@dowel-ui/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/blocks/admin-users/meta.js +27 -0
- package/dist/blocks/admin-users/meta.js.map +1 -0
- package/dist/blocks/ai-chat/meta.js +30 -0
- package/dist/blocks/ai-chat/meta.js.map +1 -0
- package/dist/blocks/dashboard/meta.js +23 -0
- package/dist/blocks/dashboard/meta.js.map +1 -0
- package/dist/blocks/forgot-password/meta.js +24 -0
- package/dist/blocks/forgot-password/meta.js.map +1 -0
- package/dist/blocks/login/meta.js +26 -0
- package/dist/blocks/login/meta.js.map +1 -0
- package/dist/blocks/pricing/meta.js +24 -0
- package/dist/blocks/pricing/meta.js.map +1 -0
- package/dist/blocks/settings/meta.js +29 -0
- package/dist/blocks/settings/meta.js.map +1 -0
- package/dist/blocks/signup/meta.js +25 -0
- package/dist/blocks/signup/meta.js.map +1 -0
- package/dist/components/accordion/accordion.d.ts +19 -0
- package/dist/components/accordion/accordion.d.ts.map +1 -0
- package/dist/components/accordion/accordion.js +58 -0
- package/dist/components/accordion/accordion.js.map +1 -0
- package/dist/components/accordion/index.d.ts +2 -0
- package/dist/components/accordion/index.js +2 -0
- package/dist/components/accordion/meta.js +17 -0
- package/dist/components/accordion/meta.js.map +1 -0
- package/dist/components/activity-feed/activity-feed.d.ts +39 -0
- package/dist/components/activity-feed/activity-feed.d.ts.map +1 -0
- package/dist/components/activity-feed/activity-feed.js +77 -0
- package/dist/components/activity-feed/activity-feed.js.map +1 -0
- package/dist/components/activity-feed/index.d.ts +2 -0
- package/dist/components/activity-feed/index.js +2 -0
- package/dist/components/activity-feed/meta.js +17 -0
- package/dist/components/activity-feed/meta.js.map +1 -0
- package/dist/components/ai-agent-status/ai-agent-status.d.ts +30 -0
- package/dist/components/ai-agent-status/ai-agent-status.d.ts.map +1 -0
- package/dist/components/ai-agent-status/ai-agent-status.js +43 -0
- package/dist/components/ai-agent-status/ai-agent-status.js.map +1 -0
- package/dist/components/ai-agent-status/index.d.ts +2 -0
- package/dist/components/ai-agent-status/index.js +2 -0
- package/dist/components/ai-agent-status/meta.js +17 -0
- package/dist/components/ai-agent-status/meta.js.map +1 -0
- package/dist/components/ai-conversation/ai-conversation.d.ts +45 -0
- package/dist/components/ai-conversation/ai-conversation.d.ts.map +1 -0
- package/dist/components/ai-conversation/ai-conversation.js +138 -0
- package/dist/components/ai-conversation/ai-conversation.js.map +1 -0
- package/dist/components/ai-conversation/index.d.ts +2 -0
- package/dist/components/ai-conversation/index.js +2 -0
- package/dist/components/ai-conversation/meta.js +17 -0
- package/dist/components/ai-conversation/meta.js.map +1 -0
- package/dist/components/ai-message/ai-message.d.ts +56 -0
- package/dist/components/ai-message/ai-message.d.ts.map +1 -0
- package/dist/components/ai-message/ai-message.js +90 -0
- package/dist/components/ai-message/ai-message.js.map +1 -0
- package/dist/components/ai-message/index.d.ts +2 -0
- package/dist/components/ai-message/index.js +2 -0
- package/dist/components/ai-message/meta.js +17 -0
- package/dist/components/ai-message/meta.js.map +1 -0
- package/dist/components/ai-model-selector/ai-model-selector.d.ts +42 -0
- package/dist/components/ai-model-selector/ai-model-selector.d.ts.map +1 -0
- package/dist/components/ai-model-selector/ai-model-selector.js +48 -0
- package/dist/components/ai-model-selector/ai-model-selector.js.map +1 -0
- package/dist/components/ai-model-selector/index.d.ts +2 -0
- package/dist/components/ai-model-selector/index.js +2 -0
- package/dist/components/ai-model-selector/meta.js +17 -0
- package/dist/components/ai-model-selector/meta.js.map +1 -0
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts +61 -0
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -0
- package/dist/components/ai-prompt-input/ai-prompt-input.js +170 -0
- package/dist/components/ai-prompt-input/ai-prompt-input.js.map +1 -0
- package/dist/components/ai-prompt-input/index.d.ts +2 -0
- package/dist/components/ai-prompt-input/index.js +2 -0
- package/dist/components/ai-prompt-input/meta.js +17 -0
- package/dist/components/ai-prompt-input/meta.js.map +1 -0
- package/dist/components/ai-reasoning/ai-reasoning.d.ts +24 -0
- package/dist/components/ai-reasoning/ai-reasoning.d.ts.map +1 -0
- package/dist/components/ai-reasoning/ai-reasoning.js +64 -0
- package/dist/components/ai-reasoning/ai-reasoning.js.map +1 -0
- package/dist/components/ai-reasoning/index.d.ts +2 -0
- package/dist/components/ai-reasoning/index.js +2 -0
- package/dist/components/ai-reasoning/meta.js +17 -0
- package/dist/components/ai-reasoning/meta.js.map +1 -0
- package/dist/components/ai-response/ai-response.d.ts +36 -0
- package/dist/components/ai-response/ai-response.d.ts.map +1 -0
- package/dist/components/ai-response/ai-response.js +46 -0
- package/dist/components/ai-response/ai-response.js.map +1 -0
- package/dist/components/ai-response/index.d.ts +2 -0
- package/dist/components/ai-response/index.js +2 -0
- package/dist/components/ai-response/meta.js +17 -0
- package/dist/components/ai-response/meta.js.map +1 -0
- package/dist/components/ai-sources/ai-sources.d.ts +44 -0
- package/dist/components/ai-sources/ai-sources.d.ts.map +1 -0
- package/dist/components/ai-sources/ai-sources.js +112 -0
- package/dist/components/ai-sources/ai-sources.js.map +1 -0
- package/dist/components/ai-sources/index.d.ts +2 -0
- package/dist/components/ai-sources/index.js +2 -0
- package/dist/components/ai-sources/meta.js +17 -0
- package/dist/components/ai-sources/meta.js.map +1 -0
- package/dist/components/ai-token-usage/ai-token-usage.d.ts +34 -0
- package/dist/components/ai-token-usage/ai-token-usage.d.ts.map +1 -0
- package/dist/components/ai-token-usage/ai-token-usage.js +58 -0
- package/dist/components/ai-token-usage/ai-token-usage.js.map +1 -0
- package/dist/components/ai-token-usage/index.d.ts +2 -0
- package/dist/components/ai-token-usage/index.js +2 -0
- package/dist/components/ai-token-usage/meta.js +17 -0
- package/dist/components/ai-token-usage/meta.js.map +1 -0
- package/dist/components/ai-tool/ai-tool.d.ts +50 -0
- package/dist/components/ai-tool/ai-tool.d.ts.map +1 -0
- package/dist/components/ai-tool/ai-tool.js +129 -0
- package/dist/components/ai-tool/ai-tool.js.map +1 -0
- package/dist/components/ai-tool/index.d.ts +2 -0
- package/dist/components/ai-tool/index.js +2 -0
- package/dist/components/ai-tool/meta.js +17 -0
- package/dist/components/ai-tool/meta.js.map +1 -0
- package/dist/components/alert/alert.d.ts +32 -0
- package/dist/components/alert/alert.d.ts.map +1 -0
- package/dist/components/alert/alert.js +49 -0
- package/dist/components/alert/alert.js.map +1 -0
- package/dist/components/alert/index.d.ts +2 -0
- package/dist/components/alert/index.js +2 -0
- package/dist/components/alert/meta.js +17 -0
- package/dist/components/alert/meta.js.map +1 -0
- package/dist/components/avatar/avatar.d.ts +23 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -0
- package/dist/components/avatar/avatar.js +44 -0
- package/dist/components/avatar/avatar.js.map +1 -0
- package/dist/components/avatar/index.d.ts +2 -0
- package/dist/components/avatar/index.js +2 -0
- package/dist/components/avatar/meta.js +17 -0
- package/dist/components/avatar/meta.js.map +1 -0
- package/dist/components/badge/badge.d.ts +20 -0
- package/dist/components/badge/badge.d.ts.map +1 -0
- package/dist/components/badge/badge.js +47 -0
- package/dist/components/badge/badge.js.map +1 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/badge/meta.js +17 -0
- package/dist/components/badge/meta.js.map +1 -0
- package/dist/components/button/button.d.ts +28 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/button.js +77 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/button/index.js +2 -0
- package/dist/components/button/meta.js +17 -0
- package/dist/components/button/meta.js.map +1 -0
- package/dist/components/calendar/calendar.d.ts +16 -0
- package/dist/components/calendar/calendar.d.ts.map +1 -0
- package/dist/components/calendar/calendar.js +70 -0
- package/dist/components/calendar/calendar.js.map +1 -0
- package/dist/components/calendar/index.d.ts +2 -0
- package/dist/components/calendar/index.js +2 -0
- package/dist/components/calendar/meta.js +17 -0
- package/dist/components/calendar/meta.js.map +1 -0
- package/dist/components/card/card.d.ts +23 -0
- package/dist/components/card/card.d.ts.map +1 -0
- package/dist/components/card/card.js +53 -0
- package/dist/components/card/card.js.map +1 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +2 -0
- package/dist/components/card/meta.js +17 -0
- package/dist/components/card/meta.js.map +1 -0
- package/dist/components/checkbox/checkbox.d.ts +15 -0
- package/dist/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox.js +45 -0
- package/dist/components/checkbox/checkbox.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +2 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/checkbox/meta.js +17 -0
- package/dist/components/checkbox/meta.js.map +1 -0
- package/dist/components/code-block/code-block.d.ts +46 -0
- package/dist/components/code-block/code-block.d.ts.map +1 -0
- package/dist/components/code-block/code-block.js +110 -0
- package/dist/components/code-block/code-block.js.map +1 -0
- package/dist/components/code-block/index.d.ts +2 -0
- package/dist/components/code-block/index.js +2 -0
- package/dist/components/code-block/meta.js +17 -0
- package/dist/components/code-block/meta.js.map +1 -0
- package/dist/components/combobox/combobox.d.ts +59 -0
- package/dist/components/combobox/combobox.d.ts.map +1 -0
- package/dist/components/combobox/combobox.js +346 -0
- package/dist/components/combobox/combobox.js.map +1 -0
- package/dist/components/combobox/index.d.ts +2 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/combobox/meta.js +17 -0
- package/dist/components/combobox/meta.js.map +1 -0
- package/dist/components/command/command.d.ts +65 -0
- package/dist/components/command/command.d.ts.map +1 -0
- package/dist/components/command/command.js +330 -0
- package/dist/components/command/command.js.map +1 -0
- package/dist/components/command/index.d.ts +2 -0
- package/dist/components/command/index.js +2 -0
- package/dist/components/command/meta.js +17 -0
- package/dist/components/command/meta.js.map +1 -0
- package/dist/components/data-table/data-table.d.ts +91 -0
- package/dist/components/data-table/data-table.d.ts.map +1 -0
- package/dist/components/data-table/data-table.js +263 -0
- package/dist/components/data-table/data-table.js.map +1 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/data-table/index.js +2 -0
- package/dist/components/data-table/meta.js +22 -0
- package/dist/components/data-table/meta.js.map +1 -0
- package/dist/components/date-picker/date-picker.d.ts +31 -0
- package/dist/components/date-picker/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker/date-picker.js +123 -0
- package/dist/components/date-picker/date-picker.js.map +1 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/date-picker/meta.js +21 -0
- package/dist/components/date-picker/meta.js.map +1 -0
- package/dist/components/dialog/dialog.d.ts +30 -0
- package/dist/components/dialog/dialog.d.ts.map +1 -0
- package/dist/components/dialog/dialog.js +79 -0
- package/dist/components/dialog/dialog.js.map +1 -0
- package/dist/components/dialog/index.d.ts +2 -0
- package/dist/components/dialog/index.js +2 -0
- package/dist/components/dialog/meta.js +17 -0
- package/dist/components/dialog/meta.js.map +1 -0
- package/dist/components/drawer/drawer.d.ts +32 -0
- package/dist/components/drawer/drawer.d.ts.map +1 -0
- package/dist/components/drawer/drawer.js +153 -0
- package/dist/components/drawer/drawer.js.map +1 -0
- package/dist/components/drawer/index.d.ts +2 -0
- package/dist/components/drawer/index.js +2 -0
- package/dist/components/drawer/meta.js +17 -0
- package/dist/components/drawer/meta.js.map +1 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +43 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu/dropdown-menu.js +130 -0
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -0
- package/dist/components/dropdown-menu/index.d.ts +2 -0
- package/dist/components/dropdown-menu/index.js +2 -0
- package/dist/components/dropdown-menu/meta.js +17 -0
- package/dist/components/dropdown-menu/meta.js.map +1 -0
- package/dist/components/empty-state/empty-state.d.ts +24 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.js +73 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/index.d.ts +2 -0
- package/dist/components/empty-state/index.js +2 -0
- package/dist/components/empty-state/meta.js +17 -0
- package/dist/components/empty-state/meta.js.map +1 -0
- package/dist/components/form/form.d.ts +43 -0
- package/dist/components/form/form.d.ts.map +1 -0
- package/dist/components/form/form.js +127 -0
- package/dist/components/form/form.js.map +1 -0
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.js +2 -0
- package/dist/components/form/meta.js +17 -0
- package/dist/components/form/meta.js.map +1 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/index.js +2 -0
- package/dist/components/input/input.d.ts +21 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/input/input.js +34 -0
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/input/meta.js +17 -0
- package/dist/components/input/meta.js.map +1 -0
- package/dist/components/label/index.d.ts +2 -0
- package/dist/components/label/index.js +2 -0
- package/dist/components/label/label.d.ts +14 -0
- package/dist/components/label/label.d.ts.map +1 -0
- package/dist/components/label/label.js +20 -0
- package/dist/components/label/label.js.map +1 -0
- package/dist/components/label/meta.js +17 -0
- package/dist/components/label/meta.js.map +1 -0
- package/dist/components/pagination/index.d.ts +2 -0
- package/dist/components/pagination/index.js +2 -0
- package/dist/components/pagination/meta.js +17 -0
- package/dist/components/pagination/meta.js.map +1 -0
- package/dist/components/pagination/pagination.d.ts +33 -0
- package/dist/components/pagination/pagination.d.ts.map +1 -0
- package/dist/components/pagination/pagination.js +143 -0
- package/dist/components/pagination/pagination.js.map +1 -0
- package/dist/components/popover/index.d.ts +2 -0
- package/dist/components/popover/index.js +2 -0
- package/dist/components/popover/meta.js +17 -0
- package/dist/components/popover/meta.js.map +1 -0
- package/dist/components/popover/popover.d.ts +24 -0
- package/dist/components/popover/popover.d.ts.map +1 -0
- package/dist/components/popover/popover.js +60 -0
- package/dist/components/popover/popover.js.map +1 -0
- package/dist/components/progress/index.d.ts +2 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/progress/meta.js +17 -0
- package/dist/components/progress/meta.js.map +1 -0
- package/dist/components/progress/progress.d.ts +21 -0
- package/dist/components/progress/progress.d.ts.map +1 -0
- package/dist/components/progress/progress.js +55 -0
- package/dist/components/progress/progress.js.map +1 -0
- package/dist/components/radio-group/index.d.ts +2 -0
- package/dist/components/radio-group/index.js +2 -0
- package/dist/components/radio-group/meta.js +17 -0
- package/dist/components/radio-group/meta.js.map +1 -0
- package/dist/components/radio-group/radio-group.d.ts +17 -0
- package/dist/components/radio-group/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group/radio-group.js +29 -0
- package/dist/components/radio-group/radio-group.js.map +1 -0
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/select/meta.js +17 -0
- package/dist/components/select/meta.js.map +1 -0
- package/dist/components/select/select.d.ts +37 -0
- package/dist/components/select/select.d.ts.map +1 -0
- package/dist/components/select/select.js +128 -0
- package/dist/components/select/select.js.map +1 -0
- package/dist/components/separator/index.d.ts +2 -0
- package/dist/components/separator/index.js +2 -0
- package/dist/components/separator/meta.js +17 -0
- package/dist/components/separator/meta.js.map +1 -0
- package/dist/components/separator/separator.d.ts +15 -0
- package/dist/components/separator/separator.d.ts.map +1 -0
- package/dist/components/separator/separator.js +23 -0
- package/dist/components/separator/separator.js.map +1 -0
- package/dist/components/sheet/index.d.ts +2 -0
- package/dist/components/sheet/index.js +2 -0
- package/dist/components/sheet/meta.js +17 -0
- package/dist/components/sheet/meta.js.map +1 -0
- package/dist/components/sheet/sheet.d.ts +31 -0
- package/dist/components/sheet/sheet.d.ts.map +1 -0
- package/dist/components/sheet/sheet.js +90 -0
- package/dist/components/sheet/sheet.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +2 -0
- package/dist/components/skeleton/index.js +2 -0
- package/dist/components/skeleton/meta.js +17 -0
- package/dist/components/skeleton/meta.js.map +1 -0
- package/dist/components/skeleton/skeleton.d.ts +20 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +29 -0
- package/dist/components/skeleton/skeleton.js.map +1 -0
- package/dist/components/slider/index.d.ts +2 -0
- package/dist/components/slider/index.js +2 -0
- package/dist/components/slider/meta.js +17 -0
- package/dist/components/slider/meta.js.map +1 -0
- package/dist/components/slider/slider.d.ts +29 -0
- package/dist/components/slider/slider.d.ts.map +1 -0
- package/dist/components/slider/slider.js +61 -0
- package/dist/components/slider/slider.js.map +1 -0
- package/dist/components/spinner/index.d.ts +2 -0
- package/dist/components/spinner/index.js +2 -0
- package/dist/components/spinner/meta.js +17 -0
- package/dist/components/spinner/meta.js.map +1 -0
- package/dist/components/spinner/spinner.d.ts +21 -0
- package/dist/components/spinner/spinner.d.ts.map +1 -0
- package/dist/components/spinner/spinner.js +45 -0
- package/dist/components/spinner/spinner.js.map +1 -0
- package/dist/components/switch/index.d.ts +2 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/switch/meta.js +17 -0
- package/dist/components/switch/meta.js.map +1 -0
- package/dist/components/switch/switch.d.ts +15 -0
- package/dist/components/switch/switch.d.ts.map +1 -0
- package/dist/components/switch/switch.js +21 -0
- package/dist/components/switch/switch.js.map +1 -0
- package/dist/components/table/index.d.ts +2 -0
- package/dist/components/table/index.js +2 -0
- package/dist/components/table/meta.js +17 -0
- package/dist/components/table/meta.js.map +1 -0
- package/dist/components/table/table.d.ts +41 -0
- package/dist/components/table/table.d.ts.map +1 -0
- package/dist/components/table/table.js +78 -0
- package/dist/components/table/table.js.map +1 -0
- package/dist/components/tabs/index.d.ts +2 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/tabs/meta.js +17 -0
- package/dist/components/tabs/meta.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +28 -0
- package/dist/components/tabs/tabs.d.ts.map +1 -0
- package/dist/components/tabs/tabs.js +58 -0
- package/dist/components/tabs/tabs.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +3 -0
- package/dist/components/toast/meta.js +17 -0
- package/dist/components/toast/meta.js.map +1 -0
- package/dist/components/toast/toast-store.d.ts +84 -0
- package/dist/components/toast/toast-store.d.ts.map +1 -0
- package/dist/components/toast/toast-store.js +115 -0
- package/dist/components/toast/toast-store.js.map +1 -0
- package/dist/components/toast/toast.d.ts +39 -0
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +140 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/meta.js +17 -0
- package/dist/components/tooltip/meta.js.map +1 -0
- package/dist/components/tooltip/tooltip.d.ts +24 -0
- package/dist/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.js +38 -0
- package/dist/components/tooltip/tooltip.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.js +51 -0
- package/dist/lib/styles.d.ts +21 -0
- package/dist/lib/styles.d.ts.map +1 -0
- package/dist/lib/styles.js +22 -0
- package/dist/lib/styles.js.map +1 -0
- package/dist/lib/utils.d.ts +11 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +21 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/registry/blocks.d.ts +15 -0
- package/dist/registry/blocks.d.ts.map +1 -0
- package/dist/registry/blocks.js +32 -0
- package/dist/registry/blocks.js.map +1 -0
- package/dist/registry/components.d.ts +18 -0
- package/dist/registry/components.d.ts.map +1 -0
- package/dist/registry/components.js +112 -0
- package/dist/registry/components.js.map +1 -0
- package/dist/registry/schema.d.ts +44 -0
- package/dist/registry/schema.d.ts.map +1 -0
- package/dist/registry/schema.js +33 -0
- package/dist/registry/schema.js.map +1 -0
- package/package.json +74 -0
- package/src/blocks/admin-users/admin-users.stories.tsx +83 -0
- package/src/blocks/admin-users/admin-users.test.tsx +159 -0
- package/src/blocks/admin-users/admin-users.tsx +251 -0
- package/src/blocks/admin-users/index.ts +1 -0
- package/src/blocks/admin-users/meta.ts +27 -0
- package/src/blocks/ai-chat/ai-chat.stories.tsx +149 -0
- package/src/blocks/ai-chat/ai-chat.test.tsx +166 -0
- package/src/blocks/ai-chat/ai-chat.tsx +280 -0
- package/src/blocks/ai-chat/index.ts +7 -0
- package/src/blocks/ai-chat/meta.ts +32 -0
- package/src/blocks/dashboard/dashboard.stories.tsx +106 -0
- package/src/blocks/dashboard/dashboard.test.tsx +94 -0
- package/src/blocks/dashboard/dashboard.tsx +192 -0
- package/src/blocks/dashboard/index.ts +6 -0
- package/src/blocks/dashboard/meta.ts +18 -0
- package/src/blocks/forgot-password/forgot-password.stories.tsx +41 -0
- package/src/blocks/forgot-password/forgot-password.test.tsx +62 -0
- package/src/blocks/forgot-password/forgot-password.tsx +158 -0
- package/src/blocks/forgot-password/index.ts +1 -0
- package/src/blocks/forgot-password/meta.ts +18 -0
- package/src/blocks/login/index.ts +1 -0
- package/src/blocks/login/login.stories.tsx +46 -0
- package/src/blocks/login/login.test.tsx +100 -0
- package/src/blocks/login/login.tsx +178 -0
- package/src/blocks/login/meta.ts +18 -0
- package/src/blocks/pricing/index.ts +1 -0
- package/src/blocks/pricing/meta.ts +18 -0
- package/src/blocks/pricing/pricing.stories.tsx +62 -0
- package/src/blocks/pricing/pricing.test.tsx +101 -0
- package/src/blocks/pricing/pricing.tsx +176 -0
- package/src/blocks/settings/index.ts +6 -0
- package/src/blocks/settings/meta.ts +29 -0
- package/src/blocks/settings/settings.stories.tsx +94 -0
- package/src/blocks/settings/settings.test.tsx +167 -0
- package/src/blocks/settings/settings.tsx +317 -0
- package/src/blocks/signup/index.ts +1 -0
- package/src/blocks/signup/meta.ts +18 -0
- package/src/blocks/signup/signup.stories.tsx +27 -0
- package/src/blocks/signup/signup.test.tsx +97 -0
- package/src/blocks/signup/signup.tsx +240 -0
- package/src/components/accordion/accordion.stories.tsx +90 -0
- package/src/components/accordion/accordion.test.tsx +156 -0
- package/src/components/accordion/accordion.tsx +88 -0
- package/src/components/accordion/index.ts +9 -0
- package/src/components/accordion/meta.ts +16 -0
- package/src/components/activity-feed/activity-feed.stories.tsx +163 -0
- package/src/components/activity-feed/activity-feed.test.tsx +125 -0
- package/src/components/activity-feed/activity-feed.tsx +115 -0
- package/src/components/activity-feed/index.ts +12 -0
- package/src/components/activity-feed/meta.ts +17 -0
- package/src/components/ai-agent-status/ai-agent-status.stories.tsx +86 -0
- package/src/components/ai-agent-status/ai-agent-status.test.tsx +66 -0
- package/src/components/ai-agent-status/ai-agent-status.tsx +88 -0
- package/src/components/ai-agent-status/index.ts +6 -0
- package/src/components/ai-agent-status/meta.ts +17 -0
- package/src/components/ai-conversation/ai-conversation.stories.tsx +126 -0
- package/src/components/ai-conversation/ai-conversation.test.tsx +144 -0
- package/src/components/ai-conversation/ai-conversation.tsx +229 -0
- package/src/components/ai-conversation/index.ts +9 -0
- package/src/components/ai-conversation/meta.ts +20 -0
- package/src/components/ai-message/ai-message.stories.tsx +106 -0
- package/src/components/ai-message/ai-message.test.tsx +160 -0
- package/src/components/ai-message/ai-message.tsx +162 -0
- package/src/components/ai-message/index.ts +13 -0
- package/src/components/ai-message/meta.ts +17 -0
- package/src/components/ai-model-selector/ai-model-selector.stories.tsx +66 -0
- package/src/components/ai-model-selector/ai-model-selector.test.tsx +120 -0
- package/src/components/ai-model-selector/ai-model-selector.tsx +112 -0
- package/src/components/ai-model-selector/index.ts +1 -0
- package/src/components/ai-model-selector/meta.ts +17 -0
- package/src/components/ai-prompt-input/ai-prompt-input.stories.tsx +145 -0
- package/src/components/ai-prompt-input/ai-prompt-input.test.tsx +273 -0
- package/src/components/ai-prompt-input/ai-prompt-input.tsx +306 -0
- package/src/components/ai-prompt-input/index.ts +11 -0
- package/src/components/ai-prompt-input/meta.ts +18 -0
- package/src/components/ai-reasoning/ai-reasoning.stories.tsx +60 -0
- package/src/components/ai-reasoning/ai-reasoning.test.tsx +95 -0
- package/src/components/ai-reasoning/ai-reasoning.tsx +106 -0
- package/src/components/ai-reasoning/index.ts +7 -0
- package/src/components/ai-reasoning/meta.ts +17 -0
- package/src/components/ai-response/ai-response.stories.tsx +75 -0
- package/src/components/ai-response/ai-response.test.tsx +96 -0
- package/src/components/ai-response/ai-response.tsx +95 -0
- package/src/components/ai-response/index.ts +7 -0
- package/src/components/ai-response/meta.ts +17 -0
- package/src/components/ai-sources/ai-sources.stories.tsx +93 -0
- package/src/components/ai-sources/ai-sources.test.tsx +102 -0
- package/src/components/ai-sources/ai-sources.tsx +186 -0
- package/src/components/ai-sources/index.ts +11 -0
- package/src/components/ai-sources/meta.ts +17 -0
- package/src/components/ai-token-usage/ai-token-usage.stories.tsx +59 -0
- package/src/components/ai-token-usage/ai-token-usage.test.tsx +83 -0
- package/src/components/ai-token-usage/ai-token-usage.tsx +105 -0
- package/src/components/ai-token-usage/index.ts +6 -0
- package/src/components/ai-token-usage/meta.ts +16 -0
- package/src/components/ai-tool/ai-tool.stories.tsx +96 -0
- package/src/components/ai-tool/ai-tool.test.tsx +137 -0
- package/src/components/ai-tool/ai-tool.tsx +235 -0
- package/src/components/ai-tool/index.ts +13 -0
- package/src/components/ai-tool/meta.ts +17 -0
- package/src/components/alert/alert.stories.tsx +101 -0
- package/src/components/alert/alert.test.tsx +94 -0
- package/src/components/alert/alert.tsx +89 -0
- package/src/components/alert/index.ts +8 -0
- package/src/components/alert/meta.ts +16 -0
- package/src/components/avatar/avatar.stories.tsx +58 -0
- package/src/components/avatar/avatar.test.tsx +64 -0
- package/src/components/avatar/avatar.tsx +68 -0
- package/src/components/avatar/index.ts +9 -0
- package/src/components/avatar/meta.ts +15 -0
- package/src/components/badge/badge.stories.tsx +68 -0
- package/src/components/badge/badge.test.tsx +61 -0
- package/src/components/badge/badge.tsx +54 -0
- package/src/components/badge/index.ts +1 -0
- package/src/components/badge/meta.ts +15 -0
- package/src/components/button/button.stories.tsx +128 -0
- package/src/components/button/button.test.tsx +224 -0
- package/src/components/button/button.tsx +114 -0
- package/src/components/button/index.ts +1 -0
- package/src/components/button/meta.ts +16 -0
- package/src/components/calendar/calendar.stories.tsx +105 -0
- package/src/components/calendar/calendar.test.tsx +255 -0
- package/src/components/calendar/calendar.tsx +115 -0
- package/src/components/calendar/index.ts +1 -0
- package/src/components/calendar/meta.ts +17 -0
- package/src/components/card/card.stories.tsx +61 -0
- package/src/components/card/card.test.tsx +66 -0
- package/src/components/card/card.tsx +81 -0
- package/src/components/card/index.ts +9 -0
- package/src/components/card/meta.ts +16 -0
- package/src/components/checkbox/checkbox.stories.tsx +124 -0
- package/src/components/checkbox/checkbox.test.tsx +121 -0
- package/src/components/checkbox/checkbox.tsx +66 -0
- package/src/components/checkbox/index.ts +1 -0
- package/src/components/checkbox/meta.ts +16 -0
- package/src/components/code-block/code-block.stories.tsx +62 -0
- package/src/components/code-block/code-block.test.tsx +139 -0
- package/src/components/code-block/code-block.tsx +188 -0
- package/src/components/code-block/index.ts +1 -0
- package/src/components/code-block/meta.ts +17 -0
- package/src/components/combobox/combobox.stories.tsx +171 -0
- package/src/components/combobox/combobox.test.tsx +429 -0
- package/src/components/combobox/combobox.tsx +544 -0
- package/src/components/combobox/index.ts +15 -0
- package/src/components/combobox/meta.ts +17 -0
- package/src/components/command/command.stories.tsx +152 -0
- package/src/components/command/command.test.tsx +380 -0
- package/src/components/command/command.tsx +482 -0
- package/src/components/command/index.ts +17 -0
- package/src/components/command/meta.ts +18 -0
- package/src/components/data-table/data-table.stories.tsx +151 -0
- package/src/components/data-table/data-table.test.tsx +288 -0
- package/src/components/data-table/data-table.tsx +485 -0
- package/src/components/data-table/index.ts +13 -0
- package/src/components/data-table/meta.ts +19 -0
- package/src/components/date-picker/date-picker.stories.tsx +103 -0
- package/src/components/date-picker/date-picker.test.tsx +205 -0
- package/src/components/date-picker/date-picker.tsx +198 -0
- package/src/components/date-picker/index.ts +6 -0
- package/src/components/date-picker/meta.ts +18 -0
- package/src/components/dialog/dialog.stories.tsx +140 -0
- package/src/components/dialog/dialog.test.tsx +186 -0
- package/src/components/dialog/dialog.tsx +132 -0
- package/src/components/dialog/index.ts +16 -0
- package/src/components/dialog/meta.ts +16 -0
- package/src/components/drawer/drawer.stories.tsx +111 -0
- package/src/components/drawer/drawer.test.tsx +187 -0
- package/src/components/drawer/drawer.tsx +293 -0
- package/src/components/drawer/index.ts +16 -0
- package/src/components/drawer/meta.ts +16 -0
- package/src/components/dropdown-menu/dropdown-menu.stories.tsx +128 -0
- package/src/components/dropdown-menu/dropdown-menu.test.tsx +321 -0
- package/src/components/dropdown-menu/dropdown-menu.tsx +242 -0
- package/src/components/dropdown-menu/index.ts +21 -0
- package/src/components/dropdown-menu/meta.ts +17 -0
- package/src/components/empty-state/empty-state.stories.tsx +70 -0
- package/src/components/empty-state/empty-state.test.tsx +97 -0
- package/src/components/empty-state/empty-state.tsx +92 -0
- package/src/components/empty-state/index.ts +9 -0
- package/src/components/empty-state/meta.ts +16 -0
- package/src/components/form/form.stories.tsx +144 -0
- package/src/components/form/form.test.tsx +203 -0
- package/src/components/form/form.tsx +221 -0
- package/src/components/form/index.ts +13 -0
- package/src/components/form/meta.ts +17 -0
- package/src/components/input/index.ts +1 -0
- package/src/components/input/input.stories.tsx +84 -0
- package/src/components/input/input.test.tsx +108 -0
- package/src/components/input/input.tsx +51 -0
- package/src/components/input/meta.ts +15 -0
- package/src/components/label/index.ts +1 -0
- package/src/components/label/label.stories.tsx +51 -0
- package/src/components/label/label.test.tsx +55 -0
- package/src/components/label/label.tsx +26 -0
- package/src/components/label/meta.ts +15 -0
- package/src/components/pagination/index.ts +10 -0
- package/src/components/pagination/meta.ts +17 -0
- package/src/components/pagination/pagination.stories.tsx +129 -0
- package/src/components/pagination/pagination.test.tsx +119 -0
- package/src/components/pagination/pagination.tsx +142 -0
- package/src/components/popover/index.ts +9 -0
- package/src/components/popover/meta.ts +18 -0
- package/src/components/popover/popover.stories.tsx +84 -0
- package/src/components/popover/popover.test.tsx +163 -0
- package/src/components/popover/popover.tsx +89 -0
- package/src/components/progress/index.ts +1 -0
- package/src/components/progress/meta.ts +17 -0
- package/src/components/progress/progress.stories.tsx +90 -0
- package/src/components/progress/progress.test.tsx +78 -0
- package/src/components/progress/progress.tsx +70 -0
- package/src/components/radio-group/index.ts +6 -0
- package/src/components/radio-group/meta.ts +16 -0
- package/src/components/radio-group/radio-group.stories.tsx +102 -0
- package/src/components/radio-group/radio-group.test.tsx +152 -0
- package/src/components/radio-group/radio-group.tsx +53 -0
- package/src/components/select/index.ts +14 -0
- package/src/components/select/meta.ts +16 -0
- package/src/components/select/select.stories.tsx +137 -0
- package/src/components/select/select.test.tsx +209 -0
- package/src/components/select/select.tsx +222 -0
- package/src/components/separator/index.ts +1 -0
- package/src/components/separator/meta.ts +15 -0
- package/src/components/separator/separator.stories.tsx +42 -0
- package/src/components/separator/separator.test.tsx +46 -0
- package/src/components/separator/separator.tsx +33 -0
- package/src/components/sheet/index.ts +14 -0
- package/src/components/sheet/meta.ts +16 -0
- package/src/components/sheet/sheet.stories.tsx +107 -0
- package/src/components/sheet/sheet.test.tsx +152 -0
- package/src/components/sheet/sheet.tsx +160 -0
- package/src/components/skeleton/index.ts +1 -0
- package/src/components/skeleton/meta.ts +15 -0
- package/src/components/skeleton/skeleton.stories.tsx +46 -0
- package/src/components/skeleton/skeleton.test.tsx +57 -0
- package/src/components/skeleton/skeleton.tsx +28 -0
- package/src/components/slider/index.ts +1 -0
- package/src/components/slider/meta.ts +19 -0
- package/src/components/slider/slider.stories.tsx +87 -0
- package/src/components/slider/slider.test.tsx +148 -0
- package/src/components/slider/slider.tsx +135 -0
- package/src/components/spinner/index.ts +1 -0
- package/src/components/spinner/meta.ts +15 -0
- package/src/components/spinner/spinner.stories.tsx +47 -0
- package/src/components/spinner/spinner.test.tsx +41 -0
- package/src/components/spinner/spinner.tsx +68 -0
- package/src/components/switch/index.ts +1 -0
- package/src/components/switch/meta.ts +15 -0
- package/src/components/switch/switch.stories.tsx +70 -0
- package/src/components/switch/switch.test.tsx +101 -0
- package/src/components/switch/switch.tsx +42 -0
- package/src/components/table/index.ts +11 -0
- package/src/components/table/meta.ts +17 -0
- package/src/components/table/table.stories.tsx +131 -0
- package/src/components/table/table.test.tsx +153 -0
- package/src/components/table/table.tsx +138 -0
- package/src/components/tabs/index.ts +11 -0
- package/src/components/tabs/meta.ts +17 -0
- package/src/components/tabs/tabs.stories.tsx +139 -0
- package/src/components/tabs/tabs.test.tsx +148 -0
- package/src/components/tabs/tabs.tsx +106 -0
- package/src/components/toast/index.ts +24 -0
- package/src/components/toast/meta.ts +18 -0
- package/src/components/toast/toast-store.ts +181 -0
- package/src/components/toast/toast.stories.tsx +167 -0
- package/src/components/toast/toast.test.tsx +306 -0
- package/src/components/toast/toast.tsx +241 -0
- package/src/components/tooltip/index.ts +8 -0
- package/src/components/tooltip/meta.ts +17 -0
- package/src/components/tooltip/tooltip.stories.tsx +89 -0
- package/src/components/tooltip/tooltip.test.tsx +120 -0
- package/src/components/tooltip/tooltip.tsx +58 -0
- package/src/index.ts +50 -0
- package/src/lib/styles.ts +26 -0
- package/src/lib/utils.test.ts +32 -0
- package/src/lib/utils.ts +24 -0
- package/src/registry/blocks.ts +30 -0
- package/src/registry/components.ts +114 -0
- package/src/registry/meta.test.ts +234 -0
- package/src/registry/schema.ts +58 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/components/button";
|
|
4
|
+
import {
|
|
5
|
+
Card,
|
|
6
|
+
CardContent,
|
|
7
|
+
CardDescription,
|
|
8
|
+
CardFooter,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle,
|
|
11
|
+
} from "@/components/card";
|
|
12
|
+
import { Input } from "@/components/input";
|
|
13
|
+
import { Label } from "@/components/label";
|
|
14
|
+
|
|
15
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "./tabs";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Annotated rather than inferred with `satisfies`. These components are direct
|
|
19
|
+
* re-exports of Radix primitives, and inferring the meta type makes the emitted
|
|
20
|
+
* declaration reference Radix-internal prop types that are not nameable from
|
|
21
|
+
* this path (TS2883).
|
|
22
|
+
*/
|
|
23
|
+
const meta: Meta<typeof Tabs> = {
|
|
24
|
+
title: "Navigation/Tabs",
|
|
25
|
+
component: Tabs,
|
|
26
|
+
parameters: { controls: { disable: true } },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default meta;
|
|
30
|
+
type Story = StoryObj<typeof Tabs>;
|
|
31
|
+
|
|
32
|
+
export const Default: Story = {
|
|
33
|
+
render: () => (
|
|
34
|
+
<Tabs defaultValue="account" className="w-96">
|
|
35
|
+
<TabsList>
|
|
36
|
+
<TabsTrigger value="account">Account</TabsTrigger>
|
|
37
|
+
<TabsTrigger value="password">Password</TabsTrigger>
|
|
38
|
+
</TabsList>
|
|
39
|
+
<TabsContent value="account">
|
|
40
|
+
<Card>
|
|
41
|
+
<CardHeader>
|
|
42
|
+
<CardTitle>Account</CardTitle>
|
|
43
|
+
<CardDescription>Update your account details.</CardDescription>
|
|
44
|
+
</CardHeader>
|
|
45
|
+
<CardContent className="grid gap-2">
|
|
46
|
+
<Label htmlFor="tabs-name">Name</Label>
|
|
47
|
+
<Input id="tabs-name" defaultValue="Ada Lovelace" />
|
|
48
|
+
</CardContent>
|
|
49
|
+
<CardFooter className="justify-end">
|
|
50
|
+
<Button>Save</Button>
|
|
51
|
+
</CardFooter>
|
|
52
|
+
</Card>
|
|
53
|
+
</TabsContent>
|
|
54
|
+
<TabsContent value="password">
|
|
55
|
+
<Card>
|
|
56
|
+
<CardHeader>
|
|
57
|
+
<CardTitle>Password</CardTitle>
|
|
58
|
+
<CardDescription>Change your password here.</CardDescription>
|
|
59
|
+
</CardHeader>
|
|
60
|
+
<CardContent className="grid gap-2">
|
|
61
|
+
<Label htmlFor="tabs-password">New password</Label>
|
|
62
|
+
<Input id="tabs-password" type="password" />
|
|
63
|
+
</CardContent>
|
|
64
|
+
<CardFooter className="justify-end">
|
|
65
|
+
<Button>Update password</Button>
|
|
66
|
+
</CardFooter>
|
|
67
|
+
</Card>
|
|
68
|
+
</TabsContent>
|
|
69
|
+
</Tabs>
|
|
70
|
+
),
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const Underline: Story = {
|
|
74
|
+
render: () => (
|
|
75
|
+
<Tabs defaultValue="overview" className="w-96">
|
|
76
|
+
<TabsList variant="underline">
|
|
77
|
+
<TabsTrigger value="overview" variant="underline">
|
|
78
|
+
Overview
|
|
79
|
+
</TabsTrigger>
|
|
80
|
+
<TabsTrigger value="deployments" variant="underline">
|
|
81
|
+
Deployments
|
|
82
|
+
</TabsTrigger>
|
|
83
|
+
<TabsTrigger value="settings" variant="underline">
|
|
84
|
+
Settings
|
|
85
|
+
</TabsTrigger>
|
|
86
|
+
</TabsList>
|
|
87
|
+
<TabsContent value="overview" className="text-sm text-muted-foreground">
|
|
88
|
+
Traffic, errors and latency for the last 24 hours.
|
|
89
|
+
</TabsContent>
|
|
90
|
+
<TabsContent value="deployments" className="text-sm text-muted-foreground">
|
|
91
|
+
42 deployments this week.
|
|
92
|
+
</TabsContent>
|
|
93
|
+
<TabsContent value="settings" className="text-sm text-muted-foreground">
|
|
94
|
+
Environment variables and build settings.
|
|
95
|
+
</TabsContent>
|
|
96
|
+
</Tabs>
|
|
97
|
+
),
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const WithDisabledTab: Story = {
|
|
101
|
+
render: () => (
|
|
102
|
+
<Tabs defaultValue="general" className="w-96">
|
|
103
|
+
<TabsList>
|
|
104
|
+
<TabsTrigger value="general">General</TabsTrigger>
|
|
105
|
+
<TabsTrigger value="team">Team</TabsTrigger>
|
|
106
|
+
<TabsTrigger value="billing" disabled>
|
|
107
|
+
Billing
|
|
108
|
+
</TabsTrigger>
|
|
109
|
+
</TabsList>
|
|
110
|
+
<TabsContent value="general" className="text-sm text-muted-foreground">
|
|
111
|
+
General settings.
|
|
112
|
+
</TabsContent>
|
|
113
|
+
<TabsContent value="team" className="text-sm text-muted-foreground">
|
|
114
|
+
Invite and manage teammates.
|
|
115
|
+
</TabsContent>
|
|
116
|
+
<TabsContent value="billing" className="text-sm text-muted-foreground">
|
|
117
|
+
Upgrade to manage billing.
|
|
118
|
+
</TabsContent>
|
|
119
|
+
</Tabs>
|
|
120
|
+
),
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/** Manual activation stops arrow keys from loading each panel in passing. */
|
|
124
|
+
export const ManualActivation: Story = {
|
|
125
|
+
render: () => (
|
|
126
|
+
<Tabs defaultValue="one" activationMode="manual" className="w-96">
|
|
127
|
+
<TabsList>
|
|
128
|
+
<TabsTrigger value="one">Expensive one</TabsTrigger>
|
|
129
|
+
<TabsTrigger value="two">Expensive two</TabsTrigger>
|
|
130
|
+
</TabsList>
|
|
131
|
+
<TabsContent value="one" className="text-sm text-muted-foreground">
|
|
132
|
+
Arrow to the next tab, then press Enter or Space to load it.
|
|
133
|
+
</TabsContent>
|
|
134
|
+
<TabsContent value="two" className="text-sm text-muted-foreground">
|
|
135
|
+
Loaded on purpose, not in passing.
|
|
136
|
+
</TabsContent>
|
|
137
|
+
</Tabs>
|
|
138
|
+
),
|
|
139
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import userEvent from "@testing-library/user-event";
|
|
3
|
+
import { describe, expect, it, vi } from "vitest";
|
|
4
|
+
|
|
5
|
+
import { expectNoA11yViolations } from "../../../test/a11y";
|
|
6
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger, type TabsListProps } from "./tabs";
|
|
7
|
+
|
|
8
|
+
function Example({
|
|
9
|
+
variant,
|
|
10
|
+
onValueChange,
|
|
11
|
+
activationMode,
|
|
12
|
+
}: {
|
|
13
|
+
variant?: TabsListProps["variant"];
|
|
14
|
+
onValueChange?: (value: string) => void;
|
|
15
|
+
activationMode?: "automatic" | "manual";
|
|
16
|
+
} = {}) {
|
|
17
|
+
return (
|
|
18
|
+
<Tabs defaultValue="account" onValueChange={onValueChange} activationMode={activationMode}>
|
|
19
|
+
<TabsList variant={variant}>
|
|
20
|
+
<TabsTrigger value="account" variant={variant}>
|
|
21
|
+
Account
|
|
22
|
+
</TabsTrigger>
|
|
23
|
+
<TabsTrigger value="password" variant={variant}>
|
|
24
|
+
Password
|
|
25
|
+
</TabsTrigger>
|
|
26
|
+
<TabsTrigger value="team" variant={variant} disabled>
|
|
27
|
+
Team
|
|
28
|
+
</TabsTrigger>
|
|
29
|
+
</TabsList>
|
|
30
|
+
<TabsContent value="account">Account panel</TabsContent>
|
|
31
|
+
<TabsContent value="password">Password panel</TabsContent>
|
|
32
|
+
<TabsContent value="team">Team panel</TabsContent>
|
|
33
|
+
</Tabs>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe("Tabs", () => {
|
|
38
|
+
it("shows only the active panel", () => {
|
|
39
|
+
render(<Example />);
|
|
40
|
+
expect(screen.getByText("Account panel")).toBeInTheDocument();
|
|
41
|
+
expect(screen.queryByText("Password panel")).not.toBeInTheDocument();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("marks the active tab as selected", () => {
|
|
45
|
+
render(<Example />);
|
|
46
|
+
expect(screen.getByRole("tab", { name: "Account" })).toHaveAttribute(
|
|
47
|
+
"aria-selected",
|
|
48
|
+
"true",
|
|
49
|
+
);
|
|
50
|
+
expect(screen.getByRole("tab", { name: "Password" })).toHaveAttribute(
|
|
51
|
+
"aria-selected",
|
|
52
|
+
"false",
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("switches panels on click", async () => {
|
|
57
|
+
const user = userEvent.setup();
|
|
58
|
+
render(<Example />);
|
|
59
|
+
|
|
60
|
+
await user.click(screen.getByRole("tab", { name: "Password" }));
|
|
61
|
+
expect(screen.getByText("Password panel")).toBeInTheDocument();
|
|
62
|
+
expect(screen.queryByText("Account panel")).not.toBeInTheDocument();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("moves between tabs with the arrow keys", async () => {
|
|
66
|
+
const user = userEvent.setup();
|
|
67
|
+
render(<Example />);
|
|
68
|
+
|
|
69
|
+
await user.click(screen.getByRole("tab", { name: "Account" }));
|
|
70
|
+
await user.keyboard("{ArrowRight}");
|
|
71
|
+
|
|
72
|
+
expect(screen.getByRole("tab", { name: "Password" })).toHaveFocus();
|
|
73
|
+
expect(screen.getByText("Password panel")).toBeInTheDocument();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("keeps only the active tab in the tab sequence", async () => {
|
|
77
|
+
const user = userEvent.setup();
|
|
78
|
+
render(<Example />);
|
|
79
|
+
|
|
80
|
+
await user.tab();
|
|
81
|
+
expect(screen.getByRole("tab", { name: "Account" })).toHaveFocus();
|
|
82
|
+
|
|
83
|
+
// A second Tab leaves the tablist entirely rather than visiting each tab.
|
|
84
|
+
await user.tab();
|
|
85
|
+
expect(screen.getByRole("tab", { name: "Password" })).not.toHaveFocus();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("skips disabled tabs when arrowing", async () => {
|
|
89
|
+
const user = userEvent.setup();
|
|
90
|
+
render(<Example />);
|
|
91
|
+
|
|
92
|
+
await user.click(screen.getByRole("tab", { name: "Password" }));
|
|
93
|
+
await user.keyboard("{ArrowRight}");
|
|
94
|
+
|
|
95
|
+
expect(screen.getByRole("tab", { name: "Team" })).not.toHaveFocus();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("defers activation in manual mode", async () => {
|
|
99
|
+
const user = userEvent.setup();
|
|
100
|
+
render(<Example activationMode="manual" />);
|
|
101
|
+
|
|
102
|
+
await user.click(screen.getByRole("tab", { name: "Account" }));
|
|
103
|
+
await user.keyboard("{ArrowRight}");
|
|
104
|
+
|
|
105
|
+
expect(screen.getByRole("tab", { name: "Password" })).toHaveFocus();
|
|
106
|
+
expect(screen.getByText("Account panel")).toBeInTheDocument();
|
|
107
|
+
|
|
108
|
+
await user.keyboard("{Enter}");
|
|
109
|
+
expect(screen.getByText("Password panel")).toBeInTheDocument();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("reports value changes", async () => {
|
|
113
|
+
const onValueChange = vi.fn();
|
|
114
|
+
const user = userEvent.setup();
|
|
115
|
+
render(<Example onValueChange={onValueChange} />);
|
|
116
|
+
|
|
117
|
+
await user.click(screen.getByRole("tab", { name: "Password" }));
|
|
118
|
+
expect(onValueChange).toHaveBeenCalledWith("password");
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it.each([
|
|
122
|
+
["solid", "bg-muted"],
|
|
123
|
+
["underline", "border-b"],
|
|
124
|
+
] as const)("applies the %s list variant", (variant, expectedClass) => {
|
|
125
|
+
render(<Example variant={variant} />);
|
|
126
|
+
expect(screen.getByRole("tablist")).toHaveClass(expectedClass);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("lets a consumer className override a conflicting utility", () => {
|
|
130
|
+
render(
|
|
131
|
+
<Tabs defaultValue="a">
|
|
132
|
+
<TabsList className="bg-card">
|
|
133
|
+
<TabsTrigger value="a">A</TabsTrigger>
|
|
134
|
+
</TabsList>
|
|
135
|
+
<TabsContent value="a">Panel</TabsContent>
|
|
136
|
+
</Tabs>,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const list = screen.getByRole("tablist");
|
|
140
|
+
expect(list).toHaveClass("bg-card");
|
|
141
|
+
expect(list).not.toHaveClass("bg-muted");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("has no accessibility violations", async () => {
|
|
145
|
+
const { container } = render(<Example />);
|
|
146
|
+
await expectNoA11yViolations(container);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
4
|
+
import { Tabs as TabsPrimitive } from "radix-ui";
|
|
5
|
+
import type { ComponentPropsWithRef } from "react";
|
|
6
|
+
|
|
7
|
+
import { focusRing } from "@/lib/styles";
|
|
8
|
+
import { cn } from "@/lib/utils";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Switches between panels of related content.
|
|
12
|
+
*
|
|
13
|
+
* Tabs are for alternate views of the same subject, not for steps in a process
|
|
14
|
+
* — a user can leave a tab and come back with nothing lost. Activation is
|
|
15
|
+
* automatic on arrow keys by default; pass `activationMode="manual"` when
|
|
16
|
+
* revealing a panel is expensive.
|
|
17
|
+
*/
|
|
18
|
+
export const Tabs = TabsPrimitive.Root;
|
|
19
|
+
|
|
20
|
+
const tabsListVariants = cva("inline-flex items-center", {
|
|
21
|
+
variants: {
|
|
22
|
+
variant: {
|
|
23
|
+
/** Pill track. Reads as a segmented control. */
|
|
24
|
+
solid: "gap-1 rounded-lg bg-muted p-1",
|
|
25
|
+
/** Underlined. Reads as page-level navigation between views. */
|
|
26
|
+
underline: "gap-4 border-b border-border",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: {
|
|
30
|
+
variant: "solid",
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const tabsTriggerVariants = cva(
|
|
35
|
+
cn(
|
|
36
|
+
"inline-flex items-center justify-center gap-2 text-sm font-medium whitespace-nowrap",
|
|
37
|
+
"transition-colors duration-[var(--duration-fast)]",
|
|
38
|
+
"disabled:pointer-events-none disabled:opacity-55",
|
|
39
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
40
|
+
focusRing,
|
|
41
|
+
),
|
|
42
|
+
{
|
|
43
|
+
variants: {
|
|
44
|
+
variant: {
|
|
45
|
+
solid: cn(
|
|
46
|
+
"h-7 rounded-md px-3 text-muted-foreground",
|
|
47
|
+
"hover:text-foreground",
|
|
48
|
+
"data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-xs",
|
|
49
|
+
),
|
|
50
|
+
underline: cn(
|
|
51
|
+
"-mb-px h-9 border-b-2 border-transparent px-0.5 text-muted-foreground",
|
|
52
|
+
"hover:text-foreground",
|
|
53
|
+
"data-[state=active]:border-primary data-[state=active]:text-foreground",
|
|
54
|
+
),
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
defaultVariants: {
|
|
58
|
+
variant: "solid",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
export interface TabsListProps
|
|
64
|
+
extends
|
|
65
|
+
ComponentPropsWithRef<typeof TabsPrimitive.List>,
|
|
66
|
+
VariantProps<typeof tabsListVariants> {}
|
|
67
|
+
|
|
68
|
+
export function TabsList({ className, variant, ...props }: TabsListProps) {
|
|
69
|
+
return (
|
|
70
|
+
<TabsPrimitive.List
|
|
71
|
+
data-slot="tabs-list"
|
|
72
|
+
data-variant={variant ?? "solid"}
|
|
73
|
+
className={cn(tabsListVariants({ variant }), className)}
|
|
74
|
+
{...props}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface TabsTriggerProps
|
|
80
|
+
extends
|
|
81
|
+
ComponentPropsWithRef<typeof TabsPrimitive.Trigger>,
|
|
82
|
+
VariantProps<typeof tabsTriggerVariants> {}
|
|
83
|
+
|
|
84
|
+
export function TabsTrigger({ className, variant, ...props }: TabsTriggerProps) {
|
|
85
|
+
return (
|
|
86
|
+
<TabsPrimitive.Trigger
|
|
87
|
+
data-slot="tabs-trigger"
|
|
88
|
+
className={cn(tabsTriggerVariants({ variant }), className)}
|
|
89
|
+
{...props}
|
|
90
|
+
/>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type TabsContentProps = ComponentPropsWithRef<typeof TabsPrimitive.Content>;
|
|
95
|
+
|
|
96
|
+
export function TabsContent({ className, ...props }: TabsContentProps) {
|
|
97
|
+
return (
|
|
98
|
+
<TabsPrimitive.Content
|
|
99
|
+
data-slot="tabs-content"
|
|
100
|
+
className={cn("mt-4 outline-none", focusRing, className)}
|
|
101
|
+
{...props}
|
|
102
|
+
/>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { tabsListVariants, tabsTriggerVariants };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export {
|
|
2
|
+
Toast,
|
|
3
|
+
ToastAction,
|
|
4
|
+
ToastClose,
|
|
5
|
+
ToastDescription,
|
|
6
|
+
ToastProvider,
|
|
7
|
+
ToastTitle,
|
|
8
|
+
Toaster,
|
|
9
|
+
toastVariants,
|
|
10
|
+
type ToastPosition,
|
|
11
|
+
type ToastProps,
|
|
12
|
+
type ToasterProps,
|
|
13
|
+
} from "./toast";
|
|
14
|
+
export {
|
|
15
|
+
DEFAULT_TOAST_DURATION,
|
|
16
|
+
TOAST_LIMIT,
|
|
17
|
+
toast,
|
|
18
|
+
useToasts,
|
|
19
|
+
type ToastAction as ToastActionOptions,
|
|
20
|
+
type ToastOptions,
|
|
21
|
+
type ToastPromiseMessages,
|
|
22
|
+
type ToastRecord,
|
|
23
|
+
type ToastVariant,
|
|
24
|
+
} from "./toast-store";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineMeta } from "@/registry/schema";
|
|
2
|
+
|
|
3
|
+
export const meta = defineMeta({
|
|
4
|
+
name: "toast",
|
|
5
|
+
title: "Toast",
|
|
6
|
+
description: "Brief, non-blocking messages with an imperative API callable from anywhere.",
|
|
7
|
+
category: "feedback",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: ["class-variance-authority", "radix-ui"],
|
|
10
|
+
registryDependencies: [],
|
|
11
|
+
files: ["toast-store.ts", "toast.tsx"],
|
|
12
|
+
a11y:
|
|
13
|
+
"Toasts are announced through a live region: destructive and warning variants interrupt " +
|
|
14
|
+
"(foreground), the rest wait for a pause (background). Auto-dismiss timers pause on hover, " +
|
|
15
|
+
"focus and window blur, and F8 moves focus into the toast list from anywhere. An action " +
|
|
16
|
+
"must carry altText describing how to do the same thing without the toast, since it may " +
|
|
17
|
+
"be gone before a screen reader user reaches it.",
|
|
18
|
+
});
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useSyncExternalStore, type ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Toast state, kept outside React.
|
|
7
|
+
*
|
|
8
|
+
* A toast is usually raised from somewhere that is not a component — a fetch
|
|
9
|
+
* handler, a mutation callback, a websocket message. Holding the queue in a
|
|
10
|
+
* plain module-level store means `toast()` is callable from anywhere, while
|
|
11
|
+
* `useToasts()` still gives components a properly-subscribed, concurrent-safe
|
|
12
|
+
* read via useSyncExternalStore.
|
|
13
|
+
*
|
|
14
|
+
* Dismiss *timing* deliberately lives in the component layer, not here: the
|
|
15
|
+
* underlying primitive already pauses timers on hover, focus and window blur,
|
|
16
|
+
* and reimplementing that in the store would only fight it.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export type ToastVariant = "default" | "success" | "warning" | "destructive" | "info";
|
|
20
|
+
|
|
21
|
+
export interface ToastAction {
|
|
22
|
+
label: string;
|
|
23
|
+
onClick: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Announced instead of the label, describing how to do the same thing without
|
|
26
|
+
* the toast (which may vanish before assistive technology reaches it).
|
|
27
|
+
* Defaults to the label.
|
|
28
|
+
*/
|
|
29
|
+
altText?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ToastOptions {
|
|
33
|
+
id?: string;
|
|
34
|
+
title?: ReactNode;
|
|
35
|
+
description?: ReactNode;
|
|
36
|
+
variant?: ToastVariant;
|
|
37
|
+
/** Milliseconds before auto-dismiss. `Infinity` keeps it until dismissed. */
|
|
38
|
+
duration?: number;
|
|
39
|
+
action?: ToastAction;
|
|
40
|
+
onDismiss?: (id: string) => void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface ToastRecord extends ToastOptions {
|
|
44
|
+
id: string;
|
|
45
|
+
variant: ToastVariant;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Beyond a handful, toasts stop being read and start being dismissed. */
|
|
49
|
+
export const TOAST_LIMIT = 4;
|
|
50
|
+
|
|
51
|
+
export const DEFAULT_TOAST_DURATION = 5000;
|
|
52
|
+
|
|
53
|
+
let toasts: ToastRecord[] = [];
|
|
54
|
+
let nextId = 0;
|
|
55
|
+
|
|
56
|
+
const listeners = new Set<() => void>();
|
|
57
|
+
|
|
58
|
+
function emit(next: ToastRecord[]) {
|
|
59
|
+
toasts = next;
|
|
60
|
+
for (const listener of listeners) listener();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function subscribe(listener: () => void): () => void {
|
|
64
|
+
listeners.add(listener);
|
|
65
|
+
return () => {
|
|
66
|
+
listeners.delete(listener);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getSnapshot(): ToastRecord[] {
|
|
71
|
+
return toasts;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Subscribed read of the current queue. */
|
|
75
|
+
export function useToasts(): ToastRecord[] {
|
|
76
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function add(options: ToastOptions): string {
|
|
80
|
+
nextId += 1;
|
|
81
|
+
const id = options.id ?? `toast-${String(nextId)}`;
|
|
82
|
+
const record: ToastRecord = { variant: "default", ...options, id };
|
|
83
|
+
|
|
84
|
+
// Newest first, oldest past the limit dropped.
|
|
85
|
+
emit([record, ...toasts.filter((existing) => existing.id !== id)].slice(0, TOAST_LIMIT));
|
|
86
|
+
return id;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function update(id: string, options: Partial<ToastOptions>): void {
|
|
90
|
+
emit(toasts.map((existing) => (existing.id === id ? { ...existing, ...options } : existing)));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function dismiss(id: string): void {
|
|
94
|
+
const target = toasts.find((existing) => existing.id === id);
|
|
95
|
+
emit(toasts.filter((existing) => existing.id !== id));
|
|
96
|
+
target?.onDismiss?.(id);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function dismissAll(): void {
|
|
100
|
+
const current = toasts;
|
|
101
|
+
emit([]);
|
|
102
|
+
for (const record of current) record.onDismiss?.(record.id);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface ToastPromiseMessages<T> {
|
|
106
|
+
loading: ReactNode;
|
|
107
|
+
success: ReactNode | ((value: T) => ReactNode);
|
|
108
|
+
error: ReactNode | ((error: unknown) => ReactNode);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function resolveMessage<T>(
|
|
112
|
+
message: ReactNode | ((value: T) => ReactNode),
|
|
113
|
+
value: T,
|
|
114
|
+
): ReactNode {
|
|
115
|
+
return typeof message === "function" ? (message as (value: T) => ReactNode)(value) : message;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Shows a pending toast that resolves into a success or error toast.
|
|
120
|
+
*
|
|
121
|
+
* Returns the original promise so it stays awaitable and rejections are not
|
|
122
|
+
* swallowed — the toast is a side effect of the promise, not a replacement for
|
|
123
|
+
* handling it.
|
|
124
|
+
*/
|
|
125
|
+
function promise<T>(input: Promise<T>, messages: ToastPromiseMessages<T>): Promise<T> {
|
|
126
|
+
const id = add({ title: messages.loading, duration: Infinity });
|
|
127
|
+
|
|
128
|
+
input.then(
|
|
129
|
+
(value) => {
|
|
130
|
+
update(id, {
|
|
131
|
+
title: resolveMessage(messages.success, value),
|
|
132
|
+
variant: "success",
|
|
133
|
+
duration: DEFAULT_TOAST_DURATION,
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
(error: unknown) => {
|
|
137
|
+
update(id, {
|
|
138
|
+
title: resolveMessage(messages.error, error),
|
|
139
|
+
variant: "destructive",
|
|
140
|
+
duration: DEFAULT_TOAST_DURATION,
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
return input;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function withVariant(variant: ToastVariant) {
|
|
149
|
+
return (title: ReactNode, options: Omit<ToastOptions, "title" | "variant"> = {}) =>
|
|
150
|
+
add({ ...options, title, variant });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Raises a toast from anywhere — no hook, no provider lookup.
|
|
155
|
+
*
|
|
156
|
+
* toast.success("Project created");
|
|
157
|
+
* toast.error("Could not save", { description: "Check your connection." });
|
|
158
|
+
* await toast.promise(save(), { loading: "Saving…", success: "Saved", error: "Failed" });
|
|
159
|
+
*/
|
|
160
|
+
export const toast = Object.assign(
|
|
161
|
+
(title: ReactNode, options: Omit<ToastOptions, "title"> = {}) => add({ ...options, title }),
|
|
162
|
+
{
|
|
163
|
+
default: withVariant("default"),
|
|
164
|
+
success: withVariant("success"),
|
|
165
|
+
error: withVariant("destructive"),
|
|
166
|
+
warning: withVariant("warning"),
|
|
167
|
+
info: withVariant("info"),
|
|
168
|
+
custom: add,
|
|
169
|
+
update,
|
|
170
|
+
dismiss,
|
|
171
|
+
dismissAll,
|
|
172
|
+
promise,
|
|
173
|
+
},
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
/** Test-only reset. Not exported from the package index. */
|
|
177
|
+
export function resetToasts(): void {
|
|
178
|
+
toasts = [];
|
|
179
|
+
nextId = 0;
|
|
180
|
+
for (const listener of listeners) listener();
|
|
181
|
+
}
|