@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,272 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment, useEffect } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Selects elements that can participate in keyboard focus order.
|
|
5
|
+
*/
|
|
6
|
+
const focusableSelector = [
|
|
7
|
+
"a[href]",
|
|
8
|
+
"button:not([disabled])",
|
|
9
|
+
"input:not([disabled]):not([type='hidden'])",
|
|
10
|
+
"select:not([disabled])",
|
|
11
|
+
"textarea:not([disabled])",
|
|
12
|
+
"[contenteditable='true']",
|
|
13
|
+
"[tabindex]:not([tabindex='-1'])",
|
|
14
|
+
].join(",");
|
|
15
|
+
/**
|
|
16
|
+
* Stores the active focus scopes for each independent document realm.
|
|
17
|
+
*/
|
|
18
|
+
const focusScopeStacks = new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Activates the single package-internal focus boundary around rendered children.
|
|
21
|
+
*
|
|
22
|
+
* Activation is deferred to a microtask so native dialog synchronization can finish before the
|
|
23
|
+
* first focus move. Cleanup cancels pending activation or deactivates the live scope exactly once.
|
|
24
|
+
*
|
|
25
|
+
* @param props - Internal focus boundary configuration.
|
|
26
|
+
* @param props.active - Whether the focus boundary is active.
|
|
27
|
+
* @param props.containerRef - Reference to the scope container.
|
|
28
|
+
* @param props.initialFocusRef - Optional reference to the preferred initial target.
|
|
29
|
+
* @param props.restoreFocusRef - Optional reference to a pre-captured restoration target.
|
|
30
|
+
* @param props.children - Content rendered without an additional wrapper.
|
|
31
|
+
* @returns Rendered children without an additional DOM element.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export function FocusScope({ active, containerRef, initialFocusRef, restoreFocusRef, children, }) {
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!active)
|
|
37
|
+
return undefined;
|
|
38
|
+
const container = containerRef.current;
|
|
39
|
+
if (container === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
let cancelled = false;
|
|
42
|
+
let deactivate;
|
|
43
|
+
queueMicrotask(() => {
|
|
44
|
+
if (cancelled)
|
|
45
|
+
return;
|
|
46
|
+
deactivate = activateMiaixzFocusScope(container, initialFocusRef?.current ?? undefined, restoreFocusRef === undefined ? undefined : restoreFocusRef.current);
|
|
47
|
+
});
|
|
48
|
+
return () => {
|
|
49
|
+
cancelled = true;
|
|
50
|
+
deactivate?.();
|
|
51
|
+
};
|
|
52
|
+
}, [active, containerRef, initialFocusRef, restoreFocusRef]);
|
|
53
|
+
return _jsx(Fragment, { children: children });
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Activates focus entry, Tab containment, nested-scope ownership, and restoration for one element.
|
|
57
|
+
*
|
|
58
|
+
* This package-internal function is exported only for direct reuse and deterministic unit tests;
|
|
59
|
+
* it is not re-exported from any public package entry.
|
|
60
|
+
*
|
|
61
|
+
* @param container - Element whose descendants form the focus boundary.
|
|
62
|
+
* @param initialFocus - Optional preferred initial focus element inside the container.
|
|
63
|
+
* @param restoreFocusTarget - Optional pre-captured restoration target; null disables restoration.
|
|
64
|
+
* @returns An idempotent function that removes the scope and restores a valid focus target.
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
export function activateMiaixzFocusScope(container, initialFocus, restoreFocusTarget) {
|
|
68
|
+
const ownerDocument = container.ownerDocument;
|
|
69
|
+
const stack = getFocusScopeStack(ownerDocument);
|
|
70
|
+
const activeElement = ownerDocument.activeElement;
|
|
71
|
+
const entry = {
|
|
72
|
+
id: Symbol("miaixz-focus-scope"),
|
|
73
|
+
container,
|
|
74
|
+
document: ownerDocument,
|
|
75
|
+
restoreTarget: restoreFocusTarget === undefined
|
|
76
|
+
? isFocusableReference(activeElement)
|
|
77
|
+
? activeElement
|
|
78
|
+
: undefined
|
|
79
|
+
: (restoreFocusTarget ?? undefined),
|
|
80
|
+
addedContainerTabIndex: false,
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Keeps keyboard Tab movement inside the current topmost scope.
|
|
84
|
+
*
|
|
85
|
+
* @param event - Keyboard event dispatched from the scope container.
|
|
86
|
+
*/
|
|
87
|
+
const handleKeyDown = (event) => {
|
|
88
|
+
if (event.key !== "Tab" ||
|
|
89
|
+
event.altKey ||
|
|
90
|
+
event.ctrlKey ||
|
|
91
|
+
event.metaKey ||
|
|
92
|
+
getTopFocusScope(ownerDocument)?.id !== entry.id) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const focusable = getFocusableElements(container);
|
|
96
|
+
if (focusable.length === 0) {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
focusScopeEntry(entry);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const first = focusable[0];
|
|
102
|
+
const last = focusable.at(-1);
|
|
103
|
+
const current = ownerDocument.activeElement;
|
|
104
|
+
const currentIsInside = isFocusableReference(current) && container.contains(current);
|
|
105
|
+
if (event.shiftKey && (!currentIsInside || current === first)) {
|
|
106
|
+
event.preventDefault();
|
|
107
|
+
if (last !== undefined)
|
|
108
|
+
focusElement(last);
|
|
109
|
+
}
|
|
110
|
+
else if (!event.shiftKey && (!currentIsInside || current === last)) {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
if (first !== undefined)
|
|
113
|
+
focusElement(first);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Redirects programmatic focus back into the current topmost scope.
|
|
118
|
+
*
|
|
119
|
+
* @param event - Focus event observed by the owner document.
|
|
120
|
+
*/
|
|
121
|
+
const handleFocusIn = (event) => {
|
|
122
|
+
if (getTopFocusScope(ownerDocument)?.id !== entry.id)
|
|
123
|
+
return;
|
|
124
|
+
const target = event.target;
|
|
125
|
+
if (!isFocusableReference(target) || !container.contains(target))
|
|
126
|
+
focusScopeEntry(entry);
|
|
127
|
+
};
|
|
128
|
+
stack.push(entry);
|
|
129
|
+
container.addEventListener("keydown", handleKeyDown);
|
|
130
|
+
ownerDocument.addEventListener("focusin", handleFocusIn);
|
|
131
|
+
focusScopeEntry(entry, initialFocus);
|
|
132
|
+
let active = true;
|
|
133
|
+
return () => {
|
|
134
|
+
if (!active)
|
|
135
|
+
return;
|
|
136
|
+
active = false;
|
|
137
|
+
const currentStack = getFocusScopeStack(ownerDocument);
|
|
138
|
+
const entryIndex = currentStack.findIndex((candidate) => candidate.id === entry.id);
|
|
139
|
+
if (entryIndex < 0)
|
|
140
|
+
return;
|
|
141
|
+
const wasTopScope = entryIndex === currentStack.length - 1;
|
|
142
|
+
currentStack.splice(entryIndex, 1);
|
|
143
|
+
container.removeEventListener("keydown", handleKeyDown);
|
|
144
|
+
ownerDocument.removeEventListener("focusin", handleFocusIn);
|
|
145
|
+
restoreContainerTabIndex(entry);
|
|
146
|
+
if (!wasTopScope) {
|
|
147
|
+
const nestedEntry = currentStack[entryIndex];
|
|
148
|
+
if (nestedEntry !== undefined &&
|
|
149
|
+
entry.restoreTarget !== undefined &&
|
|
150
|
+
nestedEntry.restoreTarget !== undefined &&
|
|
151
|
+
entry.container.contains(nestedEntry.restoreTarget)) {
|
|
152
|
+
nestedEntry.restoreTarget = entry.restoreTarget;
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
restoreFocusAfterScope(entry, currentStack.at(-1));
|
|
157
|
+
if (currentStack.length === 0)
|
|
158
|
+
focusScopeStacks.delete(ownerDocument);
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Returns the mutable activation stack for one document realm.
|
|
163
|
+
*
|
|
164
|
+
* @param ownerDocument - Document whose scopes are being coordinated.
|
|
165
|
+
* @returns Existing or newly created focus-scope stack.
|
|
166
|
+
*/
|
|
167
|
+
function getFocusScopeStack(ownerDocument) {
|
|
168
|
+
const existing = focusScopeStacks.get(ownerDocument);
|
|
169
|
+
if (existing !== undefined)
|
|
170
|
+
return existing;
|
|
171
|
+
const created = [];
|
|
172
|
+
focusScopeStacks.set(ownerDocument, created);
|
|
173
|
+
return created;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Returns the active topmost scope for one document.
|
|
177
|
+
*
|
|
178
|
+
* @param ownerDocument - Document whose scope stack should be inspected.
|
|
179
|
+
* @returns Topmost scope or undefined when none is active.
|
|
180
|
+
*/
|
|
181
|
+
function getTopFocusScope(ownerDocument) {
|
|
182
|
+
return focusScopeStacks.get(ownerDocument)?.at(-1);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Reads the current focusable descendants in document order.
|
|
186
|
+
*
|
|
187
|
+
* @param container - Scope container to inspect.
|
|
188
|
+
* @returns Connected, enabled, assistive-visible focus targets.
|
|
189
|
+
*/
|
|
190
|
+
function getFocusableElements(container) {
|
|
191
|
+
return Array.from(container.querySelectorAll(focusableSelector)).filter((element) => element.isConnected &&
|
|
192
|
+
!element.hasAttribute("disabled") &&
|
|
193
|
+
element.getAttribute("aria-hidden") !== "true" &&
|
|
194
|
+
element.closest("[hidden], [inert], [aria-hidden='true']") === null);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Moves focus to the preferred target, first focusable descendant, or the container itself.
|
|
198
|
+
*
|
|
199
|
+
* @param entry - Active scope receiving focus.
|
|
200
|
+
* @param preferred - Optional preferred target within the scope.
|
|
201
|
+
*/
|
|
202
|
+
function focusScopeEntry(entry, preferred) {
|
|
203
|
+
if (preferred !== undefined &&
|
|
204
|
+
preferred.isConnected &&
|
|
205
|
+
entry.container.contains(preferred) &&
|
|
206
|
+
focusElement(preferred)) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const first = getFocusableElements(entry.container)[0];
|
|
210
|
+
if (first !== undefined && focusElement(first))
|
|
211
|
+
return;
|
|
212
|
+
if (entry.container.getAttribute("tabindex") === null) {
|
|
213
|
+
entry.container.setAttribute("tabindex", "-1");
|
|
214
|
+
entry.addedContainerTabIndex = true;
|
|
215
|
+
}
|
|
216
|
+
focusElement(entry.container);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Restores focus to the captured target or to the still-active parent scope.
|
|
220
|
+
*
|
|
221
|
+
* @param entry - Scope being removed.
|
|
222
|
+
* @param parent - Remaining parent scope, when one exists.
|
|
223
|
+
*/
|
|
224
|
+
function restoreFocusAfterScope(entry, parent) {
|
|
225
|
+
const target = entry.restoreTarget;
|
|
226
|
+
if (target !== undefined &&
|
|
227
|
+
target.isConnected &&
|
|
228
|
+
(parent === undefined || parent.container.contains(target)) &&
|
|
229
|
+
focusElement(target)) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (parent !== undefined)
|
|
233
|
+
focusScopeEntry(parent);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Removes a tabindex added only to support an otherwise empty focus scope.
|
|
237
|
+
*
|
|
238
|
+
* @param entry - Scope whose container attributes should be restored.
|
|
239
|
+
*/
|
|
240
|
+
function restoreContainerTabIndex(entry) {
|
|
241
|
+
if (entry.addedContainerTabIndex)
|
|
242
|
+
entry.container.removeAttribute("tabindex");
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Determines whether an unknown active-element value can safely receive focus.
|
|
246
|
+
*
|
|
247
|
+
* @param value - Candidate active or restoration target.
|
|
248
|
+
* @returns Whether the candidate exposes the required HTMLElement focus contract.
|
|
249
|
+
*/
|
|
250
|
+
function isFocusableReference(value) {
|
|
251
|
+
return (typeof value === "object" &&
|
|
252
|
+
value !== null &&
|
|
253
|
+
"focus" in value &&
|
|
254
|
+
typeof value.focus === "function" &&
|
|
255
|
+
"isConnected" in value);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Attempts a focus move without allowing detached or browser-specific failures to escape cleanup.
|
|
259
|
+
*
|
|
260
|
+
* @param element - Connected element that should receive focus.
|
|
261
|
+
* @returns Whether the owner document reports the element as active after the move.
|
|
262
|
+
*/
|
|
263
|
+
function focusElement(element) {
|
|
264
|
+
try {
|
|
265
|
+
element.focus({ preventScroll: true });
|
|
266
|
+
return element.ownerDocument.activeElement === element;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=focus-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-scope.js","sourceRoot":"","sources":["../../src/accessibility/focus-scope.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Fragment, useEffect, type ReactElement, type ReactNode, type RefObject } from \"react\";\n\n/**\n * Selects elements that can participate in keyboard focus order.\n */\nconst focusableSelector = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled]):not([type='hidden'])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[contenteditable='true']\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\n/**\n * Stores the active focus scopes for each independent document realm.\n */\nconst focusScopeStacks = new WeakMap<Document, FocusScopeEntry[]>();\n\n/**\n * Describes the internal state retained while one focus scope is active.\n */\ninterface FocusScopeEntry {\n /**\n * Uniquely identifies the activation instance.\n */\n readonly id: symbol;\n\n /**\n * Contains every focusable node owned by the scope.\n */\n readonly container: HTMLElement;\n\n /**\n * Identifies the document that owns the scope.\n */\n readonly document: Document;\n\n /**\n * Identifies the element that should receive focus after deactivation.\n */\n restoreTarget: HTMLElement | undefined;\n\n /**\n * Tracks whether the scope added a temporary container tabindex.\n */\n addedContainerTabIndex: boolean;\n}\n\n/**\n * Configures the package-internal focus scope component.\n */\ninterface FocusScopeProps {\n /**\n * Controls whether the focus boundary is active.\n */\n readonly active: boolean;\n\n /**\n * References the element that owns focusable descendants.\n */\n readonly containerRef: RefObject<HTMLElement | null>;\n\n /**\n * Optionally identifies the preferred initial focus element.\n */\n readonly initialFocusRef?: RefObject<HTMLElement | null>;\n\n /**\n * Optionally supplies a restoration target captured before a native modal changes focus.\n */\n readonly restoreFocusRef?: RefObject<HTMLElement | null>;\n\n /**\n * Supplies content without introducing another DOM wrapper.\n */\n readonly children: ReactNode;\n}\n\n/**\n * Activates the single package-internal focus boundary around rendered children.\n *\n * Activation is deferred to a microtask so native dialog synchronization can finish before the\n * first focus move. Cleanup cancels pending activation or deactivates the live scope exactly once.\n *\n * @param props - Internal focus boundary configuration.\n * @param props.active - Whether the focus boundary is active.\n * @param props.containerRef - Reference to the scope container.\n * @param props.initialFocusRef - Optional reference to the preferred initial target.\n * @param props.restoreFocusRef - Optional reference to a pre-captured restoration target.\n * @param props.children - Content rendered without an additional wrapper.\n * @returns Rendered children without an additional DOM element.\n * @internal\n */\nexport function FocusScope({\n active,\n containerRef,\n initialFocusRef,\n restoreFocusRef,\n children,\n}: FocusScopeProps): ReactElement {\n useEffect(() => {\n if (!active) return undefined;\n const container = containerRef.current;\n if (container === null) return undefined;\n let cancelled = false;\n let deactivate: (() => void) | undefined;\n queueMicrotask(() => {\n if (cancelled) return;\n deactivate = activateMiaixzFocusScope(\n container,\n initialFocusRef?.current ?? undefined,\n restoreFocusRef === undefined ? undefined : restoreFocusRef.current,\n );\n });\n return () => {\n cancelled = true;\n deactivate?.();\n };\n }, [active, containerRef, initialFocusRef, restoreFocusRef]);\n\n return <Fragment>{children}</Fragment>;\n}\n\n/**\n * Activates focus entry, Tab containment, nested-scope ownership, and restoration for one element.\n *\n * This package-internal function is exported only for direct reuse and deterministic unit tests;\n * it is not re-exported from any public package entry.\n *\n * @param container - Element whose descendants form the focus boundary.\n * @param initialFocus - Optional preferred initial focus element inside the container.\n * @param restoreFocusTarget - Optional pre-captured restoration target; null disables restoration.\n * @returns An idempotent function that removes the scope and restores a valid focus target.\n * @internal\n */\nexport function activateMiaixzFocusScope(\n container: HTMLElement,\n initialFocus?: HTMLElement,\n restoreFocusTarget?: HTMLElement | null,\n): () => void {\n const ownerDocument = container.ownerDocument;\n const stack = getFocusScopeStack(ownerDocument);\n const activeElement = ownerDocument.activeElement;\n const entry: FocusScopeEntry = {\n id: Symbol(\"miaixz-focus-scope\"),\n container,\n document: ownerDocument,\n restoreTarget:\n restoreFocusTarget === undefined\n ? isFocusableReference(activeElement)\n ? activeElement\n : undefined\n : (restoreFocusTarget ?? undefined),\n addedContainerTabIndex: false,\n };\n\n /**\n * Keeps keyboard Tab movement inside the current topmost scope.\n *\n * @param event - Keyboard event dispatched from the scope container.\n */\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (\n event.key !== \"Tab\" ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n getTopFocusScope(ownerDocument)?.id !== entry.id\n ) {\n return;\n }\n\n const focusable = getFocusableElements(container);\n if (focusable.length === 0) {\n event.preventDefault();\n focusScopeEntry(entry);\n return;\n }\n\n const first = focusable[0];\n const last = focusable.at(-1);\n const current = ownerDocument.activeElement;\n const currentIsInside = isFocusableReference(current) && container.contains(current);\n if (event.shiftKey && (!currentIsInside || current === first)) {\n event.preventDefault();\n if (last !== undefined) focusElement(last);\n } else if (!event.shiftKey && (!currentIsInside || current === last)) {\n event.preventDefault();\n if (first !== undefined) focusElement(first);\n }\n };\n\n /**\n * Redirects programmatic focus back into the current topmost scope.\n *\n * @param event - Focus event observed by the owner document.\n */\n const handleFocusIn = (event: FocusEvent): void => {\n if (getTopFocusScope(ownerDocument)?.id !== entry.id) return;\n const target = event.target;\n if (!isFocusableReference(target) || !container.contains(target)) focusScopeEntry(entry);\n };\n\n stack.push(entry);\n container.addEventListener(\"keydown\", handleKeyDown);\n ownerDocument.addEventListener(\"focusin\", handleFocusIn);\n focusScopeEntry(entry, initialFocus);\n\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const currentStack = getFocusScopeStack(ownerDocument);\n const entryIndex = currentStack.findIndex((candidate) => candidate.id === entry.id);\n if (entryIndex < 0) return;\n const wasTopScope = entryIndex === currentStack.length - 1;\n currentStack.splice(entryIndex, 1);\n container.removeEventListener(\"keydown\", handleKeyDown);\n ownerDocument.removeEventListener(\"focusin\", handleFocusIn);\n restoreContainerTabIndex(entry);\n\n if (!wasTopScope) {\n const nestedEntry = currentStack[entryIndex];\n if (\n nestedEntry !== undefined &&\n entry.restoreTarget !== undefined &&\n nestedEntry.restoreTarget !== undefined &&\n entry.container.contains(nestedEntry.restoreTarget)\n ) {\n nestedEntry.restoreTarget = entry.restoreTarget;\n }\n return;\n }\n\n restoreFocusAfterScope(entry, currentStack.at(-1));\n if (currentStack.length === 0) focusScopeStacks.delete(ownerDocument);\n };\n}\n\n/**\n * Returns the mutable activation stack for one document realm.\n *\n * @param ownerDocument - Document whose scopes are being coordinated.\n * @returns Existing or newly created focus-scope stack.\n */\nfunction getFocusScopeStack(ownerDocument: Document): FocusScopeEntry[] {\n const existing = focusScopeStacks.get(ownerDocument);\n if (existing !== undefined) return existing;\n const created: FocusScopeEntry[] = [];\n focusScopeStacks.set(ownerDocument, created);\n return created;\n}\n\n/**\n * Returns the active topmost scope for one document.\n *\n * @param ownerDocument - Document whose scope stack should be inspected.\n * @returns Topmost scope or undefined when none is active.\n */\nfunction getTopFocusScope(ownerDocument: Document): FocusScopeEntry | undefined {\n return focusScopeStacks.get(ownerDocument)?.at(-1);\n}\n\n/**\n * Reads the current focusable descendants in document order.\n *\n * @param container - Scope container to inspect.\n * @returns Connected, enabled, assistive-visible focus targets.\n */\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(focusableSelector)).filter(\n (element) =>\n element.isConnected &&\n !element.hasAttribute(\"disabled\") &&\n element.getAttribute(\"aria-hidden\") !== \"true\" &&\n element.closest(\"[hidden], [inert], [aria-hidden='true']\") === null,\n );\n}\n\n/**\n * Moves focus to the preferred target, first focusable descendant, or the container itself.\n *\n * @param entry - Active scope receiving focus.\n * @param preferred - Optional preferred target within the scope.\n */\nfunction focusScopeEntry(entry: FocusScopeEntry, preferred?: HTMLElement): void {\n if (\n preferred !== undefined &&\n preferred.isConnected &&\n entry.container.contains(preferred) &&\n focusElement(preferred)\n ) {\n return;\n }\n\n const first = getFocusableElements(entry.container)[0];\n if (first !== undefined && focusElement(first)) return;\n if (entry.container.getAttribute(\"tabindex\") === null) {\n entry.container.setAttribute(\"tabindex\", \"-1\");\n entry.addedContainerTabIndex = true;\n }\n focusElement(entry.container);\n}\n\n/**\n * Restores focus to the captured target or to the still-active parent scope.\n *\n * @param entry - Scope being removed.\n * @param parent - Remaining parent scope, when one exists.\n */\nfunction restoreFocusAfterScope(entry: FocusScopeEntry, parent: FocusScopeEntry | undefined): void {\n const target = entry.restoreTarget;\n if (\n target !== undefined &&\n target.isConnected &&\n (parent === undefined || parent.container.contains(target)) &&\n focusElement(target)\n ) {\n return;\n }\n if (parent !== undefined) focusScopeEntry(parent);\n}\n\n/**\n * Removes a tabindex added only to support an otherwise empty focus scope.\n *\n * @param entry - Scope whose container attributes should be restored.\n */\nfunction restoreContainerTabIndex(entry: FocusScopeEntry): void {\n if (entry.addedContainerTabIndex) entry.container.removeAttribute(\"tabindex\");\n}\n\n/**\n * Determines whether an unknown active-element value can safely receive focus.\n *\n * @param value - Candidate active or restoration target.\n * @returns Whether the candidate exposes the required HTMLElement focus contract.\n */\nfunction isFocusableReference(value: unknown): value is HTMLElement {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"focus\" in value &&\n typeof value.focus === \"function\" &&\n \"isConnected\" in value\n );\n}\n\n/**\n * Attempts a focus move without allowing detached or browser-specific failures to escape cleanup.\n *\n * @param element - Connected element that should receive focus.\n * @returns Whether the owner document reports the element as active after the move.\n */\nfunction focusElement(element: HTMLElement): boolean {\n try {\n element.focus({ preventScroll: true });\n return element.ownerDocument.activeElement === element;\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/accessibility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessibility/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { FocusScope, activateMiaixzFocusScope } from \"./focus-scope.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AlertProps } from "./alert.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a prominent localized feedback message with optional actions and dismissal.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export declare const Alert: import("react").ForwardRefExoticComponent<AlertProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
8
|
+
//# sourceMappingURL=alert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAanD;;;;GAIG;AACH,eAAO,MAAM,KAAK,uGAmChB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { classNames } from "../../internal/class-names.js";
|
|
4
|
+
import { useMiaixzLocale } from "../../i18n/index.js";
|
|
5
|
+
import { Button } from "../button/index.js";
|
|
6
|
+
import { Icon } from "../icon/index.js";
|
|
7
|
+
const miaixzAlertIcons = {
|
|
8
|
+
neutral: "Info",
|
|
9
|
+
info: "Info",
|
|
10
|
+
success: "CircleCheck",
|
|
11
|
+
warning: "TriangleAlert",
|
|
12
|
+
danger: "CircleAlert",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Renders a prominent localized feedback message with optional actions and dismissal.
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export const Alert = forwardRef(function Alert({ tone = "neutral", title, children, actions, dismissLabel, onDismiss, className, ...props }, ref) {
|
|
20
|
+
const { t } = useMiaixzLocale();
|
|
21
|
+
const resolvedDismissLabel = dismissLabel ?? t("ui.action.dismiss");
|
|
22
|
+
return (_jsxs("div", { ...props, ref: ref, role: tone === "danger" ? "alert" : "status", "data-tone": tone, className: classNames("miaixz-alert", `miaixz-alert-${tone}`, className), children: [_jsx(Icon, { name: miaixzAlertIcons[tone], size: "control", className: "miaixz-alert-icon" }), _jsxs("div", { className: "miaixz-alert-content", children: [title !== undefined && _jsx("div", { className: "miaixz-alert-title", children: title }), _jsx("div", { className: "miaixz-alert-message", children: children }), actions !== undefined && _jsx("div", { className: "miaixz-alert-actions", children: actions })] }), onDismiss !== undefined && (_jsx(Button, { iconOnly: true, variant: "ghost", size: "small", "aria-label": resolvedDismissLabel, className: "miaixz-alert-dismiss", onClick: onDismiss, children: _jsx(Icon, { name: "X" }) }))] }));
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/components/alert/alert.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAIxC,MAAM,gBAAgB,GAGlB;IACF,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAA6B,SAAS,KAAK,CACxE,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAC5F,GAAG;IAEH,MAAM,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,oBAAoB,GAAG,YAAY,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAEpE,OAAO,CACL,kBACM,KAAK,EACT,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,eACjC,IAAI,EACf,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE,gBAAgB,IAAI,EAAE,EAAE,SAAS,CAAC,aAExE,KAAC,IAAI,IAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAC,SAAS,EAAC,SAAS,EAAC,mBAAmB,GAAG,EACnF,eAAK,SAAS,EAAC,sBAAsB,aAClC,KAAK,KAAK,SAAS,IAAI,cAAK,SAAS,EAAC,oBAAoB,YAAE,KAAK,GAAO,EACzE,cAAK,SAAS,EAAC,sBAAsB,YAAE,QAAQ,GAAO,EACrD,OAAO,KAAK,SAAS,IAAI,cAAK,SAAS,EAAC,sBAAsB,YAAE,OAAO,GAAO,IAC3E,EACL,SAAS,KAAK,SAAS,IAAI,CAC1B,KAAC,MAAM,IACL,QAAQ,QACR,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,OAAO,gBACA,oBAAoB,EAChC,SAAS,EAAC,sBAAsB,EAChC,OAAO,EAAE,SAAS,YAElB,KAAC,IAAI,IAAC,IAAI,EAAC,GAAG,GAAG,GACV,CACV,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { forwardRef } from \"react\";\n\nimport { classNames } from \"../../internal/class-names.js\";\nimport { useMiaixzLocale } from \"../../i18n/index.js\";\nimport { Button } from \"../button/index.js\";\nimport { Icon } from \"../icon/index.js\";\nimport type { MiaixzFeedbackTone } from \"../shared.types.js\";\nimport type { AlertProps } from \"./alert.types.js\";\n\nconst miaixzAlertIcons: Record<\n MiaixzFeedbackTone,\n \"Info\" | \"CircleCheck\" | \"TriangleAlert\" | \"CircleAlert\"\n> = {\n neutral: \"Info\",\n info: \"Info\",\n success: \"CircleCheck\",\n warning: \"TriangleAlert\",\n danger: \"CircleAlert\",\n};\n\n/**\n * Renders a prominent localized feedback message with optional actions and dismissal.\n *\n * @public\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n { tone = \"neutral\", title, children, actions, dismissLabel, onDismiss, className, ...props },\n ref,\n) {\n const { t } = useMiaixzLocale();\n const resolvedDismissLabel = dismissLabel ?? t(\"ui.action.dismiss\");\n\n return (\n <div\n {...props}\n ref={ref}\n role={tone === \"danger\" ? \"alert\" : \"status\"}\n data-tone={tone}\n className={classNames(\"miaixz-alert\", `miaixz-alert-${tone}`, className)}\n >\n <Icon name={miaixzAlertIcons[tone]} size=\"control\" className=\"miaixz-alert-icon\" />\n <div className=\"miaixz-alert-content\">\n {title !== undefined && <div className=\"miaixz-alert-title\">{title}</div>}\n <div className=\"miaixz-alert-message\">{children}</div>\n {actions !== undefined && <div className=\"miaixz-alert-actions\">{actions}</div>}\n </div>\n {onDismiss !== undefined && (\n <Button\n iconOnly\n variant=\"ghost\"\n size=\"small\"\n aria-label={resolvedDismissLabel}\n className=\"miaixz-alert-dismiss\"\n onClick={onDismiss}\n >\n <Icon name=\"X\" />\n </Button>\n )}\n </div>\n );\n});\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from "react";
|
|
2
|
+
import type { MiaixzFeedbackTone } from "../shared.types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Defines properties owned by the Miaixz Alert contract.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface MiaixzAlertOwnProps {
|
|
9
|
+
/**
|
|
10
|
+
* Selects the semantic feedback tone.
|
|
11
|
+
*
|
|
12
|
+
* @defaultValue `"neutral"`
|
|
13
|
+
*/
|
|
14
|
+
readonly tone?: MiaixzFeedbackTone;
|
|
15
|
+
/**
|
|
16
|
+
* Displays an optional alert heading.
|
|
17
|
+
*/
|
|
18
|
+
readonly title?: ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* Supplies the required alert message content.
|
|
21
|
+
*/
|
|
22
|
+
readonly children: ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* Displays optional actions below the message.
|
|
25
|
+
*/
|
|
26
|
+
readonly actions?: ReactNode;
|
|
27
|
+
/**
|
|
28
|
+
* Overrides the localized accessible dismissal label.
|
|
29
|
+
*/
|
|
30
|
+
readonly dismissLabel?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Enables dismissal and receives the dismissal request.
|
|
33
|
+
*/
|
|
34
|
+
readonly onDismiss?: () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Configures a prominent semantic feedback message.
|
|
38
|
+
*
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
export interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzAlertOwnProps>, MiaixzAlertOwnProps {
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=alert.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.types.d.ts","sourceRoot":"","sources":["../../../src/components/alert/alert.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,UACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,mBAAmB,CAAC,EAAE,mBAAmB;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.types.js","sourceRoot":"","sources":["../../../src/components/alert/alert.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport type { MiaixzFeedbackTone } from \"../shared.types.js\";\n\n/**\n * Defines properties owned by the Miaixz Alert contract.\n *\n * @public\n */\nexport interface MiaixzAlertOwnProps {\n /**\n * Selects the semantic feedback tone.\n *\n * @defaultValue `\"neutral\"`\n */\n readonly tone?: MiaixzFeedbackTone;\n\n /**\n * Displays an optional alert heading.\n */\n readonly title?: ReactNode;\n\n /**\n * Supplies the required alert message content.\n */\n readonly children: ReactNode;\n\n /**\n * Displays optional actions below the message.\n */\n readonly actions?: ReactNode;\n\n /**\n * Overrides the localized accessible dismissal label.\n */\n readonly dismissLabel?: string;\n\n /**\n * Enables dismissal and receives the dismissal request.\n */\n readonly onDismiss?: () => void;\n}\n\n/**\n * Configures a prominent semantic feedback message.\n *\n * @public\n */\nexport interface AlertProps\n extends Omit<HTMLAttributes<HTMLDivElement>, keyof MiaixzAlertOwnProps>, MiaixzAlertOwnProps {}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/alert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/alert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { Alert } from \"./alert.js\";\nexport type { AlertProps, MiaixzAlertOwnProps } from \"./alert.types.js\";\nexport type { MiaixzFeedbackTone } from \"../shared.types.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AvatarProps } from "./avatar.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders an accessible avatar image with a Unicode-safe name fallback.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export declare const Avatar: import("react").ForwardRefExoticComponent<AvatarProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
8
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmBrD;;;;GAIG;AACH,eAAO,MAAM,MAAM,yGA6BjB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useState } from "react";
|
|
3
|
+
import { classNames } from "../../internal/class-names.js";
|
|
4
|
+
/**
|
|
5
|
+
* Derives the first two visible Unicode graphemes from a display name.
|
|
6
|
+
*
|
|
7
|
+
* @param name - Display name used to generate the fallback.
|
|
8
|
+
* @returns Uppercase graphemes or a question mark when the name is empty.
|
|
9
|
+
*/
|
|
10
|
+
function createAvatarFallback(name) {
|
|
11
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
12
|
+
const fallback = Array.from(segmenter.segment(name.trim()), ({ segment }) => segment)
|
|
13
|
+
.filter((segment) => segment.trim().length > 0)
|
|
14
|
+
.slice(0, 2)
|
|
15
|
+
.join("")
|
|
16
|
+
.toLocaleUpperCase();
|
|
17
|
+
return fallback || "?";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Renders an accessible avatar image with a Unicode-safe name fallback.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export const Avatar = forwardRef(function Avatar({ src, alt, name, size = "medium", className, ...props }, ref) {
|
|
25
|
+
const [failedSource, setFailedSource] = useState();
|
|
26
|
+
const displaysImage = src !== undefined && src.length > 0 && failedSource !== src;
|
|
27
|
+
return (_jsx("span", { ...props, ref: ref, "data-size": size, "data-state": displaysImage ? "image" : "fallback", className: classNames("miaixz-avatar", `miaixz-avatar-${size}`, className), children: displaysImage ? (_jsx("img", { className: "miaixz-avatar-image", src: src, alt: alt, onError: () => setFailedSource(src) })) : (_jsx("span", { className: "miaixz-avatar-fallback", role: "img", "aria-label": alt, children: createAvatarFallback(name) })) }));
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/components/avatar/avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;SAClF,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SAC9C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,EAAE,CAAC;SACR,iBAAiB,EAAE,CAAC;IAEvB,OAAO,QAAQ,IAAI,GAAG,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAA+B,SAAS,MAAM,CAC5E,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EACxD,GAAG;IAEH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC3D,MAAM,aAAa,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,GAAG,CAAC;IAElF,OAAO,CACL,kBACM,KAAK,EACT,GAAG,EAAE,GAAG,eACG,IAAI,gBACH,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAChD,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,iBAAiB,IAAI,EAAE,EAAE,SAAS,CAAC,YAEzE,aAAa,CAAC,CAAC,CAAC,CACf,cACE,SAAS,EAAC,qBAAqB,EAC/B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GACnC,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,wBAAwB,EAAC,IAAI,EAAC,KAAK,gBAAa,GAAG,YAChE,oBAAoB,CAAC,IAAI,CAAC,GACtB,CACR,GACI,CACR,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { forwardRef, useState } from \"react\";\n\nimport { classNames } from \"../../internal/class-names.js\";\nimport type { AvatarProps } from \"./avatar.types.js\";\n\n/**\n * Derives the first two visible Unicode graphemes from a display name.\n *\n * @param name - Display name used to generate the fallback.\n * @returns Uppercase graphemes or a question mark when the name is empty.\n */\nfunction createAvatarFallback(name: string): string {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n const fallback = Array.from(segmenter.segment(name.trim()), ({ segment }) => segment)\n .filter((segment) => segment.trim().length > 0)\n .slice(0, 2)\n .join(\"\")\n .toLocaleUpperCase();\n\n return fallback || \"?\";\n}\n\n/**\n * Renders an accessible avatar image with a Unicode-safe name fallback.\n *\n * @public\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { src, alt, name, size = \"medium\", className, ...props },\n ref,\n) {\n const [failedSource, setFailedSource] = useState<string>();\n const displaysImage = src !== undefined && src.length > 0 && failedSource !== src;\n\n return (\n <span\n {...props}\n ref={ref}\n data-size={size}\n data-state={displaysImage ? \"image\" : \"fallback\"}\n className={classNames(\"miaixz-avatar\", `miaixz-avatar-${size}`, className)}\n >\n {displaysImage ? (\n <img\n className=\"miaixz-avatar-image\"\n src={src}\n alt={alt}\n onError={() => setFailedSource(src)}\n />\n ) : (\n <span className=\"miaixz-avatar-fallback\" role=\"img\" aria-label={alt}>\n {createAvatarFallback(name)}\n </span>\n )}\n </span>\n );\n});\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "react";
|
|
2
|
+
import type { MiaixzComponentSize } from "../shared.types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Defines properties owned by the Miaixz Avatar contract.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface MiaixzAvatarOwnProps {
|
|
9
|
+
/**
|
|
10
|
+
* Supplies the optional profile image source.
|
|
11
|
+
*/
|
|
12
|
+
readonly src?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Supplies the required accessible name for either image or fallback content.
|
|
15
|
+
*/
|
|
16
|
+
readonly alt: string;
|
|
17
|
+
/**
|
|
18
|
+
* Supplies the name used to derive fallback graphemes.
|
|
19
|
+
*/
|
|
20
|
+
readonly name: string;
|
|
21
|
+
/**
|
|
22
|
+
* Selects the semantic avatar size.
|
|
23
|
+
*
|
|
24
|
+
* @defaultValue `"medium"`
|
|
25
|
+
*/
|
|
26
|
+
readonly size?: MiaixzComponentSize;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Configures an accessible profile image with a deterministic name fallback.
|
|
30
|
+
*
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, keyof MiaixzAvatarOwnProps>, MiaixzAvatarOwnProps {
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=avatar.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.types.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/avatar.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,oBAAoB,CAAC,EAAE,oBAAoB;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.types.js","sourceRoot":"","sources":["../../../src/components/avatar/avatar.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { HTMLAttributes } from \"react\";\n\nimport type { MiaixzComponentSize } from \"../shared.types.js\";\n\n/**\n * Defines properties owned by the Miaixz Avatar contract.\n *\n * @public\n */\nexport interface MiaixzAvatarOwnProps {\n /**\n * Supplies the optional profile image source.\n */\n readonly src?: string;\n\n /**\n * Supplies the required accessible name for either image or fallback content.\n */\n readonly alt: string;\n\n /**\n * Supplies the name used to derive fallback graphemes.\n */\n readonly name: string;\n\n /**\n * Selects the semantic avatar size.\n *\n * @defaultValue `\"medium\"`\n */\n readonly size?: MiaixzComponentSize;\n}\n\n/**\n * Configures an accessible profile image with a deterministic name fallback.\n *\n * @public\n */\nexport interface AvatarProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, keyof MiaixzAvatarOwnProps>, MiaixzAvatarOwnProps {}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { Avatar } from \"./avatar.js\";\nexport type { AvatarProps, MiaixzAvatarOwnProps } from \"./avatar.types.js\";\nexport type { MiaixzComponentSize } from \"../shared.types.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BadgeProps } from "./badge.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a compact semantic status or category label.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
8
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/badge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,KAAK,wGAqBhB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { classNames } from "../../internal/class-names.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders a compact semantic status or category label.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export const Badge = forwardRef(function Badge({ tone = "neutral", outline = false, dot = false, icon, className, children, ...props }, ref) {
|
|
10
|
+
return (_jsxs("span", { ...props, ref: ref, "data-tone": tone, className: classNames("miaixz-badge", tone !== "neutral" && `miaixz-badge-${tone}`, outline && "miaixz-badge-outline", className), children: [dot && _jsx("span", { className: "miaixz-badge-dot", "aria-hidden": "true" }), icon && _jsx("span", { className: "miaixz-badge-icon", children: icon }), _jsx("span", { className: "miaixz-badge-label", children: children })] }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/components/badge/badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAA8B,SAAS,KAAK,CACzE,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EACvF,GAAG;IAEH,OAAO,CACL,mBACM,KAAK,EACT,GAAG,EAAE,GAAG,eACG,IAAI,EACf,SAAS,EAAE,UAAU,CACnB,cAAc,EACd,IAAI,KAAK,SAAS,IAAI,gBAAgB,IAAI,EAAE,EAC5C,OAAO,IAAI,sBAAsB,EACjC,SAAS,CACV,aAEA,GAAG,IAAI,eAAM,SAAS,EAAC,kBAAkB,iBAAa,MAAM,GAAG,EAC/D,IAAI,IAAI,eAAM,SAAS,EAAC,mBAAmB,YAAE,IAAI,GAAQ,EAC1D,eAAM,SAAS,EAAC,oBAAoB,YAAE,QAAQ,GAAQ,IACjD,CACR,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { forwardRef } from \"react\";\n\nimport { classNames } from \"../../internal/class-names.js\";\nimport type { BadgeProps } from \"./badge.types.js\";\n\n/**\n * Renders a compact semantic status or category label.\n *\n * @public\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { tone = \"neutral\", outline = false, dot = false, icon, className, children, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n data-tone={tone}\n className={classNames(\n \"miaixz-badge\",\n tone !== \"neutral\" && `miaixz-badge-${tone}`,\n outline && \"miaixz-badge-outline\",\n className,\n )}\n >\n {dot && <span className=\"miaixz-badge-dot\" aria-hidden=\"true\" />}\n {icon && <span className=\"miaixz-badge-icon\">{icon}</span>}\n <span className=\"miaixz-badge-label\">{children}</span>\n </span>\n );\n});\n"]}
|