@hyddenlabs/hydn-ui 0.3.0-alpha.99 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -29
- package/dist/components/branding/google-logo.d.ts +14 -0
- package/dist/components/branding/google-logo.d.ts.map +1 -0
- package/dist/components/branding/google-logo.js +49 -0
- package/dist/components/branding/google-logo.js.map +1 -0
- package/dist/components/branding/hydden-logo.d.ts +14 -0
- package/dist/components/branding/hydden-logo.d.ts.map +1 -0
- package/dist/components/branding/hydden-logo.js +8 -0
- package/dist/components/branding/hydden-logo.js.map +1 -0
- package/dist/components/branding/microsoft-logo.d.ts +14 -0
- package/dist/components/branding/microsoft-logo.d.ts.map +1 -0
- package/dist/components/branding/microsoft-logo.js +25 -0
- package/dist/components/branding/microsoft-logo.js.map +1 -0
- package/dist/components/data-display/avatar/avatar.d.ts +24 -0
- package/dist/components/data-display/avatar/avatar.d.ts.map +1 -0
- package/dist/components/data-display/avatar/avatar.js +25 -0
- package/dist/components/data-display/avatar/avatar.js.map +1 -0
- package/dist/components/data-display/avatar/index.d.ts +3 -0
- package/dist/components/data-display/avatar/index.d.ts.map +1 -0
- package/dist/components/data-display/badge/badge.d.ts +24 -0
- package/dist/components/data-display/badge/badge.d.ts.map +1 -0
- package/dist/components/data-display/badge/badge.js +27 -0
- package/dist/components/data-display/badge/badge.js.map +1 -0
- package/dist/components/data-display/badge/index.d.ts +5 -0
- package/dist/components/data-display/badge/index.d.ts.map +1 -0
- package/dist/components/data-display/badge/status-label.d.ts +25 -0
- package/dist/components/data-display/badge/status-label.d.ts.map +1 -0
- package/dist/components/data-display/badge/status-label.js +63 -0
- package/dist/components/data-display/badge/status-label.js.map +1 -0
- package/dist/components/data-display/chip/chip.d.ts +42 -0
- package/dist/components/data-display/chip/chip.d.ts.map +1 -0
- package/dist/components/data-display/chip/chip.js +79 -0
- package/dist/components/data-display/chip/chip.js.map +1 -0
- package/dist/components/data-display/chip/index.d.ts +3 -0
- package/dist/components/data-display/chip/index.d.ts.map +1 -0
- package/dist/components/data-display/code-block/code-block.d.ts +17 -0
- package/dist/components/data-display/code-block/code-block.d.ts.map +1 -0
- package/dist/components/data-display/code-block/code-block.js +34 -0
- package/dist/components/data-display/code-block/code-block.js.map +1 -0
- package/dist/components/data-display/data-table/data-table.d.ts +226 -0
- package/dist/components/data-display/data-table/data-table.d.ts.map +1 -0
- package/dist/components/data-display/data-table/data-table.js +404 -0
- package/dist/components/data-display/data-table/data-table.js.map +1 -0
- package/dist/components/data-display/data-table/index.d.ts +5 -0
- package/dist/components/data-display/data-table/index.d.ts.map +1 -0
- package/dist/components/data-display/data-table/use-table.d.ts +42 -0
- package/dist/components/data-display/data-table/use-table.d.ts.map +1 -0
- package/dist/components/data-display/data-table/use-table.js +120 -0
- package/dist/components/data-display/data-table/use-table.js.map +1 -0
- package/dist/components/data-display/empty-state/empty-state.d.ts +8 -0
- package/dist/components/data-display/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/data-display/empty-state/empty-state.js +17 -0
- package/dist/components/data-display/empty-state/empty-state.js.map +1 -0
- package/dist/components/data-display/empty-state/index.d.ts +3 -0
- package/dist/components/data-display/empty-state/index.d.ts.map +1 -0
- package/dist/components/data-display/list/index.d.ts +3 -0
- package/dist/components/data-display/list/index.d.ts.map +1 -0
- package/dist/components/data-display/list/list.d.ts +31 -0
- package/dist/components/data-display/list/list.d.ts.map +1 -0
- package/dist/components/data-display/list/list.js +16 -0
- package/dist/components/data-display/list/list.js.map +1 -0
- package/dist/components/data-display/table/index.d.ts +3 -0
- package/dist/components/data-display/table/index.d.ts.map +1 -0
- package/dist/components/data-display/table/table.d.ts +101 -0
- package/dist/components/data-display/table/table.d.ts.map +1 -0
- package/dist/components/data-display/table/table.js +98 -0
- package/dist/components/data-display/table/table.js.map +1 -0
- package/dist/components/data-display/timeline/index.d.ts +3 -0
- package/dist/components/data-display/timeline/index.d.ts.map +1 -0
- package/dist/components/data-display/timeline/timeline.d.ts +57 -0
- package/dist/components/data-display/timeline/timeline.d.ts.map +1 -0
- package/dist/components/data-display/timeline/timeline.js +52 -0
- package/dist/components/data-display/timeline/timeline.js.map +1 -0
- package/dist/components/feedback/alert/alert.d.ts +27 -0
- package/dist/components/feedback/alert/alert.d.ts.map +1 -0
- package/dist/components/feedback/alert/alert.js +86 -0
- package/dist/components/feedback/alert/alert.js.map +1 -0
- package/dist/components/feedback/alert/index.d.ts +3 -0
- package/dist/components/feedback/alert/index.d.ts.map +1 -0
- package/dist/components/feedback/dialog/delete-dialog.d.ts +41 -0
- package/dist/components/feedback/dialog/delete-dialog.d.ts.map +1 -0
- package/dist/components/feedback/dialog/delete-dialog.js +52 -0
- package/dist/components/feedback/dialog/delete-dialog.js.map +1 -0
- package/dist/components/feedback/dialog/dialog.d.ts +24 -0
- package/dist/components/feedback/dialog/dialog.d.ts.map +1 -0
- package/dist/components/feedback/dialog/dialog.js +15 -0
- package/dist/components/feedback/dialog/dialog.js.map +1 -0
- package/dist/components/feedback/dialog/index.d.ts +5 -0
- package/dist/components/feedback/dialog/index.d.ts.map +1 -0
- package/dist/components/feedback/error-page/error-400.d.ts +22 -0
- package/dist/components/feedback/error-page/error-400.d.ts.map +1 -0
- package/dist/components/feedback/error-page/error-400.js +28 -0
- package/dist/components/feedback/error-page/error-400.js.map +1 -0
- package/dist/components/feedback/error-page/error-401.d.ts +26 -0
- package/dist/components/feedback/error-page/error-401.d.ts.map +1 -0
- package/dist/components/feedback/error-page/error-401.js +33 -0
- package/dist/components/feedback/error-page/error-401.js.map +1 -0
- package/dist/components/feedback/error-page/error-403.d.ts +26 -0
- package/dist/components/feedback/error-page/error-403.d.ts.map +1 -0
- package/dist/components/feedback/error-page/error-403.js +33 -0
- package/dist/components/feedback/error-page/error-403.js.map +1 -0
- package/dist/components/feedback/error-page/error-404.d.ts +26 -0
- package/dist/components/feedback/error-page/error-404.d.ts.map +1 -0
- package/dist/components/feedback/error-page/error-404.js +33 -0
- package/dist/components/feedback/error-page/error-404.js.map +1 -0
- package/dist/components/feedback/error-page/index.d.ts +9 -0
- package/dist/components/feedback/error-page/index.d.ts.map +1 -0
- package/dist/components/feedback/loading-container/index.d.ts +3 -0
- package/dist/components/feedback/loading-container/index.d.ts.map +1 -0
- package/dist/components/feedback/loading-container/loading-container.d.ts +16 -0
- package/dist/components/feedback/loading-container/loading-container.d.ts.map +1 -0
- package/dist/components/feedback/loading-container/loading-container.js +28 -0
- package/dist/components/feedback/loading-container/loading-container.js.map +1 -0
- package/dist/components/feedback/modal/index.d.ts +3 -0
- package/dist/components/feedback/modal/index.d.ts.map +1 -0
- package/dist/components/feedback/modal/modal.d.ts +33 -0
- package/dist/components/feedback/modal/modal.d.ts.map +1 -0
- package/dist/components/feedback/modal/modal.js +88 -0
- package/dist/components/feedback/modal/modal.js.map +1 -0
- package/dist/components/feedback/overlay/useOverlay.d.ts +24 -0
- package/dist/components/feedback/overlay/useOverlay.d.ts.map +1 -0
- package/dist/components/feedback/overlay/useOverlay.js +119 -0
- package/dist/components/feedback/overlay/useOverlay.js.map +1 -0
- package/dist/components/feedback/popover/index.d.ts +3 -0
- package/dist/components/feedback/popover/index.d.ts.map +1 -0
- package/dist/components/feedback/popover/popover.d.ts +25 -0
- package/dist/components/feedback/popover/popover.d.ts.map +1 -0
- package/dist/components/feedback/popover/popover.js +118 -0
- package/dist/components/feedback/popover/popover.js.map +1 -0
- package/dist/components/feedback/progress-bar/index.d.ts +3 -0
- package/dist/components/feedback/progress-bar/index.d.ts.map +1 -0
- package/dist/components/feedback/progress-bar/progress-bar.d.ts +22 -0
- package/dist/components/feedback/progress-bar/progress-bar.d.ts.map +1 -0
- package/dist/components/feedback/progress-bar/progress-bar.js +27 -0
- package/dist/components/feedback/progress-bar/progress-bar.js.map +1 -0
- package/dist/components/feedback/skeleton/index.d.ts +3 -0
- package/dist/components/feedback/skeleton/index.d.ts.map +1 -0
- package/dist/components/feedback/skeleton/skeleton.d.ts +19 -0
- package/dist/components/feedback/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/feedback/skeleton/skeleton.js +28 -0
- package/dist/components/feedback/skeleton/skeleton.js.map +1 -0
- package/dist/components/feedback/smooth-transition/index.d.ts +3 -0
- package/dist/components/feedback/smooth-transition/index.d.ts.map +1 -0
- package/dist/components/feedback/smooth-transition/smooth-transition.d.ts +68 -0
- package/dist/components/feedback/smooth-transition/smooth-transition.d.ts.map +1 -0
- package/dist/components/feedback/smooth-transition/smooth-transition.js +89 -0
- package/dist/components/feedback/smooth-transition/smooth-transition.js.map +1 -0
- package/dist/components/feedback/spinner/index.d.ts +3 -0
- package/dist/components/feedback/spinner/index.d.ts.map +1 -0
- package/dist/components/feedback/spinner/spinner.d.ts +21 -0
- package/dist/components/feedback/spinner/spinner.d.ts.map +1 -0
- package/dist/components/feedback/spinner/spinner.js +27 -0
- package/dist/components/feedback/spinner/spinner.js.map +1 -0
- package/dist/components/feedback/toast/index.d.ts +3 -0
- package/dist/components/feedback/toast/index.d.ts.map +1 -0
- package/dist/components/feedback/toast/toast.d.ts +23 -0
- package/dist/components/feedback/toast/toast.d.ts.map +1 -0
- package/dist/components/feedback/toast/toast.js +45 -0
- package/dist/components/feedback/toast/toast.js.map +1 -0
- package/dist/components/feedback/tooltip/index.d.ts +3 -0
- package/dist/components/feedback/tooltip/index.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/tooltip.d.ts +39 -0
- package/dist/components/feedback/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/tooltip.js +129 -0
- package/dist/components/feedback/tooltip/tooltip.js.map +1 -0
- package/dist/components/forms/button/button-with-icon.d.ts +18 -0
- package/dist/components/forms/button/button-with-icon.d.ts.map +1 -0
- package/dist/components/forms/button/button-with-icon.js +15 -0
- package/dist/components/forms/button/button-with-icon.js.map +1 -0
- package/dist/components/forms/button/button.d.ts +66 -0
- package/dist/components/forms/button/button.d.ts.map +1 -0
- package/dist/components/forms/button/button.examples.d.ts +73 -0
- package/dist/components/forms/button/button.examples.d.ts.map +1 -0
- package/dist/components/forms/button/button.js +118 -0
- package/dist/components/forms/button/button.js.map +1 -0
- package/dist/components/forms/button/icon-button.d.ts +23 -0
- package/dist/components/forms/button/icon-button.d.ts.map +1 -0
- package/dist/components/forms/button/icon-button.js +85 -0
- package/dist/components/forms/button/icon-button.js.map +1 -0
- package/dist/components/forms/button/index.d.ts +10 -0
- package/dist/components/forms/button/index.d.ts.map +1 -0
- package/dist/components/forms/button/inline-button.d.ts +45 -0
- package/dist/components/forms/button/inline-button.d.ts.map +1 -0
- package/dist/components/forms/button/inline-button.js +59 -0
- package/dist/components/forms/button/inline-button.js.map +1 -0
- package/dist/components/forms/button-group/button-group.d.ts +20 -0
- package/dist/components/forms/button-group/button-group.d.ts.map +1 -0
- package/dist/components/forms/button-group/button-group.js +24 -0
- package/dist/components/forms/button-group/button-group.js.map +1 -0
- package/dist/components/forms/button-group/index.d.ts +3 -0
- package/dist/components/forms/button-group/index.d.ts.map +1 -0
- package/dist/components/forms/calendar/calendar.d.ts +37 -0
- package/dist/components/forms/calendar/calendar.d.ts.map +1 -0
- package/dist/components/forms/calendar/calendar.js +131 -0
- package/dist/components/forms/calendar/calendar.js.map +1 -0
- package/dist/components/forms/calendar/index.d.ts +3 -0
- package/dist/components/forms/calendar/index.d.ts.map +1 -0
- package/dist/components/forms/checkbox/checkbox.d.ts +31 -0
- package/dist/components/forms/checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/forms/checkbox/checkbox.js +39 -0
- package/dist/components/forms/checkbox/checkbox.js.map +1 -0
- package/dist/components/forms/checkbox/index.d.ts +3 -0
- package/dist/components/forms/checkbox/index.d.ts.map +1 -0
- package/dist/components/forms/code/code.d.ts +32 -0
- package/dist/components/forms/code/code.d.ts.map +1 -0
- package/dist/components/forms/code/code.js +31 -0
- package/dist/components/forms/code/code.js.map +1 -0
- package/dist/components/forms/code/index.d.ts +1 -0
- package/dist/components/forms/code/index.d.ts.map +1 -0
- package/dist/components/forms/date-picker/date-picker.d.ts +72 -0
- package/dist/components/forms/date-picker/date-picker.d.ts.map +1 -0
- package/dist/components/forms/date-picker/date-picker.js +173 -0
- package/dist/components/forms/date-picker/date-picker.js.map +1 -0
- package/dist/components/forms/date-picker/index.d.ts +3 -0
- package/dist/components/forms/date-picker/index.d.ts.map +1 -0
- package/dist/components/forms/editable-text/editable-text.d.ts +59 -0
- package/dist/components/forms/editable-text/editable-text.d.ts.map +1 -0
- package/dist/components/forms/editable-text/editable-text.js +188 -0
- package/dist/components/forms/editable-text/editable-text.js.map +1 -0
- package/dist/components/forms/editable-text/index.d.ts +3 -0
- package/dist/components/forms/editable-text/index.d.ts.map +1 -0
- package/dist/components/forms/fieldset/fieldset.d.ts +46 -0
- package/dist/components/forms/fieldset/fieldset.d.ts.map +1 -0
- package/dist/components/forms/fieldset/fieldset.js +40 -0
- package/dist/components/forms/fieldset/fieldset.js.map +1 -0
- package/dist/components/forms/fieldset/index.d.ts +3 -0
- package/dist/components/forms/fieldset/index.d.ts.map +1 -0
- package/dist/components/forms/form/form-example.d.ts +11 -0
- package/dist/components/forms/form/form-example.d.ts.map +1 -0
- package/dist/components/forms/form/form.d.ts +44 -0
- package/dist/components/forms/form/form.d.ts.map +1 -0
- package/dist/components/forms/form/form.js +39 -0
- package/dist/components/forms/form/form.js.map +1 -0
- package/dist/components/forms/form/index.d.ts +3 -0
- package/dist/components/forms/form/index.d.ts.map +1 -0
- package/dist/components/forms/form-checkbox/form-checkbox.d.ts +27 -0
- package/dist/components/forms/form-checkbox/form-checkbox.d.ts.map +1 -0
- package/dist/components/forms/form-checkbox/form-checkbox.js +58 -0
- package/dist/components/forms/form-checkbox/form-checkbox.js.map +1 -0
- package/dist/components/forms/form-checkbox/index.d.ts +3 -0
- package/dist/components/forms/form-checkbox/index.d.ts.map +1 -0
- package/dist/components/forms/form-checkbox-group/form-checkbox-group.d.ts +40 -0
- package/dist/components/forms/form-checkbox-group/form-checkbox-group.d.ts.map +1 -0
- package/dist/components/forms/form-checkbox-group/form-checkbox-group.js +74 -0
- package/dist/components/forms/form-checkbox-group/form-checkbox-group.js.map +1 -0
- package/dist/components/forms/form-field/form-field.d.ts +53 -0
- package/dist/components/forms/form-field/form-field.d.ts.map +1 -0
- package/dist/components/forms/form-field/form-field.js +56 -0
- package/dist/components/forms/form-field/form-field.js.map +1 -0
- package/dist/components/forms/form-field/index.d.ts +3 -0
- package/dist/components/forms/form-field/index.d.ts.map +1 -0
- package/dist/components/forms/form-input/form-input.d.ts +60 -0
- package/dist/components/forms/form-input/form-input.d.ts.map +1 -0
- package/dist/components/forms/form-input/form-input.js +53 -0
- package/dist/components/forms/form-input/form-input.js.map +1 -0
- package/dist/components/forms/form-select/form-select.d.ts +32 -0
- package/dist/components/forms/form-select/form-select.d.ts.map +1 -0
- package/dist/components/forms/form-select/form-select.js +34 -0
- package/dist/components/forms/form-select/form-select.js.map +1 -0
- package/dist/components/forms/form-textarea/form-textarea.d.ts +31 -0
- package/dist/components/forms/form-textarea/form-textarea.d.ts.map +1 -0
- package/dist/components/forms/form-textarea/form-textarea.js +34 -0
- package/dist/components/forms/form-textarea/form-textarea.js.map +1 -0
- package/dist/components/forms/input/index.d.ts +3 -0
- package/dist/components/forms/input/index.d.ts.map +1 -0
- package/dist/components/forms/input/input.d.ts +71 -0
- package/dist/components/forms/input/input.d.ts.map +1 -0
- package/dist/components/forms/input/input.js +64 -0
- package/dist/components/forms/input/input.js.map +1 -0
- package/dist/components/forms/input-group/index.d.ts +3 -0
- package/dist/components/forms/input-group/index.d.ts.map +1 -0
- package/dist/components/forms/input-group/input-group.d.ts +43 -0
- package/dist/components/forms/input-group/input-group.d.ts.map +1 -0
- package/dist/components/forms/input-group/input-group.js +55 -0
- package/dist/components/forms/input-group/input-group.js.map +1 -0
- package/dist/components/forms/multi-select/index.d.ts +3 -0
- package/dist/components/forms/multi-select/index.d.ts.map +1 -0
- package/dist/components/forms/multi-select/multi-select.d.ts +75 -0
- package/dist/components/forms/multi-select/multi-select.d.ts.map +1 -0
- package/dist/components/forms/multi-select/multi-select.js +259 -0
- package/dist/components/forms/multi-select/multi-select.js.map +1 -0
- package/dist/components/forms/radio/index.d.ts +3 -0
- package/dist/components/forms/radio/index.d.ts.map +1 -0
- package/dist/components/forms/radio/radio.d.ts +31 -0
- package/dist/components/forms/radio/radio.d.ts.map +1 -0
- package/dist/components/forms/radio/radio.js +74 -0
- package/dist/components/forms/radio/radio.js.map +1 -0
- package/dist/components/forms/radio-group/index.d.ts +3 -0
- package/dist/components/forms/radio-group/index.d.ts.map +1 -0
- package/dist/components/forms/radio-group/radio-group.d.ts +32 -0
- package/dist/components/forms/radio-group/radio-group.d.ts.map +1 -0
- package/dist/components/forms/radio-group/radio-group.js +28 -0
- package/dist/components/forms/radio-group/radio-group.js.map +1 -0
- package/dist/components/forms/select/index.d.ts +5 -0
- package/dist/components/forms/select/index.d.ts.map +1 -0
- package/dist/components/forms/select/select-item.d.ts +16 -0
- package/dist/components/forms/select/select-item.d.ts.map +1 -0
- package/dist/components/forms/select/select-item.js +9 -0
- package/dist/components/forms/select/select-item.js.map +1 -0
- package/dist/components/forms/select/select.d.ts +52 -0
- package/dist/components/forms/select/select.d.ts.map +1 -0
- package/dist/components/forms/select/select.js +51 -0
- package/dist/components/forms/select/select.js.map +1 -0
- package/dist/components/forms/slider/index.d.ts +3 -0
- package/dist/components/forms/slider/index.d.ts.map +1 -0
- package/dist/components/forms/slider/slider.d.ts +21 -0
- package/dist/components/forms/slider/slider.d.ts.map +1 -0
- package/dist/components/forms/slider/slider.js +65 -0
- package/dist/components/forms/slider/slider.js.map +1 -0
- package/dist/components/forms/switch/index.d.ts +3 -0
- package/dist/components/forms/switch/index.d.ts.map +1 -0
- package/dist/components/forms/switch/switch.d.ts +30 -0
- package/dist/components/forms/switch/switch.d.ts.map +1 -0
- package/dist/components/forms/switch/switch.js +104 -0
- package/dist/components/forms/switch/switch.js.map +1 -0
- package/dist/components/forms/textarea/index.d.ts +3 -0
- package/dist/components/forms/textarea/index.d.ts.map +1 -0
- package/dist/components/forms/textarea/textarea.d.ts +54 -0
- package/dist/components/forms/textarea/textarea.d.ts.map +1 -0
- package/dist/components/forms/textarea/textarea.js +55 -0
- package/dist/components/forms/textarea/textarea.js.map +1 -0
- package/dist/components/index.d.ts +124 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/layout/accordion/accordion.d.ts +30 -0
- package/dist/components/layout/accordion/accordion.d.ts.map +1 -0
- package/dist/components/layout/accordion/accordion.js +38 -0
- package/dist/components/layout/accordion/accordion.js.map +1 -0
- package/dist/components/layout/accordion/index.d.ts +3 -0
- package/dist/components/layout/accordion/index.d.ts.map +1 -0
- package/dist/components/layout/action-card/action-card.d.ts +37 -0
- package/dist/components/layout/action-card/action-card.d.ts.map +1 -0
- package/dist/components/layout/action-card/action-card.js +104 -0
- package/dist/components/layout/action-card/action-card.js.map +1 -0
- package/dist/components/layout/action-card/index.d.ts +3 -0
- package/dist/components/layout/action-card/index.d.ts.map +1 -0
- package/dist/components/layout/card/card-actions.d.ts +47 -0
- package/dist/components/layout/card/card-actions.d.ts.map +1 -0
- package/dist/components/layout/card/card-actions.js +30 -0
- package/dist/components/layout/card/card-actions.js.map +1 -0
- package/dist/components/layout/card/card-body.d.ts +26 -0
- package/dist/components/layout/card/card-body.d.ts.map +1 -0
- package/dist/components/layout/card/card-body.js +22 -0
- package/dist/components/layout/card/card-body.js.map +1 -0
- package/dist/components/layout/card/card-figure.d.ts +50 -0
- package/dist/components/layout/card/card-figure.d.ts.map +1 -0
- package/dist/components/layout/card/card-figure.js +27 -0
- package/dist/components/layout/card/card-figure.js.map +1 -0
- package/dist/components/layout/card/card-footer.d.ts +46 -0
- package/dist/components/layout/card/card-footer.d.ts.map +1 -0
- package/dist/components/layout/card/card-footer.js +39 -0
- package/dist/components/layout/card/card-footer.js.map +1 -0
- package/dist/components/layout/card/card-header.d.ts +41 -0
- package/dist/components/layout/card/card-header.d.ts.map +1 -0
- package/dist/components/layout/card/card-header.js +27 -0
- package/dist/components/layout/card/card-header.js.map +1 -0
- package/dist/components/layout/card/card-title.d.ts +43 -0
- package/dist/components/layout/card/card-title.d.ts.map +1 -0
- package/dist/components/layout/card/card-title.js +21 -0
- package/dist/components/layout/card/card-title.js.map +1 -0
- package/dist/components/layout/card/card.d.ts +74 -0
- package/dist/components/layout/card/card.d.ts.map +1 -0
- package/dist/components/layout/card/card.js +64 -0
- package/dist/components/layout/card/card.js.map +1 -0
- package/dist/components/layout/card/index.d.ts +15 -0
- package/dist/components/layout/card/index.d.ts.map +1 -0
- package/dist/components/layout/container/container.d.ts +33 -0
- package/dist/components/layout/container/container.d.ts.map +1 -0
- package/dist/components/layout/container/container.js +36 -0
- package/dist/components/layout/container/container.js.map +1 -0
- package/dist/components/layout/container/index.d.ts +3 -0
- package/dist/components/layout/container/index.d.ts.map +1 -0
- package/dist/components/layout/divider/divider.d.ts +15 -0
- package/dist/components/layout/divider/divider.d.ts.map +1 -0
- package/dist/components/layout/divider/divider.js +10 -0
- package/dist/components/layout/divider/divider.js.map +1 -0
- package/dist/components/layout/divider/index.d.ts +3 -0
- package/dist/components/layout/divider/index.d.ts.map +1 -0
- package/dist/components/layout/drawer/drawer.d.ts +35 -0
- package/dist/components/layout/drawer/drawer.d.ts.map +1 -0
- package/dist/components/layout/drawer/drawer.js +108 -0
- package/dist/components/layout/drawer/drawer.js.map +1 -0
- package/dist/components/layout/drawer/index.d.ts +3 -0
- package/dist/components/layout/drawer/index.d.ts.map +1 -0
- package/dist/components/layout/feature-section/feature-section.d.ts +36 -0
- package/dist/components/layout/feature-section/feature-section.d.ts.map +1 -0
- package/dist/components/layout/feature-section/feature-section.js +37 -0
- package/dist/components/layout/feature-section/feature-section.js.map +1 -0
- package/dist/components/layout/feature-section/index.d.ts +3 -0
- package/dist/components/layout/feature-section/index.d.ts.map +1 -0
- package/dist/components/layout/footer/footer.d.ts +37 -0
- package/dist/components/layout/footer/footer.d.ts.map +1 -0
- package/dist/components/layout/footer/footer.js +36 -0
- package/dist/components/layout/footer/footer.js.map +1 -0
- package/dist/components/layout/footer/index.d.ts +3 -0
- package/dist/components/layout/footer/index.d.ts.map +1 -0
- package/dist/components/layout/grid/grid.d.ts +66 -0
- package/dist/components/layout/grid/grid.d.ts.map +1 -0
- package/dist/components/layout/grid/grid.js +62 -0
- package/dist/components/layout/grid/grid.js.map +1 -0
- package/dist/components/layout/grid/index.d.ts +3 -0
- package/dist/components/layout/grid/index.d.ts.map +1 -0
- package/dist/components/layout/hero/hero.d.ts +61 -0
- package/dist/components/layout/hero/hero.d.ts.map +1 -0
- package/dist/components/layout/hero/hero.js +79 -0
- package/dist/components/layout/hero/hero.js.map +1 -0
- package/dist/components/layout/hero/index.d.ts +3 -0
- package/dist/components/layout/hero/index.d.ts.map +1 -0
- package/dist/components/layout/left-nav-layout/index.d.ts +7 -0
- package/dist/components/layout/left-nav-layout/index.d.ts.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-item.d.ts +56 -0
- package/dist/components/layout/left-nav-layout/left-nav-item.d.ts.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-item.js +105 -0
- package/dist/components/layout/left-nav-layout/left-nav-item.js.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-layout.d.ts +67 -0
- package/dist/components/layout/left-nav-layout/left-nav-layout.d.ts.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-layout.js +182 -0
- package/dist/components/layout/left-nav-layout/left-nav-layout.js.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-section.d.ts +40 -0
- package/dist/components/layout/left-nav-layout/left-nav-section.d.ts.map +1 -0
- package/dist/components/layout/left-nav-layout/left-nav-section.js +119 -0
- package/dist/components/layout/left-nav-layout/left-nav-section.js.map +1 -0
- package/dist/components/layout/page/index.d.ts +3 -0
- package/dist/components/layout/page/index.d.ts.map +1 -0
- package/dist/components/layout/page/page.d.ts +17 -0
- package/dist/components/layout/page/page.d.ts.map +1 -0
- package/dist/components/layout/page/page.js +9 -0
- package/dist/components/layout/page/page.js.map +1 -0
- package/dist/components/layout/page-header/index.d.ts +3 -0
- package/dist/components/layout/page-header/index.d.ts.map +1 -0
- package/dist/components/layout/page-header/page-header.d.ts +21 -0
- package/dist/components/layout/page-header/page-header.d.ts.map +1 -0
- package/dist/components/layout/page-header/page-header.js +18 -0
- package/dist/components/layout/page-header/page-header.js.map +1 -0
- package/dist/components/layout/page-transition/index.d.ts +3 -0
- package/dist/components/layout/page-transition/index.d.ts.map +1 -0
- package/dist/components/layout/page-transition/page-transition.d.ts +52 -0
- package/dist/components/layout/page-transition/page-transition.d.ts.map +1 -0
- package/dist/components/layout/page-transition/page-transition.js +43 -0
- package/dist/components/layout/page-transition/page-transition.js.map +1 -0
- package/dist/components/layout/section/index.d.ts +3 -0
- package/dist/components/layout/section/index.d.ts.map +1 -0
- package/dist/components/layout/section/section.d.ts +35 -0
- package/dist/components/layout/section/section.d.ts.map +1 -0
- package/dist/components/layout/section/section.js +18 -0
- package/dist/components/layout/section/section.js.map +1 -0
- package/dist/components/layout/section-header/index.d.ts +3 -0
- package/dist/components/layout/section-header/index.d.ts.map +1 -0
- package/dist/components/layout/section-header/section-header.d.ts +23 -0
- package/dist/components/layout/section-header/section-header.d.ts.map +1 -0
- package/dist/components/layout/section-header/section-header.js +18 -0
- package/dist/components/layout/section-header/section-header.js.map +1 -0
- package/dist/components/layout/settings-page/index.d.ts +4 -0
- package/dist/components/layout/settings-page/index.d.ts.map +1 -0
- package/dist/components/layout/settings-page/setting-item.d.ts +52 -0
- package/dist/components/layout/settings-page/setting-item.d.ts.map +1 -0
- package/dist/components/layout/settings-page/setting-item.js +31 -0
- package/dist/components/layout/settings-page/setting-item.js.map +1 -0
- package/dist/components/layout/settings-page/settings-page.d.ts +37 -0
- package/dist/components/layout/settings-page/settings-page.d.ts.map +1 -0
- package/dist/components/layout/settings-page/settings-page.js +18 -0
- package/dist/components/layout/settings-page/settings-page.js.map +1 -0
- package/dist/components/layout/settings-page/settings-section.d.ts +35 -0
- package/dist/components/layout/settings-page/settings-section.d.ts.map +1 -0
- package/dist/components/layout/settings-page/settings-section.js +17 -0
- package/dist/components/layout/settings-page/settings-section.js.map +1 -0
- package/dist/components/layout/stack/index.d.ts +3 -0
- package/dist/components/layout/stack/index.d.ts.map +1 -0
- package/dist/components/layout/stack/stack.d.ts +33 -0
- package/dist/components/layout/stack/stack.d.ts.map +1 -0
- package/dist/components/layout/stack/stack.js +44 -0
- package/dist/components/layout/stack/stack.js.map +1 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.d.ts +61 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.js +30 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.js.map +1 -0
- package/dist/components/navigation/breadcrumbs/index.d.ts +3 -0
- package/dist/components/navigation/breadcrumbs/index.d.ts.map +1 -0
- package/dist/components/navigation/dropdown/dropdown.d.ts +83 -0
- package/dist/components/navigation/dropdown/dropdown.d.ts.map +1 -0
- package/dist/components/navigation/dropdown/dropdown.js +295 -0
- package/dist/components/navigation/dropdown/dropdown.js.map +1 -0
- package/dist/components/navigation/dropdown/index.d.ts +5 -0
- package/dist/components/navigation/dropdown/index.d.ts.map +1 -0
- package/dist/components/navigation/nav/index.d.ts +3 -0
- package/dist/components/navigation/nav/index.d.ts.map +1 -0
- package/dist/components/navigation/nav/nav.d.ts +24 -0
- package/dist/components/navigation/nav/nav.d.ts.map +1 -0
- package/dist/components/navigation/nav/nav.js +32 -0
- package/dist/components/navigation/nav/nav.js.map +1 -0
- package/dist/components/navigation/nav-dropdown/index.d.ts +5 -0
- package/dist/components/navigation/nav-dropdown/index.d.ts.map +1 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown-item.d.ts +17 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown-item.d.ts.map +1 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown-item.js +17 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown-item.js.map +1 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown.d.ts +20 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown.d.ts.map +1 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown.js +24 -0
- package/dist/components/navigation/nav-dropdown/nav-dropdown.js.map +1 -0
- package/dist/components/navigation/navbar/index.d.ts +9 -0
- package/dist/components/navigation/navbar/index.d.ts.map +1 -0
- package/dist/components/navigation/navbar/navbar-brand.d.ts +23 -0
- package/dist/components/navigation/navbar/navbar-brand.d.ts.map +1 -0
- package/dist/components/navigation/navbar/navbar-brand.js +21 -0
- package/dist/components/navigation/navbar/navbar-brand.js.map +1 -0
- package/dist/components/navigation/navbar/navbar-link.d.ts +23 -0
- package/dist/components/navigation/navbar/navbar-link.d.ts.map +1 -0
- package/dist/components/navigation/navbar/navbar-link.js +34 -0
- package/dist/components/navigation/navbar/navbar-link.js.map +1 -0
- package/dist/components/navigation/navbar/navbar-toggle.d.ts +34 -0
- package/dist/components/navigation/navbar/navbar-toggle.d.ts.map +1 -0
- package/dist/components/navigation/navbar/navbar-toggle.js +37 -0
- package/dist/components/navigation/navbar/navbar-toggle.js.map +1 -0
- package/dist/components/navigation/navbar/navbar.d.ts +33 -0
- package/dist/components/navigation/navbar/navbar.d.ts.map +1 -0
- package/dist/components/navigation/navbar/navbar.js +40 -0
- package/dist/components/navigation/navbar/navbar.js.map +1 -0
- package/dist/components/navigation/notification-dropdown/index.d.ts +3 -0
- package/dist/components/navigation/notification-dropdown/index.d.ts.map +1 -0
- package/dist/components/navigation/notification-dropdown/notification-dropdown.d.ts +59 -0
- package/dist/components/navigation/notification-dropdown/notification-dropdown.d.ts.map +1 -0
- package/dist/components/navigation/notification-dropdown/notification-dropdown.js +456 -0
- package/dist/components/navigation/notification-dropdown/notification-dropdown.js.map +1 -0
- package/dist/components/navigation/pagination/index.d.ts +3 -0
- package/dist/components/navigation/pagination/index.d.ts.map +1 -0
- package/dist/components/navigation/pagination/pagination.d.ts +21 -0
- package/dist/components/navigation/pagination/pagination.d.ts.map +1 -0
- package/dist/components/navigation/pagination/pagination.js +72 -0
- package/dist/components/navigation/pagination/pagination.js.map +1 -0
- package/dist/components/navigation/scroll-nav/index.d.ts +3 -0
- package/dist/components/navigation/scroll-nav/index.d.ts.map +1 -0
- package/dist/components/navigation/scroll-nav/scroll-nav.d.ts +53 -0
- package/dist/components/navigation/scroll-nav/scroll-nav.d.ts.map +1 -0
- package/dist/components/navigation/scroll-nav/scroll-nav.js +188 -0
- package/dist/components/navigation/scroll-nav/scroll-nav.js.map +1 -0
- package/dist/components/navigation/sidebar/index.d.ts +3 -0
- package/dist/components/navigation/sidebar/index.d.ts.map +1 -0
- package/dist/components/navigation/sidebar/sidebar.d.ts +18 -0
- package/dist/components/navigation/sidebar/sidebar.d.ts.map +1 -0
- package/dist/components/navigation/sidebar/sidebar.js +41 -0
- package/dist/components/navigation/sidebar/sidebar.js.map +1 -0
- package/dist/components/navigation/stepper/index.d.ts +3 -0
- package/dist/components/navigation/stepper/index.d.ts.map +1 -0
- package/dist/components/navigation/stepper/stepper.d.ts +50 -0
- package/dist/components/navigation/stepper/stepper.d.ts.map +1 -0
- package/dist/components/navigation/stepper/stepper.js +159 -0
- package/dist/components/navigation/stepper/stepper.js.map +1 -0
- package/dist/components/navigation/tabs/index.d.ts +3 -0
- package/dist/components/navigation/tabs/index.d.ts.map +1 -0
- package/dist/components/navigation/tabs/tabs.d.ts +32 -0
- package/dist/components/navigation/tabs/tabs.d.ts.map +1 -0
- package/dist/components/navigation/tabs/tabs.js +61 -0
- package/dist/components/navigation/tabs/tabs.js.map +1 -0
- package/dist/components/system/auth-provider/auth-provider.d.ts +103 -0
- package/dist/components/system/auth-provider/auth-provider.d.ts.map +1 -0
- package/dist/components/system/auth-provider/auth-provider.js +118 -0
- package/dist/components/system/auth-provider/auth-provider.js.map +1 -0
- package/dist/components/system/auth-provider/auth-utils.d.ts +32 -0
- package/dist/components/system/auth-provider/auth-utils.d.ts.map +1 -0
- package/dist/components/system/auth-provider/auth-utils.js +83 -0
- package/dist/components/system/auth-provider/auth-utils.js.map +1 -0
- package/dist/components/system/auth-provider/index.d.ts +4 -0
- package/dist/components/system/auth-provider/index.d.ts.map +1 -0
- package/dist/components/system/color-mode-toggle/color-mode-toggle.d.ts +18 -0
- package/dist/components/system/color-mode-toggle/color-mode-toggle.d.ts.map +1 -0
- package/dist/components/system/color-mode-toggle/color-mode-toggle.js +27 -0
- package/dist/components/system/color-mode-toggle/color-mode-toggle.js.map +1 -0
- package/dist/components/system/color-mode-toggle/index.d.ts +3 -0
- package/dist/components/system/color-mode-toggle/index.d.ts.map +1 -0
- package/dist/components/system/error-boundary/error-boundary.d.ts +21 -0
- package/dist/components/system/error-boundary/error-boundary.d.ts.map +1 -0
- package/dist/components/system/icon/icon.d.ts +35 -0
- package/dist/components/system/icon/icon.d.ts.map +1 -0
- package/dist/components/system/icon/icon.js +83 -0
- package/dist/components/system/icon/icon.js.map +1 -0
- package/dist/components/system/icon/index.d.ts +3 -0
- package/dist/components/system/icon/index.d.ts.map +1 -0
- package/dist/components/system/theme-provider/index.d.ts +3 -0
- package/dist/components/system/theme-provider/index.d.ts.map +1 -0
- package/dist/components/system/theme-provider/theme-provider.d.ts +40 -0
- package/dist/components/system/theme-provider/theme-provider.d.ts.map +1 -0
- package/dist/components/system/theme-provider/theme-provider.js +55 -0
- package/dist/components/system/theme-provider/theme-provider.js.map +1 -0
- package/dist/components/typography/code/code.d.ts +24 -0
- package/dist/components/typography/code/code.d.ts.map +1 -0
- package/dist/components/typography/code/code.js +18 -0
- package/dist/components/typography/code/code.js.map +1 -0
- package/dist/components/typography/code/index.d.ts +3 -0
- package/dist/components/typography/code/index.d.ts.map +1 -0
- package/dist/components/typography/heading/heading.d.ts +32 -0
- package/dist/components/typography/heading/heading.d.ts.map +1 -0
- package/dist/components/typography/heading/heading.js +39 -0
- package/dist/components/typography/heading/heading.js.map +1 -0
- package/dist/components/typography/heading/index.d.ts +3 -0
- package/dist/components/typography/heading/index.d.ts.map +1 -0
- package/dist/components/typography/link/index.d.ts +3 -0
- package/dist/components/typography/link/index.d.ts.map +1 -0
- package/dist/components/typography/link/link.d.ts +44 -0
- package/dist/components/typography/link/link.d.ts.map +1 -0
- package/dist/components/typography/link/link.js +72 -0
- package/dist/components/typography/link/link.js.map +1 -0
- package/dist/components/typography/text/index.d.ts +3 -0
- package/dist/components/typography/text/index.d.ts.map +1 -0
- package/dist/components/typography/text/text.d.ts +104 -0
- package/dist/components/typography/text/text.d.ts.map +1 -0
- package/dist/components/typography/text/text.js +148 -0
- package/dist/components/typography/text/text.js.map +1 -0
- package/dist/components.d.ts +2 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/hooks/useDebounce.d.ts +29 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +26 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useScrollReset.d.ts +11 -0
- package/dist/hooks/useScrollReset.d.ts.map +1 -0
- package/dist/hooks/useScrollReset.js +55 -0
- package/dist/hooks/useScrollReset.js.map +1 -0
- package/dist/humans.txt +8 -0
- package/dist/icons/logo.svg +9 -0
- package/dist/index.d.ts +7 -1170
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +287 -4333
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +16 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/robots.txt +5 -0
- package/dist/sitemap.xml +8 -0
- package/dist/staticwebapp.config.json +23 -0
- package/dist/style.css +2 -2
- package/dist/styles.d.ts +9 -0
- package/dist/theme/hydn-presets.d.ts +4 -0
- package/dist/theme/hydn-presets.d.ts.map +1 -0
- package/dist/theme/size-tokens.d.ts +686 -0
- package/dist/theme/size-tokens.d.ts.map +1 -0
- package/dist/theme/size-tokens.js +636 -0
- package/dist/theme/size-tokens.js.map +1 -0
- package/dist/theme/tokens.d.ts +116 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +164 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/utils/debounce.d.ts +7 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/debounce.js +40 -0
- package/dist/utils/debounce.js.map +1 -0
- package/package.json +49 -43
- package/dist/index.cjs +0 -4425
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -1170
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ButtonProps } from '../../forms/button/button';
|
|
2
|
+
export type NotificationType = 'info' | 'success' | 'warning' | 'error';
|
|
3
|
+
export type Notification = {
|
|
4
|
+
/** Unique identifier for the notification */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Notification title/heading */
|
|
7
|
+
title: string;
|
|
8
|
+
/** Notification message/body */
|
|
9
|
+
message: string;
|
|
10
|
+
/** ISO timestamp string or Date object - component will parse and format */
|
|
11
|
+
timestamp: string | Date;
|
|
12
|
+
/** Read/unread status */
|
|
13
|
+
isRead: boolean;
|
|
14
|
+
/** Type determines icon color */
|
|
15
|
+
type: NotificationType;
|
|
16
|
+
};
|
|
17
|
+
export type NotificationDropdownProps = {
|
|
18
|
+
/** Array of notifications to display */
|
|
19
|
+
notifications: Notification[];
|
|
20
|
+
/** Callback when a notification is clicked */
|
|
21
|
+
onNotificationClick?: (notification: Notification) => void;
|
|
22
|
+
/** Callback when a notification is dismissed */
|
|
23
|
+
onNotificationDismiss?: (notificationId: string) => void;
|
|
24
|
+
/** Callback when "Mark all as read" is clicked */
|
|
25
|
+
onMarkAllAsRead?: () => void;
|
|
26
|
+
/** Callback when "Clear all" is clicked */
|
|
27
|
+
onClearAll?: () => void;
|
|
28
|
+
/** Custom empty state message */
|
|
29
|
+
emptyStateMessage?: string;
|
|
30
|
+
/** Custom header text - default "Notifications" */
|
|
31
|
+
headerText?: string;
|
|
32
|
+
/** Size variant */
|
|
33
|
+
size?: ButtonProps['size'];
|
|
34
|
+
/** Button variant for the trigger */
|
|
35
|
+
variant?: ButtonProps['variant'];
|
|
36
|
+
/** Button style for the trigger */
|
|
37
|
+
buttonStyle?: ButtonProps['style'];
|
|
38
|
+
/** Optional trigger icon (defaults to bell icon) */
|
|
39
|
+
triggerIcon?: string;
|
|
40
|
+
/** Badge display mode: 'full' (count + indicator), 'indicator' (dot only), 'none' (no badge) */
|
|
41
|
+
badgeMode?: 'full' | 'indicator' | 'none';
|
|
42
|
+
/** Alignment of the dropdown menu */
|
|
43
|
+
align?: 'start' | 'center' | 'end';
|
|
44
|
+
/** Maximum width for the dropdown menu */
|
|
45
|
+
maxWidth?: string;
|
|
46
|
+
/** Additional className for the trigger container */
|
|
47
|
+
className?: string;
|
|
48
|
+
/** Additional className for the dropdown menu */
|
|
49
|
+
menuClassName?: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* NotificationDropdown component - specialized dropdown for notifications
|
|
53
|
+
*/
|
|
54
|
+
declare function NotificationDropdown({ notifications, onNotificationClick, onNotificationDismiss, onMarkAllAsRead, onClearAll, emptyStateMessage, headerText, size, variant, buttonStyle, triggerIcon, badgeMode, align, maxWidth, className, menuClassName }: Readonly<NotificationDropdownProps>): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
declare namespace NotificationDropdown {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
export default NotificationDropdown;
|
|
59
|
+
//# sourceMappingURL=notification-dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-dropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/notification-dropdown/notification-dropdown.tsx"],"names":[],"mappings":"AAEA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAExE,MAAM,MAAM,YAAY,GAAG;IACzB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,iCAAiC;IACjC,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,wCAAwC;IACxC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3D,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,mCAAmC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1C,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAuCF;;GAEG;AACH,iBAAS,oBAAoB,CAAC,EAC5B,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,iBAAsC,EACtC,UAA4B,EAC5B,IAAW,EACX,OAAmB,EACnB,WAAqB,EACrB,WAAoB,EACpB,SAAkB,EAClB,KAAa,EACb,QAAkB,EAClB,SAAc,EACd,aAAkB,EACnB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,2CAkRrC;kBAnSQ,oBAAoB;;;AAuS7B,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useCallback, useEffect, useLayoutEffect } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import Button from "../../forms/button/button.js";
|
|
5
|
+
import { Icon } from "../../system/icon/icon.js";
|
|
6
|
+
const notificationTypeIcons = {
|
|
7
|
+
info: "info-circle",
|
|
8
|
+
success: "circle-check",
|
|
9
|
+
warning: "alert-triangle",
|
|
10
|
+
error: "alert-circle"
|
|
11
|
+
};
|
|
12
|
+
const notificationTypeColors = {
|
|
13
|
+
info: "text-info",
|
|
14
|
+
success: "text-success",
|
|
15
|
+
warning: "text-warning",
|
|
16
|
+
error: "text-error"
|
|
17
|
+
};
|
|
18
|
+
function formatRelativeTime(timestamp) {
|
|
19
|
+
const date = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
|
|
20
|
+
const now = /* @__PURE__ */ new Date();
|
|
21
|
+
const diffMs = now.getTime() - date.getTime();
|
|
22
|
+
const diffSecs = Math.floor(diffMs / 1e3);
|
|
23
|
+
const diffMins = Math.floor(diffSecs / 60);
|
|
24
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
25
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
26
|
+
if (diffSecs < 60) return "Just now";
|
|
27
|
+
if (diffMins < 60) return `${diffMins} min ago`;
|
|
28
|
+
if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? "s" : ""} ago`;
|
|
29
|
+
if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? "s" : ""} ago`;
|
|
30
|
+
return date.toLocaleDateString(void 0, { month: "short", day: "numeric" });
|
|
31
|
+
}
|
|
32
|
+
function NotificationDropdown({
|
|
33
|
+
notifications,
|
|
34
|
+
onNotificationClick,
|
|
35
|
+
onNotificationDismiss,
|
|
36
|
+
onMarkAllAsRead,
|
|
37
|
+
onClearAll,
|
|
38
|
+
emptyStateMessage = "No notifications",
|
|
39
|
+
headerText = "Notifications",
|
|
40
|
+
size = "md",
|
|
41
|
+
variant = "neutral",
|
|
42
|
+
buttonStyle = "ghost",
|
|
43
|
+
triggerIcon = "bell",
|
|
44
|
+
badgeMode = "full",
|
|
45
|
+
align = "end",
|
|
46
|
+
maxWidth = "400px",
|
|
47
|
+
className = "",
|
|
48
|
+
menuClassName = ""
|
|
49
|
+
}) {
|
|
50
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
51
|
+
const dropdownRef = useRef(null);
|
|
52
|
+
const triggerRef = useRef(null);
|
|
53
|
+
const menuRef = useRef(null);
|
|
54
|
+
const notificationRefs = useRef([]);
|
|
55
|
+
const [menuPosition, setMenuPosition] = useState(null);
|
|
56
|
+
const [activeIndex, setActiveIndex] = useState(-1);
|
|
57
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
58
|
+
const open = useCallback(() => setIsOpen(true), []);
|
|
59
|
+
const unreadCount = notifications.filter((n) => !n.isRead).length;
|
|
60
|
+
const hasUnread = unreadCount > 0;
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!isOpen) return;
|
|
63
|
+
const handleKey = (e) => {
|
|
64
|
+
const notificationItems = notificationRefs.current.filter(Boolean);
|
|
65
|
+
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
if (notificationItems.length === 0) return;
|
|
68
|
+
let nextIndex = activeIndex;
|
|
69
|
+
if (e.key === "ArrowDown") {
|
|
70
|
+
nextIndex = activeIndex < notificationItems.length - 1 ? activeIndex + 1 : 0;
|
|
71
|
+
} else {
|
|
72
|
+
nextIndex = activeIndex > 0 ? activeIndex - 1 : notificationItems.length - 1;
|
|
73
|
+
}
|
|
74
|
+
setActiveIndex(nextIndex);
|
|
75
|
+
notificationItems[nextIndex]?.focus();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (e.key === "Home") {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
if (notificationItems.length > 0) {
|
|
81
|
+
setActiveIndex(0);
|
|
82
|
+
notificationItems[0]?.focus();
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (e.key === "End") {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
if (notificationItems.length > 0) {
|
|
89
|
+
const lastIndex = notificationItems.length - 1;
|
|
90
|
+
setActiveIndex(lastIndex);
|
|
91
|
+
notificationItems[lastIndex]?.focus();
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (e.key === "Escape") {
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
close();
|
|
98
|
+
triggerRef.current?.focus();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
document.addEventListener("keydown", handleKey);
|
|
102
|
+
return () => document.removeEventListener("keydown", handleKey);
|
|
103
|
+
}, [isOpen, close, activeIndex]);
|
|
104
|
+
useLayoutEffect(() => {
|
|
105
|
+
let raf;
|
|
106
|
+
if (isOpen && notifications.length > 0) {
|
|
107
|
+
const notificationItems = notificationRefs.current.filter(Boolean);
|
|
108
|
+
if (notificationItems.length > 0) {
|
|
109
|
+
raf = requestAnimationFrame(() => {
|
|
110
|
+
setActiveIndex(0);
|
|
111
|
+
notificationItems[0]?.focus();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
} else if (!isOpen) {
|
|
115
|
+
raf = requestAnimationFrame(() => {
|
|
116
|
+
setActiveIndex(-1);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return () => {
|
|
120
|
+
if (raf) cancelAnimationFrame(raf);
|
|
121
|
+
};
|
|
122
|
+
}, [isOpen, notifications.length]);
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (!isOpen) return;
|
|
125
|
+
const handleClickOutside = (event) => {
|
|
126
|
+
const isClickInTrigger = dropdownRef.current && dropdownRef.current.contains(event.target);
|
|
127
|
+
const isClickInMenu = menuRef.current && menuRef.current.contains(event.target);
|
|
128
|
+
if (!isClickInTrigger && !isClickInMenu) {
|
|
129
|
+
close();
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
133
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
134
|
+
}, [isOpen, close]);
|
|
135
|
+
useLayoutEffect(() => {
|
|
136
|
+
if (isOpen && triggerRef.current) {
|
|
137
|
+
const rect = triggerRef.current.getBoundingClientRect();
|
|
138
|
+
setMenuPosition({
|
|
139
|
+
top: rect.bottom,
|
|
140
|
+
left: rect.left,
|
|
141
|
+
width: rect.width
|
|
142
|
+
});
|
|
143
|
+
} else {
|
|
144
|
+
setMenuPosition(null);
|
|
145
|
+
}
|
|
146
|
+
}, [isOpen]);
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (!isOpen) return;
|
|
149
|
+
const handleScrollOrResize = (event) => {
|
|
150
|
+
if (event && event.target && menuRef.current?.contains(event.target)) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
close();
|
|
154
|
+
};
|
|
155
|
+
window.addEventListener("scroll", handleScrollOrResize, true);
|
|
156
|
+
window.addEventListener("resize", handleScrollOrResize);
|
|
157
|
+
return () => {
|
|
158
|
+
window.removeEventListener("scroll", handleScrollOrResize, true);
|
|
159
|
+
window.removeEventListener("resize", handleScrollOrResize);
|
|
160
|
+
};
|
|
161
|
+
}, [isOpen, close]);
|
|
162
|
+
const getAlignmentStyle = () => {
|
|
163
|
+
if (!menuPosition) return {};
|
|
164
|
+
const baseStyle = {
|
|
165
|
+
top: menuPosition.top + 4,
|
|
166
|
+
maxWidth: maxWidth || void 0
|
|
167
|
+
};
|
|
168
|
+
if (align === "start") {
|
|
169
|
+
baseStyle.left = menuPosition.left;
|
|
170
|
+
} else if (align === "end") {
|
|
171
|
+
baseStyle.right = window.innerWidth - (menuPosition.left + menuPosition.width);
|
|
172
|
+
} else {
|
|
173
|
+
baseStyle.left = menuPosition.left + menuPosition.width / 2;
|
|
174
|
+
baseStyle.transform = "translateX(-50%)";
|
|
175
|
+
}
|
|
176
|
+
return baseStyle;
|
|
177
|
+
};
|
|
178
|
+
const handleNotificationClick = (notification) => {
|
|
179
|
+
onNotificationClick?.(notification);
|
|
180
|
+
close();
|
|
181
|
+
};
|
|
182
|
+
const handleDismiss = (e, notificationId) => {
|
|
183
|
+
e.stopPropagation();
|
|
184
|
+
if (notifications.length === 1) {
|
|
185
|
+
close();
|
|
186
|
+
}
|
|
187
|
+
onNotificationDismiss?.(notificationId);
|
|
188
|
+
};
|
|
189
|
+
const handleMarkAllAsRead = () => {
|
|
190
|
+
onMarkAllAsRead?.();
|
|
191
|
+
};
|
|
192
|
+
const handleClearAll = () => {
|
|
193
|
+
onClearAll?.();
|
|
194
|
+
close();
|
|
195
|
+
};
|
|
196
|
+
const registerNotification = useCallback((el, index) => {
|
|
197
|
+
notificationRefs.current[index] = el;
|
|
198
|
+
}, []);
|
|
199
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
200
|
+
/* @__PURE__ */ jsx("div", { ref: dropdownRef, className: `inline-block relative ${className}`, children: /* @__PURE__ */ jsx(
|
|
201
|
+
Button,
|
|
202
|
+
{
|
|
203
|
+
ref: triggerRef,
|
|
204
|
+
variant,
|
|
205
|
+
style: buttonStyle,
|
|
206
|
+
onClick: () => isOpen ? close() : open(),
|
|
207
|
+
"aria-expanded": isOpen,
|
|
208
|
+
"aria-haspopup": "true",
|
|
209
|
+
"aria-label": "Notifications",
|
|
210
|
+
size,
|
|
211
|
+
children: /* @__PURE__ */ jsxs("span", { className: "relative", children: [
|
|
212
|
+
/* @__PURE__ */ jsx(Icon, { name: triggerIcon, size, color: "currentColor" }),
|
|
213
|
+
(badgeMode === "indicator" || badgeMode === "full") && hasUnread && /* @__PURE__ */ jsx("span", { className: "absolute -top-0.5 -right-0.5 w-2 h-2 bg-info rounded-full" }),
|
|
214
|
+
badgeMode === "full" && unreadCount > 0 && /* @__PURE__ */ jsx("span", { className: "absolute -top-1.5 -right-1.5 min-w-4.5 h-4.5 flex items-center justify-center bg-info text-info-foreground text-[10px] font-semibold rounded-full px-1", children: unreadCount > 99 ? "99+" : unreadCount })
|
|
215
|
+
] })
|
|
216
|
+
}
|
|
217
|
+
) }),
|
|
218
|
+
isOpen && menuPosition && createPortal(
|
|
219
|
+
/* @__PURE__ */ jsxs(
|
|
220
|
+
"div",
|
|
221
|
+
{
|
|
222
|
+
ref: menuRef,
|
|
223
|
+
className: `fixed bg-popover text-popover-foreground border border-border rounded-md shadow-lg z-50 w-96 max-h-128 overflow-hidden origin-top animate-scaleIn focus:outline-none flex flex-col ${menuClassName}`,
|
|
224
|
+
style: getAlignmentStyle(),
|
|
225
|
+
role: "menu",
|
|
226
|
+
"aria-label": headerText,
|
|
227
|
+
tabIndex: -1,
|
|
228
|
+
children: [
|
|
229
|
+
notifications.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-border bg-muted/30", children: [
|
|
230
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold select-none", children: headerText }),
|
|
231
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
232
|
+
hasUnread && onMarkAllAsRead && /* @__PURE__ */ jsx(
|
|
233
|
+
"button",
|
|
234
|
+
{
|
|
235
|
+
type: "button",
|
|
236
|
+
onClick: handleMarkAllAsRead,
|
|
237
|
+
className: "text-xs text-primary hover:text-primary-hover transition-colors cursor-pointer",
|
|
238
|
+
children: "Mark all read"
|
|
239
|
+
}
|
|
240
|
+
),
|
|
241
|
+
onClearAll && /* @__PURE__ */ jsx(
|
|
242
|
+
"button",
|
|
243
|
+
{
|
|
244
|
+
type: "button",
|
|
245
|
+
onClick: handleClearAll,
|
|
246
|
+
className: "text-xs text-muted-foreground hover:text-foreground transition-colors cursor-pointer",
|
|
247
|
+
children: "Clear all"
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
] })
|
|
251
|
+
] }),
|
|
252
|
+
/* @__PURE__ */ jsx("div", { className: "overflow-y-auto flex-1 overflow-x-hidden [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-transparent hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/20 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-muted-foreground/30", children: notifications.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-12 px-4 text-center", children: [
|
|
253
|
+
/* @__PURE__ */ jsx(Icon, { name: "bell-off", size: "xl", color: "currentColor", className: "text-muted-foreground mb-3" }),
|
|
254
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: emptyStateMessage })
|
|
255
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "grid divide-y divide-border", children: notifications.map((notification, index) => /* @__PURE__ */ jsx(
|
|
256
|
+
NotificationItem,
|
|
257
|
+
{
|
|
258
|
+
notification,
|
|
259
|
+
onClick: () => handleNotificationClick(notification),
|
|
260
|
+
onDismiss: (e) => handleDismiss(e, notification.id),
|
|
261
|
+
showDismissButton: !!onNotificationDismiss,
|
|
262
|
+
registerRef: (el) => registerNotification(el, index)
|
|
263
|
+
},
|
|
264
|
+
notification.id
|
|
265
|
+
)) }) })
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
),
|
|
269
|
+
document.body
|
|
270
|
+
)
|
|
271
|
+
] });
|
|
272
|
+
}
|
|
273
|
+
NotificationDropdown.displayName = "NotificationDropdown";
|
|
274
|
+
function NotificationItem({
|
|
275
|
+
notification,
|
|
276
|
+
onClick,
|
|
277
|
+
onDismiss,
|
|
278
|
+
showDismissButton,
|
|
279
|
+
registerRef
|
|
280
|
+
}) {
|
|
281
|
+
const typeIcon = notificationTypeIcons[notification.type];
|
|
282
|
+
const typeColor = notificationTypeColors[notification.type];
|
|
283
|
+
const [swipeX, setSwipeX] = useState(0);
|
|
284
|
+
const [isSwiping, setIsSwiping] = useState(false);
|
|
285
|
+
const [isDismissing, setIsDismissing] = useState(false);
|
|
286
|
+
const [isHorizontalSwipe, setIsHorizontalSwipe] = useState(false);
|
|
287
|
+
const startXRef = useRef(0);
|
|
288
|
+
const startYRef = useRef(0);
|
|
289
|
+
const currentXRef = useRef(0);
|
|
290
|
+
const initialSwipeXRef = useRef(0);
|
|
291
|
+
const itemRef = useRef(null);
|
|
292
|
+
const PARTIAL_OPEN_AMOUNT = -80;
|
|
293
|
+
const handleTouchStart = useCallback(
|
|
294
|
+
(e) => {
|
|
295
|
+
startXRef.current = e.touches[0].clientX;
|
|
296
|
+
startYRef.current = e.touches[0].clientY;
|
|
297
|
+
currentXRef.current = e.touches[0].clientX;
|
|
298
|
+
initialSwipeXRef.current = swipeX;
|
|
299
|
+
setIsSwiping(true);
|
|
300
|
+
setIsHorizontalSwipe(false);
|
|
301
|
+
},
|
|
302
|
+
[swipeX]
|
|
303
|
+
);
|
|
304
|
+
const handleTouchMove = useCallback(
|
|
305
|
+
(e) => {
|
|
306
|
+
if (!isSwiping) return;
|
|
307
|
+
const currentY = e.touches[0].clientY;
|
|
308
|
+
currentXRef.current = e.touches[0].clientX;
|
|
309
|
+
const diffX = Math.abs(currentXRef.current - startXRef.current);
|
|
310
|
+
const diffY = Math.abs(currentY - startYRef.current);
|
|
311
|
+
if (!isHorizontalSwipe && diffX > 5 && diffX > diffY) {
|
|
312
|
+
setIsHorizontalSwipe(true);
|
|
313
|
+
}
|
|
314
|
+
if (isHorizontalSwipe || diffX > diffY && diffX > 5) {
|
|
315
|
+
e.preventDefault();
|
|
316
|
+
}
|
|
317
|
+
const diff = currentXRef.current - startXRef.current;
|
|
318
|
+
const newPosition = initialSwipeXRef.current + diff;
|
|
319
|
+
if (newPosition <= 0) {
|
|
320
|
+
setSwipeX(newPosition);
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
[isSwiping, isHorizontalSwipe]
|
|
324
|
+
);
|
|
325
|
+
const handleTouchEnd = useCallback(
|
|
326
|
+
(e) => {
|
|
327
|
+
if (!isSwiping) return;
|
|
328
|
+
const itemWidth = itemRef.current?.offsetWidth || 0;
|
|
329
|
+
const swipeDistance = Math.abs(swipeX);
|
|
330
|
+
const dismissThreshold = itemWidth * 0.75;
|
|
331
|
+
const revealThreshold = itemWidth * 0.3;
|
|
332
|
+
if (swipeDistance >= dismissThreshold) {
|
|
333
|
+
setSwipeX(-itemWidth);
|
|
334
|
+
requestAnimationFrame(() => {
|
|
335
|
+
setIsDismissing(true);
|
|
336
|
+
});
|
|
337
|
+
setTimeout(() => {
|
|
338
|
+
onDismiss(e);
|
|
339
|
+
}, 300);
|
|
340
|
+
} else if (swipeDistance >= revealThreshold) {
|
|
341
|
+
setSwipeX(PARTIAL_OPEN_AMOUNT);
|
|
342
|
+
} else {
|
|
343
|
+
setSwipeX(0);
|
|
344
|
+
}
|
|
345
|
+
setIsSwiping(false);
|
|
346
|
+
},
|
|
347
|
+
[isSwiping, swipeX, onDismiss, PARTIAL_OPEN_AMOUNT]
|
|
348
|
+
);
|
|
349
|
+
const handleTrashClick = useCallback(
|
|
350
|
+
(e) => {
|
|
351
|
+
e.stopPropagation();
|
|
352
|
+
const itemWidth = itemRef.current?.offsetWidth || 0;
|
|
353
|
+
setSwipeX(-itemWidth);
|
|
354
|
+
requestAnimationFrame(() => {
|
|
355
|
+
setIsDismissing(true);
|
|
356
|
+
});
|
|
357
|
+
setTimeout(() => {
|
|
358
|
+
onDismiss(e);
|
|
359
|
+
}, 300);
|
|
360
|
+
},
|
|
361
|
+
[onDismiss]
|
|
362
|
+
);
|
|
363
|
+
const handleXButtonClick = useCallback(
|
|
364
|
+
(e) => {
|
|
365
|
+
e.stopPropagation();
|
|
366
|
+
requestAnimationFrame(() => {
|
|
367
|
+
setIsDismissing(true);
|
|
368
|
+
});
|
|
369
|
+
setTimeout(() => {
|
|
370
|
+
onDismiss(e);
|
|
371
|
+
}, 300);
|
|
372
|
+
},
|
|
373
|
+
[onDismiss]
|
|
374
|
+
);
|
|
375
|
+
const setRefs = useCallback(
|
|
376
|
+
(el) => {
|
|
377
|
+
itemRef.current = el;
|
|
378
|
+
registerRef(el);
|
|
379
|
+
},
|
|
380
|
+
[registerRef]
|
|
381
|
+
);
|
|
382
|
+
const isTouchDevice = typeof window !== "undefined" && (window.matchMedia("(pointer: coarse)").matches || "ontouchstart" in window);
|
|
383
|
+
return /* @__PURE__ */ jsxs(
|
|
384
|
+
"div",
|
|
385
|
+
{
|
|
386
|
+
className: "relative overflow-hidden transition-[max-height,opacity,margin] duration-300 ease-out",
|
|
387
|
+
style: {
|
|
388
|
+
maxHeight: isDismissing ? "0px" : "200px",
|
|
389
|
+
opacity: isDismissing ? 0 : 1,
|
|
390
|
+
marginTop: isDismissing ? "-1px" : "0px",
|
|
391
|
+
marginBottom: isDismissing ? "-1px" : "0px"
|
|
392
|
+
},
|
|
393
|
+
children: [
|
|
394
|
+
isTouchDevice && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-error flex items-center justify-end px-6", children: /* @__PURE__ */ jsx(
|
|
395
|
+
"button",
|
|
396
|
+
{
|
|
397
|
+
type: "button",
|
|
398
|
+
onClick: handleTrashClick,
|
|
399
|
+
className: "p-2 hover:bg-error-foreground/10 rounded transition-colors cursor-pointer",
|
|
400
|
+
"aria-label": "Delete notification",
|
|
401
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "trash", size: "md", color: "currentColor", className: "text-error-foreground" })
|
|
402
|
+
}
|
|
403
|
+
) }),
|
|
404
|
+
/* @__PURE__ */ jsx(
|
|
405
|
+
"div",
|
|
406
|
+
{
|
|
407
|
+
ref: setRefs,
|
|
408
|
+
role: "button",
|
|
409
|
+
tabIndex: 0,
|
|
410
|
+
onClick,
|
|
411
|
+
onKeyDown: (e) => {
|
|
412
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
413
|
+
e.preventDefault();
|
|
414
|
+
onClick();
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
onTouchStart: handleTouchStart,
|
|
418
|
+
onTouchMove: handleTouchMove,
|
|
419
|
+
onTouchEnd: handleTouchEnd,
|
|
420
|
+
style: {
|
|
421
|
+
transform: `translateX(${swipeX}px)`,
|
|
422
|
+
transition: isSwiping ? "none" : "transform 0.2s ease-out",
|
|
423
|
+
touchAction: "pan-y"
|
|
424
|
+
},
|
|
425
|
+
className: `w-full text-left px-4 py-3 hover:bg-muted/50 relative group cursor-pointer ${!notification.isRead ? "bg-muted/20" : ""} bg-popover`,
|
|
426
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
427
|
+
/* @__PURE__ */ jsxs("div", { className: "relative shrink-0 pt-0.5", children: [
|
|
428
|
+
/* @__PURE__ */ jsx(Icon, { name: typeIcon, size: "md", color: "currentColor", className: typeColor }),
|
|
429
|
+
!notification.isRead && /* @__PURE__ */ jsx("span", { className: "absolute -top-0.5 -right-0.5 w-2 h-2 bg-info rounded-full ring-2 ring-popover" })
|
|
430
|
+
] }),
|
|
431
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 pr-6", children: [
|
|
432
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-start justify-between gap-2 mb-1", children: /* @__PURE__ */ jsx("h4", { className: "text-sm font-semibold text-foreground line-clamp-1", children: notification.title }) }),
|
|
433
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-foreground/80 line-clamp-2 mb-1.5", children: notification.message }),
|
|
434
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: formatRelativeTime(notification.timestamp) })
|
|
435
|
+
] }),
|
|
436
|
+
showDismissButton && /* @__PURE__ */ jsx(
|
|
437
|
+
"button",
|
|
438
|
+
{
|
|
439
|
+
type: "button",
|
|
440
|
+
onClick: handleXButtonClick,
|
|
441
|
+
className: "absolute top-3 right-3 opacity-0 group-hover:opacity-100 transition-opacity p-1 hover:bg-muted rounded cursor-pointer",
|
|
442
|
+
"aria-label": "Dismiss notification",
|
|
443
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "x", size: "sm", color: "currentColor", className: "text-muted-foreground" })
|
|
444
|
+
}
|
|
445
|
+
)
|
|
446
|
+
] })
|
|
447
|
+
}
|
|
448
|
+
)
|
|
449
|
+
]
|
|
450
|
+
}
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
export {
|
|
454
|
+
NotificationDropdown as default
|
|
455
|
+
};
|
|
456
|
+
//# sourceMappingURL=notification-dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-dropdown.js","sources":["../../../../src/components/navigation/notification-dropdown/notification-dropdown.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport Button, { type ButtonProps } from '../../forms/button/button';\nimport { Icon } from '@/components/system/icon';\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error';\n\nexport type Notification = {\n /** Unique identifier for the notification */\n id: string;\n /** Notification title/heading */\n title: string;\n /** Notification message/body */\n message: string;\n /** ISO timestamp string or Date object - component will parse and format */\n timestamp: string | Date;\n /** Read/unread status */\n isRead: boolean;\n /** Type determines icon color */\n type: NotificationType;\n};\n\nexport type NotificationDropdownProps = {\n /** Array of notifications to display */\n notifications: Notification[];\n /** Callback when a notification is clicked */\n onNotificationClick?: (notification: Notification) => void;\n /** Callback when a notification is dismissed */\n onNotificationDismiss?: (notificationId: string) => void;\n /** Callback when \"Mark all as read\" is clicked */\n onMarkAllAsRead?: () => void;\n /** Callback when \"Clear all\" is clicked */\n onClearAll?: () => void;\n /** Custom empty state message */\n emptyStateMessage?: string;\n /** Custom header text - default \"Notifications\" */\n headerText?: string;\n /** Size variant */\n size?: ButtonProps['size'];\n /** Button variant for the trigger */\n variant?: ButtonProps['variant'];\n /** Button style for the trigger */\n buttonStyle?: ButtonProps['style'];\n /** Optional trigger icon (defaults to bell icon) */\n triggerIcon?: string;\n /** Badge display mode: 'full' (count + indicator), 'indicator' (dot only), 'none' (no badge) */\n badgeMode?: 'full' | 'indicator' | 'none';\n /** Alignment of the dropdown menu */\n align?: 'start' | 'center' | 'end';\n /** Maximum width for the dropdown menu */\n maxWidth?: string;\n /** Additional className for the trigger container */\n className?: string;\n /** Additional className for the dropdown menu */\n menuClassName?: string;\n};\n\n// Icon mapping for notification types\nconst notificationTypeIcons: Record<NotificationType, string> = {\n info: 'info-circle',\n success: 'circle-check',\n warning: 'alert-triangle',\n error: 'alert-circle'\n};\n\n// Color mapping for notification type icons\nconst notificationTypeColors: Record<NotificationType, string> = {\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-error'\n};\n\n/**\n * Format timestamp to relative time (e.g., \"2 min ago\", \"3 hours ago\")\n */\nfunction formatRelativeTime(timestamp: string | Date): string {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'Just now';\n if (diffMins < 60) return `${diffMins} min ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\n // For older notifications, show the date\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\n/**\n * NotificationDropdown component - specialized dropdown for notifications\n */\nfunction NotificationDropdown({\n notifications,\n onNotificationClick,\n onNotificationDismiss,\n onMarkAllAsRead,\n onClearAll,\n emptyStateMessage = 'No notifications',\n headerText = 'Notifications',\n size = 'md',\n variant = 'neutral',\n buttonStyle = 'ghost',\n triggerIcon = 'bell',\n badgeMode = 'full',\n align = 'end',\n maxWidth = '400px',\n className = '',\n menuClassName = ''\n}: Readonly<NotificationDropdownProps>) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const notificationRefs = useRef<Array<HTMLDivElement | null>>([]);\n const [menuPosition, setMenuPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n\n const close = useCallback(() => setIsOpen(false), []);\n const open = useCallback(() => setIsOpen(true), []);\n\n const unreadCount = notifications.filter((n) => !n.isRead).length;\n const hasUnread = unreadCount > 0;\n\n // Handle keyboard\n useEffect(() => {\n if (!isOpen) return;\n const handleKey = (e: KeyboardEvent) => {\n const notificationItems = notificationRefs.current.filter(Boolean);\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n if (notificationItems.length === 0) return;\n\n let nextIndex = activeIndex;\n if (e.key === 'ArrowDown') {\n nextIndex = activeIndex < notificationItems.length - 1 ? activeIndex + 1 : 0;\n } else {\n nextIndex = activeIndex > 0 ? activeIndex - 1 : notificationItems.length - 1;\n }\n\n setActiveIndex(nextIndex);\n notificationItems[nextIndex]?.focus();\n return;\n }\n\n if (e.key === 'Home') {\n e.preventDefault();\n if (notificationItems.length > 0) {\n setActiveIndex(0);\n notificationItems[0]?.focus();\n }\n return;\n }\n\n if (e.key === 'End') {\n e.preventDefault();\n if (notificationItems.length > 0) {\n const lastIndex = notificationItems.length - 1;\n setActiveIndex(lastIndex);\n notificationItems[lastIndex]?.focus();\n }\n return;\n }\n\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [isOpen, close, activeIndex]);\n\n useLayoutEffect(() => {\n let raf: number | undefined;\n if (isOpen && notifications.length > 0) {\n const notificationItems = notificationRefs.current.filter(Boolean);\n if (notificationItems.length > 0) {\n raf = requestAnimationFrame(() => {\n setActiveIndex(0);\n notificationItems[0]?.focus();\n });\n }\n } else if (!isOpen) {\n raf = requestAnimationFrame(() => {\n setActiveIndex(-1);\n });\n }\n return () => {\n if (raf) cancelAnimationFrame(raf);\n };\n }, [isOpen, notifications.length]);\n\n // Outside click close\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (event: MouseEvent) => {\n const isClickInTrigger = dropdownRef.current && dropdownRef.current.contains(event.target as Node);\n const isClickInMenu = menuRef.current && menuRef.current.contains(event.target as Node);\n\n if (!isClickInTrigger && !isClickInMenu) {\n close();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, close]);\n\n useLayoutEffect(() => {\n if (isOpen && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n setMenuPosition({\n top: rect.bottom,\n left: rect.left,\n width: rect.width\n });\n } else {\n setMenuPosition(null);\n }\n }, [isOpen]);\n\n // Close on scroll or resize\n useEffect(() => {\n if (!isOpen) return;\n\n const handleScrollOrResize = (event?: Event) => {\n if (event && event.target && menuRef.current?.contains(event.target as Node)) {\n return;\n }\n close();\n };\n\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [isOpen, close]);\n\n const getAlignmentStyle = (): React.CSSProperties => {\n if (!menuPosition) return {};\n const baseStyle: React.CSSProperties = {\n top: menuPosition.top + 4,\n maxWidth: maxWidth || undefined\n };\n\n if (align === 'start') {\n baseStyle.left = menuPosition.left;\n } else if (align === 'end') {\n baseStyle.right = window.innerWidth - (menuPosition.left + menuPosition.width);\n } else {\n baseStyle.left = menuPosition.left + menuPosition.width / 2;\n baseStyle.transform = 'translateX(-50%)';\n }\n\n return baseStyle;\n };\n\n const handleNotificationClick = (notification: Notification) => {\n onNotificationClick?.(notification);\n // Optionally close the dropdown after clicking a notification\n close();\n };\n\n const handleDismiss = (e: React.MouseEvent, notificationId: string) => {\n e.stopPropagation();\n\n // If this is the last notification, close the dropdown after animation\n if (notifications.length === 1) {\n close();\n }\n\n onNotificationDismiss?.(notificationId);\n };\n\n const handleMarkAllAsRead = () => {\n onMarkAllAsRead?.();\n };\n\n const handleClearAll = () => {\n onClearAll?.();\n close();\n };\n\n const registerNotification = useCallback((el: HTMLDivElement | null, index: number) => {\n notificationRefs.current[index] = el;\n }, []);\n\n return (\n <>\n <div ref={dropdownRef} className={`inline-block relative ${className}`}>\n <Button\n ref={triggerRef}\n variant={variant}\n style={buttonStyle}\n onClick={() => (isOpen ? close() : open())}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label=\"Notifications\"\n size={size}\n >\n <span className=\"relative\">\n <Icon name={triggerIcon} size={size} color=\"currentColor\" />\n {(badgeMode === 'indicator' || badgeMode === 'full') && hasUnread && (\n <span className=\"absolute -top-0.5 -right-0.5 w-2 h-2 bg-info rounded-full\" />\n )}\n {badgeMode === 'full' && unreadCount > 0 && (\n <span className=\"absolute -top-1.5 -right-1.5 min-w-4.5 h-4.5 flex items-center justify-center bg-info text-info-foreground text-[10px] font-semibold rounded-full px-1\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </span>\n </Button>\n </div>\n {isOpen &&\n menuPosition &&\n createPortal(\n <div\n ref={menuRef}\n className={`fixed bg-popover text-popover-foreground border border-border rounded-md shadow-lg z-50 w-96 max-h-128 overflow-hidden origin-top animate-scaleIn focus:outline-none flex flex-col ${menuClassName}`}\n style={getAlignmentStyle()}\n role=\"menu\"\n aria-label={headerText}\n tabIndex={-1}\n >\n {/* Header with actions */}\n {notifications.length > 0 && (\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border bg-muted/30\">\n <h3 className=\"text-sm font-semibold select-none\">{headerText}</h3>\n <div className=\"flex items-center gap-2\">\n {hasUnread && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={handleMarkAllAsRead}\n className=\"text-xs text-primary hover:text-primary-hover transition-colors cursor-pointer\"\n >\n Mark all read\n </button>\n )}\n {onClearAll && (\n <button\n type=\"button\"\n onClick={handleClearAll}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors cursor-pointer\"\n >\n Clear all\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Notifications list or empty state */}\n <div className=\"overflow-y-auto flex-1 overflow-x-hidden [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-transparent hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/20 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb:hover]:bg-muted-foreground/30\">\n {notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 px-4 text-center\">\n <Icon name=\"bell-off\" size=\"xl\" color=\"currentColor\" className=\"text-muted-foreground mb-3\" />\n <p className=\"text-sm text-muted-foreground\">{emptyStateMessage}</p>\n </div>\n ) : (\n <div className=\"grid divide-y divide-border\">\n {notifications.map((notification, index) => (\n <NotificationItem\n key={notification.id}\n notification={notification}\n onClick={() => handleNotificationClick(notification)}\n onDismiss={(e) => handleDismiss(e, notification.id)}\n showDismissButton={!!onNotificationDismiss}\n registerRef={(el) => registerNotification(el, index)}\n />\n ))}\n </div>\n )}\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n\nNotificationDropdown.displayName = 'NotificationDropdown';\n\nexport default NotificationDropdown;\n\n// NotificationItem component\ntype NotificationItemProps = {\n notification: Notification;\n onClick: () => void;\n onDismiss: (e: React.MouseEvent) => void;\n showDismissButton: boolean;\n registerRef: (el: HTMLDivElement | null) => void;\n};\n\nfunction NotificationItem({\n notification,\n onClick,\n onDismiss,\n showDismissButton,\n registerRef\n}: Readonly<NotificationItemProps>) {\n const typeIcon = notificationTypeIcons[notification.type];\n const typeColor = notificationTypeColors[notification.type];\n const [swipeX, setSwipeX] = useState(0);\n const [isSwiping, setIsSwiping] = useState(false);\n const [isDismissing, setIsDismissing] = useState(false);\n const [isHorizontalSwipe, setIsHorizontalSwipe] = useState(false);\n const startXRef = useRef(0);\n const startYRef = useRef(0);\n const currentXRef = useRef(0);\n const initialSwipeXRef = useRef(0); // Track position when touch starts\n const itemRef = useRef<HTMLDivElement | null>(null);\n const PARTIAL_OPEN_AMOUNT = -80; // How far to slide to reveal delete button\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n startXRef.current = e.touches[0].clientX;\n startYRef.current = e.touches[0].clientY;\n currentXRef.current = e.touches[0].clientX;\n initialSwipeXRef.current = swipeX; // Remember where we are\n setIsSwiping(true);\n setIsHorizontalSwipe(false);\n },\n [swipeX]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!isSwiping) return;\n\n const currentY = e.touches[0].clientY;\n currentXRef.current = e.touches[0].clientX;\n\n const diffX = Math.abs(currentXRef.current - startXRef.current);\n const diffY = Math.abs(currentY - startYRef.current);\n\n // Detect horizontal swipe early and lock it in\n if (!isHorizontalSwipe && diffX > 5 && diffX > diffY) {\n setIsHorizontalSwipe(true);\n }\n\n // If this is a horizontal swipe, always prevent default\n if (isHorizontalSwipe || (diffX > diffY && diffX > 5)) {\n e.preventDefault();\n }\n\n const diff = currentXRef.current - startXRef.current;\n const newPosition = initialSwipeXRef.current + diff;\n\n // Only allow left swipe (negative values) and don't go past 0 (right)\n if (newPosition <= 0) {\n setSwipeX(newPosition);\n }\n },\n [isSwiping, isHorizontalSwipe]\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (!isSwiping) return;\n const itemWidth = itemRef.current?.offsetWidth || 0;\n const swipeDistance = Math.abs(swipeX);\n const dismissThreshold = itemWidth * 0.75; // 75% for auto-dismiss\n const revealThreshold = itemWidth * 0.3; // 30% to reveal delete button\n\n if (swipeDistance >= dismissThreshold) {\n // Large swipe: complete the swipe animation then dismiss\n setSwipeX(-itemWidth);\n // Delay state change to ensure transition triggers\n requestAnimationFrame(() => {\n setIsDismissing(true);\n });\n setTimeout(() => {\n onDismiss(e as unknown as React.MouseEvent);\n }, 300);\n } else if (swipeDistance >= revealThreshold) {\n // Medium swipe: snap to partial open state showing delete button\n setSwipeX(PARTIAL_OPEN_AMOUNT);\n } else {\n // Small swipe: snap back closed\n setSwipeX(0);\n }\n setIsSwiping(false);\n },\n [isSwiping, swipeX, onDismiss, PARTIAL_OPEN_AMOUNT]\n );\n\n const handleTrashClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n const itemWidth = itemRef.current?.offsetWidth || 0;\n // Animate out then dismiss\n setSwipeX(-itemWidth);\n // Delay state change to ensure transition triggers\n requestAnimationFrame(() => {\n setIsDismissing(true);\n });\n setTimeout(() => {\n onDismiss(e);\n }, 300);\n },\n [onDismiss]\n );\n\n const handleXButtonClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n // Trigger collapse animation\n requestAnimationFrame(() => {\n setIsDismissing(true);\n });\n setTimeout(() => {\n onDismiss(e);\n }, 300);\n },\n [onDismiss]\n );\n\n const setRefs = useCallback(\n (el: HTMLDivElement | null) => {\n itemRef.current = el;\n registerRef(el);\n },\n [registerRef]\n );\n\n // Detect if this is a touch device\n const isTouchDevice =\n typeof window !== 'undefined' && (window.matchMedia('(pointer: coarse)').matches || 'ontouchstart' in window);\n\n return (\n <div\n className=\"relative overflow-hidden transition-[max-height,opacity,margin] duration-300 ease-out\"\n style={{\n maxHeight: isDismissing ? '0px' : '200px',\n opacity: isDismissing ? 0 : 1,\n marginTop: isDismissing ? '-1px' : '0px',\n marginBottom: isDismissing ? '-1px' : '0px'\n }}\n >\n {/* Red delete background - revealed on swipe (touch devices only) */}\n {isTouchDevice && (\n <div className=\"absolute inset-0 bg-error flex items-center justify-end px-6\">\n <button\n type=\"button\"\n onClick={handleTrashClick}\n className=\"p-2 hover:bg-error-foreground/10 rounded transition-colors cursor-pointer\"\n aria-label=\"Delete notification\"\n >\n <Icon name=\"trash\" size=\"md\" color=\"currentColor\" className=\"text-error-foreground\" />\n </button>\n </div>\n )}\n\n {/* Notification content */}\n <div\n ref={setRefs}\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n style={{\n transform: `translateX(${swipeX}px)`,\n transition: isSwiping ? 'none' : 'transform 0.2s ease-out',\n touchAction: 'pan-y'\n }}\n className={`w-full text-left px-4 py-3 hover:bg-muted/50 relative group cursor-pointer ${\n !notification.isRead ? 'bg-muted/20' : ''\n } bg-popover`}\n >\n <div className=\"flex gap-3\">\n {/* Icon with unread indicator */}\n <div className=\"relative shrink-0 pt-0.5\">\n <Icon name={typeIcon} size=\"md\" color=\"currentColor\" className={typeColor} />\n {!notification.isRead && (\n <span className=\"absolute -top-0.5 -right-0.5 w-2 h-2 bg-info rounded-full ring-2 ring-popover\" />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0 pr-6\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h4 className=\"text-sm font-semibold text-foreground line-clamp-1\">{notification.title}</h4>\n </div>\n <p className=\"text-sm text-foreground/80 line-clamp-2 mb-1.5\">{notification.message}</p>\n <span className=\"text-xs text-muted-foreground\">{formatRelativeTime(notification.timestamp)}</span>\n </div>\n\n {/* Dismiss button */}\n {showDismissButton && (\n <button\n type=\"button\"\n onClick={handleXButtonClick}\n className=\"absolute top-3 right-3 opacity-0 group-hover:opacity-100 transition-opacity p-1 hover:bg-muted rounded cursor-pointer\"\n aria-label=\"Dismiss notification\"\n >\n <Icon name=\"x\" size=\"sm\" color=\"currentColor\" className=\"text-muted-foreground\" />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/pagination/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type PaginationProps = {
|
|
2
|
+
/** The currently active page number */
|
|
3
|
+
currentPage: number;
|
|
4
|
+
/** Total number of pages available */
|
|
5
|
+
totalPages: number;
|
|
6
|
+
/** Callback fired when a page is selected */
|
|
7
|
+
onPageChange: (page: number) => void;
|
|
8
|
+
/** Number of page buttons to show on each side of current page (defaults to 1) */
|
|
9
|
+
siblingCount?: number;
|
|
10
|
+
/** Additional CSS classes for the pagination container */
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Pagination - Page controls with active state
|
|
15
|
+
*/
|
|
16
|
+
declare function Pagination({ currentPage, totalPages, onPageChange, siblingCount, className }: Readonly<PaginationProps>): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
declare namespace Pagination {
|
|
18
|
+
var displayName: string;
|
|
19
|
+
}
|
|
20
|
+
export default Pagination;
|
|
21
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/pagination/pagination.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,iBAAS,UAAU,CAAC,EAClB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAgB,EAChB,SAAc,EACf,EAAE,QAAQ,CAAC,eAAe,CAAC,2CA8E3B;kBApFQ,UAAU;;;AAwFnB,eAAe,UAAU,CAAC"}
|