@miaixz/ui 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +7 -0
- package/README.md +190 -0
- package/dist/accessibility/focus-scope.d.ts +57 -0
- package/dist/accessibility/focus-scope.d.ts.map +1 -0
- package/dist/accessibility/focus-scope.js +272 -0
- package/dist/accessibility/focus-scope.js.map +1 -0
- package/dist/accessibility/index.d.ts +2 -0
- package/dist/accessibility/index.d.ts.map +1 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts +8 -0
- package/dist/components/alert/alert.d.ts.map +1 -0
- package/dist/components/alert/alert.js +24 -0
- package/dist/components/alert/alert.js.map +1 -0
- package/dist/components/alert/alert.types.d.ts +43 -0
- package/dist/components/alert/alert.types.d.ts.map +1 -0
- package/dist/components/alert/alert.types.js +2 -0
- package/dist/components/alert/alert.types.js.map +1 -0
- package/dist/components/alert/index.d.ts +4 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +2 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/avatar/avatar.d.ts +8 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -0
- package/dist/components/avatar/avatar.js +29 -0
- package/dist/components/avatar/avatar.js.map +1 -0
- package/dist/components/avatar/avatar.types.d.ts +35 -0
- package/dist/components/avatar/avatar.types.d.ts.map +1 -0
- package/dist/components/avatar/avatar.types.js +2 -0
- package/dist/components/avatar/avatar.types.js.map +1 -0
- package/dist/components/avatar/index.d.ts +4 -0
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +2 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/badge/badge.d.ts +8 -0
- package/dist/components/badge/badge.d.ts.map +1 -0
- package/dist/components/badge/badge.js +12 -0
- package/dist/components/badge/badge.js.map +1 -0
- package/dist/components/badge/badge.types.d.ts +37 -0
- package/dist/components/badge/badge.types.d.ts.map +1 -0
- package/dist/components/badge/badge.types.js +2 -0
- package/dist/components/badge/badge.types.js.map +1 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.d.ts.map +1 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/badge/index.js.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +14 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.js +22 -0
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.types.d.ts +30 -0
- package/dist/components/breadcrumb/breadcrumb.types.d.ts.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.types.js +2 -0
- package/dist/components/breadcrumb/breadcrumb.types.js.map +1 -0
- package/dist/components/breadcrumb/index.d.ts +3 -0
- package/dist/components/breadcrumb/index.d.ts.map +1 -0
- package/dist/components/breadcrumb/index.js +2 -0
- package/dist/components/breadcrumb/index.js.map +1 -0
- package/dist/components/button/button.d.ts +8 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/button.js +16 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/button/button.types.d.ts +99 -0
- package/dist/components/button/button.types.d.ts.map +1 -0
- package/dist/components/button/button.types.js +2 -0
- package/dist/components/button/button.types.js.map +1 -0
- package/dist/components/button/index.d.ts +3 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/index.js +2 -0
- package/dist/components/button/index.js.map +1 -0
- package/dist/components/checkbox/checkbox.d.ts +8 -0
- package/dist/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox.js +18 -0
- package/dist/components/checkbox/checkbox.js.map +1 -0
- package/dist/components/checkbox/checkbox.types.d.ts +23 -0
- package/dist/components/checkbox/checkbox.types.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox.types.js +2 -0
- package/dist/components/checkbox/checkbox.types.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +3 -0
- package/dist/components/checkbox/index.d.ts.map +1 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/checkbox/index.js.map +1 -0
- package/dist/components/combobox/combobox.d.ts +123 -0
- package/dist/components/combobox/combobox.d.ts.map +1 -0
- package/dist/components/combobox/combobox.js +378 -0
- package/dist/components/combobox/combobox.js.map +1 -0
- package/dist/components/combobox/combobox.types.d.ts +108 -0
- package/dist/components/combobox/combobox.types.d.ts.map +1 -0
- package/dist/components/combobox/combobox.types.js +2 -0
- package/dist/components/combobox/combobox.types.js.map +1 -0
- package/dist/components/combobox/index.d.ts +3 -0
- package/dist/components/combobox/index.d.ts.map +1 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/combobox/index.js.map +1 -0
- package/dist/components/confirm-dialog/confirm-dialog.d.ts +10 -0
- package/dist/components/confirm-dialog/confirm-dialog.d.ts.map +1 -0
- package/dist/components/confirm-dialog/confirm-dialog.js +70 -0
- package/dist/components/confirm-dialog/confirm-dialog.js.map +1 -0
- package/dist/components/confirm-dialog/confirm-dialog.types.d.ts +63 -0
- package/dist/components/confirm-dialog/confirm-dialog.types.d.ts.map +1 -0
- package/dist/components/confirm-dialog/confirm-dialog.types.js +2 -0
- package/dist/components/confirm-dialog/confirm-dialog.types.js.map +1 -0
- package/dist/components/confirm-dialog/index.d.ts +3 -0
- package/dist/components/confirm-dialog/index.d.ts.map +1 -0
- package/dist/components/confirm-dialog/index.js +2 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/data-table/data-table.d.ts +9 -0
- package/dist/components/data-table/data-table.d.ts.map +1 -0
- package/dist/components/data-table/data-table.js +198 -0
- package/dist/components/data-table/data-table.js.map +1 -0
- package/dist/components/data-table/data-table.types.d.ts +127 -0
- package/dist/components/data-table/data-table.types.d.ts.map +1 -0
- package/dist/components/data-table/data-table.types.js +2 -0
- package/dist/components/data-table/data-table.types.js.map +1 -0
- package/dist/components/data-table/index.d.ts +3 -0
- package/dist/components/data-table/index.d.ts.map +1 -0
- package/dist/components/data-table/index.js +2 -0
- package/dist/components/data-table/index.js.map +1 -0
- package/dist/components/dialog/dialog.d.ts +8 -0
- package/dist/components/dialog/dialog.d.ts.map +1 -0
- package/dist/components/dialog/dialog.js +45 -0
- package/dist/components/dialog/dialog.js.map +1 -0
- package/dist/components/dialog/dialog.types.d.ts +57 -0
- package/dist/components/dialog/dialog.types.d.ts.map +1 -0
- package/dist/components/dialog/dialog.types.js +2 -0
- package/dist/components/dialog/dialog.types.js.map +1 -0
- package/dist/components/dialog/index.d.ts +3 -0
- package/dist/components/dialog/index.d.ts.map +1 -0
- package/dist/components/dialog/index.js +2 -0
- package/dist/components/dialog/index.js.map +1 -0
- package/dist/components/divider/divider.d.ts +8 -0
- package/dist/components/divider/divider.d.ts.map +1 -0
- package/dist/components/divider/divider.js +12 -0
- package/dist/components/divider/divider.js.map +1 -0
- package/dist/components/divider/divider.types.d.ts +22 -0
- package/dist/components/divider/divider.types.d.ts.map +1 -0
- package/dist/components/divider/divider.types.js +2 -0
- package/dist/components/divider/divider.types.js.map +1 -0
- package/dist/components/divider/index.d.ts +3 -0
- package/dist/components/divider/index.d.ts.map +1 -0
- package/dist/components/divider/index.js +2 -0
- package/dist/components/divider/index.js.map +1 -0
- package/dist/components/drawer/drawer.d.ts +8 -0
- package/dist/components/drawer/drawer.d.ts.map +1 -0
- package/dist/components/drawer/drawer.js +45 -0
- package/dist/components/drawer/drawer.js.map +1 -0
- package/dist/components/drawer/drawer.types.d.ts +69 -0
- package/dist/components/drawer/drawer.types.d.ts.map +1 -0
- package/dist/components/drawer/drawer.types.js +2 -0
- package/dist/components/drawer/drawer.types.js.map +1 -0
- package/dist/components/drawer/index.d.ts +3 -0
- package/dist/components/drawer/index.d.ts.map +1 -0
- package/dist/components/drawer/index.js +2 -0
- package/dist/components/drawer/index.js.map +1 -0
- package/dist/components/dropdown/dropdown.d.ts +26 -0
- package/dist/components/dropdown/dropdown.d.ts.map +1 -0
- package/dist/components/dropdown/dropdown.js +70 -0
- package/dist/components/dropdown/dropdown.js.map +1 -0
- package/dist/components/dropdown/dropdown.types.d.ts +83 -0
- package/dist/components/dropdown/dropdown.types.d.ts.map +1 -0
- package/dist/components/dropdown/dropdown.types.js +2 -0
- package/dist/components/dropdown/dropdown.types.js.map +1 -0
- package/dist/components/dropdown/index.d.ts +3 -0
- package/dist/components/dropdown/index.d.ts.map +1 -0
- package/dist/components/dropdown/index.js +2 -0
- package/dist/components/dropdown/index.js.map +1 -0
- package/dist/components/dropzone/dropzone.d.ts +8 -0
- package/dist/components/dropzone/dropzone.d.ts.map +1 -0
- package/dist/components/dropzone/dropzone.js +98 -0
- package/dist/components/dropzone/dropzone.js.map +1 -0
- package/dist/components/dropzone/dropzone.types.d.ts +40 -0
- package/dist/components/dropzone/dropzone.types.d.ts.map +1 -0
- package/dist/components/dropzone/dropzone.types.js +2 -0
- package/dist/components/dropzone/dropzone.types.js.map +1 -0
- package/dist/components/dropzone/index.d.ts +3 -0
- package/dist/components/dropzone/index.d.ts.map +1 -0
- package/dist/components/dropzone/index.js +2 -0
- package/dist/components/dropzone/index.js.map +1 -0
- package/dist/components/empty-state/empty-state.d.ts +8 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.js +13 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/empty-state.types.d.ts +37 -0
- package/dist/components/empty-state/empty-state.types.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.types.js +2 -0
- package/dist/components/empty-state/empty-state.types.js.map +1 -0
- package/dist/components/empty-state/index.d.ts +3 -0
- package/dist/components/empty-state/index.d.ts.map +1 -0
- package/dist/components/empty-state/index.js +2 -0
- package/dist/components/empty-state/index.js.map +1 -0
- package/dist/components/file-upload/file-upload.d.ts +8 -0
- package/dist/components/file-upload/file-upload.d.ts.map +1 -0
- package/dist/components/file-upload/file-upload.js +359 -0
- package/dist/components/file-upload/file-upload.js.map +1 -0
- package/dist/components/file-upload/file-upload.types.d.ts +91 -0
- package/dist/components/file-upload/file-upload.types.d.ts.map +1 -0
- package/dist/components/file-upload/file-upload.types.js +2 -0
- package/dist/components/file-upload/file-upload.types.js.map +1 -0
- package/dist/components/file-upload/index.d.ts +3 -0
- package/dist/components/file-upload/index.d.ts.map +1 -0
- package/dist/components/file-upload/index.js +2 -0
- package/dist/components/file-upload/index.js.map +1 -0
- package/dist/components/form-field/form-field.d.ts +11 -0
- package/dist/components/form-field/form-field.d.ts.map +1 -0
- package/dist/components/form-field/form-field.js +41 -0
- package/dist/components/form-field/form-field.js.map +1 -0
- package/dist/components/form-field/form-field.types.d.ts +66 -0
- package/dist/components/form-field/form-field.types.d.ts.map +1 -0
- package/dist/components/form-field/form-field.types.js +2 -0
- package/dist/components/form-field/form-field.types.js.map +1 -0
- package/dist/components/form-field/index.d.ts +3 -0
- package/dist/components/form-field/index.d.ts.map +1 -0
- package/dist/components/form-field/index.js +2 -0
- package/dist/components/form-field/index.js.map +1 -0
- package/dist/components/icon/icon.d.ts +14 -0
- package/dist/components/icon/icon.d.ts.map +1 -0
- package/dist/components/icon/icon.js +48 -0
- package/dist/components/icon/icon.js.map +1 -0
- package/dist/components/icon/icon.types.d.ts +69 -0
- package/dist/components/icon/icon.types.d.ts.map +1 -0
- package/dist/components/icon/icon.types.js +2 -0
- package/dist/components/icon/icon.types.js.map +1 -0
- package/dist/components/icon/index.d.ts +3 -0
- package/dist/components/icon/index.d.ts.map +1 -0
- package/dist/components/icon/index.js +2 -0
- package/dist/components/icon/index.js.map +1 -0
- package/dist/components/index.d.ts +46 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +45 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/inline-message/index.d.ts +4 -0
- package/dist/components/inline-message/index.d.ts.map +1 -0
- package/dist/components/inline-message/index.js +2 -0
- package/dist/components/inline-message/index.js.map +1 -0
- package/dist/components/inline-message/inline-message.d.ts +8 -0
- package/dist/components/inline-message/inline-message.d.ts.map +1 -0
- package/dist/components/inline-message/inline-message.js +20 -0
- package/dist/components/inline-message/inline-message.js.map +1 -0
- package/dist/components/inline-message/inline-message.types.d.ts +27 -0
- package/dist/components/inline-message/inline-message.types.d.ts.map +1 -0
- package/dist/components/inline-message/inline-message.types.js +2 -0
- package/dist/components/inline-message/inline-message.types.js.map +1 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/index.js +2 -0
- package/dist/components/input/index.js.map +1 -0
- package/dist/components/input/input.d.ts +8 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/input/input.js +13 -0
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/input/input.types.d.ts +35 -0
- package/dist/components/input/input.types.d.ts.map +1 -0
- package/dist/components/input/input.types.js +2 -0
- package/dist/components/input/input.types.js.map +1 -0
- package/dist/components/list/index.d.ts +3 -0
- package/dist/components/list/index.d.ts.map +1 -0
- package/dist/components/list/index.js +2 -0
- package/dist/components/list/index.js.map +1 -0
- package/dist/components/list/list.d.ts +14 -0
- package/dist/components/list/list.d.ts.map +1 -0
- package/dist/components/list/list.js +21 -0
- package/dist/components/list/list.js.map +1 -0
- package/dist/components/list/list.types.d.ts +72 -0
- package/dist/components/list/list.types.d.ts.map +1 -0
- package/dist/components/list/list.types.js +2 -0
- package/dist/components/list/list.types.js.map +1 -0
- package/dist/components/loading-overlay/index.d.ts +3 -0
- package/dist/components/loading-overlay/index.d.ts.map +1 -0
- package/dist/components/loading-overlay/index.js +2 -0
- package/dist/components/loading-overlay/index.js.map +1 -0
- package/dist/components/loading-overlay/loading-overlay.d.ts +8 -0
- package/dist/components/loading-overlay/loading-overlay.d.ts.map +1 -0
- package/dist/components/loading-overlay/loading-overlay.js +13 -0
- package/dist/components/loading-overlay/loading-overlay.js.map +1 -0
- package/dist/components/loading-overlay/loading-overlay.types.d.ts +28 -0
- package/dist/components/loading-overlay/loading-overlay.types.d.ts.map +1 -0
- package/dist/components/loading-overlay/loading-overlay.types.js +2 -0
- package/dist/components/loading-overlay/loading-overlay.types.js.map +1 -0
- package/dist/components/multi-select/index.d.ts +3 -0
- package/dist/components/multi-select/index.d.ts.map +1 -0
- package/dist/components/multi-select/index.js +2 -0
- package/dist/components/multi-select/index.js.map +1 -0
- package/dist/components/multi-select/multi-select.d.ts +9 -0
- package/dist/components/multi-select/multi-select.d.ts.map +1 -0
- package/dist/components/multi-select/multi-select.js +74 -0
- package/dist/components/multi-select/multi-select.js.map +1 -0
- package/dist/components/multi-select/multi-select.types.d.ts +35 -0
- package/dist/components/multi-select/multi-select.types.d.ts.map +1 -0
- package/dist/components/multi-select/multi-select.types.js +2 -0
- package/dist/components/multi-select/multi-select.types.js.map +1 -0
- package/dist/components/navigation/index.d.ts +3 -0
- package/dist/components/navigation/index.d.ts.map +1 -0
- package/dist/components/navigation/index.js +2 -0
- package/dist/components/navigation/index.js.map +1 -0
- package/dist/components/navigation/navigation.d.ts +14 -0
- package/dist/components/navigation/navigation.d.ts.map +1 -0
- package/dist/components/navigation/navigation.js +29 -0
- package/dist/components/navigation/navigation.js.map +1 -0
- package/dist/components/navigation/navigation.types.d.ts +84 -0
- package/dist/components/navigation/navigation.types.d.ts.map +1 -0
- package/dist/components/navigation/navigation.types.js +2 -0
- package/dist/components/navigation/navigation.types.js.map +1 -0
- package/dist/components/page-layout/index.d.ts +3 -0
- package/dist/components/page-layout/index.d.ts.map +1 -0
- package/dist/components/page-layout/index.js +2 -0
- package/dist/components/page-layout/index.js.map +1 -0
- package/dist/components/page-layout/page-layout.d.ts +74 -0
- package/dist/components/page-layout/page-layout.d.ts.map +1 -0
- package/dist/components/page-layout/page-layout.js +103 -0
- package/dist/components/page-layout/page-layout.js.map +1 -0
- package/dist/components/page-layout/page-layout.types.d.ts +188 -0
- package/dist/components/page-layout/page-layout.types.d.ts.map +1 -0
- package/dist/components/page-layout/page-layout.types.js +2 -0
- package/dist/components/page-layout/page-layout.types.js.map +1 -0
- package/dist/components/pagination/index.d.ts +4 -0
- package/dist/components/pagination/index.d.ts.map +1 -0
- package/dist/components/pagination/index.js +2 -0
- package/dist/components/pagination/index.js.map +1 -0
- package/dist/components/pagination/pagination.d.ts +24 -0
- package/dist/components/pagination/pagination.d.ts.map +1 -0
- package/dist/components/pagination/pagination.js +48 -0
- package/dist/components/pagination/pagination.js.map +1 -0
- package/dist/components/pagination/pagination.types.d.ts +43 -0
- package/dist/components/pagination/pagination.types.d.ts.map +1 -0
- package/dist/components/pagination/pagination.types.js +2 -0
- package/dist/components/pagination/pagination.types.js.map +1 -0
- package/dist/components/panel/index.d.ts +3 -0
- package/dist/components/panel/index.d.ts.map +1 -0
- package/dist/components/panel/index.js +2 -0
- package/dist/components/panel/index.js.map +1 -0
- package/dist/components/panel/panel.d.ts +14 -0
- package/dist/components/panel/panel.d.ts.map +1 -0
- package/dist/components/panel/panel.js +22 -0
- package/dist/components/panel/panel.js.map +1 -0
- package/dist/components/panel/panel.types.d.ts +62 -0
- package/dist/components/panel/panel.types.d.ts.map +1 -0
- package/dist/components/panel/panel.types.js +2 -0
- package/dist/components/panel/panel.types.js.map +1 -0
- package/dist/components/popover/index.d.ts +3 -0
- package/dist/components/popover/index.d.ts.map +1 -0
- package/dist/components/popover/index.js +2 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/popover/popover-context.d.ts +29 -0
- package/dist/components/popover/popover-context.d.ts.map +1 -0
- package/dist/components/popover/popover-context.js +14 -0
- package/dist/components/popover/popover-context.js.map +1 -0
- package/dist/components/popover/popover.d.ts +8 -0
- package/dist/components/popover/popover.d.ts.map +1 -0
- package/dist/components/popover/popover.js +60 -0
- package/dist/components/popover/popover.js.map +1 -0
- package/dist/components/popover/popover.types.d.ts +47 -0
- package/dist/components/popover/popover.types.d.ts.map +1 -0
- package/dist/components/popover/popover.types.js +2 -0
- package/dist/components/popover/popover.types.js.map +1 -0
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.d.ts.map +1 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/progress/index.js.map +1 -0
- package/dist/components/progress/progress.d.ts +8 -0
- package/dist/components/progress/progress.d.ts.map +1 -0
- package/dist/components/progress/progress.js +32 -0
- package/dist/components/progress/progress.js.map +1 -0
- package/dist/components/progress/progress.types.d.ts +36 -0
- package/dist/components/progress/progress.types.d.ts.map +1 -0
- package/dist/components/progress/progress.types.js +2 -0
- package/dist/components/progress/progress.types.js.map +1 -0
- package/dist/components/radio/index.d.ts +3 -0
- package/dist/components/radio/index.d.ts.map +1 -0
- package/dist/components/radio/index.js +2 -0
- package/dist/components/radio/index.js.map +1 -0
- package/dist/components/radio/radio.d.ts +8 -0
- package/dist/components/radio/radio.d.ts.map +1 -0
- package/dist/components/radio/radio.js +12 -0
- package/dist/components/radio/radio.js.map +1 -0
- package/dist/components/radio/radio.types.d.ts +17 -0
- package/dist/components/radio/radio.types.d.ts.map +1 -0
- package/dist/components/radio/radio.types.js +2 -0
- package/dist/components/radio/radio.types.js.map +1 -0
- package/dist/components/search-input/index.d.ts +3 -0
- package/dist/components/search-input/index.d.ts.map +1 -0
- package/dist/components/search-input/index.js +2 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +8 -0
- package/dist/components/search-input/search-input.d.ts.map +1 -0
- package/dist/components/search-input/search-input.js +35 -0
- package/dist/components/search-input/search-input.js.map +1 -0
- package/dist/components/search-input/search-input.types.d.ts +38 -0
- package/dist/components/search-input/search-input.types.d.ts.map +1 -0
- package/dist/components/search-input/search-input.types.js +2 -0
- package/dist/components/search-input/search-input.types.js.map +1 -0
- package/dist/components/select/index.d.ts +3 -0
- package/dist/components/select/index.d.ts.map +1 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/select/index.js.map +1 -0
- package/dist/components/select/select.d.ts +8 -0
- package/dist/components/select/select.d.ts.map +1 -0
- package/dist/components/select/select.js +14 -0
- package/dist/components/select/select.js.map +1 -0
- package/dist/components/select/select.types.d.ts +27 -0
- package/dist/components/select/select.types.d.ts.map +1 -0
- package/dist/components/select/select.types.js +2 -0
- package/dist/components/select/select.types.js.map +1 -0
- package/dist/components/shared.types.d.ts +13 -0
- package/dist/components/shared.types.d.ts.map +1 -0
- package/dist/components/shared.types.js +2 -0
- package/dist/components/shared.types.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/index.js +2 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/skeleton/skeleton.d.ts +8 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +12 -0
- package/dist/components/skeleton/skeleton.js.map +1 -0
- package/dist/components/skeleton/skeleton.types.d.ts +29 -0
- package/dist/components/skeleton/skeleton.types.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.types.js +2 -0
- package/dist/components/skeleton/skeleton.types.js.map +1 -0
- package/dist/components/spinner/index.d.ts +4 -0
- package/dist/components/spinner/index.d.ts.map +1 -0
- package/dist/components/spinner/index.js +2 -0
- package/dist/components/spinner/index.js.map +1 -0
- package/dist/components/spinner/spinner.d.ts +8 -0
- package/dist/components/spinner/spinner.d.ts.map +1 -0
- package/dist/components/spinner/spinner.js +19 -0
- package/dist/components/spinner/spinner.js.map +1 -0
- package/dist/components/spinner/spinner.types.d.ts +27 -0
- package/dist/components/spinner/spinner.types.d.ts.map +1 -0
- package/dist/components/spinner/spinner.types.js +2 -0
- package/dist/components/spinner/spinner.types.js.map +1 -0
- package/dist/components/status-indicator/index.d.ts +4 -0
- package/dist/components/status-indicator/index.d.ts.map +1 -0
- package/dist/components/status-indicator/index.js +2 -0
- package/dist/components/status-indicator/index.js.map +1 -0
- package/dist/components/status-indicator/status-indicator.d.ts +8 -0
- package/dist/components/status-indicator/status-indicator.d.ts.map +1 -0
- package/dist/components/status-indicator/status-indicator.js +12 -0
- package/dist/components/status-indicator/status-indicator.js.map +1 -0
- package/dist/components/status-indicator/status-indicator.types.d.ts +25 -0
- package/dist/components/status-indicator/status-indicator.types.d.ts.map +1 -0
- package/dist/components/status-indicator/status-indicator.types.js +2 -0
- package/dist/components/status-indicator/status-indicator.types.js.map +1 -0
- package/dist/components/switch/index.d.ts +3 -0
- package/dist/components/switch/index.d.ts.map +1 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/switch/index.js.map +1 -0
- package/dist/components/switch/switch.d.ts +8 -0
- package/dist/components/switch/switch.d.ts.map +1 -0
- package/dist/components/switch/switch.js +12 -0
- package/dist/components/switch/switch.js.map +1 -0
- package/dist/components/switch/switch.types.d.ts +17 -0
- package/dist/components/switch/switch.types.d.ts.map +1 -0
- package/dist/components/switch/switch.types.js +2 -0
- package/dist/components/switch/switch.types.js.map +1 -0
- package/dist/components/table/index.d.ts +3 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/table/index.js +2 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table.d.ts +56 -0
- package/dist/components/table/table.d.ts.map +1 -0
- package/dist/components/table/table.js +76 -0
- package/dist/components/table/table.js.map +1 -0
- package/dist/components/table/table.types.d.ts +101 -0
- package/dist/components/table/table.types.d.ts.map +1 -0
- package/dist/components/table/table.types.js +2 -0
- package/dist/components/table/table.types.js.map +1 -0
- package/dist/components/tabs/index.d.ts +3 -0
- package/dist/components/tabs/index.d.ts.map +1 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +26 -0
- package/dist/components/tabs/tabs.d.ts.map +1 -0
- package/dist/components/tabs/tabs.js +122 -0
- package/dist/components/tabs/tabs.js.map +1 -0
- package/dist/components/tabs/tabs.types.d.ts +70 -0
- package/dist/components/tabs/tabs.types.d.ts.map +1 -0
- package/dist/components/tabs/tabs.types.js +2 -0
- package/dist/components/tabs/tabs.types.js.map +1 -0
- package/dist/components/textarea/index.d.ts +3 -0
- package/dist/components/textarea/index.d.ts.map +1 -0
- package/dist/components/textarea/index.js +2 -0
- package/dist/components/textarea/index.js.map +1 -0
- package/dist/components/textarea/textarea.d.ts +8 -0
- package/dist/components/textarea/textarea.d.ts.map +1 -0
- package/dist/components/textarea/textarea.js +13 -0
- package/dist/components/textarea/textarea.js.map +1 -0
- package/dist/components/textarea/textarea.types.d.ts +39 -0
- package/dist/components/textarea/textarea.types.d.ts.map +1 -0
- package/dist/components/textarea/textarea.types.js +2 -0
- package/dist/components/textarea/textarea.types.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toast/index.js.map +1 -0
- package/dist/components/toast/toast.d.ts +24 -0
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +111 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/toast/toast.types.d.ts +103 -0
- package/dist/components/toast/toast.types.d.ts.map +1 -0
- package/dist/components/toast/toast.types.js +2 -0
- package/dist/components/toast/toast.types.js.map +1 -0
- package/dist/components/toolbar/index.d.ts +3 -0
- package/dist/components/toolbar/index.d.ts.map +1 -0
- package/dist/components/toolbar/index.js +2 -0
- package/dist/components/toolbar/index.js.map +1 -0
- package/dist/components/toolbar/toolbar.d.ts +20 -0
- package/dist/components/toolbar/toolbar.d.ts.map +1 -0
- package/dist/components/toolbar/toolbar.js +28 -0
- package/dist/components/toolbar/toolbar.js.map +1 -0
- package/dist/components/toolbar/toolbar.types.d.ts +37 -0
- package/dist/components/toolbar/toolbar.types.d.ts.map +1 -0
- package/dist/components/toolbar/toolbar.types.js +2 -0
- package/dist/components/toolbar/toolbar.types.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +3 -0
- package/dist/components/tooltip/index.d.ts.map +1 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/index.js.map +1 -0
- package/dist/components/tooltip/tooltip.d.ts +8 -0
- package/dist/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.js +84 -0
- package/dist/components/tooltip/tooltip.js.map +1 -0
- package/dist/components/tooltip/tooltip.types.d.ts +34 -0
- package/dist/components/tooltip/tooltip.types.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.types.js +2 -0
- package/dist/components/tooltip/tooltip.types.js.map +1 -0
- package/dist/components/tree-view/index.d.ts +3 -0
- package/dist/components/tree-view/index.d.ts.map +1 -0
- package/dist/components/tree-view/index.js +2 -0
- package/dist/components/tree-view/index.js.map +1 -0
- package/dist/components/tree-view/tree-view.d.ts +9 -0
- package/dist/components/tree-view/tree-view.d.ts.map +1 -0
- package/dist/components/tree-view/tree-view.js +573 -0
- package/dist/components/tree-view/tree-view.js.map +1 -0
- package/dist/components/tree-view/tree-view.types.d.ts +92 -0
- package/dist/components/tree-view/tree-view.types.d.ts.map +1 -0
- package/dist/components/tree-view/tree-view.types.js +2 -0
- package/dist/components/tree-view/tree-view.types.js.map +1 -0
- package/dist/components/visually-hidden/index.d.ts +3 -0
- package/dist/components/visually-hidden/index.d.ts.map +1 -0
- package/dist/components/visually-hidden/index.js +2 -0
- package/dist/components/visually-hidden/index.js.map +1 -0
- package/dist/components/visually-hidden/visually-hidden.d.ts +8 -0
- package/dist/components/visually-hidden/visually-hidden.d.ts.map +1 -0
- package/dist/components/visually-hidden/visually-hidden.js +12 -0
- package/dist/components/visually-hidden/visually-hidden.js.map +1 -0
- package/dist/components/visually-hidden/visually-hidden.types.d.ts +9 -0
- package/dist/components/visually-hidden/visually-hidden.types.d.ts.map +1 -0
- package/dist/components/visually-hidden/visually-hidden.types.js +2 -0
- package/dist/components/visually-hidden/visually-hidden.types.js.map +1 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/ui-error.d.ts +60 -0
- package/dist/errors/ui-error.d.ts.map +1 -0
- package/dist/errors/ui-error.js +219 -0
- package/dist/errors/ui-error.js.map +1 -0
- package/dist/i18n/i18n.d.ts +52 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +156 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/icons/icon-names.d.ts +7 -0
- package/dist/icons/icon-names.d.ts.map +1 -0
- package/dist/icons/icon-names.js +2 -0
- package/dist/icons/icon-names.js.map +1 -0
- package/dist/icons/icon-registry.d.ts +30 -0
- package/dist/icons/icon-registry.d.ts.map +1 -0
- package/dist/icons/icon-registry.js +31 -0
- package/dist/icons/icon-registry.js.map +1 -0
- package/dist/icons/index.d.ts +4 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/class-names.d.ts +8 -0
- package/dist/internal/class-names.d.ts.map +1 -0
- package/dist/internal/class-names.js +10 -0
- package/dist/internal/class-names.js.map +1 -0
- package/dist/internal/menu/index.d.ts +3 -0
- package/dist/internal/menu/index.d.ts.map +1 -0
- package/dist/internal/menu/index.js +2 -0
- package/dist/internal/menu/index.js.map +1 -0
- package/dist/internal/menu/menu.d.ts +33 -0
- package/dist/internal/menu/menu.d.ts.map +1 -0
- package/dist/internal/menu/menu.js +150 -0
- package/dist/internal/menu/menu.js.map +1 -0
- package/dist/internal/overlay/dismissible-layer.d.ts +38 -0
- package/dist/internal/overlay/dismissible-layer.d.ts.map +1 -0
- package/dist/internal/overlay/dismissible-layer.js +99 -0
- package/dist/internal/overlay/dismissible-layer.js.map +1 -0
- package/dist/internal/overlay/document-scroll-lock.d.ts +8 -0
- package/dist/internal/overlay/document-scroll-lock.d.ts.map +1 -0
- package/dist/internal/overlay/document-scroll-lock.js +58 -0
- package/dist/internal/overlay/document-scroll-lock.js.map +1 -0
- package/dist/internal/overlay/floating-position.d.ts +46 -0
- package/dist/internal/overlay/floating-position.d.ts.map +1 -0
- package/dist/internal/overlay/floating-position.js +137 -0
- package/dist/internal/overlay/floating-position.js.map +1 -0
- package/dist/internal/overlay/index.d.ts +8 -0
- package/dist/internal/overlay/index.d.ts.map +1 -0
- package/dist/internal/overlay/index.js +6 -0
- package/dist/internal/overlay/index.js.map +1 -0
- package/dist/internal/overlay/native-modal.d.ts +11 -0
- package/dist/internal/overlay/native-modal.d.ts.map +1 -0
- package/dist/internal/overlay/native-modal.js +160 -0
- package/dist/internal/overlay/native-modal.js.map +1 -0
- package/dist/internal/overlay/portal-target.d.ts +19 -0
- package/dist/internal/overlay/portal-target.d.ts.map +1 -0
- package/dist/internal/overlay/portal-target.js +113 -0
- package/dist/internal/overlay/portal-target.js.map +1 -0
- package/dist/internal/overlay/top-layer.d.ts +21 -0
- package/dist/internal/overlay/top-layer.d.ts.map +1 -0
- package/dist/internal/overlay/top-layer.js +51 -0
- package/dist/internal/overlay/top-layer.js.map +1 -0
- package/dist/internal/use-merged-ref.d.ts +11 -0
- package/dist/internal/use-merged-ref.d.ts.map +1 -0
- package/dist/internal/use-merged-ref.js +31 -0
- package/dist/internal/use-merged-ref.js.map +1 -0
- package/dist/internal/use-native-dialog.d.ts +9 -0
- package/dist/internal/use-native-dialog.d.ts.map +1 -0
- package/dist/internal/use-native-dialog.js +19 -0
- package/dist/internal/use-native-dialog.js.map +1 -0
- package/dist/runtime/appearance.d.ts +32 -0
- package/dist/runtime/appearance.d.ts.map +1 -0
- package/dist/runtime/appearance.js +123 -0
- package/dist/runtime/appearance.js.map +1 -0
- package/dist/styles/components/alert.css +99 -0
- package/dist/styles/components/avatar.css +70 -0
- package/dist/styles/components/badge.css +101 -0
- package/dist/styles/components/breadcrumb.css +65 -0
- package/dist/styles/components/button.css +136 -0
- package/dist/styles/components/choice.css +120 -0
- package/dist/styles/components/combobox.css +200 -0
- package/dist/styles/components/confirm-dialog.css +50 -0
- package/dist/styles/components/data-table.css +120 -0
- package/dist/styles/components/dialog.css +135 -0
- package/dist/styles/components/divider.css +27 -0
- package/dist/styles/components/drawer.css +160 -0
- package/dist/styles/components/dropdown.css +75 -0
- package/dist/styles/components/dropzone.css +94 -0
- package/dist/styles/components/empty-state.css +85 -0
- package/dist/styles/components/file-upload.css +145 -0
- package/dist/styles/components/form-field.css +49 -0
- package/dist/styles/components/icon.css +53 -0
- package/dist/styles/components/inline-message.css +33 -0
- package/dist/styles/components/input.css +77 -0
- package/dist/styles/components/list.css +132 -0
- package/dist/styles/components/loading-overlay.css +24 -0
- package/dist/styles/components/menu.css +6 -0
- package/dist/styles/components/multi-select.css +68 -0
- package/dist/styles/components/navigation.css +116 -0
- package/dist/styles/components/page-layout.css +279 -0
- package/dist/styles/components/pagination.css +99 -0
- package/dist/styles/components/panel.css +123 -0
- package/dist/styles/components/popover.css +41 -0
- package/dist/styles/components/progress.css +65 -0
- package/dist/styles/components/search-input.css +12 -0
- package/dist/styles/components/select.css +56 -0
- package/dist/styles/components/skeleton.css +93 -0
- package/dist/styles/components/spinner.css +27 -0
- package/dist/styles/components/status-indicator.css +54 -0
- package/dist/styles/components/switch.css +111 -0
- package/dist/styles/components/table.css +127 -0
- package/dist/styles/components/tabs.css +144 -0
- package/dist/styles/components/textarea.css +79 -0
- package/dist/styles/components/toast.css +134 -0
- package/dist/styles/components/toolbar.css +27 -0
- package/dist/styles/components/tooltip.css +32 -0
- package/dist/styles/components/tree-view.css +146 -0
- package/dist/styles/components.css +45 -0
- package/dist/styles/foundation/controls.css +91 -0
- package/dist/styles/foundation/density.css +76 -0
- package/dist/styles/foundation/icons.css +29 -0
- package/dist/styles/foundation/layout.css +150 -0
- package/dist/styles/foundation/motion.css +58 -0
- package/dist/styles/foundation/surface.css +60 -0
- package/dist/styles/foundation/theme.css +166 -0
- package/dist/styles/foundation/typography.css +84 -0
- package/dist/styles/foundation.css +10 -0
- package/dist/styles/miaixz.css +4 -0
- package/package.json +304 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState, } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { createMiaixzUiError } from "../../errors/index.js";
|
|
5
|
+
import { useMiaixzLocale } from "../../i18n/index.js";
|
|
6
|
+
import { classNames } from "../../internal/class-names.js";
|
|
7
|
+
import { useMiaixzDismissibleLayer, useMiaixzFloatingPosition, useMiaixzManualPopover, useMiaixzPortalTarget, } from "../../internal/overlay/index.js";
|
|
8
|
+
import { useMergedRef } from "../../internal/use-merged-ref.js";
|
|
9
|
+
import { Icon } from "../icon/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Defines the frozen asynchronous query debounce interval in milliseconds.
|
|
12
|
+
*/
|
|
13
|
+
const miaixzComboboxDebounceMilliseconds = 200;
|
|
14
|
+
/**
|
|
15
|
+
* Renders the public single-value Combobox adapter.
|
|
16
|
+
*
|
|
17
|
+
* @typeParam Value - Stable string value selected by the control.
|
|
18
|
+
* @param props - Public single-value combobox configuration.
|
|
19
|
+
* @param forwardedRef - Forwarded root div reference.
|
|
20
|
+
* @returns A searchable single-value WAI-ARIA combobox.
|
|
21
|
+
*/
|
|
22
|
+
function ComboboxImplementation(props, forwardedRef) {
|
|
23
|
+
const { options, loadOptions, value, defaultValue, onValueChange, inputValue, defaultInputValue, onInputValueChange, label, placeholder, emptyMessage, loadingMessage, errorMessage, disabled = false, ...rootProps } = props;
|
|
24
|
+
const { t } = useMiaixzLocale();
|
|
25
|
+
const valueControlled = value !== undefined;
|
|
26
|
+
const inputControlled = inputValue !== undefined;
|
|
27
|
+
validateMiaixzComboboxValueControl(t, valueControlled, defaultValue !== undefined, onValueChange !== undefined);
|
|
28
|
+
validateMiaixzComboboxInputControl(t, inputControlled, defaultInputValue !== undefined, onInputValueChange !== undefined);
|
|
29
|
+
useStableMiaixzComboboxControlModes(t, valueControlled, inputControlled);
|
|
30
|
+
const [internalValue, setInternalValue] = useState(defaultValue ?? null);
|
|
31
|
+
const [internalInputValue, setInternalInputValue] = useState(defaultInputValue ?? "");
|
|
32
|
+
const selectedValue = valueControlled ? value : internalValue;
|
|
33
|
+
const currentInputValue = inputControlled ? inputValue : internalInputValue;
|
|
34
|
+
const selectedValues = useMemo(() => (selectedValue === null ? [] : [selectedValue]), [selectedValue]);
|
|
35
|
+
const updateInputValue = useCallback((nextValue) => {
|
|
36
|
+
if (!inputControlled)
|
|
37
|
+
setInternalInputValue(nextValue);
|
|
38
|
+
onInputValueChange?.(nextValue);
|
|
39
|
+
}, [inputControlled, onInputValueChange]);
|
|
40
|
+
const selectOption = useCallback((option) => {
|
|
41
|
+
if (!valueControlled)
|
|
42
|
+
setInternalValue(option.value);
|
|
43
|
+
onValueChange?.(option.value);
|
|
44
|
+
updateInputValue(option.label);
|
|
45
|
+
}, [onValueChange, updateInputValue, valueControlled]);
|
|
46
|
+
return (_jsx(MiaixzOptionPicker, { component: "combobox", rootProps: rootProps, forwardedRef: forwardedRef, options: options, loadOptions: loadOptions, selectedValues: selectedValues, onOptionSelect: selectOption, onOptionRemove: undefined, isOptionSelected: (optionValue) => optionValue === selectedValue, isOptionSelectionDisabled: () => false, inputValue: currentInputValue, onInputValueChange: updateInputValue, label: label, placeholder: placeholder, emptyMessage: emptyMessage, loadingMessage: loadingMessage, errorMessage: errorMessage, disabled: disabled }));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Renders a searchable single-value WAI-ARIA combobox.
|
|
50
|
+
*
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export const Combobox = forwardRef(ComboboxImplementation);
|
|
54
|
+
/**
|
|
55
|
+
* Renders the shared searchable option-picker surface.
|
|
56
|
+
*
|
|
57
|
+
* @typeParam Value - Stable string value selected by the control.
|
|
58
|
+
* @param props - Private option-picker configuration.
|
|
59
|
+
* @returns A Portal-backed WAI-ARIA combobox and listbox.
|
|
60
|
+
*/
|
|
61
|
+
export function MiaixzOptionPicker(props) {
|
|
62
|
+
const { component, rootProps, forwardedRef, options, loadOptions, selectedValues, onOptionSelect, onOptionRemove, isOptionSelected, isOptionSelectionDisabled, inputValue, onInputValueChange, label, placeholder, emptyMessage, loadingMessage, errorMessage, disabled, } = props;
|
|
63
|
+
const { t } = useMiaixzLocale();
|
|
64
|
+
validateMiaixzComboboxOptionSource(t, options, loadOptions);
|
|
65
|
+
const { className, ...nativeRootProps } = rootProps;
|
|
66
|
+
const [rootElement, setRootElement] = useState(null);
|
|
67
|
+
const rootRef = useMergedRef(forwardedRef, setRootElement);
|
|
68
|
+
const controlRef = useRef(null);
|
|
69
|
+
const inputRef = useRef(null);
|
|
70
|
+
const surfaceRef = useRef(null);
|
|
71
|
+
const [open, setOpen] = useState(false);
|
|
72
|
+
const [activeIndex, setActiveIndex] = useState(-1);
|
|
73
|
+
const [loadedOptions, setLoadedOptions] = useState([]);
|
|
74
|
+
const [knownOptions, setKnownOptions] = useState(() => new Map());
|
|
75
|
+
const [loading, setLoading] = useState(false);
|
|
76
|
+
const [loadFailed, setLoadFailed] = useState(false);
|
|
77
|
+
const requestSequenceRef = useRef(0);
|
|
78
|
+
const listboxId = useId();
|
|
79
|
+
const labelId = useId();
|
|
80
|
+
const optionIdPrefix = useId();
|
|
81
|
+
const portalTarget = useMiaixzPortalTarget(rootElement);
|
|
82
|
+
const asynchronous = loadOptions !== undefined;
|
|
83
|
+
const visibleOptions = useMemo(() => (asynchronous ? loadedOptions : filterMiaixzComboboxOptions(options ?? [], inputValue)), [asynchronous, inputValue, loadedOptions, options]);
|
|
84
|
+
const selectedOptionMap = useMemo(() => createMiaixzSelectedOptionMap(options, knownOptions, selectedValues), [knownOptions, options, selectedValues]);
|
|
85
|
+
const close = useCallback((restoreFocus) => {
|
|
86
|
+
setOpen(false);
|
|
87
|
+
setActiveIndex(-1);
|
|
88
|
+
setLoading(false);
|
|
89
|
+
if (restoreFocus)
|
|
90
|
+
queueMicrotask(() => inputRef.current?.focus({ preventScroll: true }));
|
|
91
|
+
}, []);
|
|
92
|
+
const prepareAsynchronousQuery = useCallback(() => {
|
|
93
|
+
if (!asynchronous)
|
|
94
|
+
return;
|
|
95
|
+
setLoading(true);
|
|
96
|
+
setLoadFailed(false);
|
|
97
|
+
setLoadedOptions([]);
|
|
98
|
+
}, [asynchronous]);
|
|
99
|
+
const openListbox = useCallback(() => {
|
|
100
|
+
if (disabled)
|
|
101
|
+
return;
|
|
102
|
+
if (!open)
|
|
103
|
+
prepareAsynchronousQuery();
|
|
104
|
+
setOpen(true);
|
|
105
|
+
}, [disabled, open, prepareAsynchronousQuery]);
|
|
106
|
+
useMiaixzManualPopover(surfaceRef, open, portalTarget);
|
|
107
|
+
useMiaixzFloatingPosition(controlRef, surfaceRef, open, "bottom-start", portalTarget);
|
|
108
|
+
useMiaixzDismissibleLayer({
|
|
109
|
+
active: open,
|
|
110
|
+
triggerRef: controlRef,
|
|
111
|
+
contentRef: surfaceRef,
|
|
112
|
+
portalTarget,
|
|
113
|
+
onDismiss: () => close(true),
|
|
114
|
+
});
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (!disabled || !open)
|
|
117
|
+
return;
|
|
118
|
+
queueMicrotask(() => close(false));
|
|
119
|
+
}, [close, disabled, open]);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (!open || loadOptions === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
const controller = new AbortController();
|
|
124
|
+
const sequence = requestSequenceRef.current + 1;
|
|
125
|
+
requestSequenceRef.current = sequence;
|
|
126
|
+
const timer = window.setTimeout(() => {
|
|
127
|
+
void loadOptions(inputValue, controller.signal)
|
|
128
|
+
.then((result) => {
|
|
129
|
+
if (controller.signal.aborted || requestSequenceRef.current !== sequence)
|
|
130
|
+
return;
|
|
131
|
+
setLoadedOptions(result);
|
|
132
|
+
setKnownOptions((currentOptions) => mergeMiaixzKnownOptions(currentOptions, result));
|
|
133
|
+
setLoadFailed(false);
|
|
134
|
+
setLoading(false);
|
|
135
|
+
})
|
|
136
|
+
.catch(() => {
|
|
137
|
+
if (controller.signal.aborted || requestSequenceRef.current !== sequence)
|
|
138
|
+
return;
|
|
139
|
+
setLoadedOptions([]);
|
|
140
|
+
setLoadFailed(true);
|
|
141
|
+
setLoading(false);
|
|
142
|
+
});
|
|
143
|
+
}, miaixzComboboxDebounceMilliseconds);
|
|
144
|
+
return () => {
|
|
145
|
+
window.clearTimeout(timer);
|
|
146
|
+
controller.abort();
|
|
147
|
+
};
|
|
148
|
+
}, [inputValue, loadOptions, open]);
|
|
149
|
+
const resolvedActiveIndex = open &&
|
|
150
|
+
!loading &&
|
|
151
|
+
!loadFailed &&
|
|
152
|
+
isMiaixzComboboxOptionEnabled(visibleOptions[activeIndex], isOptionSelectionDisabled)
|
|
153
|
+
? activeIndex
|
|
154
|
+
: open && !loading && !loadFailed
|
|
155
|
+
? findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, 0, 1)
|
|
156
|
+
: -1;
|
|
157
|
+
const activateOption = useCallback((option) => {
|
|
158
|
+
if (!isMiaixzComboboxOptionEnabled(option, isOptionSelectionDisabled))
|
|
159
|
+
return;
|
|
160
|
+
onOptionSelect(option);
|
|
161
|
+
if (component === "combobox")
|
|
162
|
+
close(false);
|
|
163
|
+
}, [close, component, isOptionSelectionDisabled, onOptionSelect]);
|
|
164
|
+
const handleKeyDown = useCallback((event) => {
|
|
165
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
if (!open) {
|
|
168
|
+
openListbox();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const direction = event.key === "ArrowDown" ? 1 : -1;
|
|
172
|
+
setActiveIndex((currentIndex) => findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, (currentIndex < 0 ? resolvedActiveIndex : currentIndex) + direction, direction));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (event.key === "Home" && open) {
|
|
176
|
+
event.preventDefault();
|
|
177
|
+
setActiveIndex(findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, 0, 1));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (event.key === "End" && open) {
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
setActiveIndex(findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, visibleOptions.length - 1, -1));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (event.key === "Enter" && open) {
|
|
186
|
+
const option = visibleOptions[resolvedActiveIndex];
|
|
187
|
+
if (option !== undefined) {
|
|
188
|
+
event.preventDefault();
|
|
189
|
+
activateOption(option);
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (event.key === "Escape" && open) {
|
|
194
|
+
event.preventDefault();
|
|
195
|
+
close(true);
|
|
196
|
+
}
|
|
197
|
+
if (event.key === "Tab" && open)
|
|
198
|
+
close(false);
|
|
199
|
+
}, [
|
|
200
|
+
activateOption,
|
|
201
|
+
close,
|
|
202
|
+
isOptionSelectionDisabled,
|
|
203
|
+
open,
|
|
204
|
+
openListbox,
|
|
205
|
+
resolvedActiveIndex,
|
|
206
|
+
visibleOptions,
|
|
207
|
+
]);
|
|
208
|
+
const activeOptionId = open && resolvedActiveIndex >= 0
|
|
209
|
+
? `${optionIdPrefix}-option-${resolvedActiveIndex}`
|
|
210
|
+
: undefined;
|
|
211
|
+
const status = loadFailed ? "error" : loading ? "loading" : "ready";
|
|
212
|
+
const state = disabled ? "disabled" : open ? "open" : "closed";
|
|
213
|
+
return (_jsxs("div", { ...nativeRootProps, ref: rootRef, className: classNames(`miaixz-${component}`, className), "data-state": state, "data-disabled": disabled || undefined, children: [_jsx("label", { id: labelId, className: `miaixz-${component}-label`, children: label }), _jsxs("div", { ref: controlRef, className: classNames("miaixz-control", `miaixz-${component}-control`), "data-state": state, "data-disabled": disabled || undefined, children: [component === "multi-select" && selectedValues.length > 0 && (_jsx("div", { className: "miaixz-multi-select-tags", children: selectedValues.map((selectedValue) => {
|
|
214
|
+
const selectedOption = selectedOptionMap.get(selectedValue);
|
|
215
|
+
return (_jsxs("span", { className: "miaixz-multi-select-tag", children: [_jsx("span", { className: "miaixz-multi-select-tag-label", children: selectedOption?.label ?? selectedValue }), _jsx("button", { type: "button", className: "miaixz-multi-select-tag-remove", "aria-label": `${t("ui.action.remove")} ${selectedOption?.label ?? selectedValue}`, disabled: disabled, onClick: () => onOptionRemove?.(selectedValue), children: _jsx(Icon, { name: "X", size: "indicator" }) })] }, selectedValue));
|
|
216
|
+
}) })), _jsx("input", { ref: inputRef, type: "text", role: "combobox", className: `miaixz-${component}-input`, "aria-autocomplete": "list", "aria-controls": listboxId, "aria-expanded": open, "aria-labelledby": labelId, "aria-activedescendant": activeOptionId, autoComplete: "off", value: inputValue, placeholder: placeholder, disabled: disabled, onFocus: openListbox, onClick: openListbox, onChange: (event) => {
|
|
217
|
+
prepareAsynchronousQuery();
|
|
218
|
+
onInputValueChange(event.currentTarget.value);
|
|
219
|
+
openListbox();
|
|
220
|
+
}, onKeyDown: handleKeyDown }), component === "multi-select" && (_jsx("output", { className: "miaixz-multi-select-count", "aria-live": "polite", children: selectedValues.length })), _jsx("button", { type: "button", className: `miaixz-${component}-toggle`, "aria-label": label, "aria-controls": listboxId, "aria-expanded": open, disabled: disabled, tabIndex: -1, onClick: () => {
|
|
221
|
+
if (open)
|
|
222
|
+
close(false);
|
|
223
|
+
else
|
|
224
|
+
openListbox();
|
|
225
|
+
inputRef.current?.focus({ preventScroll: true });
|
|
226
|
+
}, children: _jsx(Icon, { name: "ChevronDown", size: "control" }) })] }), open &&
|
|
227
|
+
portalTarget !== null &&
|
|
228
|
+
createPortal(_jsx("div", { ref: surfaceRef, popover: "manual", role: "region", "aria-labelledby": labelId, className: `miaixz-${component}-surface`, "data-state": status, children: loading ? (_jsxs("div", { id: listboxId, className: `miaixz-${component}-message`, role: "status", children: [_jsx(Icon, { name: "LoaderCircle", size: "control", className: "miaixz-icon-spin" }), loadingMessage ?? t("ui.loading")] })) : loadFailed ? (_jsx("div", { id: listboxId, className: `miaixz-${component}-message`, role: "alert", children: errorMessage ?? t("ui.combobox.loadError") })) : visibleOptions.length === 0 ? (_jsx("div", { id: listboxId, className: `miaixz-${component}-message`, role: "status", children: emptyMessage ?? "—" })) : (_jsx("div", { id: listboxId, role: "listbox", "aria-labelledby": labelId, "aria-multiselectable": component === "multi-select" || undefined, className: `miaixz-${component}-listbox`, children: visibleOptions.map((option, index) => {
|
|
229
|
+
const selected = isOptionSelected(option.value);
|
|
230
|
+
const optionDisabled = option.disabled === true || isOptionSelectionDisabled(option.value);
|
|
231
|
+
return (_jsxs("div", { id: `${optionIdPrefix}-option-${index}`, role: "option", "aria-label": option.label, "aria-selected": selected, "aria-disabled": optionDisabled || undefined, className: `miaixz-${component}-option`, "data-state": index === resolvedActiveIndex ? "active" : "idle", "data-disabled": optionDisabled || undefined, onPointerMove: () => {
|
|
232
|
+
if (!optionDisabled)
|
|
233
|
+
setActiveIndex(index);
|
|
234
|
+
}, onMouseDown: (event) => event.preventDefault(), onClick: () => activateOption(option), children: [_jsxs("span", { className: `miaixz-${component}-option-copy`, children: [_jsx("span", { className: `miaixz-${component}-option-label`, children: option.label }), option.description !== undefined && (_jsx("span", { className: `miaixz-${component}-option-description`, children: option.description }))] }), selected && _jsx(Icon, { name: "Check", size: "control" })] }, option.value));
|
|
235
|
+
}) })) }), portalTarget)] }));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Validates the mutually exclusive static and asynchronous option sources.
|
|
239
|
+
*
|
|
240
|
+
* @typeParam Value - Stable string value returned by the source.
|
|
241
|
+
* @param translate - Active localized message resolver.
|
|
242
|
+
* @param options - Optional static option source.
|
|
243
|
+
* @param loadOptions - Optional asynchronous option source.
|
|
244
|
+
*/
|
|
245
|
+
function validateMiaixzComboboxOptionSource(translate, options, loadOptions) {
|
|
246
|
+
if ((options === undefined) === (loadOptions === undefined)) {
|
|
247
|
+
throw createMiaixzUiError(translate, {
|
|
248
|
+
code: "UI_OPTIONS_SOURCE_INVALID",
|
|
249
|
+
messageKey: "ui.error.options.sourceInvalid",
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Validates the selected-value controlled and uncontrolled contract.
|
|
255
|
+
*
|
|
256
|
+
* @param translate - Active localized message resolver.
|
|
257
|
+
* @param controlled - Whether a controlled value was supplied.
|
|
258
|
+
* @param hasDefault - Whether an uncontrolled default was supplied.
|
|
259
|
+
* @param hasChangeHandler - Whether requested changes can be observed.
|
|
260
|
+
*/
|
|
261
|
+
export function validateMiaixzComboboxValueControl(translate, controlled, hasDefault, hasChangeHandler) {
|
|
262
|
+
if (controlled && (!hasChangeHandler || hasDefault)) {
|
|
263
|
+
throw createMiaixzUiError(translate, {
|
|
264
|
+
code: "UI_CONTROLLED_VALUE_INVALID",
|
|
265
|
+
messageKey: "ui.error.controlled.valueInvalid",
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Validates the search-input controlled and uncontrolled contract.
|
|
271
|
+
*
|
|
272
|
+
* @param translate - Active localized message resolver.
|
|
273
|
+
* @param controlled - Whether a controlled input value was supplied.
|
|
274
|
+
* @param hasDefault - Whether an uncontrolled input default was supplied.
|
|
275
|
+
* @param hasChangeHandler - Whether requested changes can be observed.
|
|
276
|
+
*/
|
|
277
|
+
export function validateMiaixzComboboxInputControl(translate, controlled, hasDefault, hasChangeHandler) {
|
|
278
|
+
if (controlled && (!hasChangeHandler || hasDefault)) {
|
|
279
|
+
throw createMiaixzUiError(translate, {
|
|
280
|
+
code: "UI_CONTROLLED_INPUT_INVALID",
|
|
281
|
+
messageKey: "ui.error.controlled.inputInvalid",
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Freezes selection and input control modes for the mounted component lifetime.
|
|
287
|
+
*
|
|
288
|
+
* @param translate - Active localized message resolver.
|
|
289
|
+
* @param valueControlled - Current selected-value control mode.
|
|
290
|
+
* @param inputControlled - Current search-input control mode.
|
|
291
|
+
*/
|
|
292
|
+
export function useStableMiaixzComboboxControlModes(translate, valueControlled, inputControlled) {
|
|
293
|
+
const [initialModes] = useState({
|
|
294
|
+
value: valueControlled,
|
|
295
|
+
input: inputControlled,
|
|
296
|
+
});
|
|
297
|
+
if (initialModes.value !== valueControlled || initialModes.input !== inputControlled) {
|
|
298
|
+
throw createMiaixzUiError(translate, {
|
|
299
|
+
code: "UI_CONTROL_MODE_CHANGED",
|
|
300
|
+
messageKey: "ui.error.controlled.modeChanged",
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Filters static options by Unicode-lowercased label while preserving source order.
|
|
306
|
+
*
|
|
307
|
+
* @typeParam Value - Stable string value carried by each option.
|
|
308
|
+
* @param options - Ordered static option source.
|
|
309
|
+
* @param query - Current search input.
|
|
310
|
+
* @returns Options whose labels contain the normalized query.
|
|
311
|
+
*/
|
|
312
|
+
function filterMiaixzComboboxOptions(options, query) {
|
|
313
|
+
const normalizedQuery = query.toLocaleLowerCase();
|
|
314
|
+
if (normalizedQuery.length === 0)
|
|
315
|
+
return options;
|
|
316
|
+
return options.filter((option) => option.label.toLocaleLowerCase().includes(normalizedQuery));
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Finds the next enabled option without wrapping past the collection boundary.
|
|
320
|
+
*
|
|
321
|
+
* @typeParam Value - Stable string value carried by each option.
|
|
322
|
+
* @param options - Current ordered visible options.
|
|
323
|
+
* @param isSelectionDisabled - Selection-limit predicate.
|
|
324
|
+
* @param startIndex - First candidate index.
|
|
325
|
+
* @param direction - Search direction expressed as one or negative one.
|
|
326
|
+
* @returns Enabled option index, or negative one when no candidate remains.
|
|
327
|
+
*/
|
|
328
|
+
function findMiaixzComboboxEnabledOption(options, isSelectionDisabled, startIndex, direction) {
|
|
329
|
+
for (let index = Math.min(Math.max(startIndex, 0), Math.max(options.length - 1, 0)); index >= 0 && index < options.length; index += direction) {
|
|
330
|
+
if (isMiaixzComboboxOptionEnabled(options[index], isSelectionDisabled))
|
|
331
|
+
return index;
|
|
332
|
+
}
|
|
333
|
+
return -1;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Reports whether an option accepts pointer or keyboard activation.
|
|
337
|
+
*
|
|
338
|
+
* @typeParam Value - Stable string value carried by the option.
|
|
339
|
+
* @param option - Optional candidate at the requested index.
|
|
340
|
+
* @param isSelectionDisabled - Selection-limit predicate.
|
|
341
|
+
* @returns Whether the option exists and remains selectable.
|
|
342
|
+
*/
|
|
343
|
+
function isMiaixzComboboxOptionEnabled(option, isSelectionDisabled) {
|
|
344
|
+
return option !== undefined && option.disabled !== true && !isSelectionDisabled(option.value);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Retains labels for selected values across static and asynchronous result changes.
|
|
348
|
+
*
|
|
349
|
+
* @typeParam Value - Stable string value carried by each option.
|
|
350
|
+
* @param staticOptions - Optional static option collection.
|
|
351
|
+
* @param knownOptions - Persisted metadata from successful asynchronous results.
|
|
352
|
+
* @param selectedValues - Current selected values.
|
|
353
|
+
* @returns Map containing available selected-option metadata.
|
|
354
|
+
*/
|
|
355
|
+
function createMiaixzSelectedOptionMap(staticOptions, knownOptions, selectedValues) {
|
|
356
|
+
const selected = new Set(selectedValues);
|
|
357
|
+
const result = new Map();
|
|
358
|
+
for (const option of [...(staticOptions ?? []), ...knownOptions.values()]) {
|
|
359
|
+
if (selected.has(option.value))
|
|
360
|
+
result.set(option.value, option);
|
|
361
|
+
}
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Merges a successful asynchronous result into persistent option metadata.
|
|
366
|
+
*
|
|
367
|
+
* @typeParam Value - Stable string value carried by each option.
|
|
368
|
+
* @param currentOptions - Option metadata retained from earlier successful requests.
|
|
369
|
+
* @param loadedOptions - Complete result returned by the latest successful request.
|
|
370
|
+
* @returns A new map retaining every known value and its latest metadata.
|
|
371
|
+
*/
|
|
372
|
+
function mergeMiaixzKnownOptions(currentOptions, loadedOptions) {
|
|
373
|
+
const nextOptions = new Map(currentOptions);
|
|
374
|
+
for (const option of loadedOptions)
|
|
375
|
+
nextOptions.set(option.value, option);
|
|
376
|
+
return nextOptions;
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../../src/components/combobox/combobox.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ForwardedRef,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactElement,\n type RefAttributes,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { createMiaixzUiError } from \"../../errors/index.js\";\nimport { useMiaixzLocale, type MiaixzTranslator } from \"../../i18n/index.js\";\nimport { classNames } from \"../../internal/class-names.js\";\nimport {\n useMiaixzDismissibleLayer,\n useMiaixzFloatingPosition,\n useMiaixzManualPopover,\n useMiaixzPortalTarget,\n} from \"../../internal/overlay/index.js\";\nimport { useMergedRef } from \"../../internal/use-merged-ref.js\";\nimport { Icon } from \"../icon/index.js\";\nimport type { ComboboxProps, MiaixzOption, MiaixzOptionLoader } from \"./combobox.types.js\";\n\n/**\n * Defines the frozen asynchronous query debounce interval in milliseconds.\n */\nconst miaixzComboboxDebounceMilliseconds = 200;\n\n/**\n * Tracks the controlled mode selected during the first render.\n */\ninterface MiaixzComboboxControlModes {\n /**\n * Identifies whether selection is controlled.\n */\n readonly value: boolean;\n\n /**\n * Identifies whether search input is controlled.\n */\n readonly input: boolean;\n}\n\n/**\n * Configures the private option-picker implementation shared by both public controls.\n *\n * @typeParam Value - Stable string value selected by the control.\n */\nexport interface MiaixzOptionPickerProps<Value extends string> {\n /**\n * Selects the public component identity and class namespace.\n */\n readonly component: \"combobox\" | \"multi-select\";\n\n /**\n * Supplies native root div attributes.\n */\n readonly rootProps: HTMLAttributes<HTMLDivElement>;\n\n /**\n * Receives the public root reference.\n */\n readonly forwardedRef: ForwardedRef<HTMLDivElement>;\n\n /**\n * Supplies the static option source.\n */\n readonly options: readonly MiaixzOption<Value>[] | undefined;\n\n /**\n * Supplies the asynchronous option source.\n */\n readonly loadOptions: MiaixzOptionLoader<Value> | undefined;\n\n /**\n * Supplies the current ordered selected values.\n */\n readonly selectedValues: readonly Value[];\n\n /**\n * Receives an option activation request.\n */\n readonly onOptionSelect: (option: MiaixzOption<Value>) => void;\n\n /**\n * Receives a selected-value removal request.\n */\n readonly onOptionRemove: ((value: Value) => void) | undefined;\n\n /**\n * Reports whether the value is selected.\n */\n readonly isOptionSelected: (value: Value) => boolean;\n\n /**\n * Reports whether the current selection state disables an otherwise enabled option.\n */\n readonly isOptionSelectionDisabled: (value: Value) => boolean;\n\n /**\n * Supplies the current search input.\n */\n readonly inputValue: string;\n\n /**\n * Receives requested search-input changes.\n */\n readonly onInputValueChange: (value: string) => void;\n\n /**\n * Supplies the visible and accessible field label.\n */\n readonly label: string;\n\n /**\n * Supplies optional input placeholder copy.\n */\n readonly placeholder: string | undefined;\n\n /**\n * Supplies optional empty-result copy.\n */\n readonly emptyMessage: string | undefined;\n\n /**\n * Supplies optional asynchronous loading copy.\n */\n readonly loadingMessage: string | undefined;\n\n /**\n * Supplies optional asynchronous failure copy.\n */\n readonly errorMessage: string | undefined;\n\n /**\n * Disables the complete composite control.\n */\n readonly disabled: boolean;\n}\n\n/**\n * Renders the public single-value Combobox adapter.\n *\n * @typeParam Value - Stable string value selected by the control.\n * @param props - Public single-value combobox configuration.\n * @param forwardedRef - Forwarded root div reference.\n * @returns A searchable single-value WAI-ARIA combobox.\n */\nfunction ComboboxImplementation<Value extends string = string>(\n props: ComboboxProps<Value>,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const {\n options,\n loadOptions,\n value,\n defaultValue,\n onValueChange,\n inputValue,\n defaultInputValue,\n onInputValueChange,\n label,\n placeholder,\n emptyMessage,\n loadingMessage,\n errorMessage,\n disabled = false,\n ...rootProps\n } = props;\n const { t } = useMiaixzLocale();\n const valueControlled = value !== undefined;\n const inputControlled = inputValue !== undefined;\n validateMiaixzComboboxValueControl(\n t,\n valueControlled,\n defaultValue !== undefined,\n onValueChange !== undefined,\n );\n validateMiaixzComboboxInputControl(\n t,\n inputControlled,\n defaultInputValue !== undefined,\n onInputValueChange !== undefined,\n );\n useStableMiaixzComboboxControlModes(t, valueControlled, inputControlled);\n\n const [internalValue, setInternalValue] = useState<Value | null>(defaultValue ?? null);\n const [internalInputValue, setInternalInputValue] = useState(defaultInputValue ?? \"\");\n const selectedValue = valueControlled ? value : internalValue;\n const currentInputValue = inputControlled ? inputValue : internalInputValue;\n const selectedValues = useMemo(\n () => (selectedValue === null ? [] : [selectedValue]),\n [selectedValue],\n );\n\n const updateInputValue = useCallback(\n (nextValue: string) => {\n if (!inputControlled) setInternalInputValue(nextValue);\n onInputValueChange?.(nextValue);\n },\n [inputControlled, onInputValueChange],\n );\n const selectOption = useCallback(\n (option: MiaixzOption<Value>) => {\n if (!valueControlled) setInternalValue(option.value);\n onValueChange?.(option.value);\n updateInputValue(option.label);\n },\n [onValueChange, updateInputValue, valueControlled],\n );\n\n return (\n <MiaixzOptionPicker\n component=\"combobox\"\n rootProps={rootProps}\n forwardedRef={forwardedRef}\n options={options}\n loadOptions={loadOptions}\n selectedValues={selectedValues}\n onOptionSelect={selectOption}\n onOptionRemove={undefined}\n isOptionSelected={(optionValue) => optionValue === selectedValue}\n isOptionSelectionDisabled={() => false}\n inputValue={currentInputValue}\n onInputValueChange={updateInputValue}\n label={label}\n placeholder={placeholder}\n emptyMessage={emptyMessage}\n loadingMessage={loadingMessage}\n errorMessage={errorMessage}\n disabled={disabled}\n />\n );\n}\n\n/**\n * Renders a searchable single-value WAI-ARIA combobox.\n *\n * @public\n */\nexport const Combobox = forwardRef(ComboboxImplementation) as <Value extends string = string>(\n props: ComboboxProps<Value> & RefAttributes<HTMLDivElement>,\n) => ReactElement;\n\n/**\n * Renders the shared searchable option-picker surface.\n *\n * @typeParam Value - Stable string value selected by the control.\n * @param props - Private option-picker configuration.\n * @returns A Portal-backed WAI-ARIA combobox and listbox.\n */\nexport function MiaixzOptionPicker<Value extends string>(props: MiaixzOptionPickerProps<Value>) {\n const {\n component,\n rootProps,\n forwardedRef,\n options,\n loadOptions,\n selectedValues,\n onOptionSelect,\n onOptionRemove,\n isOptionSelected,\n isOptionSelectionDisabled,\n inputValue,\n onInputValueChange,\n label,\n placeholder,\n emptyMessage,\n loadingMessage,\n errorMessage,\n disabled,\n } = props;\n const { t } = useMiaixzLocale();\n validateMiaixzComboboxOptionSource(t, options, loadOptions);\n\n const { className, ...nativeRootProps } = rootProps;\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n const rootRef = useMergedRef(forwardedRef, setRootElement);\n const controlRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [loadedOptions, setLoadedOptions] = useState<readonly MiaixzOption<Value>[]>([]);\n const [knownOptions, setKnownOptions] = useState<ReadonlyMap<Value, MiaixzOption<Value>>>(\n () => new Map(),\n );\n const [loading, setLoading] = useState(false);\n const [loadFailed, setLoadFailed] = useState(false);\n const requestSequenceRef = useRef(0);\n const listboxId = useId();\n const labelId = useId();\n const optionIdPrefix = useId();\n const portalTarget = useMiaixzPortalTarget(rootElement);\n const asynchronous = loadOptions !== undefined;\n const visibleOptions = useMemo(\n () => (asynchronous ? loadedOptions : filterMiaixzComboboxOptions(options ?? [], inputValue)),\n [asynchronous, inputValue, loadedOptions, options],\n );\n const selectedOptionMap = useMemo(\n () => createMiaixzSelectedOptionMap(options, knownOptions, selectedValues),\n [knownOptions, options, selectedValues],\n );\n\n const close = useCallback((restoreFocus: boolean) => {\n setOpen(false);\n setActiveIndex(-1);\n setLoading(false);\n if (restoreFocus) queueMicrotask(() => inputRef.current?.focus({ preventScroll: true }));\n }, []);\n const prepareAsynchronousQuery = useCallback(() => {\n if (!asynchronous) return;\n setLoading(true);\n setLoadFailed(false);\n setLoadedOptions([]);\n }, [asynchronous]);\n const openListbox = useCallback(() => {\n if (disabled) return;\n if (!open) prepareAsynchronousQuery();\n setOpen(true);\n }, [disabled, open, prepareAsynchronousQuery]);\n\n useMiaixzManualPopover(surfaceRef, open, portalTarget);\n useMiaixzFloatingPosition(controlRef, surfaceRef, open, \"bottom-start\", portalTarget);\n useMiaixzDismissibleLayer({\n active: open,\n triggerRef: controlRef,\n contentRef: surfaceRef,\n portalTarget,\n onDismiss: () => close(true),\n });\n\n useEffect(() => {\n if (!disabled || !open) return;\n queueMicrotask(() => close(false));\n }, [close, disabled, open]);\n\n useEffect(() => {\n if (!open || loadOptions === undefined) return undefined;\n const controller = new AbortController();\n const sequence = requestSequenceRef.current + 1;\n requestSequenceRef.current = sequence;\n const timer = window.setTimeout(() => {\n void loadOptions(inputValue, controller.signal)\n .then((result) => {\n if (controller.signal.aborted || requestSequenceRef.current !== sequence) return;\n setLoadedOptions(result);\n setKnownOptions((currentOptions) => mergeMiaixzKnownOptions(currentOptions, result));\n setLoadFailed(false);\n setLoading(false);\n })\n .catch(() => {\n if (controller.signal.aborted || requestSequenceRef.current !== sequence) return;\n setLoadedOptions([]);\n setLoadFailed(true);\n setLoading(false);\n });\n }, miaixzComboboxDebounceMilliseconds);\n\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n }, [inputValue, loadOptions, open]);\n\n const resolvedActiveIndex =\n open &&\n !loading &&\n !loadFailed &&\n isMiaixzComboboxOptionEnabled(visibleOptions[activeIndex], isOptionSelectionDisabled)\n ? activeIndex\n : open && !loading && !loadFailed\n ? findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, 0, 1)\n : -1;\n\n const activateOption = useCallback(\n (option: MiaixzOption<Value>) => {\n if (!isMiaixzComboboxOptionEnabled(option, isOptionSelectionDisabled)) return;\n onOptionSelect(option);\n if (component === \"combobox\") close(false);\n },\n [close, component, isOptionSelectionDisabled, onOptionSelect],\n );\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!open) {\n openListbox();\n return;\n }\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n setActiveIndex((currentIndex) =>\n findMiaixzComboboxEnabledOption(\n visibleOptions,\n isOptionSelectionDisabled,\n (currentIndex < 0 ? resolvedActiveIndex : currentIndex) + direction,\n direction,\n ),\n );\n return;\n }\n if (event.key === \"Home\" && open) {\n event.preventDefault();\n setActiveIndex(\n findMiaixzComboboxEnabledOption(visibleOptions, isOptionSelectionDisabled, 0, 1),\n );\n return;\n }\n if (event.key === \"End\" && open) {\n event.preventDefault();\n setActiveIndex(\n findMiaixzComboboxEnabledOption(\n visibleOptions,\n isOptionSelectionDisabled,\n visibleOptions.length - 1,\n -1,\n ),\n );\n return;\n }\n if (event.key === \"Enter\" && open) {\n const option = visibleOptions[resolvedActiveIndex];\n if (option !== undefined) {\n event.preventDefault();\n activateOption(option);\n }\n return;\n }\n if (event.key === \"Escape\" && open) {\n event.preventDefault();\n close(true);\n }\n if (event.key === \"Tab\" && open) close(false);\n },\n [\n activateOption,\n close,\n isOptionSelectionDisabled,\n open,\n openListbox,\n resolvedActiveIndex,\n visibleOptions,\n ],\n );\n\n const activeOptionId =\n open && resolvedActiveIndex >= 0\n ? `${optionIdPrefix}-option-${resolvedActiveIndex}`\n : undefined;\n const status = loadFailed ? \"error\" : loading ? \"loading\" : \"ready\";\n const state = disabled ? \"disabled\" : open ? \"open\" : \"closed\";\n\n return (\n <div\n {...nativeRootProps}\n ref={rootRef}\n className={classNames(`miaixz-${component}`, className)}\n data-state={state}\n data-disabled={disabled || undefined}\n >\n <label id={labelId} className={`miaixz-${component}-label`}>\n {label}\n </label>\n <div\n ref={controlRef}\n className={classNames(\"miaixz-control\", `miaixz-${component}-control`)}\n data-state={state}\n data-disabled={disabled || undefined}\n >\n {component === \"multi-select\" && selectedValues.length > 0 && (\n <div className=\"miaixz-multi-select-tags\">\n {selectedValues.map((selectedValue) => {\n const selectedOption = selectedOptionMap.get(selectedValue);\n return (\n <span key={selectedValue} className=\"miaixz-multi-select-tag\">\n <span className=\"miaixz-multi-select-tag-label\">\n {selectedOption?.label ?? selectedValue}\n </span>\n <button\n type=\"button\"\n className=\"miaixz-multi-select-tag-remove\"\n aria-label={`${t(\"ui.action.remove\")} ${selectedOption?.label ?? selectedValue}`}\n disabled={disabled}\n onClick={() => onOptionRemove?.(selectedValue)}\n >\n <Icon name=\"X\" size=\"indicator\" />\n </button>\n </span>\n );\n })}\n </div>\n )}\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n className={`miaixz-${component}-input`}\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-expanded={open}\n aria-labelledby={labelId}\n aria-activedescendant={activeOptionId}\n autoComplete=\"off\"\n value={inputValue}\n placeholder={placeholder}\n disabled={disabled}\n onFocus={openListbox}\n onClick={openListbox}\n onChange={(event) => {\n prepareAsynchronousQuery();\n onInputValueChange(event.currentTarget.value);\n openListbox();\n }}\n onKeyDown={handleKeyDown}\n />\n {component === \"multi-select\" && (\n <output className=\"miaixz-multi-select-count\" aria-live=\"polite\">\n {selectedValues.length}\n </output>\n )}\n <button\n type=\"button\"\n className={`miaixz-${component}-toggle`}\n aria-label={label}\n aria-controls={listboxId}\n aria-expanded={open}\n disabled={disabled}\n tabIndex={-1}\n onClick={() => {\n if (open) close(false);\n else openListbox();\n inputRef.current?.focus({ preventScroll: true });\n }}\n >\n <Icon name=\"ChevronDown\" size=\"control\" />\n </button>\n </div>\n {open &&\n portalTarget !== null &&\n createPortal(\n <div\n ref={surfaceRef}\n popover=\"manual\"\n role=\"region\"\n aria-labelledby={labelId}\n className={`miaixz-${component}-surface`}\n data-state={status}\n >\n {loading ? (\n <div id={listboxId} className={`miaixz-${component}-message`} role=\"status\">\n <Icon name=\"LoaderCircle\" size=\"control\" className=\"miaixz-icon-spin\" />\n {loadingMessage ?? t(\"ui.loading\")}\n </div>\n ) : loadFailed ? (\n <div id={listboxId} className={`miaixz-${component}-message`} role=\"alert\">\n {errorMessage ?? t(\"ui.combobox.loadError\")}\n </div>\n ) : visibleOptions.length === 0 ? (\n <div id={listboxId} className={`miaixz-${component}-message`} role=\"status\">\n {emptyMessage ?? \"—\"}\n </div>\n ) : (\n <div\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={labelId}\n aria-multiselectable={component === \"multi-select\" || undefined}\n className={`miaixz-${component}-listbox`}\n >\n {visibleOptions.map((option, index) => {\n const selected = isOptionSelected(option.value);\n const optionDisabled =\n option.disabled === true || isOptionSelectionDisabled(option.value);\n return (\n <div\n key={option.value}\n id={`${optionIdPrefix}-option-${index}`}\n role=\"option\"\n aria-label={option.label}\n aria-selected={selected}\n aria-disabled={optionDisabled || undefined}\n className={`miaixz-${component}-option`}\n data-state={index === resolvedActiveIndex ? \"active\" : \"idle\"}\n data-disabled={optionDisabled || undefined}\n onPointerMove={() => {\n if (!optionDisabled) setActiveIndex(index);\n }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => activateOption(option)}\n >\n <span className={`miaixz-${component}-option-copy`}>\n <span className={`miaixz-${component}-option-label`}>{option.label}</span>\n {option.description !== undefined && (\n <span className={`miaixz-${component}-option-description`}>\n {option.description}\n </span>\n )}\n </span>\n {selected && <Icon name=\"Check\" size=\"control\" />}\n </div>\n );\n })}\n </div>\n )}\n </div>,\n portalTarget,\n )}\n </div>\n );\n}\n\n/**\n * Validates the mutually exclusive static and asynchronous option sources.\n *\n * @typeParam Value - Stable string value returned by the source.\n * @param translate - Active localized message resolver.\n * @param options - Optional static option source.\n * @param loadOptions - Optional asynchronous option source.\n */\nfunction validateMiaixzComboboxOptionSource<Value extends string>(\n translate: MiaixzTranslator,\n options: readonly MiaixzOption<Value>[] | undefined,\n loadOptions: MiaixzOptionLoader<Value> | undefined,\n): void {\n if ((options === undefined) === (loadOptions === undefined)) {\n throw createMiaixzUiError(translate, {\n code: \"UI_OPTIONS_SOURCE_INVALID\",\n messageKey: \"ui.error.options.sourceInvalid\",\n });\n }\n}\n\n/**\n * Validates the selected-value controlled and uncontrolled contract.\n *\n * @param translate - Active localized message resolver.\n * @param controlled - Whether a controlled value was supplied.\n * @param hasDefault - Whether an uncontrolled default was supplied.\n * @param hasChangeHandler - Whether requested changes can be observed.\n */\nexport function validateMiaixzComboboxValueControl(\n translate: MiaixzTranslator,\n controlled: boolean,\n hasDefault: boolean,\n hasChangeHandler: boolean,\n): void {\n if (controlled && (!hasChangeHandler || hasDefault)) {\n throw createMiaixzUiError(translate, {\n code: \"UI_CONTROLLED_VALUE_INVALID\",\n messageKey: \"ui.error.controlled.valueInvalid\",\n });\n }\n}\n\n/**\n * Validates the search-input controlled and uncontrolled contract.\n *\n * @param translate - Active localized message resolver.\n * @param controlled - Whether a controlled input value was supplied.\n * @param hasDefault - Whether an uncontrolled input default was supplied.\n * @param hasChangeHandler - Whether requested changes can be observed.\n */\nexport function validateMiaixzComboboxInputControl(\n translate: MiaixzTranslator,\n controlled: boolean,\n hasDefault: boolean,\n hasChangeHandler: boolean,\n): void {\n if (controlled && (!hasChangeHandler || hasDefault)) {\n throw createMiaixzUiError(translate, {\n code: \"UI_CONTROLLED_INPUT_INVALID\",\n messageKey: \"ui.error.controlled.inputInvalid\",\n });\n }\n}\n\n/**\n * Freezes selection and input control modes for the mounted component lifetime.\n *\n * @param translate - Active localized message resolver.\n * @param valueControlled - Current selected-value control mode.\n * @param inputControlled - Current search-input control mode.\n */\nexport function useStableMiaixzComboboxControlModes(\n translate: MiaixzTranslator,\n valueControlled: boolean,\n inputControlled: boolean,\n): void {\n const [initialModes] = useState<MiaixzComboboxControlModes>({\n value: valueControlled,\n input: inputControlled,\n });\n if (initialModes.value !== valueControlled || initialModes.input !== inputControlled) {\n throw createMiaixzUiError(translate, {\n code: \"UI_CONTROL_MODE_CHANGED\",\n messageKey: \"ui.error.controlled.modeChanged\",\n });\n }\n}\n\n/**\n * Filters static options by Unicode-lowercased label while preserving source order.\n *\n * @typeParam Value - Stable string value carried by each option.\n * @param options - Ordered static option source.\n * @param query - Current search input.\n * @returns Options whose labels contain the normalized query.\n */\nfunction filterMiaixzComboboxOptions<Value extends string>(\n options: readonly MiaixzOption<Value>[],\n query: string,\n): readonly MiaixzOption<Value>[] {\n const normalizedQuery = query.toLocaleLowerCase();\n if (normalizedQuery.length === 0) return options;\n return options.filter((option) => option.label.toLocaleLowerCase().includes(normalizedQuery));\n}\n\n/**\n * Finds the next enabled option without wrapping past the collection boundary.\n *\n * @typeParam Value - Stable string value carried by each option.\n * @param options - Current ordered visible options.\n * @param isSelectionDisabled - Selection-limit predicate.\n * @param startIndex - First candidate index.\n * @param direction - Search direction expressed as one or negative one.\n * @returns Enabled option index, or negative one when no candidate remains.\n */\nfunction findMiaixzComboboxEnabledOption<Value extends string>(\n options: readonly MiaixzOption<Value>[],\n isSelectionDisabled: (value: Value) => boolean,\n startIndex: number,\n direction: 1 | -1,\n): number {\n for (\n let index = Math.min(Math.max(startIndex, 0), Math.max(options.length - 1, 0));\n index >= 0 && index < options.length;\n index += direction\n ) {\n if (isMiaixzComboboxOptionEnabled(options[index], isSelectionDisabled)) return index;\n }\n return -1;\n}\n\n/**\n * Reports whether an option accepts pointer or keyboard activation.\n *\n * @typeParam Value - Stable string value carried by the option.\n * @param option - Optional candidate at the requested index.\n * @param isSelectionDisabled - Selection-limit predicate.\n * @returns Whether the option exists and remains selectable.\n */\nfunction isMiaixzComboboxOptionEnabled<Value extends string>(\n option: MiaixzOption<Value> | undefined,\n isSelectionDisabled: (value: Value) => boolean,\n): option is MiaixzOption<Value> {\n return option !== undefined && option.disabled !== true && !isSelectionDisabled(option.value);\n}\n\n/**\n * Retains labels for selected values across static and asynchronous result changes.\n *\n * @typeParam Value - Stable string value carried by each option.\n * @param staticOptions - Optional static option collection.\n * @param knownOptions - Persisted metadata from successful asynchronous results.\n * @param selectedValues - Current selected values.\n * @returns Map containing available selected-option metadata.\n */\nfunction createMiaixzSelectedOptionMap<Value extends string>(\n staticOptions: readonly MiaixzOption<Value>[] | undefined,\n knownOptions: ReadonlyMap<Value, MiaixzOption<Value>>,\n selectedValues: readonly Value[],\n): ReadonlyMap<Value, MiaixzOption<Value>> {\n const selected = new Set(selectedValues);\n const result = new Map<Value, MiaixzOption<Value>>();\n for (const option of [...(staticOptions ?? []), ...knownOptions.values()]) {\n if (selected.has(option.value)) result.set(option.value, option);\n }\n return result;\n}\n\n/**\n * Merges a successful asynchronous result into persistent option metadata.\n *\n * @typeParam Value - Stable string value carried by each option.\n * @param currentOptions - Option metadata retained from earlier successful requests.\n * @param loadedOptions - Complete result returned by the latest successful request.\n * @returns A new map retaining every known value and its latest metadata.\n */\nfunction mergeMiaixzKnownOptions<Value extends string>(\n currentOptions: ReadonlyMap<Value, MiaixzOption<Value>>,\n loadedOptions: readonly MiaixzOption<Value>[],\n): ReadonlyMap<Value, MiaixzOption<Value>> {\n const nextOptions = new Map(currentOptions);\n for (const option of loadedOptions) nextOptions.set(option.value, option);\n return nextOptions;\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Describes one selectable option shared by Combobox and MultiSelect.
|
|
4
|
+
*
|
|
5
|
+
* @typeParam Value - Stable string value type used by the owning product.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface MiaixzOption<Value extends string = string> {
|
|
9
|
+
/**
|
|
10
|
+
* Supplies the stable option value.
|
|
11
|
+
*/
|
|
12
|
+
readonly value: Value;
|
|
13
|
+
/**
|
|
14
|
+
* Supplies the visible option label.
|
|
15
|
+
*/
|
|
16
|
+
readonly label: string;
|
|
17
|
+
/**
|
|
18
|
+
* Supplies optional supporting copy.
|
|
19
|
+
*/
|
|
20
|
+
readonly description?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Prevents the option from being selected.
|
|
23
|
+
*/
|
|
24
|
+
readonly disabled?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Loads options for the current query and supports immediate cancellation.
|
|
28
|
+
*
|
|
29
|
+
* @typeParam Value - Stable string value type returned by the loader.
|
|
30
|
+
* @param query - Current user-entered query, including an empty query.
|
|
31
|
+
* @param signal - Abort signal cancelled when the query or component lifecycle changes.
|
|
32
|
+
* @returns The complete ordered option result for the query.
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export type MiaixzOptionLoader<Value extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly MiaixzOption<Value>[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Defines Miaixz-owned Combobox properties before native div attributes are merged.
|
|
38
|
+
*
|
|
39
|
+
* @typeParam Value - Stable string value type selected by the control.
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export interface MiaixzComboboxOwnProps<Value extends string = string> {
|
|
43
|
+
/**
|
|
44
|
+
* Supplies the complete static option collection.
|
|
45
|
+
*/
|
|
46
|
+
options?: readonly MiaixzOption<Value>[];
|
|
47
|
+
/**
|
|
48
|
+
* Supplies the asynchronous option source used instead of static options.
|
|
49
|
+
*/
|
|
50
|
+
loadOptions?: MiaixzOptionLoader<Value>;
|
|
51
|
+
/**
|
|
52
|
+
* Controls the selected value when supplied with `onValueChange`.
|
|
53
|
+
*/
|
|
54
|
+
value?: Value | null;
|
|
55
|
+
/**
|
|
56
|
+
* Sets the initial uncontrolled selected value.
|
|
57
|
+
*/
|
|
58
|
+
defaultValue?: Value | null;
|
|
59
|
+
/**
|
|
60
|
+
* Receives requested selected-value changes.
|
|
61
|
+
*/
|
|
62
|
+
onValueChange?: (value: Value | null) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Controls the search input when supplied with `onInputValueChange`.
|
|
65
|
+
*/
|
|
66
|
+
inputValue?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Sets the initial uncontrolled search input.
|
|
69
|
+
*/
|
|
70
|
+
defaultInputValue?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Receives requested search-input changes.
|
|
73
|
+
*/
|
|
74
|
+
onInputValueChange?: (value: string) => void;
|
|
75
|
+
/**
|
|
76
|
+
* Supplies the visible and accessible field label.
|
|
77
|
+
*/
|
|
78
|
+
label: string;
|
|
79
|
+
/**
|
|
80
|
+
* Supplies placeholder copy for an empty search input.
|
|
81
|
+
*/
|
|
82
|
+
placeholder?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Replaces the empty-result message.
|
|
85
|
+
*/
|
|
86
|
+
emptyMessage?: string;
|
|
87
|
+
/**
|
|
88
|
+
* Replaces the loading-state message.
|
|
89
|
+
*/
|
|
90
|
+
loadingMessage?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Replaces the asynchronous loader failure message.
|
|
93
|
+
*/
|
|
94
|
+
errorMessage?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Disables the complete composite control.
|
|
97
|
+
*/
|
|
98
|
+
disabled?: boolean;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Configures a searchable single-value WAI-ARIA combobox.
|
|
102
|
+
*
|
|
103
|
+
* @typeParam Value - Stable string value type selected by the control.
|
|
104
|
+
* @public
|
|
105
|
+
*/
|
|
106
|
+
export interface ComboboxProps<Value extends string = string> extends Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzComboboxOwnProps<Value>>, MiaixzComboboxOwnProps<Value> {
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=combobox.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.types.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/combobox.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACzD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI,CAC9D,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACnE;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IAEzC;;OAEG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAE9C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,CAC1D,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC,EACzE,sBAAsB,CAAC,KAAK,CAAC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.types.js","sourceRoot":"","sources":["../../../src/components/combobox/combobox.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { HTMLAttributes } from \"react\";\n\n/**\n * Describes one selectable option shared by Combobox and MultiSelect.\n *\n * @typeParam Value - Stable string value type used by the owning product.\n * @public\n */\nexport interface MiaixzOption<Value extends string = string> {\n /**\n * Supplies the stable option value.\n */\n readonly value: Value;\n\n /**\n * Supplies the visible option label.\n */\n readonly label: string;\n\n /**\n * Supplies optional supporting copy.\n */\n readonly description?: string;\n\n /**\n * Prevents the option from being selected.\n */\n readonly disabled?: boolean;\n}\n\n/**\n * Loads options for the current query and supports immediate cancellation.\n *\n * @typeParam Value - Stable string value type returned by the loader.\n * @param query - Current user-entered query, including an empty query.\n * @param signal - Abort signal cancelled when the query or component lifecycle changes.\n * @returns The complete ordered option result for the query.\n * @public\n */\nexport type MiaixzOptionLoader<Value extends string = string> = (\n query: string,\n signal: AbortSignal,\n) => Promise<readonly MiaixzOption<Value>[]>;\n\n/**\n * Defines Miaixz-owned Combobox properties before native div attributes are merged.\n *\n * @typeParam Value - Stable string value type selected by the control.\n * @public\n */\nexport interface MiaixzComboboxOwnProps<Value extends string = string> {\n /**\n * Supplies the complete static option collection.\n */\n options?: readonly MiaixzOption<Value>[];\n\n /**\n * Supplies the asynchronous option source used instead of static options.\n */\n loadOptions?: MiaixzOptionLoader<Value>;\n\n /**\n * Controls the selected value when supplied with `onValueChange`.\n */\n value?: Value | null;\n\n /**\n * Sets the initial uncontrolled selected value.\n */\n defaultValue?: Value | null;\n\n /**\n * Receives requested selected-value changes.\n */\n onValueChange?: (value: Value | null) => void;\n\n /**\n * Controls the search input when supplied with `onInputValueChange`.\n */\n inputValue?: string;\n\n /**\n * Sets the initial uncontrolled search input.\n */\n defaultInputValue?: string;\n\n /**\n * Receives requested search-input changes.\n */\n onInputValueChange?: (value: string) => void;\n\n /**\n * Supplies the visible and accessible field label.\n */\n label: string;\n\n /**\n * Supplies placeholder copy for an empty search input.\n */\n placeholder?: string;\n\n /**\n * Replaces the empty-result message.\n */\n emptyMessage?: string;\n\n /**\n * Replaces the loading-state message.\n */\n loadingMessage?: string;\n\n /**\n * Replaces the asynchronous loader failure message.\n */\n errorMessage?: string;\n\n /**\n * Disables the complete composite control.\n */\n disabled?: boolean;\n}\n\n/**\n * Configures a searchable single-value WAI-ARIA combobox.\n *\n * @typeParam Value - Stable string value type selected by the control.\n * @public\n */\nexport interface ComboboxProps<Value extends string = string>\n extends\n Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzComboboxOwnProps<Value>>,\n MiaixzComboboxOwnProps<Value> {}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/combobox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EACV,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/combobox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC","sourcesContent":["export { Combobox } from \"./combobox.js\";\nexport type {\n ComboboxProps,\n MiaixzComboboxOwnProps,\n MiaixzOption,\n MiaixzOptionLoader,\n} from \"./combobox.types.js\";\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConfirmDialogProps } from "./confirm-dialog.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a focus-safe confirmation flow by composing the shared modal dialog.
|
|
4
|
+
*
|
|
5
|
+
* @param props - Controlled confirmation state, content, actions, and optional safety controls.
|
|
6
|
+
* @returns A confirmation dialog that keeps cancellation as the initial focus target.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare function ConfirmDialog(props: ConfirmDialogProps): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=confirm-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/confirm-dialog/confirm-dialog.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAkHtD"}
|