@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,159 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "../../system/icon/icon.js";
|
|
3
|
+
function Stepper({
|
|
4
|
+
steps,
|
|
5
|
+
currentStep,
|
|
6
|
+
className = "",
|
|
7
|
+
orientation = "horizontal",
|
|
8
|
+
onStepClick,
|
|
9
|
+
clickable = false
|
|
10
|
+
}) {
|
|
11
|
+
const getStepStatus = (index) => {
|
|
12
|
+
const step = steps[index];
|
|
13
|
+
if (step.status) return step.status;
|
|
14
|
+
if (index < currentStep) return "completed";
|
|
15
|
+
if (index === currentStep) return "current";
|
|
16
|
+
return "pending";
|
|
17
|
+
};
|
|
18
|
+
const renderStep = (step, index) => {
|
|
19
|
+
const status = getStepStatus(index) || "pending";
|
|
20
|
+
const isClickable = clickable;
|
|
21
|
+
const statusStyles = {
|
|
22
|
+
pending: {
|
|
23
|
+
circle: "bg-muted text-muted-foreground border-2 border-muted",
|
|
24
|
+
title: "text-muted-foreground",
|
|
25
|
+
description: "text-muted-foreground"
|
|
26
|
+
},
|
|
27
|
+
current: {
|
|
28
|
+
circle: "bg-primary text-primary-foreground border-2 border-primary",
|
|
29
|
+
title: "text-foreground font-semibold",
|
|
30
|
+
description: "text-muted-foreground"
|
|
31
|
+
},
|
|
32
|
+
completed: {
|
|
33
|
+
circle: "bg-success text-success-foreground border-2 border-success",
|
|
34
|
+
title: "text-foreground",
|
|
35
|
+
description: "text-muted-foreground"
|
|
36
|
+
},
|
|
37
|
+
error: {
|
|
38
|
+
circle: "bg-error text-error-foreground border-2 border-error",
|
|
39
|
+
title: "text-error",
|
|
40
|
+
description: "text-error"
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const styles = statusStyles[status];
|
|
44
|
+
const handleClick = () => {
|
|
45
|
+
if (isClickable && onStepClick) {
|
|
46
|
+
onStepClick(index);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const handleKeyDown = (e) => {
|
|
50
|
+
if (isClickable && onStepClick && (e.key === "Enter" || e.key === " ")) {
|
|
51
|
+
e.preventDefault();
|
|
52
|
+
onStepClick(index);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
if (orientation === "horizontal") {
|
|
56
|
+
return /* @__PURE__ */ jsxs(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
className: `flex-1 flex flex-col items-center ${isClickable ? "cursor-pointer" : ""}`,
|
|
60
|
+
onClick: handleClick,
|
|
61
|
+
onKeyDown: handleKeyDown,
|
|
62
|
+
role: isClickable ? "button" : void 0,
|
|
63
|
+
tabIndex: isClickable ? 0 : void 0,
|
|
64
|
+
"aria-label": `Step ${index + 1}: ${step.title}`,
|
|
65
|
+
"aria-current": status === "current" ? "step" : void 0,
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex items-center w-full", children: [
|
|
68
|
+
index > 0 && /* @__PURE__ */ jsx(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
className: `h-0.5 flex-1 ${status === "completed" || status === "current" ? "bg-success" : "bg-muted"}`
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
className: `
|
|
78
|
+
relative z-10 flex items-center justify-center
|
|
79
|
+
w-10 h-10 rounded-full
|
|
80
|
+
transition-[background-color,border-color] duration-300 ease-in-out
|
|
81
|
+
${styles.circle}
|
|
82
|
+
`,
|
|
83
|
+
children: status === "completed" ? /* @__PURE__ */ jsx(Icon, { name: "check", size: "sm" }) : step.icon ? step.icon : /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: index + 1 })
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
index < steps.length - 1 && /* @__PURE__ */ jsx(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: `h-0.5 flex-1 transition-colors duration-300 ease-in-out ${status === "completed" ? "bg-success" : "bg-muted"}`
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
] }),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: `mt-3 text-center text-sm transition-colors duration-300 ease-in-out ${styles.title}`, children: [
|
|
94
|
+
step.title,
|
|
95
|
+
step.optional && /* @__PURE__ */ jsx("span", { className: "ml-1 text-xs text-muted-foreground", children: "(Optional)" }),
|
|
96
|
+
step.description && /* @__PURE__ */ jsx("p", { className: `text-xs mt-1 transition-colors duration-300 ease-in-out ${styles.description}`, children: step.description })
|
|
97
|
+
] })
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
index
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return /* @__PURE__ */ jsxs(
|
|
104
|
+
"div",
|
|
105
|
+
{
|
|
106
|
+
className: `flex gap-4 ${index < steps.length - 1 ? "pb-8" : ""} ${isClickable ? "cursor-pointer" : ""}`,
|
|
107
|
+
onClick: handleClick,
|
|
108
|
+
onKeyDown: handleKeyDown,
|
|
109
|
+
role: isClickable ? "button" : void 0,
|
|
110
|
+
tabIndex: isClickable ? 0 : void 0,
|
|
111
|
+
"aria-label": `Step ${index + 1}: ${step.title}`,
|
|
112
|
+
"aria-current": status === "current" ? "step" : void 0,
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
"div",
|
|
117
|
+
{
|
|
118
|
+
className: `
|
|
119
|
+
flex items-center justify-center
|
|
120
|
+
w-10 h-10 rounded-full shrink-0
|
|
121
|
+
transition-[background-color,border-color] duration-300 ease-in-out
|
|
122
|
+
${styles.circle}
|
|
123
|
+
`,
|
|
124
|
+
children: status === "completed" ? /* @__PURE__ */ jsx(Icon, { name: "check", size: "sm" }) : step.icon ? step.icon : /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: index + 1 })
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
index < steps.length - 1 && /* @__PURE__ */ jsx(
|
|
128
|
+
"div",
|
|
129
|
+
{
|
|
130
|
+
className: `w-0.5 flex-1 mt-2 transition-colors duration-300 ease-in-out ${status === "completed" ? "bg-success" : "bg-muted"}`
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
] }),
|
|
134
|
+
/* @__PURE__ */ jsxs("div", { className: `flex-1 pt-2 text-base transition-colors duration-300 ease-in-out ${styles.title}`, children: [
|
|
135
|
+
step.title,
|
|
136
|
+
step.optional && /* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: "(Optional)" }),
|
|
137
|
+
step.description && /* @__PURE__ */ jsx("p", { className: `text-sm mt-1 transition-colors duration-300 ease-in-out ${styles.description}`, children: step.description })
|
|
138
|
+
] })
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
index
|
|
142
|
+
);
|
|
143
|
+
};
|
|
144
|
+
return /* @__PURE__ */ jsx(
|
|
145
|
+
"div",
|
|
146
|
+
{
|
|
147
|
+
className: `
|
|
148
|
+
${orientation === "horizontal" ? "flex items-start" : "flex flex-col"}
|
|
149
|
+
${className}
|
|
150
|
+
`,
|
|
151
|
+
children: steps.map((step, index) => renderStep(step, index))
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
Stepper.displayName = "Stepper";
|
|
156
|
+
export {
|
|
157
|
+
Stepper as default
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=stepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepper.js","sources":["../../../../src/components/navigation/stepper/stepper.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport Icon from '../../system/icon/icon';\n\nexport type StepProps = {\n /** Primary text label for the step */\n title: string;\n /** Optional secondary description text */\n description?: string;\n /** Custom icon to display instead of step number */\n icon?: ReactNode;\n /** Current status of the step (auto-determined from currentStep if not set) */\n status?: 'pending' | 'current' | 'completed' | 'error';\n /** Whether this step can be skipped */\n optional?: boolean;\n};\n\nexport type StepperProps = {\n /** Array of step configurations */\n steps: StepProps[];\n /** Zero-based index of the currently active step */\n currentStep: number;\n /** Additional CSS classes for the stepper container */\n className?: string;\n /** Layout direction for the stepper */\n orientation?: 'horizontal' | 'vertical';\n /** Callback fired when a step is clicked (only when clickable is true) */\n onStepClick?: (step: number) => void;\n /** Enable clicking on steps for navigation */\n clickable?: boolean;\n};\n\n/**\n * Stepper - Multi-step progress indicator\n *\n * Features:\n * - Horizontal and vertical orientations\n * - Current, completed, and pending states\n * - Optional steps\n * - Custom icons\n * - Clickable steps (for navigation)\n * - Error states\n *\n * Common uses:\n * - Multi-step forms\n * - Checkout processes\n * - Onboarding flows\n * - Wizards\n */\nfunction Stepper({\n steps,\n currentStep,\n className = '',\n orientation = 'horizontal',\n onStepClick,\n clickable = false\n}: Readonly<StepperProps>) {\n const getStepStatus = (index: number): StepProps['status'] => {\n const step = steps[index];\n if (step.status) return step.status;\n if (index < currentStep) return 'completed';\n if (index === currentStep) return 'current';\n return 'pending';\n };\n\n const renderStep = (step: StepProps, index: number) => {\n const status = getStepStatus(index) || 'pending';\n const isClickable = clickable; // allow clicking any step when clickable enabled\n\n // Status-based styles\n const statusStyles: Record<\n NonNullable<StepProps['status']>,\n {\n circle: string;\n title: string;\n description: string;\n }\n > = {\n pending: {\n circle: 'bg-muted text-muted-foreground border-2 border-muted',\n title: 'text-muted-foreground',\n description: 'text-muted-foreground'\n },\n current: {\n circle: 'bg-primary text-primary-foreground border-2 border-primary',\n title: 'text-foreground font-semibold',\n description: 'text-muted-foreground'\n },\n completed: {\n circle: 'bg-success text-success-foreground border-2 border-success',\n title: 'text-foreground',\n description: 'text-muted-foreground'\n },\n error: {\n circle: 'bg-error text-error-foreground border-2 border-error',\n title: 'text-error',\n description: 'text-error'\n }\n };\n\n const styles = statusStyles[status];\n\n const handleClick = () => {\n if (isClickable && onStepClick) {\n onStepClick(index);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (isClickable && onStepClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onStepClick(index);\n }\n };\n\n if (orientation === 'horizontal') {\n return (\n <div\n key={index}\n className={`flex-1 flex flex-col items-center ${isClickable ? 'cursor-pointer' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n aria-label={`Step ${index + 1}: ${step.title}`}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n {/* Step Number/Icon */}\n <div className=\"relative flex items-center w-full\">\n {/* Connector Line (Left) */}\n {index > 0 && (\n <div\n className={`h-0.5 flex-1 ${status === 'completed' || status === 'current' ? 'bg-success' : 'bg-muted'}`}\n />\n )}\n\n {/* Circle */}\n <div\n className={`\n relative z-10 flex items-center justify-center\n w-10 h-10 rounded-full\n transition-[background-color,border-color] duration-300 ease-in-out\n ${styles.circle}\n `}\n >\n {status === 'completed' ? (\n <Icon name=\"check\" size=\"sm\" />\n ) : step.icon ? (\n step.icon\n ) : (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </div>\n\n {/* Connector Line (Right) */}\n {index < steps.length - 1 && (\n <div\n className={`h-0.5 flex-1 transition-colors duration-300 ease-in-out ${status === 'completed' ? 'bg-success' : 'bg-muted'}`}\n />\n )}\n </div>\n\n {/* Label */}\n <div className={`mt-3 text-center text-sm transition-colors duration-300 ease-in-out ${styles.title}`}>\n {step.title}\n {step.optional && <span className=\"ml-1 text-xs text-muted-foreground\">(Optional)</span>}\n {step.description && (\n <p className={`text-xs mt-1 transition-colors duration-300 ease-in-out ${styles.description}`}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n );\n }\n\n // Vertical orientation\n return (\n <div\n key={index}\n className={`flex gap-4 ${index < steps.length - 1 ? 'pb-8' : ''} ${isClickable ? 'cursor-pointer' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n aria-label={`Step ${index + 1}: ${step.title}`}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n {/* Icon Column */}\n <div className=\"flex flex-col items-center\">\n {/* Circle */}\n <div\n className={`\n flex items-center justify-center\n w-10 h-10 rounded-full shrink-0\n transition-[background-color,border-color] duration-300 ease-in-out\n ${styles.circle}\n `}\n >\n {status === 'completed' ? (\n <Icon name=\"check\" size=\"sm\" />\n ) : step.icon ? (\n step.icon\n ) : (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </div>\n\n {/* Connector Line */}\n {index < steps.length - 1 && (\n <div\n className={`w-0.5 flex-1 mt-2 transition-colors duration-300 ease-in-out ${status === 'completed' ? 'bg-success' : 'bg-muted'}`}\n />\n )}\n </div>\n\n {/* Content Column */}\n <div className={`flex-1 pt-2 text-base transition-colors duration-300 ease-in-out ${styles.title}`}>\n {step.title}\n {step.optional && <span className=\"ml-2 text-xs text-muted-foreground\">(Optional)</span>}\n {step.description && (\n <p className={`text-sm mt-1 transition-colors duration-300 ease-in-out ${styles.description}`}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={`\n ${orientation === 'horizontal' ? 'flex items-start' : 'flex flex-col'}\n ${className}\n `}\n >\n {steps.map((step, index) => renderStep(step, index))}\n </div>\n );\n}\n\nStepper.displayName = 'Stepper';\n\nexport default Stepper;\n"],"names":[],"mappings":";;AAgDA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AACd,GAA2B;AACzB,QAAM,gBAAgB,CAAC,UAAuC;AAC5D,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,QAAI,QAAQ,YAAa,QAAO;AAChC,QAAI,UAAU,YAAa,QAAO;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,MAAiB,UAAkB;AACrD,UAAM,SAAS,cAAc,KAAK,KAAK;AACvC,UAAM,cAAc;AAGpB,UAAM,eAOF;AAAA,MACF,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IACf;AAGF,UAAM,SAAS,aAAa,MAAM;AAElC,UAAM,cAAc,MAAM;AACxB,UAAI,eAAe,aAAa;AAC9B,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,MAA2B;AAChD,UAAI,eAAe,gBAAgB,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAAM;AACtE,UAAE,eAAA;AACF,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,gBAAgB,cAAc;AAChC,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,qCAAqC,cAAc,mBAAmB,EAAE;AAAA,UACnF,SAAS;AAAA,UACT,WAAW;AAAA,UACX,MAAM,cAAc,WAAW;AAAA,UAC/B,UAAU,cAAc,IAAI;AAAA,UAC5B,cAAY,QAAQ,QAAQ,CAAC,KAAK,KAAK,KAAK;AAAA,UAC5C,gBAAc,WAAW,YAAY,SAAS;AAAA,UAG9C,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAU,qCAEZ,UAAA;AAAA,cAAA,QAAQ,KACP;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,gBAAgB,WAAW,eAAe,WAAW,YAAY,eAAe,UAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAKzG;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA;AAAA;AAAA;AAAA,kBAIP,OAAO,MAAM;AAAA;AAAA,kBAGhB,qBAAW,cACV,oBAAC,QAAK,MAAK,SAAQ,MAAK,MAAK,IAC3B,KAAK,OACP,KAAK,OAEL,oBAAC,UAAK,WAAU,yBAAyB,kBAAQ,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,cAKtD,QAAQ,MAAM,SAAS,KACtB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,2DAA2D,WAAW,cAAc,eAAe,UAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YAC1H,GAEJ;AAAA,iCAGC,OAAA,EAAI,WAAW,uEAAuE,OAAO,KAAK,IAChG,UAAA;AAAA,cAAA,KAAK;AAAA,cACL,KAAK,YAAY,oBAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA,cAAU;AAAA,cAChF,KAAK,eACJ,oBAAC,KAAA,EAAE,WAAW,2DAA2D,OAAO,WAAW,IACxF,UAAA,KAAK,YAAA,CACR;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,QArDK;AAAA,MAAA;AAAA,IAwDX;AAGA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW,cAAc,QAAQ,MAAM,SAAS,IAAI,SAAS,EAAE,IAAI,cAAc,mBAAmB,EAAE;AAAA,QACtG,SAAS;AAAA,QACT,WAAW;AAAA,QACX,MAAM,cAAc,WAAW;AAAA,QAC/B,UAAU,cAAc,IAAI;AAAA,QAC5B,cAAY,QAAQ,QAAQ,CAAC,KAAK,KAAK,KAAK;AAAA,QAC5C,gBAAc,WAAW,YAAY,SAAS;AAAA,QAG9C,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,8BAEb,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA;AAAA;AAAA;AAAA,gBAIP,OAAO,MAAM;AAAA;AAAA,gBAGhB,qBAAW,cACV,oBAAC,QAAK,MAAK,SAAQ,MAAK,MAAK,IAC3B,KAAK,OACP,KAAK,OAEL,oBAAC,UAAK,WAAU,yBAAyB,kBAAQ,EAAA,CAAE;AAAA,cAAA;AAAA,YAAA;AAAA,YAKtD,QAAQ,MAAM,SAAS,KACtB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,gEAAgE,WAAW,cAAc,eAAe,UAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAC/H,GAEJ;AAAA,+BAGC,OAAA,EAAI,WAAW,oEAAoE,OAAO,KAAK,IAC7F,UAAA;AAAA,YAAA,KAAK;AAAA,YACL,KAAK,YAAY,oBAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA,cAAU;AAAA,YAChF,KAAK,eACJ,oBAAC,KAAA,EAAE,WAAW,2DAA2D,OAAO,WAAW,IACxF,UAAA,KAAK,YAAA,CACR;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,MA9CK;AAAA,IAAA;AAAA,EAiDX;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,UACP,gBAAgB,eAAe,qBAAqB,eAAe;AAAA,UACnE,SAAS;AAAA;AAAA,MAGZ,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU,WAAW,MAAM,KAAK,CAAC;AAAA,IAAA;AAAA,EAAA;AAGzD;AAEA,QAAQ,cAAc;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type Tab = {
|
|
3
|
+
/** Unique identifier for the tab */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Display text shown in the tab button */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Content to render when this tab is active */
|
|
8
|
+
content: React.ReactNode;
|
|
9
|
+
};
|
|
10
|
+
export type TabsProps = {
|
|
11
|
+
/** Array of tab configurations with id, label, and content */
|
|
12
|
+
tabs: Tab[];
|
|
13
|
+
/** ID of the tab to display initially (defaults to first tab) */
|
|
14
|
+
defaultTab?: string;
|
|
15
|
+
/** Additional CSS classes for the tabs container */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Accessibility label for the tab list */
|
|
18
|
+
ariaLabel?: string;
|
|
19
|
+
/** Remove the bottom border from the tab list */
|
|
20
|
+
noBorder?: boolean;
|
|
21
|
+
/** Optional localStorage key to persist the active tab */
|
|
22
|
+
storageKey?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Accessible Tabs component with animated tab switching using PageTransition
|
|
26
|
+
*/
|
|
27
|
+
declare function Tabs({ tabs, defaultTab, className, ariaLabel, noBorder, storageKey }: Readonly<TabsProps>): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
declare namespace Tabs {
|
|
29
|
+
var displayName: string;
|
|
30
|
+
}
|
|
31
|
+
export default Tabs;
|
|
32
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/tabs/tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,MAAM,MAAM,GAAG,GAAG;IAChB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,8DAA8D;IAC9D,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,iBAAS,IAAI,CAAC,EACZ,IAAI,EACJ,UAAU,EACV,SAAc,EACd,SAAkB,EAClB,QAAgB,EAChB,UAAU,EACX,EAAE,QAAQ,CAAC,SAAS,CAAC,2CA6DrB;kBApEQ,IAAI;;;AAwEb,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { PageTransition } from "../../layout/page-transition/page-transition.js";
|
|
4
|
+
function Tabs({
|
|
5
|
+
tabs,
|
|
6
|
+
defaultTab,
|
|
7
|
+
className = "",
|
|
8
|
+
ariaLabel = "Tabs",
|
|
9
|
+
noBorder = false,
|
|
10
|
+
storageKey
|
|
11
|
+
}) {
|
|
12
|
+
const [activeTab, setActiveTab] = useState(() => {
|
|
13
|
+
if (storageKey) {
|
|
14
|
+
const stored = localStorage.getItem(storageKey);
|
|
15
|
+
if (stored && tabs.some((tab) => tab.id === stored)) {
|
|
16
|
+
return stored;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return defaultTab || tabs[0]?.id;
|
|
20
|
+
});
|
|
21
|
+
const handleSetActiveTab = (tabId) => {
|
|
22
|
+
setActiveTab(tabId);
|
|
23
|
+
if (storageKey) {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem(storageKey, tabId);
|
|
26
|
+
} catch {
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsxs("div", { className, children: [
|
|
31
|
+
/* @__PURE__ */ jsx("div", { role: "tablist", "aria-label": ariaLabel, className: `flex ${noBorder ? "" : "border-b-2 border-border/50"}`, children: tabs.map((tab) => /* @__PURE__ */ jsx(
|
|
32
|
+
"button",
|
|
33
|
+
{
|
|
34
|
+
role: "tab",
|
|
35
|
+
"aria-selected": activeTab === tab.id,
|
|
36
|
+
"aria-controls": `panel-${tab.id}`,
|
|
37
|
+
id: `tab-${tab.id}`,
|
|
38
|
+
onClick: () => handleSetActiveTab(tab.id),
|
|
39
|
+
className: `px-4 py-3 font-medium cursor-pointer transition-all duration-200 focus:outline-none relative hover:text-foreground hover:bg-muted/50 ${activeTab === tab.id ? "text-primary hover:text-primary after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary after:rounded-t after:transition-all after:duration-200" : "text-muted-foreground"}`,
|
|
40
|
+
children: tab.label
|
|
41
|
+
},
|
|
42
|
+
tab.id
|
|
43
|
+
)) }),
|
|
44
|
+
tabs.map((tab) => /* @__PURE__ */ jsx(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
role: "tabpanel",
|
|
48
|
+
id: `panel-${tab.id}`,
|
|
49
|
+
"aria-labelledby": `tab-${tab.id}`,
|
|
50
|
+
hidden: activeTab !== tab.id,
|
|
51
|
+
children: activeTab === tab.id && /* @__PURE__ */ jsx(PageTransition, { type: "fade", duration: 150, children: /* @__PURE__ */ jsx("div", { className: "pt-6", children: tab.content }) })
|
|
52
|
+
},
|
|
53
|
+
tab.id
|
|
54
|
+
))
|
|
55
|
+
] });
|
|
56
|
+
}
|
|
57
|
+
Tabs.displayName = "Tabs";
|
|
58
|
+
export {
|
|
59
|
+
Tabs as default
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sources":["../../../../src/components/navigation/tabs/tabs.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport PageTransition from '../../layout/page-transition/page-transition';\n\nexport type Tab = {\n /** Unique identifier for the tab */\n id: string;\n /** Display text shown in the tab button */\n label: string;\n /** Content to render when this tab is active */\n content: React.ReactNode;\n};\n\nexport type TabsProps = {\n /** Array of tab configurations with id, label, and content */\n tabs: Tab[];\n /** ID of the tab to display initially (defaults to first tab) */\n defaultTab?: string;\n /** Additional CSS classes for the tabs container */\n className?: string;\n /** Accessibility label for the tab list */\n ariaLabel?: string;\n /** Remove the bottom border from the tab list */\n noBorder?: boolean;\n /** Optional localStorage key to persist the active tab */\n storageKey?: string;\n};\n\n/**\n * Accessible Tabs component with animated tab switching using PageTransition\n */\nfunction Tabs({\n tabs,\n defaultTab,\n className = '',\n ariaLabel = 'Tabs',\n noBorder = false,\n storageKey\n}: Readonly<TabsProps>) {\n const [activeTab, setActiveTab] = useState(() => {\n if (storageKey) {\n const stored = localStorage.getItem(storageKey);\n if (stored && tabs.some((tab) => tab.id === stored)) {\n return stored;\n }\n }\n return defaultTab || tabs[0]?.id;\n });\n\n // Save to localStorage whenever activeTab changes\n const handleSetActiveTab = (tabId: string) => {\n setActiveTab(tabId);\n if (storageKey) {\n try {\n localStorage.setItem(storageKey, tabId);\n } catch {\n // Persistence is best-effort; ignore storage errors\n }\n }\n };\n\n return (\n <div className={className}>\n <div role=\"tablist\" aria-label={ariaLabel} className={`flex ${noBorder ? '' : 'border-b-2 border-border/50'}`}>\n {tabs.map((tab) => (\n <button\n key={tab.id}\n role=\"tab\"\n aria-selected={activeTab === tab.id}\n aria-controls={`panel-${tab.id}`}\n id={`tab-${tab.id}`}\n onClick={() => handleSetActiveTab(tab.id)}\n className={`px-4 py-3 font-medium cursor-pointer transition-all duration-200 focus:outline-none relative hover:text-foreground hover:bg-muted/50 ${\n activeTab === tab.id\n ? 'text-primary hover:text-primary after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary after:rounded-t after:transition-all after:duration-200'\n : 'text-muted-foreground'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {tabs.map((tab) => (\n <div\n key={tab.id}\n role=\"tabpanel\"\n id={`panel-${tab.id}`}\n aria-labelledby={`tab-${tab.id}`}\n hidden={activeTab !== tab.id}\n >\n {activeTab === tab.id && (\n <PageTransition type=\"fade\" duration={150}>\n <div className=\"pt-6\">{tab.content}</div>\n </PageTransition>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nTabs.displayName = 'Tabs';\n\nexport default Tabs;\n"],"names":[],"mappings":";;;AA8BA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AACF,GAAwB;AACtB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,MAAM;AAC/C,QAAI,YAAY;AACd,YAAM,SAAS,aAAa,QAAQ,UAAU;AAC9C,UAAI,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,MAAM,GAAG;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,cAAc,KAAK,CAAC,GAAG;AAAA,EAChC,CAAC;AAGD,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,iBAAa,KAAK;AAClB,QAAI,YAAY;AACd,UAAI;AACF,qBAAa,QAAQ,YAAY,KAAK;AAAA,MACxC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WACH,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,MAAK,WAAU,cAAY,WAAW,WAAW,QAAQ,WAAW,KAAK,6BAA6B,IACxG,UAAA,KAAK,IAAI,CAAC,QACT;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,iBAAe,cAAc,IAAI;AAAA,QACjC,iBAAe,SAAS,IAAI,EAAE;AAAA,QAC9B,IAAI,OAAO,IAAI,EAAE;AAAA,QACjB,SAAS,MAAM,mBAAmB,IAAI,EAAE;AAAA,QACxC,WAAW,wIACT,cAAc,IAAI,KACd,kLACA,uBACN;AAAA,QAEC,UAAA,IAAI;AAAA,MAAA;AAAA,MAZA,IAAI;AAAA,IAAA,CAcZ,GACH;AAAA,IACC,KAAK,IAAI,CAAC,QACT;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,IAAI,SAAS,IAAI,EAAE;AAAA,QACnB,mBAAiB,OAAO,IAAI,EAAE;AAAA,QAC9B,QAAQ,cAAc,IAAI;AAAA,QAEzB,UAAA,cAAc,IAAI,MACjB,oBAAC,kBAAe,MAAK,QAAO,UAAU,KACpC,8BAAC,OAAA,EAAI,WAAU,QAAQ,UAAA,IAAI,SAAQ,EAAA,CACrC;AAAA,MAAA;AAAA,MATG,IAAI;AAAA,IAAA,CAYZ;AAAA,EAAA,GACH;AAEJ;AAEA,KAAK,cAAc;"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Base user type - extend this in your app
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthUser {
|
|
6
|
+
id: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Authentication state
|
|
11
|
+
*/
|
|
12
|
+
export interface AuthState {
|
|
13
|
+
user: AuthUser | null;
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
isAuthenticated: boolean;
|
|
16
|
+
error: Error | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Authentication actions
|
|
20
|
+
*/
|
|
21
|
+
export interface AuthActions {
|
|
22
|
+
login: (credentials: unknown) => Promise<void>;
|
|
23
|
+
logout: () => Promise<void>;
|
|
24
|
+
refresh: () => Promise<void>;
|
|
25
|
+
clearError: () => void;
|
|
26
|
+
updateUser: (updates: Partial<AuthUser>) => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Complete auth context type
|
|
30
|
+
*/
|
|
31
|
+
export type AuthContextType = AuthState & AuthActions;
|
|
32
|
+
/**
|
|
33
|
+
* Auth provider configuration
|
|
34
|
+
*/
|
|
35
|
+
export interface AuthProviderConfig {
|
|
36
|
+
/** Custom login handler - implement your auth logic */
|
|
37
|
+
onLogin: (credentials: unknown) => Promise<AuthUser>;
|
|
38
|
+
/** Custom logout handler */
|
|
39
|
+
onLogout?: () => Promise<void>;
|
|
40
|
+
/** Custom refresh handler - restore user from storage/API */
|
|
41
|
+
onRefresh?: () => Promise<AuthUser | null>;
|
|
42
|
+
/** Storage key for persisting user */
|
|
43
|
+
storageKey?: string;
|
|
44
|
+
/** Use sessionStorage instead of localStorage */
|
|
45
|
+
useSessionStorage?: boolean;
|
|
46
|
+
/** Auto-refresh on mount */
|
|
47
|
+
autoRefresh?: boolean;
|
|
48
|
+
/** External auth URL (e.g., auth server on different port) */
|
|
49
|
+
authUrl?: string;
|
|
50
|
+
/** Enable credentials for cross-origin requests */
|
|
51
|
+
withCredentials?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Auth provider props
|
|
55
|
+
*/
|
|
56
|
+
export interface AuthProviderProps {
|
|
57
|
+
/** Authentication configuration object containing handlers and options */
|
|
58
|
+
config: AuthProviderConfig;
|
|
59
|
+
/** React children to be wrapped with authentication context */
|
|
60
|
+
children: ReactNode;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* AuthProvider - Flexible authentication context provider
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <AuthProvider
|
|
68
|
+
* config={{
|
|
69
|
+
* onLogin: async (credentials) => {
|
|
70
|
+
* const res = await fetch('/api/login', {
|
|
71
|
+
* method: 'POST',
|
|
72
|
+
* body: JSON.stringify(credentials)
|
|
73
|
+
* });
|
|
74
|
+
* return await res.json();
|
|
75
|
+
* },
|
|
76
|
+
* onLogout: async () => {
|
|
77
|
+
* await fetch('/api/logout', { method: 'POST' });
|
|
78
|
+
* }
|
|
79
|
+
* }}
|
|
80
|
+
* >
|
|
81
|
+
* <App />
|
|
82
|
+
* </AuthProvider>
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export default function AuthProvider({ config, children }: Readonly<AuthProviderProps>): import("react/jsx-runtime").JSX.Element;
|
|
86
|
+
/**
|
|
87
|
+
* useAuth hook - Access authentication context
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```tsx
|
|
91
|
+
* function ProtectedPage() {
|
|
92
|
+
* const { user, isAuthenticated, logout } = useAuth();
|
|
93
|
+
*
|
|
94
|
+
* if (!isAuthenticated) {
|
|
95
|
+
* return <Navigate to="/login" />;
|
|
96
|
+
* }
|
|
97
|
+
*
|
|
98
|
+
* return <div>Welcome, {user.name}</div>;
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function useAuth(): AuthContextType;
|
|
103
|
+
//# sourceMappingURL=auth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/system/auth-provider/auth-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkD,SAAS,EAAE,MAAM,OAAO,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC3C,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,MAAM,EAAE,kBAAkB,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,iBAAiB,CAAC,2CAqHrF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,IAAI,eAAe,CAMzC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, createContext, useContext } from "react";
|
|
3
|
+
const AuthContext = createContext(void 0);
|
|
4
|
+
function AuthProvider({ config, children }) {
|
|
5
|
+
const {
|
|
6
|
+
onLogin,
|
|
7
|
+
onLogout,
|
|
8
|
+
onRefresh,
|
|
9
|
+
storageKey = "auth_user",
|
|
10
|
+
useSessionStorage = false,
|
|
11
|
+
autoRefresh = true
|
|
12
|
+
} = config;
|
|
13
|
+
const [user, setUser] = useState(null);
|
|
14
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const storage = useSessionStorage ? sessionStorage : localStorage;
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const loadUser = async () => {
|
|
19
|
+
try {
|
|
20
|
+
if (onRefresh && autoRefresh) {
|
|
21
|
+
const refreshedUser = await onRefresh();
|
|
22
|
+
setUser(refreshedUser);
|
|
23
|
+
} else {
|
|
24
|
+
const storedUser = storage.getItem(storageKey);
|
|
25
|
+
if (storedUser) {
|
|
26
|
+
setUser(JSON.parse(storedUser));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
} catch (err) {
|
|
30
|
+
setError(err instanceof Error ? err : new Error("Failed to load user"));
|
|
31
|
+
} finally {
|
|
32
|
+
setIsLoading(false);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
loadUser();
|
|
36
|
+
}, [storageKey, storage, onRefresh, autoRefresh]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (user) {
|
|
39
|
+
storage.setItem(storageKey, JSON.stringify(user));
|
|
40
|
+
} else {
|
|
41
|
+
storage.removeItem(storageKey);
|
|
42
|
+
}
|
|
43
|
+
}, [user, storageKey, storage]);
|
|
44
|
+
const login = async (credentials) => {
|
|
45
|
+
setIsLoading(true);
|
|
46
|
+
setError(null);
|
|
47
|
+
try {
|
|
48
|
+
const loggedInUser = await onLogin(credentials);
|
|
49
|
+
setUser(loggedInUser);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
const error2 = err instanceof Error ? err : new Error("Login failed");
|
|
52
|
+
setError(error2);
|
|
53
|
+
throw error2;
|
|
54
|
+
} finally {
|
|
55
|
+
setIsLoading(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const logout = async () => {
|
|
59
|
+
setIsLoading(true);
|
|
60
|
+
setError(null);
|
|
61
|
+
try {
|
|
62
|
+
if (onLogout) {
|
|
63
|
+
await onLogout();
|
|
64
|
+
}
|
|
65
|
+
setUser(null);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
const error2 = err instanceof Error ? err : new Error("Logout failed");
|
|
68
|
+
setError(error2);
|
|
69
|
+
throw error2;
|
|
70
|
+
} finally {
|
|
71
|
+
setIsLoading(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const refresh = async () => {
|
|
75
|
+
if (!onRefresh) return;
|
|
76
|
+
setIsLoading(true);
|
|
77
|
+
setError(null);
|
|
78
|
+
try {
|
|
79
|
+
const refreshedUser = await onRefresh();
|
|
80
|
+
setUser(refreshedUser);
|
|
81
|
+
} catch (err) {
|
|
82
|
+
const error2 = err instanceof Error ? err : new Error("Refresh failed");
|
|
83
|
+
setError(error2);
|
|
84
|
+
throw error2;
|
|
85
|
+
} finally {
|
|
86
|
+
setIsLoading(false);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const clearError = () => setError(null);
|
|
90
|
+
const updateUser = (updates) => {
|
|
91
|
+
if (!user) return;
|
|
92
|
+
setUser({ ...user, ...updates });
|
|
93
|
+
};
|
|
94
|
+
const value = {
|
|
95
|
+
user,
|
|
96
|
+
isLoading,
|
|
97
|
+
isAuthenticated: !!user,
|
|
98
|
+
error,
|
|
99
|
+
login,
|
|
100
|
+
logout,
|
|
101
|
+
refresh,
|
|
102
|
+
clearError,
|
|
103
|
+
updateUser
|
|
104
|
+
};
|
|
105
|
+
return /* @__PURE__ */ jsx(AuthContext.Provider, { value, children });
|
|
106
|
+
}
|
|
107
|
+
function useAuth() {
|
|
108
|
+
const context = useContext(AuthContext);
|
|
109
|
+
if (!context) {
|
|
110
|
+
throw new Error("useAuth must be used within an AuthProvider");
|
|
111
|
+
}
|
|
112
|
+
return context;
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
AuthProvider as default,
|
|
116
|
+
useAuth
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=auth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-provider.js","sources":["../../../../src/components/system/auth-provider/auth-provider.tsx"],"sourcesContent":["import { createContext, useContext, useState, useEffect, ReactNode } from 'react';\n\n/**\n * Base user type - extend this in your app\n */\nexport interface AuthUser {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Authentication state\n */\nexport interface AuthState {\n user: AuthUser | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n error: Error | null;\n}\n\n/**\n * Authentication actions\n */\nexport interface AuthActions {\n login: (credentials: unknown) => Promise<void>;\n logout: () => Promise<void>;\n refresh: () => Promise<void>;\n clearError: () => void;\n updateUser: (updates: Partial<AuthUser>) => void;\n}\n\n/**\n * Complete auth context type\n */\nexport type AuthContextType = AuthState & AuthActions;\n\n/**\n * Auth provider configuration\n */\nexport interface AuthProviderConfig {\n /** Custom login handler - implement your auth logic */\n onLogin: (credentials: unknown) => Promise<AuthUser>;\n /** Custom logout handler */\n onLogout?: () => Promise<void>;\n /** Custom refresh handler - restore user from storage/API */\n onRefresh?: () => Promise<AuthUser | null>;\n /** Storage key for persisting user */\n storageKey?: string;\n /** Use sessionStorage instead of localStorage */\n useSessionStorage?: boolean;\n /** Auto-refresh on mount */\n autoRefresh?: boolean;\n /** External auth URL (e.g., auth server on different port) */\n authUrl?: string;\n /** Enable credentials for cross-origin requests */\n withCredentials?: boolean;\n}\n\n/**\n * Auth provider props\n */\nexport interface AuthProviderProps {\n /** Authentication configuration object containing handlers and options */\n config: AuthProviderConfig;\n /** React children to be wrapped with authentication context */\n children: ReactNode;\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\n/**\n * AuthProvider - Flexible authentication context provider\n *\n * @example\n * ```tsx\n * <AuthProvider\n * config={{\n * onLogin: async (credentials) => {\n * const res = await fetch('/api/login', {\n * method: 'POST',\n * body: JSON.stringify(credentials)\n * });\n * return await res.json();\n * },\n * onLogout: async () => {\n * await fetch('/api/logout', { method: 'POST' });\n * }\n * }}\n * >\n * <App />\n * </AuthProvider>\n * ```\n */\nexport default function AuthProvider({ config, children }: Readonly<AuthProviderProps>) {\n const {\n onLogin,\n onLogout,\n onRefresh,\n storageKey = 'auth_user',\n useSessionStorage = false,\n autoRefresh = true\n } = config;\n\n const [user, setUser] = useState<AuthUser | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const storage = useSessionStorage ? sessionStorage : localStorage;\n\n // Load user from storage on mount\n useEffect(() => {\n const loadUser = async () => {\n try {\n if (onRefresh && autoRefresh) {\n const refreshedUser = await onRefresh();\n setUser(refreshedUser);\n } else {\n const storedUser = storage.getItem(storageKey);\n if (storedUser) {\n setUser(JSON.parse(storedUser));\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to load user'));\n } finally {\n setIsLoading(false);\n }\n };\n\n loadUser();\n }, [storageKey, storage, onRefresh, autoRefresh]);\n\n // Persist user to storage when it changes\n useEffect(() => {\n if (user) {\n storage.setItem(storageKey, JSON.stringify(user));\n } else {\n storage.removeItem(storageKey);\n }\n }, [user, storageKey, storage]);\n\n const login = async (credentials: unknown) => {\n setIsLoading(true);\n setError(null);\n try {\n const loggedInUser = await onLogin(credentials);\n setUser(loggedInUser);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Login failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n };\n\n const logout = async () => {\n setIsLoading(true);\n setError(null);\n try {\n if (onLogout) {\n await onLogout();\n }\n setUser(null);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Logout failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n };\n\n const refresh = async () => {\n if (!onRefresh) return;\n\n setIsLoading(true);\n setError(null);\n try {\n const refreshedUser = await onRefresh();\n setUser(refreshedUser);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Refresh failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n };\n\n const clearError = () => setError(null);\n\n const updateUser = (updates: Partial<AuthUser>) => {\n if (!user) return;\n setUser({ ...user, ...updates });\n };\n\n const value: AuthContextType = {\n user,\n isLoading,\n isAuthenticated: !!user,\n error,\n login,\n logout,\n refresh,\n clearError,\n updateUser\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\n/**\n * useAuth hook - Access authentication context\n *\n * @example\n * ```tsx\n * function ProtectedPage() {\n * const { user, isAuthenticated, logout } = useAuth();\n *\n * if (!isAuthenticated) {\n * return <Navigate to=\"/login\" />;\n * }\n *\n * return <div>Welcome, {user.name}</div>;\n * }\n * ```\n */\nexport function useAuth(): AuthContextType {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n}\n"],"names":["error"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth utilities for cross-origin authentication
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Fetch with credentials for cross-origin requests
|
|
6
|
+
*/
|
|
7
|
+
export declare function authFetch(url: string, options?: RequestInit, withCredentials?: boolean): Promise<Response>;
|
|
8
|
+
/**
|
|
9
|
+
* Check if user is authenticated via external auth server
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkAuthStatus(authUrl: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Get current user from external auth server
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCurrentUser(authUrl: string): Promise<unknown | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Login via external auth server
|
|
18
|
+
*/
|
|
19
|
+
export declare function loginExternal(authUrl: string, credentials: unknown): Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* Logout via external auth server
|
|
22
|
+
*/
|
|
23
|
+
export declare function logoutExternal(authUrl: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Redirect to external login page
|
|
26
|
+
*/
|
|
27
|
+
export declare function redirectToLogin(authUrl: string, returnUrl?: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Open external login in popup window
|
|
30
|
+
*/
|
|
31
|
+
export declare function openLoginPopup(authUrl: string, onSuccess?: () => void): Window | null;
|
|
32
|
+
//# sourceMappingURL=auth-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-utils.d.ts","sourceRoot":"","sources":["../../../../src/components/system/auth-provider/auth-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,EAAE,eAAe,UAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWjH;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAa7E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAW3F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI,CAoBrF"}
|