@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
|
@@ -14,7 +14,7 @@ import { FloatingFeedback } from "../shared/floating-feedback.js";
|
|
|
14
14
|
import { FloatingHighlight, useFloatingHighlight } from "../shared/floating-highlight.js";
|
|
15
15
|
import { useFormattedText } from "../shared/use-formatted-text.js";
|
|
16
16
|
const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, forwardedRef) {
|
|
17
|
-
const { options: entries, value, defaultValue = '', size = 'md', status: statusProp, filterOption, disabled: disabledProp, readOnly, className, style, form, onChange, onSelect, onSearch, open: controlledOpen, defaultOpen, onOpenChange, loading, notFoundContent, errorContent, optionRender, allowClear, virtual: virtualProp, listHeight = 248, optionHeight: optionHeightProp, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onKeyDown, onFocus, autoComplete = 'off', 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('AutoComplete', rawProps);
|
|
17
|
+
const { options: entries, value, defaultValue = '', size = 'md', status: statusProp, filterOption, disabled: disabledProp, readOnly, className, style, form, onChange, onSelect, onSearch, open: controlledOpen, defaultOpen, onOpenChange, loading, notFoundContent, errorContent, optionRender, allowClear, virtual: virtualProp, listHeight = 248, optionHeight: optionHeightProp, popupWidth = 'trigger', popupMaxWidth, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onKeyDown, onFocus, autoComplete = 'off', 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('AutoComplete', rawProps);
|
|
18
18
|
const field = useFormField();
|
|
19
19
|
const disabled = disabledProp || field?.disabled;
|
|
20
20
|
const status = statusProp ?? (field?.error ? 'error' : void 0);
|
|
@@ -22,6 +22,7 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
22
22
|
const format = useFormattedText();
|
|
23
23
|
const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);
|
|
24
24
|
const inputRef = useRef(null);
|
|
25
|
+
const rootRef = useRef(null);
|
|
25
26
|
const panelRef = useRef(null);
|
|
26
27
|
const ref = useMergedRef(inputRef, forwardedRef);
|
|
27
28
|
const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);
|
|
@@ -97,6 +98,7 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
97
98
|
}
|
|
98
99
|
};
|
|
99
100
|
return /*#__PURE__*/ jsxs("div", {
|
|
101
|
+
ref: rootRef,
|
|
100
102
|
className: classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className),
|
|
101
103
|
style: style,
|
|
102
104
|
"data-status": status,
|
|
@@ -169,9 +171,11 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
169
171
|
}),
|
|
170
172
|
/*#__PURE__*/ jsxs(FloatingPanel, {
|
|
171
173
|
open: expanded,
|
|
172
|
-
triggerRef:
|
|
174
|
+
triggerRef: rootRef,
|
|
173
175
|
panelRef: panelRef,
|
|
174
|
-
matchWidth:
|
|
176
|
+
matchWidth: 'trigger' === popupWidth,
|
|
177
|
+
width: 'trigger' === popupWidth ? void 0 : 'auto' === popupWidth ? 'max-content' : popupWidth,
|
|
178
|
+
maxWidth: popupMaxWidth,
|
|
175
179
|
...hasSuggestions ? listboxProps : {},
|
|
176
180
|
className: classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName),
|
|
177
181
|
"data-hover-motion": "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete/autocomplete.js","sources":["../../../src/autocomplete/autocomplete.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { estimateControlHeight } from '../density';\nimport { useFormField } from '../form/form';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { useFieldValue, useMergedRef } from '../shared/field';\nimport type { PopupOptions } from '../shared/floating';\nimport {\n FloatingPanel,\n useActiveOption,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { FloatingFeedback } from '../shared/floating-feedback';\nimport { FloatingHighlight, useFloatingHighlight } from '../shared/floating-highlight';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface AutoCompleteOption {\n value: string;\n label?: ReactNode;\n searchLabel?: string;\n disabled?: boolean;\n}\nexport interface AutoCompleteOptionGroup {\n label: ReactNode;\n options: readonly AutoCompleteOption[];\n}\n\nexport interface AutoCompleteProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'onSelect' | 'type' | 'list' | 'children'\n > {\n options: readonly (AutoCompleteOption | AutoCompleteOptionGroup)[];\n value?: string;\n defaultValue?: string;\n size?: ControlSize;\n status?: ControlStatus;\n filterOption?: false | ((query: string, option: AutoCompleteOption) => boolean);\n onChange?: (value: string) => void;\n onSelect?: (value: string, option: AutoCompleteOption) => void;\n onSearch?: (query: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n loading?: boolean;\n notFoundContent?: ReactNode;\n errorContent?: ReactNode;\n optionRender?: (option: AutoCompleteOption) => ReactNode;\n allowClear?: boolean;\n virtual?: boolean;\n listHeight?: number;\n optionHeight?: number;\n popupPlacement?: PopupOptions['popupPlacement'];\n popupClassName?: string;\n popupStyle?: PopupOptions['popupStyle'];\n popupRender?: PopupOptions['popupRender'];\n getPopupContainer?: PopupOptions['getPopupContainer'];\n}\n\nexport const AutoComplete = forwardRef<HTMLInputElement, AutoCompleteProps>(function AutoComplete(\n rawProps: AutoCompleteProps,\n forwardedRef,\n) {\n const {\n options: entries,\n value,\n defaultValue = '',\n size = 'md',\n status: statusProp,\n filterOption,\n disabled: disabledProp,\n readOnly,\n className,\n style,\n form,\n onChange,\n onSelect,\n onSearch,\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n loading,\n notFoundContent,\n errorContent,\n optionRender,\n allowClear,\n virtual: virtualProp,\n listHeight = 248,\n optionHeight: optionHeightProp,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onKeyDown,\n onFocus,\n autoComplete = 'off',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('AutoComplete', rawProps);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const { messages, theme, density } = useLeafConfig();\n const format = useFormattedText();\n const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);\n const inputRef = useRef<HTMLInputElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(inputRef, forwardedRef);\n const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [active, setActive] = useState(-1);\n const listId = `${useId()}-suggestions`;\n const options = entries.flatMap((entry) => ('options' in entry ? [...entry.options] : [entry]));\n const groups = new Map(\n entries.flatMap((entry) =>\n 'options' in entry ? entry.options.map((option) => [option.value, entry.label] as const) : [],\n ),\n );\n const visibleOptions = options.filter((option) => {\n if (filterOption === false) return true;\n if (filterOption) return filterOption(text, option);\n return (option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value))\n .toLocaleLowerCase()\n .includes(text.toLocaleLowerCase());\n });\n const virtual = virtualProp ?? visibleOptions.length > 100;\n const virtualizer = useVirtualizer({\n count: visibleOptions.length,\n getScrollElement: () => panelRef.current,\n estimateSize: () => optionHeight,\n enabled: open && virtual,\n initialRect: { height: listHeight, width: 240 },\n overscan: 5,\n });\n useEffect(() => {\n if (open && virtual && active >= 0) virtualizer.scrollToIndex(active, { align: 'auto' });\n }, [open, virtual, active, virtualizer]);\n const expanded = open && !disabled && !readOnly;\n const hasSuggestions = visibleOptions.length > 0 && !errorContent;\n const listboxProps = {\n id: listId,\n role: 'listbox' as const,\n 'aria-busy': loading || undefined,\n 'aria-label': ariaLabel\n ? format('autoComplete.suggestions', { label: ariaLabel })\n : messages.autoComplete.empty,\n };\n useFloatingDismiss(expanded, () => setOpen(false), inputRef, panelRef);\n useActiveOption(expanded, visibleOptions[active] ? `${listId}-${active}` : undefined, panelRef);\n const highlight = useFloatingHighlight(\n expanded,\n panelRef,\n visibleOptions[active] ? `${listId}-${active}` : undefined,\n `${text}:${visibleOptions[active]?.value}:${visibleOptions.length}:${virtualizer.range?.startIndex}:${virtualizer.range?.endIndex}`,\n );\n\n const select = (option: AutoCompleteOption) => {\n if (option.disabled || readOnly || disabled) return;\n setText(option.value);\n onChange?.(option.value);\n onSelect?.(option.value, option);\n setOpen(false);\n setActive(-1);\n inputRef.current?.focus();\n };\n\n const move = (direction: number) => {\n let index = active < 0 ? (direction > 0 ? -1 : visibleOptions.length) : active;\n for (let step = 0; step < visibleOptions.length; step += 1) {\n index = (index + direction + visibleOptions.length) % visibleOptions.length;\n if (!visibleOptions[index]?.disabled) {\n setActive(index);\n break;\n }\n }\n };\n\n return (\n <div\n className={classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className)}\n style={style}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && text && !disabled && !readOnly ? '' : undefined}\n >\n <input\n {...props}\n id={props.id ?? field?.id}\n required={props.required ?? field?.required}\n aria-describedby={\n [props['aria-describedby'], field?.descriptionId].filter(Boolean).join(' ') || undefined\n }\n ref={ref}\n type=\"text\"\n form={form}\n className=\"leaf-autocomplete__input\"\n disabled={disabled}\n readOnly={readOnly}\n value={text}\n autoComplete={autoComplete}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-activedescendant={\n expanded && visibleOptions[active] ? `${listId}-${active}` : undefined\n }\n aria-label={ariaLabel}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n onFocus={(event) => {\n onFocus?.(event);\n if (!event.defaultPrevented && !readOnly) setOpen(true);\n }}\n onChange={(event) => {\n const next = event.target.value;\n setText(next);\n setActive(-1);\n setOpen(true);\n onChange?.(next);\n onSearch?.(next);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.nativeEvent.isComposing || readOnly) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n move(event.key === 'ArrowDown' ? 1 : -1);\n } else if (event.key === 'Enter' && expanded && visibleOptions[active]) {\n event.preventDefault();\n const option = visibleOptions[active];\n if (option) select(option);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n } else if (event.key === 'Tab') setOpen(false);\n }}\n />\n {allowClear && text && !disabled && !readOnly && (\n <ClearButton\n label={messages.input.clear}\n onClear={() => {\n setText('');\n onChange?.('');\n onSearch?.('');\n inputRef.current?.focus();\n }}\n />\n )}\n <FloatingPanel\n open={expanded}\n triggerRef={inputRef}\n panelRef={panelRef}\n matchWidth\n {...(hasSuggestions ? listboxProps : {})}\n className={classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName)}\n data-hover-motion=\"\"\n data-selection=\"candidate\"\n placement={popupPlacement}\n style={{ maxHeight: listHeight, ...popupStyle }}\n container={getPopupContainer}\n render={popupRender}\n >\n {!hasSuggestions && <div {...listboxProps} />}\n <FloatingHighlight style={highlight} />\n {loading && !visibleOptions.length ? (\n <FloatingFeedback loading>{messages.common.loading}</FloatingFeedback>\n ) : errorContent ? (\n <div className=\"leaf-floating__empty\" role=\"alert\">\n {errorContent}\n </div>\n ) : visibleOptions.length ? (\n <div\n className={virtual ? undefined : 'leaf-floating__options'}\n style={\n virtual ? { height: virtualizer.getTotalSize(), position: 'relative' } : undefined\n }\n >\n {(virtual\n ? virtualizer.getVirtualItems().map((item) => ({\n option: visibleOptions[item.index],\n index: item.index,\n start: item.start,\n }))\n : visibleOptions.map((option, index) => ({ option, index, start: 0 }))\n ).map(\n ({ option, index, start }) =>\n option && (\n <div\n key={option.value}\n ref={virtual ? virtualizer.measureElement : undefined}\n data-index={virtual ? index : undefined}\n style={\n virtual\n ? {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : undefined\n }\n >\n {groups.has(option.value) &&\n (index === 0 ||\n groups.get(visibleOptions[index - 1]?.value ?? '') !==\n groups.get(option.value)) && (\n <div className=\"leaf-select__group\">{groups.get(option.value)}</div>\n )}\n <button\n key={option.value}\n id={`${listId}-${index}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={active === index}\n disabled={option.disabled}\n aria-disabled={option.disabled || undefined}\n className=\"leaf-floating__option\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => !option.disabled && setActive(index)}\n onClick={() => select(option)}\n >\n <span className=\"leaf-floating__option-label\">\n {optionRender?.(option) ?? option.label ?? option.value}\n </span>\n </button>\n </div>\n ),\n )}\n </div>\n ) : (\n <FloatingFeedback>{notFoundContent ?? messages.autoComplete.empty}</FloatingFeedback>\n )}\n </FloatingPanel>\n </div>\n );\n});\nAutoComplete.displayName = 'AutoComplete';\n"],"names":["AutoComplete","forwardRef","rawProps","forwardedRef","entries","value","defaultValue","size","statusProp","filterOption","disabledProp","readOnly","className","style","form","onChange","onSelect","onSearch","controlledOpen","defaultOpen","onOpenChange","loading","notFoundContent","errorContent","optionRender","allowClear","virtualProp","listHeight","optionHeightProp","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onKeyDown","onFocus","autoComplete","ariaLabel","ariaInvalid","props","useComponentProps","field","useFormField","disabled","status","undefined","messages","theme","density","useLeafConfig","format","useFormattedText","optionHeight","Math","estimateControlHeight","inputRef","useRef","panelRef","ref","useMergedRef","text","setText","useFieldValue","open","setOpen","usePopupState","active","setActive","useState","listId","useId","options","entry","groups","Map","option","visibleOptions","virtual","virtualizer","useVirtualizer","useEffect","expanded","hasSuggestions","listboxProps","useFloatingDismiss","useActiveOption","highlight","useFloatingHighlight","select","move","direction","index","step","classes","Boolean","event","next","ClearButton","FloatingPanel","FloatingHighlight","FloatingFeedback","item","start"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocomplete/autocomplete.js","sources":["../../../src/autocomplete/autocomplete.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { estimateControlHeight } from '../density';\nimport { useFormField } from '../form/form';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { useFieldValue, useMergedRef } from '../shared/field';\nimport type { PopupOptions } from '../shared/floating';\nimport {\n FloatingPanel,\n useActiveOption,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { FloatingFeedback } from '../shared/floating-feedback';\nimport { FloatingHighlight, useFloatingHighlight } from '../shared/floating-highlight';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface AutoCompleteOption {\n value: string;\n label?: ReactNode;\n searchLabel?: string;\n disabled?: boolean;\n}\nexport interface AutoCompleteOptionGroup {\n label: ReactNode;\n options: readonly AutoCompleteOption[];\n}\n\nexport interface AutoCompleteProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'onSelect' | 'type' | 'list' | 'children'\n > {\n options: readonly (AutoCompleteOption | AutoCompleteOptionGroup)[];\n value?: string;\n defaultValue?: string;\n size?: ControlSize;\n status?: ControlStatus;\n filterOption?: false | ((query: string, option: AutoCompleteOption) => boolean);\n onChange?: (value: string) => void;\n onSelect?: (value: string, option: AutoCompleteOption) => void;\n onSearch?: (query: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n loading?: boolean;\n notFoundContent?: ReactNode;\n errorContent?: ReactNode;\n optionRender?: (option: AutoCompleteOption) => ReactNode;\n allowClear?: boolean;\n virtual?: boolean;\n listHeight?: number;\n optionHeight?: number;\n popupWidth?: number | string;\n popupMaxWidth?: number | string;\n popupPlacement?: PopupOptions['popupPlacement'];\n popupClassName?: string;\n popupStyle?: PopupOptions['popupStyle'];\n popupRender?: PopupOptions['popupRender'];\n getPopupContainer?: PopupOptions['getPopupContainer'];\n}\n\nexport const AutoComplete = forwardRef<HTMLInputElement, AutoCompleteProps>(function AutoComplete(\n rawProps: AutoCompleteProps,\n forwardedRef,\n) {\n const {\n options: entries,\n value,\n defaultValue = '',\n size = 'md',\n status: statusProp,\n filterOption,\n disabled: disabledProp,\n readOnly,\n className,\n style,\n form,\n onChange,\n onSelect,\n onSearch,\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n loading,\n notFoundContent,\n errorContent,\n optionRender,\n allowClear,\n virtual: virtualProp,\n listHeight = 248,\n optionHeight: optionHeightProp,\n popupWidth = 'trigger',\n popupMaxWidth,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onKeyDown,\n onFocus,\n autoComplete = 'off',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('AutoComplete', rawProps);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const { messages, theme, density } = useLeafConfig();\n const format = useFormattedText();\n const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);\n const inputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(inputRef, forwardedRef);\n const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [active, setActive] = useState(-1);\n const listId = `${useId()}-suggestions`;\n const options = entries.flatMap((entry) => ('options' in entry ? [...entry.options] : [entry]));\n const groups = new Map(\n entries.flatMap((entry) =>\n 'options' in entry ? entry.options.map((option) => [option.value, entry.label] as const) : [],\n ),\n );\n const visibleOptions = options.filter((option) => {\n if (filterOption === false) return true;\n if (filterOption) return filterOption(text, option);\n return (option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value))\n .toLocaleLowerCase()\n .includes(text.toLocaleLowerCase());\n });\n const virtual = virtualProp ?? visibleOptions.length > 100;\n const virtualizer = useVirtualizer({\n count: visibleOptions.length,\n getScrollElement: () => panelRef.current,\n estimateSize: () => optionHeight,\n enabled: open && virtual,\n initialRect: { height: listHeight, width: 240 },\n overscan: 5,\n });\n useEffect(() => {\n if (open && virtual && active >= 0) virtualizer.scrollToIndex(active, { align: 'auto' });\n }, [open, virtual, active, virtualizer]);\n const expanded = open && !disabled && !readOnly;\n const hasSuggestions = visibleOptions.length > 0 && !errorContent;\n const listboxProps = {\n id: listId,\n role: 'listbox' as const,\n 'aria-busy': loading || undefined,\n 'aria-label': ariaLabel\n ? format('autoComplete.suggestions', { label: ariaLabel })\n : messages.autoComplete.empty,\n };\n useFloatingDismiss(expanded, () => setOpen(false), inputRef, panelRef);\n useActiveOption(expanded, visibleOptions[active] ? `${listId}-${active}` : undefined, panelRef);\n const highlight = useFloatingHighlight(\n expanded,\n panelRef,\n visibleOptions[active] ? `${listId}-${active}` : undefined,\n `${text}:${visibleOptions[active]?.value}:${visibleOptions.length}:${virtualizer.range?.startIndex}:${virtualizer.range?.endIndex}`,\n );\n\n const select = (option: AutoCompleteOption) => {\n if (option.disabled || readOnly || disabled) return;\n setText(option.value);\n onChange?.(option.value);\n onSelect?.(option.value, option);\n setOpen(false);\n setActive(-1);\n inputRef.current?.focus();\n };\n\n const move = (direction: number) => {\n let index = active < 0 ? (direction > 0 ? -1 : visibleOptions.length) : active;\n for (let step = 0; step < visibleOptions.length; step += 1) {\n index = (index + direction + visibleOptions.length) % visibleOptions.length;\n if (!visibleOptions[index]?.disabled) {\n setActive(index);\n break;\n }\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className)}\n style={style}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && text && !disabled && !readOnly ? '' : undefined}\n >\n <input\n {...props}\n id={props.id ?? field?.id}\n required={props.required ?? field?.required}\n aria-describedby={\n [props['aria-describedby'], field?.descriptionId].filter(Boolean).join(' ') || undefined\n }\n ref={ref}\n type=\"text\"\n form={form}\n className=\"leaf-autocomplete__input\"\n disabled={disabled}\n readOnly={readOnly}\n value={text}\n autoComplete={autoComplete}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-activedescendant={\n expanded && visibleOptions[active] ? `${listId}-${active}` : undefined\n }\n aria-label={ariaLabel}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n onFocus={(event) => {\n onFocus?.(event);\n if (!event.defaultPrevented && !readOnly) setOpen(true);\n }}\n onChange={(event) => {\n const next = event.target.value;\n setText(next);\n setActive(-1);\n setOpen(true);\n onChange?.(next);\n onSearch?.(next);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.nativeEvent.isComposing || readOnly) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n move(event.key === 'ArrowDown' ? 1 : -1);\n } else if (event.key === 'Enter' && expanded && visibleOptions[active]) {\n event.preventDefault();\n const option = visibleOptions[active];\n if (option) select(option);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n } else if (event.key === 'Tab') setOpen(false);\n }}\n />\n {allowClear && text && !disabled && !readOnly && (\n <ClearButton\n label={messages.input.clear}\n onClear={() => {\n setText('');\n onChange?.('');\n onSearch?.('');\n inputRef.current?.focus();\n }}\n />\n )}\n <FloatingPanel\n open={expanded}\n triggerRef={rootRef}\n panelRef={panelRef}\n matchWidth={popupWidth === 'trigger'}\n width={\n popupWidth === 'trigger' ? undefined : popupWidth === 'auto' ? 'max-content' : popupWidth\n }\n maxWidth={popupMaxWidth}\n {...(hasSuggestions ? listboxProps : {})}\n className={classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName)}\n data-hover-motion=\"\"\n data-selection=\"candidate\"\n placement={popupPlacement}\n style={{ maxHeight: listHeight, ...popupStyle }}\n container={getPopupContainer}\n render={popupRender}\n >\n {!hasSuggestions && <div {...listboxProps} />}\n <FloatingHighlight style={highlight} />\n {loading && !visibleOptions.length ? (\n <FloatingFeedback loading>{messages.common.loading}</FloatingFeedback>\n ) : errorContent ? (\n <div className=\"leaf-floating__empty\" role=\"alert\">\n {errorContent}\n </div>\n ) : visibleOptions.length ? (\n <div\n className={virtual ? undefined : 'leaf-floating__options'}\n style={\n virtual ? { height: virtualizer.getTotalSize(), position: 'relative' } : undefined\n }\n >\n {(virtual\n ? virtualizer.getVirtualItems().map((item) => ({\n option: visibleOptions[item.index],\n index: item.index,\n start: item.start,\n }))\n : visibleOptions.map((option, index) => ({ option, index, start: 0 }))\n ).map(\n ({ option, index, start }) =>\n option && (\n <div\n key={option.value}\n ref={virtual ? virtualizer.measureElement : undefined}\n data-index={virtual ? index : undefined}\n style={\n virtual\n ? {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : undefined\n }\n >\n {groups.has(option.value) &&\n (index === 0 ||\n groups.get(visibleOptions[index - 1]?.value ?? '') !==\n groups.get(option.value)) && (\n <div className=\"leaf-select__group\">{groups.get(option.value)}</div>\n )}\n <button\n key={option.value}\n id={`${listId}-${index}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={active === index}\n disabled={option.disabled}\n aria-disabled={option.disabled || undefined}\n className=\"leaf-floating__option\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => !option.disabled && setActive(index)}\n onClick={() => select(option)}\n >\n <span className=\"leaf-floating__option-label\">\n {optionRender?.(option) ?? option.label ?? option.value}\n </span>\n </button>\n </div>\n ),\n )}\n </div>\n ) : (\n <FloatingFeedback>{notFoundContent ?? messages.autoComplete.empty}</FloatingFeedback>\n )}\n </FloatingPanel>\n </div>\n );\n});\nAutoComplete.displayName = 'AutoComplete';\n"],"names":["AutoComplete","forwardRef","rawProps","forwardedRef","entries","value","defaultValue","size","statusProp","filterOption","disabledProp","readOnly","className","style","form","onChange","onSelect","onSearch","controlledOpen","defaultOpen","onOpenChange","loading","notFoundContent","errorContent","optionRender","allowClear","virtualProp","listHeight","optionHeightProp","popupWidth","popupMaxWidth","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onKeyDown","onFocus","autoComplete","ariaLabel","ariaInvalid","props","useComponentProps","field","useFormField","disabled","status","undefined","messages","theme","density","useLeafConfig","format","useFormattedText","optionHeight","Math","estimateControlHeight","inputRef","useRef","rootRef","panelRef","ref","useMergedRef","text","setText","useFieldValue","open","setOpen","usePopupState","active","setActive","useState","listId","useId","options","entry","groups","Map","option","visibleOptions","virtual","virtualizer","useVirtualizer","useEffect","expanded","hasSuggestions","listboxProps","useFloatingDismiss","useActiveOption","highlight","useFloatingHighlight","select","move","direction","index","step","classes","Boolean","event","next","ClearButton","FloatingPanel","FloatingHighlight","FloatingFeedback","item","start"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ import { FloatingFeedback } from "../shared/floating-feedback.js";
|
|
|
16
16
|
import { FloatingHighlight, useFloatingHighlight } from "../shared/floating-highlight.js";
|
|
17
17
|
import { useFormattedText } from "../shared/use-formatted-text.js";
|
|
18
18
|
const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, forwardedRef) {
|
|
19
|
-
const { options: entries, value, defaultValue = '', size = 'md', status: statusProp, filterOption, disabled: disabledProp, readOnly, className, style, form, onChange, onSelect, onSearch, open: controlledOpen, defaultOpen, onOpenChange, loading, notFoundContent, errorContent, optionRender, allowClear, virtual: virtualProp, listHeight = 248, optionHeight: optionHeightProp, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onKeyDown, onFocus, autoComplete = 'off', 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('AutoComplete', rawProps);
|
|
19
|
+
const { options: entries, value, defaultValue = '', size = 'md', status: statusProp, filterOption, disabled: disabledProp, readOnly, className, style, form, onChange, onSelect, onSearch, open: controlledOpen, defaultOpen, onOpenChange, loading, notFoundContent, errorContent, optionRender, allowClear, virtual: virtualProp, listHeight = 248, optionHeight: optionHeightProp, popupWidth = 'trigger', popupMaxWidth, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onKeyDown, onFocus, autoComplete = 'off', 'aria-label': ariaLabel, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('AutoComplete', rawProps);
|
|
20
20
|
const field = useFormField();
|
|
21
21
|
const disabled = disabledProp || field?.disabled;
|
|
22
22
|
const status = statusProp ?? (field?.error ? 'error' : void 0);
|
|
@@ -24,6 +24,7 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
24
24
|
const format = useFormattedText();
|
|
25
25
|
const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);
|
|
26
26
|
const inputRef = useRef(null);
|
|
27
|
+
const rootRef = useRef(null);
|
|
27
28
|
const panelRef = useRef(null);
|
|
28
29
|
const ref = useMergedRef(inputRef, forwardedRef);
|
|
29
30
|
const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);
|
|
@@ -99,6 +100,7 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
99
100
|
}
|
|
100
101
|
};
|
|
101
102
|
return /*#__PURE__*/ jsxs("div", {
|
|
103
|
+
ref: rootRef,
|
|
102
104
|
className: classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className),
|
|
103
105
|
style: style,
|
|
104
106
|
"data-status": status,
|
|
@@ -171,9 +173,11 @@ const autocomplete_AutoComplete = /*#__PURE__*/ forwardRef(function(rawProps, fo
|
|
|
171
173
|
}),
|
|
172
174
|
/*#__PURE__*/ jsxs(FloatingPanel, {
|
|
173
175
|
open: expanded,
|
|
174
|
-
triggerRef:
|
|
176
|
+
triggerRef: rootRef,
|
|
175
177
|
panelRef: panelRef,
|
|
176
|
-
matchWidth:
|
|
178
|
+
matchWidth: 'trigger' === popupWidth,
|
|
179
|
+
width: 'trigger' === popupWidth ? void 0 : 'auto' === popupWidth ? 'max-content' : popupWidth,
|
|
180
|
+
maxWidth: popupMaxWidth,
|
|
177
181
|
...hasSuggestions ? listboxProps : {},
|
|
178
182
|
className: classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName),
|
|
179
183
|
"data-hover-motion": "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete/autocomplete.js","sources":["../../../../../src/autocomplete/autocomplete.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { estimateControlHeight } from '../density';\nimport { useFormField } from '../form/form';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { useFieldValue, useMergedRef } from '../shared/field';\nimport type { PopupOptions } from '../shared/floating';\nimport {\n FloatingPanel,\n useActiveOption,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { FloatingFeedback } from '../shared/floating-feedback';\nimport { FloatingHighlight, useFloatingHighlight } from '../shared/floating-highlight';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface AutoCompleteOption {\n value: string;\n label?: ReactNode;\n searchLabel?: string;\n disabled?: boolean;\n}\nexport interface AutoCompleteOptionGroup {\n label: ReactNode;\n options: readonly AutoCompleteOption[];\n}\n\nexport interface AutoCompleteProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'onSelect' | 'type' | 'list' | 'children'\n > {\n options: readonly (AutoCompleteOption | AutoCompleteOptionGroup)[];\n value?: string;\n defaultValue?: string;\n size?: ControlSize;\n status?: ControlStatus;\n filterOption?: false | ((query: string, option: AutoCompleteOption) => boolean);\n onChange?: (value: string) => void;\n onSelect?: (value: string, option: AutoCompleteOption) => void;\n onSearch?: (query: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n loading?: boolean;\n notFoundContent?: ReactNode;\n errorContent?: ReactNode;\n optionRender?: (option: AutoCompleteOption) => ReactNode;\n allowClear?: boolean;\n virtual?: boolean;\n listHeight?: number;\n optionHeight?: number;\n popupPlacement?: PopupOptions['popupPlacement'];\n popupClassName?: string;\n popupStyle?: PopupOptions['popupStyle'];\n popupRender?: PopupOptions['popupRender'];\n getPopupContainer?: PopupOptions['getPopupContainer'];\n}\n\nexport const AutoComplete = forwardRef<HTMLInputElement, AutoCompleteProps>(function AutoComplete(\n rawProps: AutoCompleteProps,\n forwardedRef,\n) {\n const {\n options: entries,\n value,\n defaultValue = '',\n size = 'md',\n status: statusProp,\n filterOption,\n disabled: disabledProp,\n readOnly,\n className,\n style,\n form,\n onChange,\n onSelect,\n onSearch,\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n loading,\n notFoundContent,\n errorContent,\n optionRender,\n allowClear,\n virtual: virtualProp,\n listHeight = 248,\n optionHeight: optionHeightProp,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onKeyDown,\n onFocus,\n autoComplete = 'off',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('AutoComplete', rawProps);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const { messages, theme, density } = useLeafConfig();\n const format = useFormattedText();\n const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);\n const inputRef = useRef<HTMLInputElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(inputRef, forwardedRef);\n const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [active, setActive] = useState(-1);\n const listId = `${useId()}-suggestions`;\n const options = entries.flatMap((entry) => ('options' in entry ? [...entry.options] : [entry]));\n const groups = new Map(\n entries.flatMap((entry) =>\n 'options' in entry ? entry.options.map((option) => [option.value, entry.label] as const) : [],\n ),\n );\n const visibleOptions = options.filter((option) => {\n if (filterOption === false) return true;\n if (filterOption) return filterOption(text, option);\n return (option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value))\n .toLocaleLowerCase()\n .includes(text.toLocaleLowerCase());\n });\n const virtual = virtualProp ?? visibleOptions.length > 100;\n const virtualizer = useVirtualizer({\n count: visibleOptions.length,\n getScrollElement: () => panelRef.current,\n estimateSize: () => optionHeight,\n enabled: open && virtual,\n initialRect: { height: listHeight, width: 240 },\n overscan: 5,\n });\n useEffect(() => {\n if (open && virtual && active >= 0) virtualizer.scrollToIndex(active, { align: 'auto' });\n }, [open, virtual, active, virtualizer]);\n const expanded = open && !disabled && !readOnly;\n const hasSuggestions = visibleOptions.length > 0 && !errorContent;\n const listboxProps = {\n id: listId,\n role: 'listbox' as const,\n 'aria-busy': loading || undefined,\n 'aria-label': ariaLabel\n ? format('autoComplete.suggestions', { label: ariaLabel })\n : messages.autoComplete.empty,\n };\n useFloatingDismiss(expanded, () => setOpen(false), inputRef, panelRef);\n useActiveOption(expanded, visibleOptions[active] ? `${listId}-${active}` : undefined, panelRef);\n const highlight = useFloatingHighlight(\n expanded,\n panelRef,\n visibleOptions[active] ? `${listId}-${active}` : undefined,\n `${text}:${visibleOptions[active]?.value}:${visibleOptions.length}:${virtualizer.range?.startIndex}:${virtualizer.range?.endIndex}`,\n );\n\n const select = (option: AutoCompleteOption) => {\n if (option.disabled || readOnly || disabled) return;\n setText(option.value);\n onChange?.(option.value);\n onSelect?.(option.value, option);\n setOpen(false);\n setActive(-1);\n inputRef.current?.focus();\n };\n\n const move = (direction: number) => {\n let index = active < 0 ? (direction > 0 ? -1 : visibleOptions.length) : active;\n for (let step = 0; step < visibleOptions.length; step += 1) {\n index = (index + direction + visibleOptions.length) % visibleOptions.length;\n if (!visibleOptions[index]?.disabled) {\n setActive(index);\n break;\n }\n }\n };\n\n return (\n <div\n className={classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className)}\n style={style}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && text && !disabled && !readOnly ? '' : undefined}\n >\n <input\n {...props}\n id={props.id ?? field?.id}\n required={props.required ?? field?.required}\n aria-describedby={\n [props['aria-describedby'], field?.descriptionId].filter(Boolean).join(' ') || undefined\n }\n ref={ref}\n type=\"text\"\n form={form}\n className=\"leaf-autocomplete__input\"\n disabled={disabled}\n readOnly={readOnly}\n value={text}\n autoComplete={autoComplete}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-activedescendant={\n expanded && visibleOptions[active] ? `${listId}-${active}` : undefined\n }\n aria-label={ariaLabel}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n onFocus={(event) => {\n onFocus?.(event);\n if (!event.defaultPrevented && !readOnly) setOpen(true);\n }}\n onChange={(event) => {\n const next = event.target.value;\n setText(next);\n setActive(-1);\n setOpen(true);\n onChange?.(next);\n onSearch?.(next);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.nativeEvent.isComposing || readOnly) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n move(event.key === 'ArrowDown' ? 1 : -1);\n } else if (event.key === 'Enter' && expanded && visibleOptions[active]) {\n event.preventDefault();\n const option = visibleOptions[active];\n if (option) select(option);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n } else if (event.key === 'Tab') setOpen(false);\n }}\n />\n {allowClear && text && !disabled && !readOnly && (\n <ClearButton\n label={messages.input.clear}\n onClear={() => {\n setText('');\n onChange?.('');\n onSearch?.('');\n inputRef.current?.focus();\n }}\n />\n )}\n <FloatingPanel\n open={expanded}\n triggerRef={inputRef}\n panelRef={panelRef}\n matchWidth\n {...(hasSuggestions ? listboxProps : {})}\n className={classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName)}\n data-hover-motion=\"\"\n data-selection=\"candidate\"\n placement={popupPlacement}\n style={{ maxHeight: listHeight, ...popupStyle }}\n container={getPopupContainer}\n render={popupRender}\n >\n {!hasSuggestions && <div {...listboxProps} />}\n <FloatingHighlight style={highlight} />\n {loading && !visibleOptions.length ? (\n <FloatingFeedback loading>{messages.common.loading}</FloatingFeedback>\n ) : errorContent ? (\n <div className=\"leaf-floating__empty\" role=\"alert\">\n {errorContent}\n </div>\n ) : visibleOptions.length ? (\n <div\n className={virtual ? undefined : 'leaf-floating__options'}\n style={\n virtual ? { height: virtualizer.getTotalSize(), position: 'relative' } : undefined\n }\n >\n {(virtual\n ? virtualizer.getVirtualItems().map((item) => ({\n option: visibleOptions[item.index],\n index: item.index,\n start: item.start,\n }))\n : visibleOptions.map((option, index) => ({ option, index, start: 0 }))\n ).map(\n ({ option, index, start }) =>\n option && (\n <div\n key={option.value}\n ref={virtual ? virtualizer.measureElement : undefined}\n data-index={virtual ? index : undefined}\n style={\n virtual\n ? {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : undefined\n }\n >\n {groups.has(option.value) &&\n (index === 0 ||\n groups.get(visibleOptions[index - 1]?.value ?? '') !==\n groups.get(option.value)) && (\n <div className=\"leaf-select__group\">{groups.get(option.value)}</div>\n )}\n <button\n key={option.value}\n id={`${listId}-${index}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={active === index}\n disabled={option.disabled}\n aria-disabled={option.disabled || undefined}\n className=\"leaf-floating__option\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => !option.disabled && setActive(index)}\n onClick={() => select(option)}\n >\n <span className=\"leaf-floating__option-label\">\n {optionRender?.(option) ?? option.label ?? option.value}\n </span>\n </button>\n </div>\n ),\n )}\n </div>\n ) : (\n <FloatingFeedback>{notFoundContent ?? messages.autoComplete.empty}</FloatingFeedback>\n )}\n </FloatingPanel>\n </div>\n );\n});\nAutoComplete.displayName = 'AutoComplete';\n"],"names":["AutoComplete","forwardRef","rawProps","forwardedRef","entries","value","defaultValue","size","statusProp","filterOption","disabledProp","readOnly","className","style","form","onChange","onSelect","onSearch","controlledOpen","defaultOpen","onOpenChange","loading","notFoundContent","errorContent","optionRender","allowClear","virtualProp","listHeight","optionHeightProp","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onKeyDown","onFocus","autoComplete","ariaLabel","ariaInvalid","props","useComponentProps","field","useFormField","disabled","status","undefined","messages","theme","density","useLeafConfig","format","useFormattedText","optionHeight","Math","estimateControlHeight","inputRef","useRef","panelRef","ref","useMergedRef","text","setText","useFieldValue","open","setOpen","usePopupState","active","setActive","useState","listId","useId","options","entry","groups","Map","option","visibleOptions","virtual","virtualizer","useVirtualizer","useEffect","expanded","hasSuggestions","listboxProps","useFloatingDismiss","useActiveOption","highlight","useFloatingHighlight","select","move","direction","index","step","classes","Boolean","event","next","ClearButton","FloatingPanel","FloatingHighlight","FloatingFeedback","item","start"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocomplete/autocomplete.js","sources":["../../../../../src/autocomplete/autocomplete.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { estimateControlHeight } from '../density';\nimport { useFormField } from '../form/form';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { useFieldValue, useMergedRef } from '../shared/field';\nimport type { PopupOptions } from '../shared/floating';\nimport {\n FloatingPanel,\n useActiveOption,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { FloatingFeedback } from '../shared/floating-feedback';\nimport { FloatingHighlight, useFloatingHighlight } from '../shared/floating-highlight';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface AutoCompleteOption {\n value: string;\n label?: ReactNode;\n searchLabel?: string;\n disabled?: boolean;\n}\nexport interface AutoCompleteOptionGroup {\n label: ReactNode;\n options: readonly AutoCompleteOption[];\n}\n\nexport interface AutoCompleteProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'value' | 'defaultValue' | 'onChange' | 'onSelect' | 'type' | 'list' | 'children'\n > {\n options: readonly (AutoCompleteOption | AutoCompleteOptionGroup)[];\n value?: string;\n defaultValue?: string;\n size?: ControlSize;\n status?: ControlStatus;\n filterOption?: false | ((query: string, option: AutoCompleteOption) => boolean);\n onChange?: (value: string) => void;\n onSelect?: (value: string, option: AutoCompleteOption) => void;\n onSearch?: (query: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n loading?: boolean;\n notFoundContent?: ReactNode;\n errorContent?: ReactNode;\n optionRender?: (option: AutoCompleteOption) => ReactNode;\n allowClear?: boolean;\n virtual?: boolean;\n listHeight?: number;\n optionHeight?: number;\n popupWidth?: number | string;\n popupMaxWidth?: number | string;\n popupPlacement?: PopupOptions['popupPlacement'];\n popupClassName?: string;\n popupStyle?: PopupOptions['popupStyle'];\n popupRender?: PopupOptions['popupRender'];\n getPopupContainer?: PopupOptions['getPopupContainer'];\n}\n\nexport const AutoComplete = forwardRef<HTMLInputElement, AutoCompleteProps>(function AutoComplete(\n rawProps: AutoCompleteProps,\n forwardedRef,\n) {\n const {\n options: entries,\n value,\n defaultValue = '',\n size = 'md',\n status: statusProp,\n filterOption,\n disabled: disabledProp,\n readOnly,\n className,\n style,\n form,\n onChange,\n onSelect,\n onSearch,\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n loading,\n notFoundContent,\n errorContent,\n optionRender,\n allowClear,\n virtual: virtualProp,\n listHeight = 248,\n optionHeight: optionHeightProp,\n popupWidth = 'trigger',\n popupMaxWidth,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onKeyDown,\n onFocus,\n autoComplete = 'off',\n 'aria-label': ariaLabel,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('AutoComplete', rawProps);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const { messages, theme, density } = useLeafConfig();\n const format = useFormattedText();\n const optionHeight = optionHeightProp ?? Math.max(24, estimateControlHeight(theme, density) - 4);\n const inputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(inputRef, forwardedRef);\n const [text, setText] = useFieldValue(value, defaultValue, inputRef, form);\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [active, setActive] = useState(-1);\n const listId = `${useId()}-suggestions`;\n const options = entries.flatMap((entry) => ('options' in entry ? [...entry.options] : [entry]));\n const groups = new Map(\n entries.flatMap((entry) =>\n 'options' in entry ? entry.options.map((option) => [option.value, entry.label] as const) : [],\n ),\n );\n const visibleOptions = options.filter((option) => {\n if (filterOption === false) return true;\n if (filterOption) return filterOption(text, option);\n return (option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value))\n .toLocaleLowerCase()\n .includes(text.toLocaleLowerCase());\n });\n const virtual = virtualProp ?? visibleOptions.length > 100;\n const virtualizer = useVirtualizer({\n count: visibleOptions.length,\n getScrollElement: () => panelRef.current,\n estimateSize: () => optionHeight,\n enabled: open && virtual,\n initialRect: { height: listHeight, width: 240 },\n overscan: 5,\n });\n useEffect(() => {\n if (open && virtual && active >= 0) virtualizer.scrollToIndex(active, { align: 'auto' });\n }, [open, virtual, active, virtualizer]);\n const expanded = open && !disabled && !readOnly;\n const hasSuggestions = visibleOptions.length > 0 && !errorContent;\n const listboxProps = {\n id: listId,\n role: 'listbox' as const,\n 'aria-busy': loading || undefined,\n 'aria-label': ariaLabel\n ? format('autoComplete.suggestions', { label: ariaLabel })\n : messages.autoComplete.empty,\n };\n useFloatingDismiss(expanded, () => setOpen(false), inputRef, panelRef);\n useActiveOption(expanded, visibleOptions[active] ? `${listId}-${active}` : undefined, panelRef);\n const highlight = useFloatingHighlight(\n expanded,\n panelRef,\n visibleOptions[active] ? `${listId}-${active}` : undefined,\n `${text}:${visibleOptions[active]?.value}:${visibleOptions.length}:${virtualizer.range?.startIndex}:${virtualizer.range?.endIndex}`,\n );\n\n const select = (option: AutoCompleteOption) => {\n if (option.disabled || readOnly || disabled) return;\n setText(option.value);\n onChange?.(option.value);\n onSelect?.(option.value, option);\n setOpen(false);\n setActive(-1);\n inputRef.current?.focus();\n };\n\n const move = (direction: number) => {\n let index = active < 0 ? (direction > 0 ? -1 : visibleOptions.length) : active;\n for (let step = 0; step < visibleOptions.length; step += 1) {\n index = (index + direction + visibleOptions.length) % visibleOptions.length;\n if (!visibleOptions[index]?.disabled) {\n setActive(index);\n break;\n }\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={classes('leaf-autocomplete', `leaf-autocomplete--${size}`, className)}\n style={style}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && text && !disabled && !readOnly ? '' : undefined}\n >\n <input\n {...props}\n id={props.id ?? field?.id}\n required={props.required ?? field?.required}\n aria-describedby={\n [props['aria-describedby'], field?.descriptionId].filter(Boolean).join(' ') || undefined\n }\n ref={ref}\n type=\"text\"\n form={form}\n className=\"leaf-autocomplete__input\"\n disabled={disabled}\n readOnly={readOnly}\n value={text}\n autoComplete={autoComplete}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={expanded}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-activedescendant={\n expanded && visibleOptions[active] ? `${listId}-${active}` : undefined\n }\n aria-label={ariaLabel}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n onFocus={(event) => {\n onFocus?.(event);\n if (!event.defaultPrevented && !readOnly) setOpen(true);\n }}\n onChange={(event) => {\n const next = event.target.value;\n setText(next);\n setActive(-1);\n setOpen(true);\n onChange?.(next);\n onSearch?.(next);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.nativeEvent.isComposing || readOnly) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n move(event.key === 'ArrowDown' ? 1 : -1);\n } else if (event.key === 'Enter' && expanded && visibleOptions[active]) {\n event.preventDefault();\n const option = visibleOptions[active];\n if (option) select(option);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n } else if (event.key === 'Tab') setOpen(false);\n }}\n />\n {allowClear && text && !disabled && !readOnly && (\n <ClearButton\n label={messages.input.clear}\n onClear={() => {\n setText('');\n onChange?.('');\n onSearch?.('');\n inputRef.current?.focus();\n }}\n />\n )}\n <FloatingPanel\n open={expanded}\n triggerRef={rootRef}\n panelRef={panelRef}\n matchWidth={popupWidth === 'trigger'}\n width={\n popupWidth === 'trigger' ? undefined : popupWidth === 'auto' ? 'max-content' : popupWidth\n }\n maxWidth={popupMaxWidth}\n {...(hasSuggestions ? listboxProps : {})}\n className={classes('leaf-floating', 'leaf-autocomplete__panel', popupClassName)}\n data-hover-motion=\"\"\n data-selection=\"candidate\"\n placement={popupPlacement}\n style={{ maxHeight: listHeight, ...popupStyle }}\n container={getPopupContainer}\n render={popupRender}\n >\n {!hasSuggestions && <div {...listboxProps} />}\n <FloatingHighlight style={highlight} />\n {loading && !visibleOptions.length ? (\n <FloatingFeedback loading>{messages.common.loading}</FloatingFeedback>\n ) : errorContent ? (\n <div className=\"leaf-floating__empty\" role=\"alert\">\n {errorContent}\n </div>\n ) : visibleOptions.length ? (\n <div\n className={virtual ? undefined : 'leaf-floating__options'}\n style={\n virtual ? { height: virtualizer.getTotalSize(), position: 'relative' } : undefined\n }\n >\n {(virtual\n ? virtualizer.getVirtualItems().map((item) => ({\n option: visibleOptions[item.index],\n index: item.index,\n start: item.start,\n }))\n : visibleOptions.map((option, index) => ({ option, index, start: 0 }))\n ).map(\n ({ option, index, start }) =>\n option && (\n <div\n key={option.value}\n ref={virtual ? virtualizer.measureElement : undefined}\n data-index={virtual ? index : undefined}\n style={\n virtual\n ? {\n position: 'absolute',\n top: 0,\n insetInlineStart: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n }\n : undefined\n }\n >\n {groups.has(option.value) &&\n (index === 0 ||\n groups.get(visibleOptions[index - 1]?.value ?? '') !==\n groups.get(option.value)) && (\n <div className=\"leaf-select__group\">{groups.get(option.value)}</div>\n )}\n <button\n key={option.value}\n id={`${listId}-${index}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={active === index}\n disabled={option.disabled}\n aria-disabled={option.disabled || undefined}\n className=\"leaf-floating__option\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => !option.disabled && setActive(index)}\n onClick={() => select(option)}\n >\n <span className=\"leaf-floating__option-label\">\n {optionRender?.(option) ?? option.label ?? option.value}\n </span>\n </button>\n </div>\n ),\n )}\n </div>\n ) : (\n <FloatingFeedback>{notFoundContent ?? messages.autoComplete.empty}</FloatingFeedback>\n )}\n </FloatingPanel>\n </div>\n );\n});\nAutoComplete.displayName = 'AutoComplete';\n"],"names":["AutoComplete","forwardRef","rawProps","forwardedRef","entries","value","defaultValue","size","statusProp","filterOption","disabledProp","readOnly","className","style","form","onChange","onSelect","onSearch","controlledOpen","defaultOpen","onOpenChange","loading","notFoundContent","errorContent","optionRender","allowClear","virtualProp","listHeight","optionHeightProp","popupWidth","popupMaxWidth","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onKeyDown","onFocus","autoComplete","ariaLabel","ariaInvalid","props","useComponentProps","field","useFormField","disabled","status","undefined","messages","theme","density","useLeafConfig","format","useFormattedText","optionHeight","Math","estimateControlHeight","inputRef","useRef","rootRef","panelRef","ref","useMergedRef","text","setText","useFieldValue","open","setOpen","usePopupState","active","setActive","useState","listId","useId","options","entry","groups","Map","option","visibleOptions","virtual","virtualizer","useVirtualizer","useEffect","expanded","hasSuggestions","listboxProps","useFloatingDismiss","useActiveOption","highlight","useFloatingHighlight","select","move","direction","index","step","classes","Boolean","event","next","ClearButton","FloatingPanel","FloatingHighlight","FloatingFeedback","item","start"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button/button.js","sources":["../../../../../src/button/button.tsx"],"sourcesContent":["import { LoaderCircle } from 'lucide-react';\nimport { type ButtonHTMLAttributes, forwardRef, type ReactNode } from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { classes } from '../shared/classes';\nimport type { ControlSize } from '../shared/types';\nimport { useButtonWave } from './wave';\n\nexport type ButtonVariant = 'solid' | 'outline' | '
|
|
1
|
+
{"version":3,"file":"button/button.js","sources":["../../../../../src/button/button.tsx"],"sourcesContent":["import { LoaderCircle } from 'lucide-react';\nimport { type ButtonHTMLAttributes, forwardRef, type ReactNode } from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { classes } from '../shared/classes';\nimport type { ControlSize } from '../shared/types';\nimport { useButtonWave } from './wave';\n\nexport type ButtonVariant = 'solid' | 'outline' | 'soft' | 'link';\nexport type ButtonSize = ControlSize;\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style. @default 'solid' */\n variant?: ButtonVariant;\n /** Shared control size. @default 'md' (36px) */\n size?: ButtonSize;\n /** Uses the semantic danger color in every variant. */\n danger?: boolean;\n /** Displays a spinner and prevents repeated interactions. */\n loading?: boolean;\n /** Expands the button to the width of its container. */\n fullWidth?: boolean;\n /** Content before the label. Use aria-label for icon-only buttons. */\n startIcon?: ReactNode;\n /** Content after the label. */\n endIcon?: ReactNode;\n}\n\ninterface ButtonControlProps extends Omit<ButtonProps, 'variant'> {\n /** Borderless controls remain an implementation detail of their owning components. */\n variant?: ButtonVariant | 'ghost';\n}\n\n/** Internal rendering primitive; its owner resolves defaults and interaction constraints. */\nexport const ButtonControl = forwardRef<HTMLButtonElement, ButtonControlProps>(\n function ButtonControl(rawProps: ButtonControlProps, ref) {\n const {\n variant = 'solid',\n size = 'md',\n danger = false,\n loading = false,\n fullWidth = false,\n disabled = false,\n type = 'button',\n className,\n children,\n startIcon,\n endIcon,\n onClick,\n 'aria-busy': ariaBusy,\n ...props\n } = rawProps;\n const hasLabel =\n children !== undefined && children !== null && children !== false && children !== '';\n const iconOnly = !hasLabel && Boolean(startIcon || endIcon || loading);\n const hasWave = variant === 'solid' || variant === 'outline';\n const { wave, play } = useButtonWave(disabled || loading || !hasWave);\n\n return (\n <button\n {...props}\n ref={ref}\n type={type}\n className={classes(\n 'leaf-button',\n `leaf-button--${variant}`,\n `leaf-button--${size}`,\n danger && 'leaf-button--danger',\n iconOnly && 'leaf-button--icon-only',\n fullWidth && 'leaf-button--full-width',\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading || ariaBusy}\n data-loading={loading ? '' : undefined}\n onClick={(event) => {\n play(event.currentTarget);\n onClick?.(event);\n }}\n >\n {hasWave && <span ref={wave} className=\"leaf-button__wave\" aria-hidden=\"true\" />}\n <span className=\"leaf-button__content\">\n {startIcon && (\n <span className=\"leaf-button__icon\" aria-hidden=\"true\">\n {startIcon}\n </span>\n )}\n {hasLabel && <span className=\"leaf-button__label\">{children}</span>}\n {endIcon && (\n <span className=\"leaf-button__icon\" aria-hidden=\"true\">\n {endIcon}\n </span>\n )}\n </span>\n <span className=\"leaf-button__loading\" aria-hidden=\"true\">\n <LoaderCircle className=\"leaf-button__spinner\" />\n </span>\n </button>\n );\n },\n);\nButtonControl.displayName = 'ButtonControl';\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(rawProps, ref) {\n const props = useComponentProps('Button', rawProps);\n return <ButtonControl {...props} ref={ref} />;\n});\nButton.displayName = 'Button';\n"],"names":["ButtonControl","forwardRef","rawProps","ref","variant","size","danger","loading","fullWidth","disabled","type","className","children","startIcon","endIcon","onClick","ariaBusy","props","hasLabel","iconOnly","Boolean","hasWave","wave","play","useButtonWave","classes","undefined","event","LoaderCircle","Button","useComponentProps"],"mappings":";;;;;;;;;AAiCO,MAAMA,uBAAgB,WAAHA,GAAGC,WAC3B,SAAuBC,QAA4B,EAAEC,GAAG;IACtD,MAAM,EACJC,UAAU,OAAO,EACjBC,OAAO,IAAI,EACXC,SAAS,KAAK,EACdC,UAAU,KAAK,EACfC,YAAY,KAAK,EACjBC,WAAW,KAAK,EAChBC,OAAO,QAAQ,EACfC,SAAS,EACTC,QAAQ,EACRC,SAAS,EACTC,OAAO,EACPC,OAAO,EACP,aAAaC,QAAQ,EACrB,GAAGC,OACJ,GAAGf;IACJ,MAAMgB,WACJN,QAAAA,YAA+CA,AAAa,UAAbA,YAAsBA,AAAa,OAAbA;IACvE,MAAMO,WAAW,CAACD,YAAYE,QAAQP,aAAaC,WAAWP;IAC9D,MAAMc,UAAUjB,AAAY,YAAZA,WAAuBA,AAAY,cAAZA;IACvC,MAAM,EAAEkB,IAAI,EAAEC,IAAI,EAAE,GAAGC,cAAcf,YAAYF,WAAW,CAACc;IAE7D,OAAO,WAAP,GACE,KAAC;QACE,GAAGJ,KAAK;QACT,KAAKd;QACL,MAAMO;QACN,WAAWe,QACT,eACA,CAAC,aAAa,EAAErB,SAAS,EACzB,CAAC,aAAa,EAAEC,MAAM,EACtBC,UAAU,uBACVa,YAAY,0BACZX,aAAa,2BACbG;QAEF,UAAUF,YAAYF;QACtB,aAAWA,WAAWS;QACtB,gBAAcT,UAAU,KAAKmB;QAC7B,SAAS,CAACC;YACRJ,KAAKI,MAAM,aAAa;YACxBZ,UAAUY;QACZ;;YAECN,WAAW,WAAXA,GAAW,IAAC;gBAAK,KAAKC;gBAAM,WAAU;gBAAoB,eAAY;;0BACvE,KAAC;gBAAK,WAAU;;oBACbT,aAAa,WAAbA,GACC,IAAC;wBAAK,WAAU;wBAAoB,eAAY;kCAC7CA;;oBAGJK,YAAY,WAAZA,GAAY,IAAC;wBAAK,WAAU;kCAAsBN;;oBAClDE,WAAW,WAAXA,GACC,IAAC;wBAAK,WAAU;wBAAoB,eAAY;kCAC7CA;;;;0BAIP,IAAC;gBAAK,WAAU;gBAAuB,eAAY;0BACjD,kBAACc,cAAYA;oBAAC,WAAU;;;;;AAIhC;AAEF5B,qBAAc,WAAW,GAAG;AAErB,MAAM6B,gBAAS,WAAHA,GAAG5B,WAA2C,SAAgBC,QAAQ,EAAEC,GAAG;IAC5F,MAAMc,QAAQa,kBAAkB,UAAU5B;IAC1C,OAAO,WAAP,GAAO,IAACF,sBAAaA;QAAE,GAAGiB,KAAK;QAAE,KAAKd;;AACxC;AACA0B,cAAO,WAAW,GAAG"}
|
|
@@ -28,7 +28,7 @@ function resolvePath(options, values) {
|
|
|
28
28
|
return path;
|
|
29
29
|
}
|
|
30
30
|
const cascader_Cascader = /*#__PURE__*/ forwardRef(function(rawProps, forwardedRef) {
|
|
31
|
-
const { options: suppliedOptions, value, defaultValue = emptyPath, size = 'md', status: statusProp, placeholder, name, form, required: requiredProp, allowClear = true, disabled: disabledProp, className, style, onChange, onOpenChange, open: controlledOpen, defaultOpen, multiple = false, readOnly, showSearch, changeOnSelect, displayRender, optionRender, loadData, onLoadError, cacheKey, tagWrap = true, maxTagCount, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onClick, onKeyDown, 'aria-label': ariaLabel, id: idProp, 'aria-describedby': ariaDescribedByProp, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('Cascader', rawProps);
|
|
31
|
+
const { options: suppliedOptions, value, defaultValue = emptyPath, size = 'md', status: statusProp, placeholder, name, form, required: requiredProp, allowClear = true, disabled: disabledProp, className, style, onChange, onOpenChange, open: controlledOpen, defaultOpen, multiple = false, readOnly, showSearch, changeOnSelect, displayRender, optionRender, loadData, onLoadError, cacheKey, tagWrap = true, maxTagCount, popupWidth = 'trigger', popupMaxWidth, popupPlacement, popupClassName, popupStyle, popupRender, getPopupContainer, onClick, onKeyDown, 'aria-label': ariaLabel, id: idProp, 'aria-describedby': ariaDescribedByProp, 'aria-invalid': ariaInvalid, ...props } = useComponentProps('Cascader', rawProps);
|
|
32
32
|
const { messages, direction } = useLeafConfig();
|
|
33
33
|
const format = useFormattedText();
|
|
34
34
|
const [loaded, setLoaded] = useState(new Map());
|
|
@@ -71,6 +71,7 @@ const cascader_Cascader = /*#__PURE__*/ forwardRef(function(rawProps, forwardedR
|
|
|
71
71
|
field?.descriptionId
|
|
72
72
|
].filter(Boolean).join(' ') || void 0;
|
|
73
73
|
const triggerRef = useRef(null);
|
|
74
|
+
const rootRef = useRef(null);
|
|
74
75
|
const panelRef = useRef(null);
|
|
75
76
|
const ref = useMergedRef(triggerRef, forwardedRef);
|
|
76
77
|
const panelId = `${useId()}-cascader`;
|
|
@@ -176,8 +177,10 @@ const cascader_Cascader = /*#__PURE__*/ forwardRef(function(rawProps, forwardedR
|
|
|
176
177
|
}
|
|
177
178
|
};
|
|
178
179
|
return /*#__PURE__*/ jsxs("div", {
|
|
180
|
+
ref: rootRef,
|
|
179
181
|
className: classes('leaf-cascader', `leaf-cascader--${size}`, multiple && 'leaf-cascader--multiple', className),
|
|
180
182
|
style: style,
|
|
183
|
+
dir: props.dir ?? direction,
|
|
181
184
|
"data-status": status,
|
|
182
185
|
"data-disabled": disabled ? '' : void 0,
|
|
183
186
|
"data-open": open ? '' : void 0,
|
|
@@ -185,6 +188,7 @@ const cascader_Cascader = /*#__PURE__*/ forwardRef(function(rawProps, forwardedR
|
|
|
185
188
|
children: [
|
|
186
189
|
/*#__PURE__*/ jsxs("button", {
|
|
187
190
|
...props,
|
|
191
|
+
dir: props.dir ?? direction,
|
|
188
192
|
ref: ref,
|
|
189
193
|
type: "button",
|
|
190
194
|
form: form,
|
|
@@ -268,8 +272,11 @@ const cascader_Cascader = /*#__PURE__*/ forwardRef(function(rawProps, forwardedR
|
|
|
268
272
|
render: popupRender,
|
|
269
273
|
style: popupStyle,
|
|
270
274
|
open: open,
|
|
271
|
-
triggerRef:
|
|
275
|
+
triggerRef: rootRef,
|
|
272
276
|
panelRef: panelRef,
|
|
277
|
+
matchWidth: 'trigger' === popupWidth,
|
|
278
|
+
width: 'trigger' === popupWidth ? void 0 : 'auto' === popupWidth ? 'max-content' : popupWidth,
|
|
279
|
+
maxWidth: popupMaxWidth,
|
|
273
280
|
id: panelId,
|
|
274
281
|
className: classes('leaf-floating leaf-cascader__panel', popupClassName),
|
|
275
282
|
role: "dialog",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascader/cascader.js","sources":["../../../../../src/cascader/cascader.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronRight, LoaderCircle } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n forwardRef,\n type ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { FieldScope, useFormField } from '../form/form';\nimport { InputControl } from '../input/input';\nimport { ScrollbarControl as Scrollbar } from '../scrollbar/scrollbar';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { FormValue, useFieldValue, useMergedRef } from '../shared/field';\nimport {\n FloatingPanel,\n type PopupOptions,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { SelectionContent } from '../shared/selection-content';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface CascaderOption {\n value: string;\n label: ReactNode;\n searchLabel?: string;\n isLeaf?: boolean;\n disabled?: boolean;\n children?: readonly CascaderOption[];\n}\n\ninterface CascaderBaseProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type' | 'value' | 'defaultValue' | 'onChange' | 'children'\n >,\n PopupOptions {\n options: readonly CascaderOption[];\n size?: ControlSize;\n status?: ControlStatus;\n placeholder?: string;\n name?: string;\n required?: boolean;\n allowClear?: boolean;\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n defaultOpen?: boolean;\n readOnly?: boolean;\n showSearch?: boolean;\n changeOnSelect?: boolean;\n displayRender?: (labels: ReactNode[], selectedOptions: CascaderOption[]) => ReactNode;\n optionRender?: (option: CascaderOption) => ReactNode;\n loadData?: (option: CascaderOption, signal: AbortSignal) => Promise<readonly CascaderOption[]>;\n onLoadError?: (error: unknown, option: CascaderOption) => void;\n cacheKey?: string | number;\n tagWrap?: boolean;\n maxTagCount?: number | 'responsive';\n}\nexport type CascaderProps = CascaderBaseProps &\n (\n | {\n multiple?: false;\n value?: readonly string[];\n defaultValue?: readonly string[];\n onChange?: (value: string[], selectedOptions: CascaderOption[]) => void;\n }\n | {\n multiple: true;\n value?: readonly (readonly string[])[];\n defaultValue?: readonly (readonly string[])[];\n onChange?: (value: string[][], selectedOptions: CascaderOption[][]) => void;\n }\n );\n\nconst emptyPath: readonly string[] = [];\nfunction resolvePath(options: readonly CascaderOption[], values: readonly string[]) {\n const path: CascaderOption[] = [];\n let level = options;\n for (const value of values) {\n const option = level.find((item) => item.value === value);\n if (!option) break;\n path.push(option);\n level = option.children ?? [];\n }\n return path;\n}\n\nexport const Cascader = forwardRef<HTMLButtonElement, CascaderProps>(function Cascader(\n rawProps: CascaderProps,\n forwardedRef,\n) {\n const {\n options: suppliedOptions,\n value,\n defaultValue = emptyPath,\n size = 'md',\n status: statusProp,\n placeholder,\n name,\n form,\n required: requiredProp,\n allowClear = true,\n disabled: disabledProp,\n className,\n style,\n onChange,\n onOpenChange,\n open: controlledOpen,\n defaultOpen,\n multiple = false,\n readOnly,\n showSearch,\n changeOnSelect,\n displayRender,\n optionRender,\n loadData,\n onLoadError,\n cacheKey,\n tagWrap = true,\n maxTagCount,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onClick,\n onKeyDown,\n 'aria-label': ariaLabel,\n id: idProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('Cascader', rawProps);\n const { messages, direction } = useLeafConfig();\n const format = useFormattedText();\n const [loaded, setLoaded] = useState(new Map<string, readonly CascaderOption[]>());\n const [loading, setLoading] = useState(new Set<string>());\n const requests = useRef(new Map<string, AbortController>());\n // biome-ignore lint/correctness/useExhaustiveDependencies: Invalidate lazy children and abort requests when the source or explicit cache version changes.\n useEffect(() => {\n for (const request of requests.current.values()) request.abort();\n requests.current.clear();\n setLoaded(new Map());\n setLoading(new Set());\n return () => {\n for (const request of requests.current.values()) request.abort();\n };\n }, [suppliedOptions, loadData, cacheKey]);\n const options = useMemo(() => {\n const merge = (entries: readonly CascaderOption[]): CascaderOption[] =>\n entries.map((option) => {\n const children = option.children ?? loaded.get(option.value);\n return children\n ? { ...option, children: merge(children), isLeaf: !children.length }\n : option;\n });\n return merge(suppliedOptions);\n }, [suppliedOptions, loaded]);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const required = requiredProp ?? field?.required;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const id = idProp ?? field?.id;\n const ariaDescribedBy =\n [ariaDescribedByProp, field?.descriptionId].filter(Boolean).join(' ') || undefined;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(triggerRef, forwardedRef);\n const panelId = `${useId()}-cascader`;\n const [selectedValue, setSelectedValue] = useFieldValue<\n readonly string[] | readonly (readonly string[])[]\n >(value, defaultValue, triggerRef, form);\n const paths = multiple\n ? (selectedValue as readonly (readonly string[])[])\n : selectedValue.length\n ? [selectedValue as readonly string[]]\n : [];\n const [draft, setDraft] = useState<readonly string[]>(paths[0] ?? []);\n const [query, setQuery] = useState('');\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [focusLevel, setFocusLevel] = useState<number | null>(null);\n const selectedPaths = paths.map((path) => resolvePath(options, path));\n const caption = (path: CascaderOption[]) =>\n displayRender?.(\n path.map((option) => option.label),\n path,\n ) ??\n path\n .map(\n (option) =>\n option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / ');\n const searchResults: CascaderOption[][] = [];\n const visit = (entries: readonly CascaderOption[], path: CascaderOption[]) => {\n for (const entry of entries) {\n const next = [...path, entry];\n if (entry.disabled) continue;\n if (changeOnSelect || (!entry.children?.length && (!loadData || entry.isLeaf !== false))) {\n if (\n next\n .map(\n (option) =>\n option.searchLabel ??\n (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / ')\n .toLocaleLowerCase()\n .includes(query.toLocaleLowerCase())\n )\n searchResults.push(next);\n }\n if (entry.children) visit(entry.children, next);\n }\n };\n if (query) visit(options, []);\n const draftOptions = resolvePath(options, draft);\n const levels: (readonly CascaderOption[])[] = [options];\n for (const option of draftOptions) if (option.children?.length) levels.push(option.children);\n const close = () => {\n setOpen(false);\n };\n useFloatingDismiss(open, close, triggerRef, panelRef);\n useEffect(() => {\n if (open && focusLevel !== null) {\n const column = panelRef.current?.querySelector<HTMLElement>(`[data-level='${focusLevel}']`);\n const option =\n column?.querySelector<HTMLButtonElement>('button[aria-selected=\"true\"]:not(:disabled)') ??\n column?.querySelector<HTMLButtonElement>('button:not(:disabled)');\n option?.focus();\n option?.scrollIntoView?.({ block: 'nearest' });\n setFocusLevel(null);\n }\n }, [open, focusLevel]);\n\n const openPanel = () => {\n if (disabled) return;\n setDraft(paths[0] ?? []);\n setFocusLevel(0);\n setOpen(true);\n };\n const choose = (option: CascaderOption, level: number) => {\n if (option.disabled || disabled || readOnly) return;\n const next = [...draft.slice(0, level), option.value];\n setDraft(next);\n if (\n loadData &&\n option.isLeaf === false &&\n option.children === undefined &&\n !requests.current.has(option.value)\n ) {\n const request = new AbortController();\n requests.current.set(option.value, request);\n setLoading((previous) => new Set(previous).add(option.value));\n void loadData(option, request.signal)\n .then((children) => {\n if (!request.signal.aborted)\n setLoaded((previous) => new Map(previous).set(option.value, children));\n })\n .catch((error) => {\n if (!request.signal.aborted) onLoadError?.(error, option);\n })\n .finally(() => {\n if (requests.current.get(option.value) === request) {\n requests.current.delete(option.value);\n setLoading((previous) => {\n const next = new Set(previous);\n next.delete(option.value);\n return next;\n });\n }\n });\n return;\n }\n if (changeOnSelect || (!option.children?.length && option.isLeaf !== false))\n commit(next, !option.children?.length);\n };\n const commit = (path: string[], leaf = true) => {\n if (disabled || readOnly) return;\n const next = multiple\n ? paths.some((current) => JSON.stringify(current) === JSON.stringify(path))\n ? paths\n .filter((current) => JSON.stringify(current) !== JSON.stringify(path))\n .map((current) => [...current])\n : [...paths.map((current) => [...current]), path]\n : path;\n setSelectedValue(next);\n (\n onChange as\n | ((value: string[] | string[][], options: CascaderOption[] | CascaderOption[][]) => void)\n | undefined\n )?.(\n next,\n multiple\n ? (next as string[][]).map((path) => resolvePath(options, path))\n : resolvePath(options, path),\n );\n if (!multiple && leaf) {\n close();\n triggerRef.current?.focus();\n }\n };\n\n return (\n <div\n className={classes(\n 'leaf-cascader',\n `leaf-cascader--${size}`,\n multiple && 'leaf-cascader--multiple',\n className,\n )}\n style={style}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && selectedValue.length && !disabled && !readOnly ? '' : undefined}\n >\n <button\n {...props}\n ref={ref}\n type=\"button\"\n form={form}\n className=\"leaf-cascader__trigger\"\n disabled={disabled}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={panelId}\n aria-label={ariaLabel}\n id={id}\n aria-describedby={ariaDescribedBy}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n aria-required={required || undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n if (open) close();\n else openPanel();\n }\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) openPanel();\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n close();\n }\n }}\n >\n {multiple && selectedPaths.length ? (\n <SelectionContent\n className=\"leaf-cascader__value\"\n tagClassName=\"leaf-cascader__tag\"\n tagWrap={tagWrap}\n maxTagCount={maxTagCount}\n items={selectedPaths.map((path, index) => ({\n key: JSON.stringify(paths[index]),\n label: caption(path),\n text: path\n .map(\n (option) =>\n option.searchLabel ??\n (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / '),\n }))}\n />\n ) : (\n <span\n className={classes(\n 'leaf-cascader__value',\n !selectedPaths.length && 'leaf-cascader__placeholder',\n )}\n >\n {selectedPaths.length\n ? selectedPaths.map((path, index) => (\n <span key={paths[index]?.join('/')}>\n {index > 0 ? '、' : ''}\n {caption(path)}\n </span>\n ))\n : placeholder || messages.cascader.placeholder}\n </span>\n )}\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n {allowClear && selectedValue.length > 0 && !disabled && !readOnly && (\n <ClearButton\n label={messages.cascader.clear}\n beforeArrow\n onClear={() => {\n setSelectedValue([]);\n setDraft([]);\n (onChange as ((value: [], options: []) => void) | undefined)?.([], []);\n close();\n triggerRef.current?.focus();\n }}\n />\n )}\n <FormValue\n name={name}\n form={form}\n required={required}\n disabled={disabled}\n value={selectedValue.length ? JSON.stringify(selectedValue) : ''}\n triggerRef={triggerRef}\n />\n <FloatingPanel\n placement={popupPlacement}\n container={getPopupContainer}\n render={popupRender}\n style={popupStyle}\n open={open}\n triggerRef={triggerRef}\n panelRef={panelRef}\n id={panelId}\n className={classes('leaf-floating leaf-cascader__panel', popupClassName)}\n role=\"dialog\"\n aria-label={ariaLabel || messages.cascader.placeholder}\n >\n {showSearch && (\n <FieldScope>\n <div className=\"leaf-cascader__search\">\n <InputControl\n allowClear\n aria-label={messages.common.search}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n </FieldScope>\n )}\n {query ? (\n <Scrollbar\n role=\"listbox\"\n aria-label={messages.common.search}\n className=\"leaf-cascader__column\"\n orientation=\"vertical\"\n maxHeight={256}\n >\n {searchResults.length ? (\n searchResults.map((path) => (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={paths.some(\n (current) =>\n JSON.stringify(current) ===\n JSON.stringify(path.map((option) => option.value)),\n )}\n className=\"leaf-floating__option\"\n key={path.map((option) => option.value).join('/')}\n onClick={() => commit(path.map((option) => option.value))}\n >\n {caption(path)}\n </button>\n ))\n ) : (\n <div className=\"leaf-floating__empty\">{messages.cascader.empty}</div>\n )}\n </Scrollbar>\n ) : (\n <div className=\"leaf-cascader__columns\">\n {levels.map((level, depth) => (\n <Scrollbar\n key={depth === 0 ? 'root' : draft[depth - 1]}\n className=\"leaf-cascader__column\"\n orientation=\"vertical\"\n maxHeight={256}\n data-level={depth}\n role=\"listbox\"\n aria-label={format('cascader.level', { level: depth + 1 })}\n >\n {level.length ? (\n level.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n className=\"leaf-floating__option\"\n aria-selected={draft[depth] === option.value}\n disabled={option.disabled}\n tabIndex={\n option.value ===\n (draft[depth] ?? level.find((item) => !item.disabled)?.value)\n ? 0\n : -1\n }\n onClick={() => {\n choose(option, depth);\n if (option.children?.length) setFocusLevel(depth + 1);\n }}\n onKeyDown={(event) => {\n if (\n event.key === (direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight') &&\n (option.children?.length || option.isLeaf === false)\n ) {\n event.preventDefault();\n choose(option, depth);\n setFocusLevel(depth + 1);\n } else if (\n event.key === (direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft') &&\n depth > 0\n ) {\n event.preventDefault();\n setFocusLevel(depth - 1);\n } else if (['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n event.preventDefault();\n const items = Array.from(\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>(\n 'button:not(:disabled)',\n ) ?? [],\n );\n const index = items.indexOf(event.currentTarget);\n const next =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : (index + (event.key === 'ArrowDown' ? 1 : -1) + items.length) %\n items.length;\n items[next]?.focus();\n items[next]?.scrollIntoView?.({ block: 'nearest' });\n }\n }}\n >\n <span>{optionRender?.(option) ?? option.label}</span>\n {loading.has(option.value) ? (\n <LoaderCircle size={14} className=\"leaf-select__spinner\" />\n ) : option.children?.length || option.isLeaf === false ? (\n <ChevronRight size={14} aria-hidden=\"true\" />\n ) : (\n (multiple\n ? paths.some(\n (path) =>\n JSON.stringify(path) ===\n JSON.stringify([...draft.slice(0, depth), option.value]),\n )\n : draft[depth] === option.value) && (\n <Check size={14} className=\"leaf-cascader__check\" aria-hidden=\"true\" />\n )\n )}\n </button>\n ))\n ) : (\n <div className=\"leaf-floating__empty\">{messages.cascader.empty}</div>\n )}\n </Scrollbar>\n ))}\n </div>\n )}\n </FloatingPanel>\n </div>\n );\n});\nCascader.displayName = 'Cascader';\n"],"names":["emptyPath","resolvePath","options","values","path","level","value","option","item","Cascader","forwardRef","rawProps","forwardedRef","suppliedOptions","defaultValue","size","statusProp","placeholder","name","form","requiredProp","allowClear","disabledProp","className","style","onChange","onOpenChange","controlledOpen","defaultOpen","multiple","readOnly","showSearch","changeOnSelect","displayRender","optionRender","loadData","onLoadError","cacheKey","tagWrap","maxTagCount","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onClick","onKeyDown","ariaLabel","idProp","ariaDescribedByProp","ariaInvalid","props","useComponentProps","messages","direction","useLeafConfig","format","useFormattedText","loaded","setLoaded","useState","Map","loading","setLoading","Set","requests","useRef","useEffect","request","useMemo","merge","entries","children","field","useFormField","disabled","required","status","undefined","id","ariaDescribedBy","Boolean","triggerRef","panelRef","ref","useMergedRef","panelId","useId","selectedValue","setSelectedValue","useFieldValue","paths","draft","setDraft","query","setQuery","open","setOpen","usePopupState","focusLevel","setFocusLevel","selectedPaths","caption","searchResults","visit","entry","next","draftOptions","levels","close","useFloatingDismiss","column","openPanel","choose","AbortController","previous","error","commit","leaf","current","JSON","classes","event","SelectionContent","index","ChevronDown","ClearButton","FormValue","FloatingPanel","FieldScope","InputControl","Scrollbar","depth","items","Array","LoaderCircle","ChevronRight","Check"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cascader/cascader.js","sources":["../../../../../src/cascader/cascader.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronRight, LoaderCircle } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n forwardRef,\n type ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useComponentProps } from '../config-provider/component-defaults';\nimport { useLeafConfig } from '../config-provider/context';\nimport { FieldScope, useFormField } from '../form/form';\nimport { InputControl } from '../input/input';\nimport { ScrollbarControl as Scrollbar } from '../scrollbar/scrollbar';\nimport { classes } from '../shared/classes';\nimport { ClearButton } from '../shared/clear-button';\nimport { FormValue, useFieldValue, useMergedRef } from '../shared/field';\nimport {\n FloatingPanel,\n type PopupOptions,\n useFloatingDismiss,\n usePopupState,\n} from '../shared/floating';\nimport { SelectionContent } from '../shared/selection-content';\nimport type { ControlSize, ControlStatus } from '../shared/types';\nimport { useFormattedText } from '../shared/use-formatted-text';\n\nexport interface CascaderOption {\n value: string;\n label: ReactNode;\n searchLabel?: string;\n isLeaf?: boolean;\n disabled?: boolean;\n children?: readonly CascaderOption[];\n}\n\ninterface CascaderBaseProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'type' | 'value' | 'defaultValue' | 'onChange' | 'children'\n >,\n PopupOptions {\n options: readonly CascaderOption[];\n size?: ControlSize;\n status?: ControlStatus;\n placeholder?: string;\n name?: string;\n required?: boolean;\n allowClear?: boolean;\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n defaultOpen?: boolean;\n readOnly?: boolean;\n showSearch?: boolean;\n changeOnSelect?: boolean;\n displayRender?: (labels: ReactNode[], selectedOptions: CascaderOption[]) => ReactNode;\n optionRender?: (option: CascaderOption) => ReactNode;\n loadData?: (option: CascaderOption, signal: AbortSignal) => Promise<readonly CascaderOption[]>;\n onLoadError?: (error: unknown, option: CascaderOption) => void;\n cacheKey?: string | number;\n tagWrap?: boolean;\n maxTagCount?: number | 'responsive';\n popupWidth?: number | string;\n popupMaxWidth?: number | string;\n}\nexport type CascaderProps = CascaderBaseProps &\n (\n | {\n multiple?: false;\n value?: readonly string[];\n defaultValue?: readonly string[];\n onChange?: (value: string[], selectedOptions: CascaderOption[]) => void;\n }\n | {\n multiple: true;\n value?: readonly (readonly string[])[];\n defaultValue?: readonly (readonly string[])[];\n onChange?: (value: string[][], selectedOptions: CascaderOption[][]) => void;\n }\n );\n\nconst emptyPath: readonly string[] = [];\nfunction resolvePath(options: readonly CascaderOption[], values: readonly string[]) {\n const path: CascaderOption[] = [];\n let level = options;\n for (const value of values) {\n const option = level.find((item) => item.value === value);\n if (!option) break;\n path.push(option);\n level = option.children ?? [];\n }\n return path;\n}\n\nexport const Cascader = forwardRef<HTMLButtonElement, CascaderProps>(function Cascader(\n rawProps: CascaderProps,\n forwardedRef,\n) {\n const {\n options: suppliedOptions,\n value,\n defaultValue = emptyPath,\n size = 'md',\n status: statusProp,\n placeholder,\n name,\n form,\n required: requiredProp,\n allowClear = true,\n disabled: disabledProp,\n className,\n style,\n onChange,\n onOpenChange,\n open: controlledOpen,\n defaultOpen,\n multiple = false,\n readOnly,\n showSearch,\n changeOnSelect,\n displayRender,\n optionRender,\n loadData,\n onLoadError,\n cacheKey,\n tagWrap = true,\n maxTagCount,\n popupWidth = 'trigger',\n popupMaxWidth,\n popupPlacement,\n popupClassName,\n popupStyle,\n popupRender,\n getPopupContainer,\n onClick,\n onKeyDown,\n 'aria-label': ariaLabel,\n id: idProp,\n 'aria-describedby': ariaDescribedByProp,\n 'aria-invalid': ariaInvalid,\n ...props\n } = useComponentProps('Cascader', rawProps);\n const { messages, direction } = useLeafConfig();\n const format = useFormattedText();\n const [loaded, setLoaded] = useState(new Map<string, readonly CascaderOption[]>());\n const [loading, setLoading] = useState(new Set<string>());\n const requests = useRef(new Map<string, AbortController>());\n // biome-ignore lint/correctness/useExhaustiveDependencies: Invalidate lazy children and abort requests when the source or explicit cache version changes.\n useEffect(() => {\n for (const request of requests.current.values()) request.abort();\n requests.current.clear();\n setLoaded(new Map());\n setLoading(new Set());\n return () => {\n for (const request of requests.current.values()) request.abort();\n };\n }, [suppliedOptions, loadData, cacheKey]);\n const options = useMemo(() => {\n const merge = (entries: readonly CascaderOption[]): CascaderOption[] =>\n entries.map((option) => {\n const children = option.children ?? loaded.get(option.value);\n return children\n ? { ...option, children: merge(children), isLeaf: !children.length }\n : option;\n });\n return merge(suppliedOptions);\n }, [suppliedOptions, loaded]);\n const field = useFormField();\n const disabled = disabledProp || field?.disabled;\n const required = requiredProp ?? field?.required;\n const status = statusProp ?? (field?.error ? 'error' : undefined);\n const id = idProp ?? field?.id;\n const ariaDescribedBy =\n [ariaDescribedByProp, field?.descriptionId].filter(Boolean).join(' ') || undefined;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const ref = useMergedRef(triggerRef, forwardedRef);\n const panelId = `${useId()}-cascader`;\n const [selectedValue, setSelectedValue] = useFieldValue<\n readonly string[] | readonly (readonly string[])[]\n >(value, defaultValue, triggerRef, form);\n const paths = multiple\n ? (selectedValue as readonly (readonly string[])[])\n : selectedValue.length\n ? [selectedValue as readonly string[]]\n : [];\n const [draft, setDraft] = useState<readonly string[]>(paths[0] ?? []);\n const [query, setQuery] = useState('');\n const [open, setOpen] = usePopupState(\n disabled || readOnly,\n onOpenChange,\n controlledOpen,\n defaultOpen,\n );\n const [focusLevel, setFocusLevel] = useState<number | null>(null);\n const selectedPaths = paths.map((path) => resolvePath(options, path));\n const caption = (path: CascaderOption[]) =>\n displayRender?.(\n path.map((option) => option.label),\n path,\n ) ??\n path\n .map(\n (option) =>\n option.searchLabel ?? (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / ');\n const searchResults: CascaderOption[][] = [];\n const visit = (entries: readonly CascaderOption[], path: CascaderOption[]) => {\n for (const entry of entries) {\n const next = [...path, entry];\n if (entry.disabled) continue;\n if (changeOnSelect || (!entry.children?.length && (!loadData || entry.isLeaf !== false))) {\n if (\n next\n .map(\n (option) =>\n option.searchLabel ??\n (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / ')\n .toLocaleLowerCase()\n .includes(query.toLocaleLowerCase())\n )\n searchResults.push(next);\n }\n if (entry.children) visit(entry.children, next);\n }\n };\n if (query) visit(options, []);\n const draftOptions = resolvePath(options, draft);\n const levels: (readonly CascaderOption[])[] = [options];\n for (const option of draftOptions) if (option.children?.length) levels.push(option.children);\n const close = () => {\n setOpen(false);\n };\n useFloatingDismiss(open, close, triggerRef, panelRef);\n useEffect(() => {\n if (open && focusLevel !== null) {\n const column = panelRef.current?.querySelector<HTMLElement>(`[data-level='${focusLevel}']`);\n const option =\n column?.querySelector<HTMLButtonElement>('button[aria-selected=\"true\"]:not(:disabled)') ??\n column?.querySelector<HTMLButtonElement>('button:not(:disabled)');\n option?.focus();\n option?.scrollIntoView?.({ block: 'nearest' });\n setFocusLevel(null);\n }\n }, [open, focusLevel]);\n\n const openPanel = () => {\n if (disabled) return;\n setDraft(paths[0] ?? []);\n setFocusLevel(0);\n setOpen(true);\n };\n const choose = (option: CascaderOption, level: number) => {\n if (option.disabled || disabled || readOnly) return;\n const next = [...draft.slice(0, level), option.value];\n setDraft(next);\n if (\n loadData &&\n option.isLeaf === false &&\n option.children === undefined &&\n !requests.current.has(option.value)\n ) {\n const request = new AbortController();\n requests.current.set(option.value, request);\n setLoading((previous) => new Set(previous).add(option.value));\n void loadData(option, request.signal)\n .then((children) => {\n if (!request.signal.aborted)\n setLoaded((previous) => new Map(previous).set(option.value, children));\n })\n .catch((error) => {\n if (!request.signal.aborted) onLoadError?.(error, option);\n })\n .finally(() => {\n if (requests.current.get(option.value) === request) {\n requests.current.delete(option.value);\n setLoading((previous) => {\n const next = new Set(previous);\n next.delete(option.value);\n return next;\n });\n }\n });\n return;\n }\n if (changeOnSelect || (!option.children?.length && option.isLeaf !== false))\n commit(next, !option.children?.length);\n };\n const commit = (path: string[], leaf = true) => {\n if (disabled || readOnly) return;\n const next = multiple\n ? paths.some((current) => JSON.stringify(current) === JSON.stringify(path))\n ? paths\n .filter((current) => JSON.stringify(current) !== JSON.stringify(path))\n .map((current) => [...current])\n : [...paths.map((current) => [...current]), path]\n : path;\n setSelectedValue(next);\n (\n onChange as\n | ((value: string[] | string[][], options: CascaderOption[] | CascaderOption[][]) => void)\n | undefined\n )?.(\n next,\n multiple\n ? (next as string[][]).map((path) => resolvePath(options, path))\n : resolvePath(options, path),\n );\n if (!multiple && leaf) {\n close();\n triggerRef.current?.focus();\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={classes(\n 'leaf-cascader',\n `leaf-cascader--${size}`,\n multiple && 'leaf-cascader--multiple',\n className,\n )}\n style={style}\n dir={props.dir ?? direction}\n data-status={status}\n data-disabled={disabled ? '' : undefined}\n data-open={open ? '' : undefined}\n data-clearable={allowClear && selectedValue.length && !disabled && !readOnly ? '' : undefined}\n >\n <button\n {...props}\n dir={props.dir ?? direction}\n ref={ref}\n type=\"button\"\n form={form}\n className=\"leaf-cascader__trigger\"\n disabled={disabled}\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={panelId}\n aria-label={ariaLabel}\n id={id}\n aria-describedby={ariaDescribedBy}\n aria-invalid={status === 'error' ? true : ariaInvalid}\n aria-required={required || undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n if (open) close();\n else openPanel();\n }\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) openPanel();\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n close();\n }\n }}\n >\n {multiple && selectedPaths.length ? (\n <SelectionContent\n className=\"leaf-cascader__value\"\n tagClassName=\"leaf-cascader__tag\"\n tagWrap={tagWrap}\n maxTagCount={maxTagCount}\n items={selectedPaths.map((path, index) => ({\n key: JSON.stringify(paths[index]),\n label: caption(path),\n text: path\n .map(\n (option) =>\n option.searchLabel ??\n (typeof option.label === 'string' ? option.label : option.value),\n )\n .join(' / '),\n }))}\n />\n ) : (\n <span\n className={classes(\n 'leaf-cascader__value',\n !selectedPaths.length && 'leaf-cascader__placeholder',\n )}\n >\n {selectedPaths.length\n ? selectedPaths.map((path, index) => (\n <span key={paths[index]?.join('/')}>\n {index > 0 ? '、' : ''}\n {caption(path)}\n </span>\n ))\n : placeholder || messages.cascader.placeholder}\n </span>\n )}\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n {allowClear && selectedValue.length > 0 && !disabled && !readOnly && (\n <ClearButton\n label={messages.cascader.clear}\n beforeArrow\n onClear={() => {\n setSelectedValue([]);\n setDraft([]);\n (onChange as ((value: [], options: []) => void) | undefined)?.([], []);\n close();\n triggerRef.current?.focus();\n }}\n />\n )}\n <FormValue\n name={name}\n form={form}\n required={required}\n disabled={disabled}\n value={selectedValue.length ? JSON.stringify(selectedValue) : ''}\n triggerRef={triggerRef}\n />\n <FloatingPanel\n placement={popupPlacement}\n container={getPopupContainer}\n render={popupRender}\n style={popupStyle}\n open={open}\n triggerRef={rootRef}\n panelRef={panelRef}\n matchWidth={popupWidth === 'trigger'}\n width={\n popupWidth === 'trigger' ? undefined : popupWidth === 'auto' ? 'max-content' : popupWidth\n }\n maxWidth={popupMaxWidth}\n id={panelId}\n className={classes('leaf-floating leaf-cascader__panel', popupClassName)}\n role=\"dialog\"\n aria-label={ariaLabel || messages.cascader.placeholder}\n >\n {showSearch && (\n <FieldScope>\n <div className=\"leaf-cascader__search\">\n <InputControl\n allowClear\n aria-label={messages.common.search}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n </FieldScope>\n )}\n {query ? (\n <Scrollbar\n role=\"listbox\"\n aria-label={messages.common.search}\n className=\"leaf-cascader__column\"\n orientation=\"vertical\"\n maxHeight={256}\n >\n {searchResults.length ? (\n searchResults.map((path) => (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={paths.some(\n (current) =>\n JSON.stringify(current) ===\n JSON.stringify(path.map((option) => option.value)),\n )}\n className=\"leaf-floating__option\"\n key={path.map((option) => option.value).join('/')}\n onClick={() => commit(path.map((option) => option.value))}\n >\n {caption(path)}\n </button>\n ))\n ) : (\n <div className=\"leaf-floating__empty\">{messages.cascader.empty}</div>\n )}\n </Scrollbar>\n ) : (\n <div className=\"leaf-cascader__columns\">\n {levels.map((level, depth) => (\n <Scrollbar\n key={depth === 0 ? 'root' : draft[depth - 1]}\n className=\"leaf-cascader__column\"\n orientation=\"vertical\"\n maxHeight={256}\n data-level={depth}\n role=\"listbox\"\n aria-label={format('cascader.level', { level: depth + 1 })}\n >\n {level.length ? (\n level.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n className=\"leaf-floating__option\"\n aria-selected={draft[depth] === option.value}\n disabled={option.disabled}\n tabIndex={\n option.value ===\n (draft[depth] ?? level.find((item) => !item.disabled)?.value)\n ? 0\n : -1\n }\n onClick={() => {\n choose(option, depth);\n if (option.children?.length) setFocusLevel(depth + 1);\n }}\n onKeyDown={(event) => {\n if (\n event.key === (direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight') &&\n (option.children?.length || option.isLeaf === false)\n ) {\n event.preventDefault();\n choose(option, depth);\n setFocusLevel(depth + 1);\n } else if (\n event.key === (direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft') &&\n depth > 0\n ) {\n event.preventDefault();\n setFocusLevel(depth - 1);\n } else if (['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n event.preventDefault();\n const items = Array.from(\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>(\n 'button:not(:disabled)',\n ) ?? [],\n );\n const index = items.indexOf(event.currentTarget);\n const next =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : (index + (event.key === 'ArrowDown' ? 1 : -1) + items.length) %\n items.length;\n items[next]?.focus();\n items[next]?.scrollIntoView?.({ block: 'nearest' });\n }\n }}\n >\n <span>{optionRender?.(option) ?? option.label}</span>\n {loading.has(option.value) ? (\n <LoaderCircle size={14} className=\"leaf-select__spinner\" />\n ) : option.children?.length || option.isLeaf === false ? (\n <ChevronRight size={14} aria-hidden=\"true\" />\n ) : (\n (multiple\n ? paths.some(\n (path) =>\n JSON.stringify(path) ===\n JSON.stringify([...draft.slice(0, depth), option.value]),\n )\n : draft[depth] === option.value) && (\n <Check size={14} className=\"leaf-cascader__check\" aria-hidden=\"true\" />\n )\n )}\n </button>\n ))\n ) : (\n <div className=\"leaf-floating__empty\">{messages.cascader.empty}</div>\n )}\n </Scrollbar>\n ))}\n </div>\n )}\n </FloatingPanel>\n </div>\n );\n});\nCascader.displayName = 'Cascader';\n"],"names":["emptyPath","resolvePath","options","values","path","level","value","option","item","Cascader","forwardRef","rawProps","forwardedRef","suppliedOptions","defaultValue","size","statusProp","placeholder","name","form","requiredProp","allowClear","disabledProp","className","style","onChange","onOpenChange","controlledOpen","defaultOpen","multiple","readOnly","showSearch","changeOnSelect","displayRender","optionRender","loadData","onLoadError","cacheKey","tagWrap","maxTagCount","popupWidth","popupMaxWidth","popupPlacement","popupClassName","popupStyle","popupRender","getPopupContainer","onClick","onKeyDown","ariaLabel","idProp","ariaDescribedByProp","ariaInvalid","props","useComponentProps","messages","direction","useLeafConfig","format","useFormattedText","loaded","setLoaded","useState","Map","loading","setLoading","Set","requests","useRef","useEffect","request","useMemo","merge","entries","children","field","useFormField","disabled","required","status","undefined","id","ariaDescribedBy","Boolean","triggerRef","rootRef","panelRef","ref","useMergedRef","panelId","useId","selectedValue","setSelectedValue","useFieldValue","paths","draft","setDraft","query","setQuery","open","setOpen","usePopupState","focusLevel","setFocusLevel","selectedPaths","caption","searchResults","visit","entry","next","draftOptions","levels","close","useFloatingDismiss","column","openPanel","choose","AbortController","previous","error","commit","leaf","current","JSON","classes","event","SelectionContent","index","ChevronDown","ClearButton","FormValue","FloatingPanel","FieldScope","InputControl","Scrollbar","depth","items","Array","LoaderCircle","ChevronRight","Check"],"mappings":"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"}
|