@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,263 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../select/select.js";
|
|
4
|
+
import { Button } from "../button/button.js";
|
|
5
|
+
import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "../dropdown-menu/dropdown-menu.js";
|
|
6
|
+
import { Table as Table$1, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../table/table.js";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { flexRender } from "@tanstack/react-table";
|
|
9
|
+
//#region src/components/data-table/data-table.tsx
|
|
10
|
+
function hasSortState(column) {
|
|
11
|
+
return "getIsSorted" in column && "getCanSort" in column;
|
|
12
|
+
}
|
|
13
|
+
function hasSize(header) {
|
|
14
|
+
return "getSize" in header;
|
|
15
|
+
}
|
|
16
|
+
function hasSelection(row) {
|
|
17
|
+
return "getIsSelected" in row;
|
|
18
|
+
}
|
|
19
|
+
function hasVisibility(column) {
|
|
20
|
+
return "getIsVisible" in column;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether a column's cells should render.
|
|
24
|
+
*
|
|
25
|
+
* A table without the visibility feature has no notion of hidden columns, so
|
|
26
|
+
* everything renders. With the feature on, this has to be honoured for cells as
|
|
27
|
+
* well as headers — dropping a header while still rendering its cells shifts
|
|
28
|
+
* every row out of alignment with the columns above it.
|
|
29
|
+
*/
|
|
30
|
+
function isColumnVisible(column) {
|
|
31
|
+
return !hasVisibility(column) || column.getIsVisible();
|
|
32
|
+
}
|
|
33
|
+
function ariaSort(column) {
|
|
34
|
+
if (!hasSortState(column)) return void 0;
|
|
35
|
+
const sorted = column.getIsSorted();
|
|
36
|
+
if (sorted === "asc") return "ascending";
|
|
37
|
+
if (sorted === "desc") return "descending";
|
|
38
|
+
return column.getCanSort() ? "none" : void 0;
|
|
39
|
+
}
|
|
40
|
+
function columnWidth(header) {
|
|
41
|
+
if (!hasSize(header)) return void 0;
|
|
42
|
+
const size = header.getSize();
|
|
43
|
+
return size ? { width: size } : void 0;
|
|
44
|
+
}
|
|
45
|
+
function DataTable({ table, empty, className, ...props }) {
|
|
46
|
+
const rows = table.getRowModel().rows;
|
|
47
|
+
const columnCount = table.getAllLeafColumns().length;
|
|
48
|
+
return /* @__PURE__ */ jsx("div", {
|
|
49
|
+
className: "rounded-lg border border-border",
|
|
50
|
+
children: /* @__PURE__ */ jsxs(Table$1, {
|
|
51
|
+
className: cn(className),
|
|
52
|
+
...props,
|
|
53
|
+
children: [/* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(TableHead, {
|
|
54
|
+
colSpan: header.colSpan,
|
|
55
|
+
style: columnWidth(header),
|
|
56
|
+
"aria-sort": ariaSort(header.column),
|
|
57
|
+
children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())
|
|
58
|
+
}, header.id)) }, headerGroup.id)) }), /* @__PURE__ */ jsx(TableBody, { children: rows.length === 0 ? /* @__PURE__ */ jsx(TableRow, {
|
|
59
|
+
className: "hover:bg-transparent",
|
|
60
|
+
children: /* @__PURE__ */ jsx(TableCell, {
|
|
61
|
+
colSpan: columnCount,
|
|
62
|
+
className: "h-32 p-0 text-center",
|
|
63
|
+
children: empty ?? /* @__PURE__ */ jsx("span", {
|
|
64
|
+
className: "text-sm text-muted-foreground",
|
|
65
|
+
children: "No results."
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
}) : rows.map((row) => /* @__PURE__ */ jsx(TableRow, {
|
|
69
|
+
"data-state": hasSelection(row) && row.getIsSelected() ? "selected" : void 0,
|
|
70
|
+
children: row.getAllCells().filter((cell) => isColumnVisible(cell.column)).map((cell) => /* @__PURE__ */ jsx(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
|
|
71
|
+
}, row.id)) })]
|
|
72
|
+
})
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A sortable column header.
|
|
77
|
+
*
|
|
78
|
+
* Falls back to plain text when the column cannot be sorted, rather than
|
|
79
|
+
* rendering a button that does nothing — a control that looks interactive and
|
|
80
|
+
* is not is worse than no control.
|
|
81
|
+
*/
|
|
82
|
+
function DataTableColumnHeader({ column, title, className, ...props }) {
|
|
83
|
+
if (!column.getCanSort()) return /* @__PURE__ */ jsx("div", {
|
|
84
|
+
className: cn("text-xs font-medium", className),
|
|
85
|
+
...props,
|
|
86
|
+
children: title
|
|
87
|
+
});
|
|
88
|
+
const sorted = column.getIsSorted();
|
|
89
|
+
return /* @__PURE__ */ jsx("div", {
|
|
90
|
+
className: cn("flex items-center", className),
|
|
91
|
+
...props,
|
|
92
|
+
children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
93
|
+
asChild: true,
|
|
94
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
95
|
+
variant: "ghost",
|
|
96
|
+
size: "sm",
|
|
97
|
+
className: "-ml-2 h-7 gap-1 px-2 font-medium text-muted-foreground data-[state=open]:bg-accent",
|
|
98
|
+
children: [
|
|
99
|
+
title,
|
|
100
|
+
/* @__PURE__ */ jsx(SortIcon, { direction: sorted === false ? void 0 : sorted }),
|
|
101
|
+
/* @__PURE__ */ jsx("span", {
|
|
102
|
+
className: "sr-only",
|
|
103
|
+
children: sorted === "asc" ? `${title}, sorted ascending` : sorted === "desc" ? `${title}, sorted descending` : `${title}, not sorted`
|
|
104
|
+
})
|
|
105
|
+
]
|
|
106
|
+
})
|
|
107
|
+
}), /* @__PURE__ */ jsxs(DropdownMenuContent, {
|
|
108
|
+
align: "start",
|
|
109
|
+
children: [/* @__PURE__ */ jsx(DropdownMenuItem, {
|
|
110
|
+
onSelect: () => {
|
|
111
|
+
column.toggleSorting(false);
|
|
112
|
+
},
|
|
113
|
+
children: "Sort ascending"
|
|
114
|
+
}), /* @__PURE__ */ jsx(DropdownMenuItem, {
|
|
115
|
+
onSelect: () => {
|
|
116
|
+
column.toggleSorting(true);
|
|
117
|
+
},
|
|
118
|
+
children: "Sort descending"
|
|
119
|
+
})]
|
|
120
|
+
})] })
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function SortIcon({ direction }) {
|
|
124
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
125
|
+
viewBox: "0 0 24 24",
|
|
126
|
+
fill: "none",
|
|
127
|
+
"aria-hidden": "true",
|
|
128
|
+
className: "size-3.5 opacity-70",
|
|
129
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
130
|
+
d: direction === "asc" ? "m7 14 5-5 5 5" : direction === "desc" ? "m7 10 5 5 5-5" : "m8 10 4-4 4 4M8 14l4 4 4-4",
|
|
131
|
+
stroke: "currentColor",
|
|
132
|
+
strokeWidth: "2",
|
|
133
|
+
strokeLinecap: "round",
|
|
134
|
+
strokeLinejoin: "round"
|
|
135
|
+
})
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/** Toggles column visibility. */
|
|
139
|
+
function DataTableViewOptions({ table, label = "Columns" }) {
|
|
140
|
+
const columns = table.getAllColumns().filter((column) => column.getCanHide());
|
|
141
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
|
|
142
|
+
asChild: true,
|
|
143
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
144
|
+
variant: "outline",
|
|
145
|
+
size: "sm",
|
|
146
|
+
children: label
|
|
147
|
+
})
|
|
148
|
+
}), /* @__PURE__ */ jsxs(DropdownMenuContent, {
|
|
149
|
+
align: "end",
|
|
150
|
+
className: "w-44",
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ jsx(DropdownMenuLabel, { children: "Toggle columns" }),
|
|
153
|
+
/* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
154
|
+
columns.map((column) => /* @__PURE__ */ jsx(DropdownMenuCheckboxItem, {
|
|
155
|
+
checked: column.getIsVisible(),
|
|
156
|
+
onCheckedChange: (checked) => {
|
|
157
|
+
column.toggleVisibility(checked === true);
|
|
158
|
+
},
|
|
159
|
+
children: column.id
|
|
160
|
+
}, column.id))
|
|
161
|
+
]
|
|
162
|
+
})] });
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Page controls for a table.
|
|
166
|
+
*
|
|
167
|
+
* The page position is a polite live region: paging replaces the rows in place,
|
|
168
|
+
* and without an announcement a screen reader user gets no confirmation that
|
|
169
|
+
* anything happened.
|
|
170
|
+
*/
|
|
171
|
+
function DataTablePagination({ table, pageSizes = [
|
|
172
|
+
10,
|
|
173
|
+
20,
|
|
174
|
+
50,
|
|
175
|
+
100
|
|
176
|
+
], status }) {
|
|
177
|
+
const { pageIndex, pageSize } = table.state.pagination;
|
|
178
|
+
const pageCount = table.getPageCount();
|
|
179
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
180
|
+
className: "flex flex-wrap items-center justify-between gap-4 px-1 py-3",
|
|
181
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
182
|
+
className: "text-sm text-muted-foreground",
|
|
183
|
+
"aria-live": "polite",
|
|
184
|
+
children: status ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
185
|
+
"Page ",
|
|
186
|
+
pageIndex + 1,
|
|
187
|
+
" of ",
|
|
188
|
+
Math.max(1, pageCount)
|
|
189
|
+
] })
|
|
190
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
191
|
+
className: "flex items-center gap-4",
|
|
192
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
193
|
+
className: "flex items-center gap-2",
|
|
194
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
195
|
+
className: "text-sm text-muted-foreground",
|
|
196
|
+
id: "rows-per-page",
|
|
197
|
+
children: "Rows per page"
|
|
198
|
+
}), /* @__PURE__ */ jsxs(Select, {
|
|
199
|
+
value: String(pageSize),
|
|
200
|
+
onValueChange: (value) => {
|
|
201
|
+
table.setPageSize(Number(value));
|
|
202
|
+
},
|
|
203
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
204
|
+
triggerSize: "sm",
|
|
205
|
+
className: "w-18",
|
|
206
|
+
"aria-labelledby": "rows-per-page",
|
|
207
|
+
children: /* @__PURE__ */ jsx(SelectValue, {})
|
|
208
|
+
}), /* @__PURE__ */ jsx(SelectContent, { children: pageSizes.map((size) => /* @__PURE__ */ jsx(SelectItem, {
|
|
209
|
+
value: String(size),
|
|
210
|
+
children: size
|
|
211
|
+
}, size)) })]
|
|
212
|
+
})]
|
|
213
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
214
|
+
className: "flex items-center gap-1",
|
|
215
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
216
|
+
variant: "outline",
|
|
217
|
+
size: "icon-sm",
|
|
218
|
+
"aria-label": "Go to previous page",
|
|
219
|
+
disabled: !table.getCanPreviousPage(),
|
|
220
|
+
onClick: () => {
|
|
221
|
+
table.previousPage();
|
|
222
|
+
},
|
|
223
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
224
|
+
viewBox: "0 0 24 24",
|
|
225
|
+
fill: "none",
|
|
226
|
+
"aria-hidden": "true",
|
|
227
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
228
|
+
d: "m15 18-6-6 6-6",
|
|
229
|
+
stroke: "currentColor",
|
|
230
|
+
strokeWidth: "2",
|
|
231
|
+
strokeLinecap: "round",
|
|
232
|
+
strokeLinejoin: "round"
|
|
233
|
+
})
|
|
234
|
+
})
|
|
235
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
236
|
+
variant: "outline",
|
|
237
|
+
size: "icon-sm",
|
|
238
|
+
"aria-label": "Go to next page",
|
|
239
|
+
disabled: !table.getCanNextPage(),
|
|
240
|
+
onClick: () => {
|
|
241
|
+
table.nextPage();
|
|
242
|
+
},
|
|
243
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
244
|
+
viewBox: "0 0 24 24",
|
|
245
|
+
fill: "none",
|
|
246
|
+
"aria-hidden": "true",
|
|
247
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
248
|
+
d: "m9 18 6-6-6-6",
|
|
249
|
+
stroke: "currentColor",
|
|
250
|
+
strokeWidth: "2",
|
|
251
|
+
strokeLinecap: "round",
|
|
252
|
+
strokeLinejoin: "round"
|
|
253
|
+
})
|
|
254
|
+
})
|
|
255
|
+
})]
|
|
256
|
+
})]
|
|
257
|
+
})]
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
//#endregion
|
|
261
|
+
export { DataTable, DataTableColumnHeader, DataTablePagination, DataTableViewOptions };
|
|
262
|
+
|
|
263
|
+
//# sourceMappingURL=data-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table.js","names":["Table"],"sources":["../../../src/components/data-table/data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n flexRender,\n type RowData,\n type Table as TanstackTable,\n type TableFeatures,\n} from \"@tanstack/react-table\";\nimport type { ComponentPropsWithRef, ReactNode } from \"react\";\n\nimport { Button } from \"@/components/button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/dropdown-menu\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/select\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/table\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Presentation for a TanStack Table instance.\n *\n * Deliberately not a component that takes `data` and `columns` and does\n * everything. Sorting, filtering, selection and pagination are the table\n * library's job and it does them well; wrapping them in props would re-expose\n * an API that already exists, badly, and block anything the wrapper did not\n * anticipate. The consumer owns the instance:\n *\n * const table = useTable({ features, columns, data });\n * <DataTable table={table} />\n *\n * ## How these are typed\n *\n * The table library's features are opt-in, and its types follow: a method like\n * `getCanSort` exists only when the sorting feature is enabled.\n *\n * The controls below therefore declare **the shape they need** rather than\n * being generic over feature flags. A column from a table without sorting does\n * not satisfy `SortableColumn`, so passing one is a compile error at the call\n * site — the guarantee we wanted, and it survives the library reshuffling its\n * internal feature types.\n *\n * `DataTable` itself has to render any table, so it uses the core API and\n * detects the optional extras with real type guards.\n */\n\n/* -------------------------------------------------------------------------- */\n/* Capability detection */\n/* -------------------------------------------------------------------------- */\n\ninterface WithSortState {\n getIsSorted: () => \"asc\" | \"desc\" | false;\n getCanSort: () => boolean;\n}\n\ninterface WithSize {\n getSize: () => number;\n}\n\ninterface WithSelection {\n getIsSelected: () => boolean;\n}\n\ninterface WithVisibility {\n getIsVisible: () => boolean;\n}\n\nfunction hasSortState(column: object): column is WithSortState {\n return \"getIsSorted\" in column && \"getCanSort\" in column;\n}\n\nfunction hasSize(header: object): header is WithSize {\n return \"getSize\" in header;\n}\n\nfunction hasSelection(row: object): row is WithSelection {\n return \"getIsSelected\" in row;\n}\n\nfunction hasVisibility(column: object): column is WithVisibility {\n return \"getIsVisible\" in column;\n}\n\n/**\n * Whether a column's cells should render.\n *\n * A table without the visibility feature has no notion of hidden columns, so\n * everything renders. With the feature on, this has to be honoured for cells as\n * well as headers — dropping a header while still rendering its cells shifts\n * every row out of alignment with the columns above it.\n */\nfunction isColumnVisible(column: object): boolean {\n return !hasVisibility(column) || column.getIsVisible();\n}\n\nfunction ariaSort(column: object): \"ascending\" | \"descending\" | \"none\" | undefined {\n if (!hasSortState(column)) return undefined;\n\n const sorted = column.getIsSorted();\n if (sorted === \"asc\") return \"ascending\";\n if (sorted === \"desc\") return \"descending\";\n return column.getCanSort() ? \"none\" : undefined;\n}\n\nfunction columnWidth(header: object): { width: number } | undefined {\n if (!hasSize(header)) return undefined;\n\n const size = header.getSize();\n return size ? { width: size } : undefined;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Table */\n/* -------------------------------------------------------------------------- */\n\nexport interface DataTableProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> extends Omit<ComponentPropsWithRef<\"table\">, \"children\"> {\n table: TanstackTable<TFeatures, TData>;\n /** Shown in place of rows when there are none. */\n empty?: ReactNode;\n}\n\nexport function DataTable<TFeatures extends TableFeatures, TData extends RowData>({\n table,\n empty,\n className,\n ...props\n}: DataTableProps<TFeatures, TData>) {\n const rows = table.getRowModel().rows;\n const columnCount = table.getAllLeafColumns().length;\n\n return (\n <div className=\"rounded-lg border border-border\">\n <Table className={cn(className)} {...props}>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n colSpan={header.colSpan}\n style={columnWidth(header)}\n // Announces the current sort. Without it the arrow icon is the\n // only signal, which is no signal at all for a screen reader.\n aria-sort={ariaSort(header.column)}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {rows.length === 0 ? (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={columnCount} className=\"h-32 p-0 text-center\">\n {empty ?? <span className=\"text-sm text-muted-foreground\">No results.</span>}\n </TableCell>\n </TableRow>\n ) : (\n rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={hasSelection(row) && row.getIsSelected() ? \"selected\" : undefined}\n >\n {row\n .getAllCells()\n .filter((cell) => isColumnVisible(cell.column))\n .map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Sortable column header */\n/* -------------------------------------------------------------------------- */\n\n/**\n * The slice of a column a sortable header needs.\n *\n * A column from a table without the sorting feature does not have these\n * methods, so passing one is a compile error rather than a runtime crash.\n */\nexport interface SortableColumn {\n getCanSort: () => boolean;\n getIsSorted: () => \"asc\" | \"desc\" | false;\n toggleSorting: (desc?: boolean) => void;\n}\n\nexport interface DataTableColumnHeaderProps extends ComponentPropsWithRef<\"div\"> {\n column: SortableColumn;\n title: string;\n}\n\n/**\n * A sortable column header.\n *\n * Falls back to plain text when the column cannot be sorted, rather than\n * rendering a button that does nothing — a control that looks interactive and\n * is not is worse than no control.\n */\nexport function DataTableColumnHeader({\n column,\n title,\n className,\n ...props\n}: DataTableColumnHeaderProps) {\n if (!column.getCanSort()) {\n return (\n <div className={cn(\"text-xs font-medium\", className)} {...props}>\n {title}\n </div>\n );\n }\n\n const sorted = column.getIsSorted();\n\n return (\n <div className={cn(\"flex items-center\", className)} {...props}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 h-7 gap-1 px-2 font-medium text-muted-foreground data-[state=open]:bg-accent\"\n >\n {title}\n <SortIcon direction={sorted === false ? undefined : sorted} />\n <span className=\"sr-only\">\n {sorted === \"asc\"\n ? `${title}, sorted ascending`\n : sorted === \"desc\"\n ? `${title}, sorted descending`\n : `${title}, not sorted`}\n </span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem\n onSelect={() => {\n column.toggleSorting(false);\n }}\n >\n Sort ascending\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => {\n column.toggleSorting(true);\n }}\n >\n Sort descending\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nfunction SortIcon({ direction }: { direction?: \"asc\" | \"desc\" }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-3.5 opacity-70\">\n <path\n d={\n direction === \"asc\"\n ? \"m7 14 5-5 5 5\"\n : direction === \"desc\"\n ? \"m7 10 5 5 5-5\"\n : \"m8 10 4-4 4 4M8 14l4 4 4-4\"\n }\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Column visibility */\n/* -------------------------------------------------------------------------- */\n\n/** The slice of a table the column toggle needs. */\nexport interface HideableTable {\n getAllColumns: () => {\n id: string;\n getCanHide: () => boolean;\n getIsVisible: () => boolean;\n toggleVisibility: (visible?: boolean) => void;\n }[];\n}\n\nexport interface DataTableViewOptionsProps {\n table: HideableTable;\n label?: string;\n}\n\n/** Toggles column visibility. */\nexport function DataTableViewOptions({ table, label = \"Columns\" }: DataTableViewOptionsProps) {\n const columns = table.getAllColumns().filter((column) => column.getCanHide());\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n {label}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-44\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {columns.map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) => {\n column.toggleVisibility(checked === true);\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Pagination */\n/* -------------------------------------------------------------------------- */\n\n/**\n * The slice of a table the page controls need.\n *\n * `state` is a property, not a `getState()` call — the table library moved to a\n * reactive state object, and reading it the old way fails at runtime rather\n * than at compile time.\n */\nexport interface PaginatedTable {\n state: { pagination: { pageIndex: number; pageSize: number } };\n getPageCount: () => number;\n setPageSize: (size: number) => void;\n previousPage: () => void;\n nextPage: () => void;\n getCanPreviousPage: () => boolean;\n getCanNextPage: () => boolean;\n}\n\nexport interface DataTablePaginationProps {\n table: PaginatedTable;\n pageSizes?: number[];\n /**\n * Replaces the page position on the left.\n *\n * A slot rather than a `showSelectionCount` flag: a selection count needs the\n * selection and filtering features, and demanding those here would break\n * every table that only paginates.\n */\n status?: ReactNode;\n}\n\n/**\n * Page controls for a table.\n *\n * The page position is a polite live region: paging replaces the rows in place,\n * and without an announcement a screen reader user gets no confirmation that\n * anything happened.\n */\nexport function DataTablePagination({\n table,\n pageSizes = [10, 20, 50, 100],\n status,\n}: DataTablePaginationProps) {\n const { pageIndex, pageSize } = table.state.pagination;\n const pageCount = table.getPageCount();\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-4 px-1 py-3\">\n <div className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {status ?? (\n <>\n Page {pageIndex + 1} of {Math.max(1, pageCount)}\n </>\n )}\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\" id=\"rows-per-page\">\n Rows per page\n </span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => {\n table.setPageSize(Number(value));\n }}\n >\n <SelectTrigger triggerSize=\"sm\" className=\"w-18\" aria-labelledby=\"rows-per-page\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizes.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Go to previous page\"\n disabled={!table.getCanPreviousPage()}\n onClick={() => {\n table.previousPage();\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m15 18-6-6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"Go to next page\"\n disabled={!table.getCanNextPage()}\n onClick={() => {\n table.nextPage();\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"m9 18 6-6-6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { DataTable, DataTableColumnHeader, DataTableColumnHeaderProps, DataTablePagination, DataTablePaginationProps, DataTableProps, DataTableViewOptions, DataTableViewOptionsProps, HideableTable, PaginatedTable, SortableColumn } from "./data-table.js";
|
|
2
|
+
export { DataTable, DataTableColumnHeader, type DataTableColumnHeaderProps, DataTablePagination, type DataTablePaginationProps, type DataTableProps, DataTableViewOptions, type DataTableViewOptionsProps, type HideableTable, type PaginatedTable, type SortableColumn };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/data-table/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "data-table",
|
|
5
|
+
title: "Data Table",
|
|
6
|
+
description: "Presentation for a TanStack Table instance: sorting, column visibility and pagination.",
|
|
7
|
+
category: "data",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: ["@tanstack/react-table"],
|
|
10
|
+
registryDependencies: [
|
|
11
|
+
"button",
|
|
12
|
+
"dropdown-menu",
|
|
13
|
+
"select",
|
|
14
|
+
"table"
|
|
15
|
+
],
|
|
16
|
+
files: ["data-table.tsx"],
|
|
17
|
+
a11y: "Sortable headers carry aria-sort, so the current sort is announced rather than being conveyed by an arrow icon alone, and each sort button has visually hidden text stating the column and its direction. The pagination status is a polite live region, because paging swaps the rows in place with no other signal. A column that cannot be sorted renders as text, not as a button that does nothing."
|
|
18
|
+
});
|
|
19
|
+
//#endregion
|
|
20
|
+
export { meta };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/data-table/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"data-table\",\n title: \"Data Table\",\n description:\n \"Presentation for a TanStack Table instance: sorting, column visibility and pagination.\",\n category: \"data\",\n status: \"stable\",\n dependencies: [\"@tanstack/react-table\"],\n registryDependencies: [\"button\", \"dropdown-menu\", \"select\", \"table\"],\n files: [\"data-table.tsx\"],\n a11y:\n \"Sortable headers carry aria-sort, so the current sort is announced rather than being \" +\n \"conveyed by an arrow icon alone, and each sort button has visually hidden text stating the \" +\n \"column and its direction. The pagination status is a polite live region, because paging \" +\n \"swaps the rows in place with no other signal. A column that cannot be sorted renders as \" +\n \"text, not as a button that does nothing.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aACE;CACF,UAAU;CACV,QAAQ;CACR,cAAc,CAAC,uBAAuB;CACtC,sBAAsB;EAAC;EAAU;EAAiB;EAAU;CAAO;CACnE,OAAO,CAAC,gBAAgB;CACxB,MACE;AAKJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DateRange } from "react-day-picker";
|
|
2
|
+
//#region src/components/date-picker/date-picker.d.ts
|
|
3
|
+
interface DatePickerProps {
|
|
4
|
+
value?: Date;
|
|
5
|
+
defaultValue?: Date;
|
|
6
|
+
onValueChange?: (date: Date | undefined) => void;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** BCP 47 tag for formatting the button label. Defaults to the runtime locale. */
|
|
10
|
+
locale?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
/** Names the popover, which carries role="dialog". */
|
|
13
|
+
label?: string;
|
|
14
|
+
}
|
|
15
|
+
declare function DatePicker({ value: valueProp, defaultValue, onValueChange, placeholder, disabled, locale, className, label }: DatePickerProps): import("react").JSX.Element;
|
|
16
|
+
interface DateRangePickerProps {
|
|
17
|
+
value?: DateRange;
|
|
18
|
+
defaultValue?: DateRange;
|
|
19
|
+
onValueChange?: (range: DateRange | undefined) => void;
|
|
20
|
+
placeholder?: string;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
locale?: string;
|
|
23
|
+
className?: string;
|
|
24
|
+
label?: string;
|
|
25
|
+
/** Months shown side by side. Two makes most ranges selectable without paging. */
|
|
26
|
+
numberOfMonths?: number;
|
|
27
|
+
}
|
|
28
|
+
declare function DateRangePicker({ value: valueProp, defaultValue, onValueChange, placeholder, disabled, locale, className, label, numberOfMonths }: DateRangePickerProps): import("react").JSX.Element;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { DatePicker, DatePickerProps, DateRangePicker, DateRangePickerProps };
|
|
31
|
+
//# sourceMappingURL=date-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.d.ts","names":[],"sources":["../../../src/components/date-picker/date-picker.tsx"],"mappings":";;UAsEiB;EACf,QAAQ;EACR,eAAe;EACf,iBAAiB,MAAM;EACvB;EACA;;EAEA;EACA;;EAEA;;iBAGc,aACd,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,WACA,SACC,kCAAe,IAAA;UA0CD;EACf,QAAQ;EACR,eAAe;EACf,iBAAiB,OAAO;EACxB;EACA;EACA;EACA;EACA;;EAEA;;iBAGc,kBACd,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,WACA,OACA,kBACC,uCAAoB,IAAA"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { Button } from "../button/button.js";
|
|
4
|
+
import { Calendar } from "../calendar/calendar.js";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../popover/popover.js";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
//#region src/components/date-picker/date-picker.tsx
|
|
9
|
+
/**
|
|
10
|
+
* A button that opens a calendar to pick a date.
|
|
11
|
+
*
|
|
12
|
+
* Composed from Popover, Calendar and Button rather than reimplementing any of
|
|
13
|
+
* them, which is also why it is the first registry entry with transitive
|
|
14
|
+
* dependencies — installing it pulls all three.
|
|
15
|
+
*
|
|
16
|
+
* A date picker is a convenience, not the only way in. For a date the user
|
|
17
|
+
* already knows, a typed input is faster than any calendar; pair this with one
|
|
18
|
+
* when speed of entry matters more than browsing.
|
|
19
|
+
*/
|
|
20
|
+
function formatDate(date, locale) {
|
|
21
|
+
if (!date) return "";
|
|
22
|
+
return new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(date);
|
|
23
|
+
}
|
|
24
|
+
function CalendarIcon() {
|
|
25
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
26
|
+
viewBox: "0 0 24 24",
|
|
27
|
+
fill: "none",
|
|
28
|
+
"aria-hidden": "true",
|
|
29
|
+
className: "size-4 opacity-70",
|
|
30
|
+
children: [/* @__PURE__ */ jsx("rect", {
|
|
31
|
+
x: "3",
|
|
32
|
+
y: "5",
|
|
33
|
+
width: "18",
|
|
34
|
+
height: "16",
|
|
35
|
+
rx: "2",
|
|
36
|
+
stroke: "currentColor",
|
|
37
|
+
strokeWidth: "2"
|
|
38
|
+
}), /* @__PURE__ */ jsx("path", {
|
|
39
|
+
d: "M3 10h18M8 3v4M16 3v4",
|
|
40
|
+
stroke: "currentColor",
|
|
41
|
+
strokeWidth: "2",
|
|
42
|
+
strokeLinecap: "round"
|
|
43
|
+
})]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function DatePickerTrigger({ className, placeholder: _placeholder, hasValue, children, ...props }) {
|
|
47
|
+
return /* @__PURE__ */ jsxs(Button, {
|
|
48
|
+
variant: "outline",
|
|
49
|
+
className: cn("w-full justify-start gap-2 font-normal", !hasValue && "text-muted-foreground", className),
|
|
50
|
+
...props,
|
|
51
|
+
children: [/* @__PURE__ */ jsx(CalendarIcon, {}), children]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function DatePicker({ value: valueProp, defaultValue, onValueChange, placeholder = "Pick a date", disabled, locale, className, label = "Choose a date" }) {
|
|
55
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue);
|
|
56
|
+
const value = valueProp === void 0 ? uncontrolled : valueProp;
|
|
57
|
+
const [open, setOpen] = useState(false);
|
|
58
|
+
function handleSelect(next) {
|
|
59
|
+
if (valueProp === void 0) setUncontrolled(next);
|
|
60
|
+
onValueChange?.(next);
|
|
61
|
+
setOpen(next ? false : open);
|
|
62
|
+
}
|
|
63
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
64
|
+
open,
|
|
65
|
+
onOpenChange: setOpen,
|
|
66
|
+
children: [/* @__PURE__ */ jsx(PopoverTrigger, {
|
|
67
|
+
asChild: true,
|
|
68
|
+
children: /* @__PURE__ */ jsx(DatePickerTrigger, {
|
|
69
|
+
"data-slot": "date-picker-trigger",
|
|
70
|
+
placeholder,
|
|
71
|
+
hasValue: Boolean(value),
|
|
72
|
+
disabled,
|
|
73
|
+
className,
|
|
74
|
+
children: value ? formatDate(value, locale) : placeholder
|
|
75
|
+
})
|
|
76
|
+
}), /* @__PURE__ */ jsx(PopoverContent, {
|
|
77
|
+
className: "w-auto p-0",
|
|
78
|
+
"aria-label": label,
|
|
79
|
+
children: /* @__PURE__ */ jsx(Calendar, {
|
|
80
|
+
mode: "single",
|
|
81
|
+
selected: value,
|
|
82
|
+
defaultMonth: value,
|
|
83
|
+
onSelect: handleSelect,
|
|
84
|
+
autoFocus: true
|
|
85
|
+
})
|
|
86
|
+
})]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function DateRangePicker({ value: valueProp, defaultValue, onValueChange, placeholder = "Pick a date range", disabled, locale, className, label = "Choose a date range", numberOfMonths = 2 }) {
|
|
90
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue);
|
|
91
|
+
const value = valueProp === void 0 ? uncontrolled : valueProp;
|
|
92
|
+
function handleSelect(next) {
|
|
93
|
+
if (valueProp === void 0) setUncontrolled(next);
|
|
94
|
+
onValueChange?.(next);
|
|
95
|
+
}
|
|
96
|
+
const labelText = value?.from ? value.to ? `${formatDate(value.from, locale)} – ${formatDate(value.to, locale)}` : formatDate(value.from, locale) : placeholder;
|
|
97
|
+
return /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(PopoverTrigger, {
|
|
98
|
+
asChild: true,
|
|
99
|
+
children: /* @__PURE__ */ jsx(DatePickerTrigger, {
|
|
100
|
+
"data-slot": "date-range-picker-trigger",
|
|
101
|
+
placeholder,
|
|
102
|
+
hasValue: Boolean(value?.from),
|
|
103
|
+
disabled,
|
|
104
|
+
className,
|
|
105
|
+
children: labelText
|
|
106
|
+
})
|
|
107
|
+
}), /* @__PURE__ */ jsx(PopoverContent, {
|
|
108
|
+
className: "w-auto p-0",
|
|
109
|
+
"aria-label": label,
|
|
110
|
+
children: /* @__PURE__ */ jsx(Calendar, {
|
|
111
|
+
mode: "range",
|
|
112
|
+
selected: value,
|
|
113
|
+
defaultMonth: value?.from,
|
|
114
|
+
onSelect: handleSelect,
|
|
115
|
+
numberOfMonths,
|
|
116
|
+
autoFocus: true
|
|
117
|
+
})
|
|
118
|
+
})] });
|
|
119
|
+
}
|
|
120
|
+
//#endregion
|
|
121
|
+
export { DatePicker, DateRangePicker };
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=date-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-picker.js","names":[],"sources":["../../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, type ComponentPropsWithRef, type ReactNode } from \"react\";\nimport type { DateRange } from \"react-day-picker\";\n\nimport { Button } from \"@/components/button\";\nimport { Calendar } from \"@/components/calendar\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/components/popover\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * A button that opens a calendar to pick a date.\n *\n * Composed from Popover, Calendar and Button rather than reimplementing any of\n * them, which is also why it is the first registry entry with transitive\n * dependencies — installing it pulls all three.\n *\n * A date picker is a convenience, not the only way in. For a date the user\n * already knows, a typed input is faster than any calendar; pair this with one\n * when speed of entry matters more than browsing.\n */\n\nfunction formatDate(date: Date | undefined, locale?: string): string {\n if (!date) return \"\";\n return new Intl.DateTimeFormat(locale, { dateStyle: \"medium\" }).format(date);\n}\n\nfunction CalendarIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-4 opacity-70\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path\n d=\"M3 10h18M8 3v4M16 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\ninterface DatePickerTriggerProps extends Omit<ComponentPropsWithRef<\"button\">, \"value\"> {\n placeholder: string;\n hasValue: boolean;\n children: ReactNode;\n}\n\nfunction DatePickerTrigger({\n className,\n placeholder: _placeholder,\n hasValue,\n children,\n ...props\n}: DatePickerTriggerProps) {\n return (\n <Button\n variant=\"outline\"\n className={cn(\n \"w-full justify-start gap-2 font-normal\",\n !hasValue && \"text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <CalendarIcon />\n {children}\n </Button>\n );\n}\n\nexport interface DatePickerProps {\n value?: Date;\n defaultValue?: Date;\n onValueChange?: (date: Date | undefined) => void;\n placeholder?: string;\n disabled?: boolean;\n /** BCP 47 tag for formatting the button label. Defaults to the runtime locale. */\n locale?: string;\n className?: string;\n /** Names the popover, which carries role=\"dialog\". */\n label?: string;\n}\n\nexport function DatePicker({\n value: valueProp,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date\",\n disabled,\n locale,\n className,\n label = \"Choose a date\",\n}: DatePickerProps) {\n const [uncontrolled, setUncontrolled] = useState<Date | undefined>(defaultValue);\n const value = valueProp === undefined ? uncontrolled : valueProp;\n const [open, setOpen] = useState(false);\n\n function handleSelect(next: Date | undefined) {\n if (valueProp === undefined) setUncontrolled(next);\n onValueChange?.(next);\n // Closing on selection is right for a single date: the task is complete.\n // A range picker must stay open, since one click is only half an answer.\n setOpen(next ? false : open);\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <DatePickerTrigger\n data-slot=\"date-picker-trigger\"\n placeholder={placeholder}\n hasValue={Boolean(value)}\n disabled={disabled}\n className={className}\n >\n {value ? formatDate(value, locale) : placeholder}\n </DatePickerTrigger>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" aria-label={label}>\n <Calendar\n mode=\"single\"\n selected={value}\n // Open on the selected date's month rather than today's. The calendar\n // does not infer this from `selected`, so without it a user editing a\n // date from last year lands in the wrong place and has to page back.\n defaultMonth={value}\n onSelect={handleSelect}\n autoFocus\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n defaultValue?: DateRange;\n onValueChange?: (range: DateRange | undefined) => void;\n placeholder?: string;\n disabled?: boolean;\n locale?: string;\n className?: string;\n label?: string;\n /** Months shown side by side. Two makes most ranges selectable without paging. */\n numberOfMonths?: number;\n}\n\nexport function DateRangePicker({\n value: valueProp,\n defaultValue,\n onValueChange,\n placeholder = \"Pick a date range\",\n disabled,\n locale,\n className,\n label = \"Choose a date range\",\n numberOfMonths = 2,\n}: DateRangePickerProps) {\n const [uncontrolled, setUncontrolled] = useState<DateRange | undefined>(defaultValue);\n const value = valueProp === undefined ? uncontrolled : valueProp;\n\n function handleSelect(next: DateRange | undefined) {\n if (valueProp === undefined) setUncontrolled(next);\n onValueChange?.(next);\n }\n\n const labelText = value?.from\n ? value.to\n ? `${formatDate(value.from, locale)} – ${formatDate(value.to, locale)}`\n : formatDate(value.from, locale)\n : placeholder;\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <DatePickerTrigger\n data-slot=\"date-range-picker-trigger\"\n placeholder={placeholder}\n hasValue={Boolean(value?.from)}\n disabled={disabled}\n className={className}\n >\n {labelText}\n </DatePickerTrigger>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" aria-label={label}>\n <Calendar\n mode=\"range\"\n selected={value}\n defaultMonth={value?.from}\n onSelect={handleSelect}\n numberOfMonths={numberOfMonths}\n autoFocus\n />\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,SAAS,WAAW,MAAwB,QAAyB;CACnE,IAAI,CAAC,MAAM,OAAO;CAClB,OAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,WAAW,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI;AAC7E;AAEA,SAAS,eAAe;CACtB,OACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,eAAY;EAAO,WAAU;EAAlE,UAAA,CACE,oBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;GAAI,QAAO;GAAe,aAAY;EAAK,CAAA,GACvF,oBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACf,CAAA,CACE;;AAET;AAQA,SAAS,kBAAkB,EACzB,WACA,aAAa,cACb,UACA,UACA,GAAG,SACsB;CACzB,OACE,qBAAC,QAAD;EACE,SAAQ;EACR,WAAW,GACT,0CACA,CAAC,YAAY,yBACb,SACF;EACA,GAAI;EAPN,UAAA,CASE,oBAAC,cAAD,CAAe,CAAA,GACd,QACK;;AAEZ;AAeA,SAAgB,WAAW,EACzB,OAAO,WACP,cACA,eACA,cAAc,eACd,UACA,QACA,WACA,QAAQ,mBACU;CAClB,MAAM,CAAC,cAAc,mBAAmB,SAA2B,YAAY;CAC/E,MAAM,QAAQ,cAAc,KAAA,IAAY,eAAe;CACvD,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CAEtC,SAAS,aAAa,MAAwB;EAC5C,IAAI,cAAc,KAAA,GAAW,gBAAgB,IAAI;EACjD,gBAAgB,IAAI;EAGpB,QAAQ,OAAO,QAAQ,IAAI;CAC7B;CAEA,OACE,qBAAC,SAAD;EAAe;EAAM,cAAc;EAAnC,UAAA,CACE,oBAAC,gBAAD;GAAgB,SAAA;GACd,UAAA,oBAAC,mBAAD;IACE,aAAU;IACG;IACb,UAAU,QAAQ,KAAK;IACb;IACC;IAEV,UAAA,QAAQ,WAAW,OAAO,MAAM,IAAI;GACpB,CAAA;EACL,CAAA,GAChB,oBAAC,gBAAD;GAAgB,WAAU;GAAa,cAAY;GACjD,UAAA,oBAAC,UAAD;IACE,MAAK;IACL,UAAU;IAIV,cAAc;IACd,UAAU;IACV,WAAA;GACD,CAAA;EACa,CAAA,CACT;;AAEb;AAeA,SAAgB,gBAAgB,EAC9B,OAAO,WACP,cACA,eACA,cAAc,qBACd,UACA,QACA,WACA,QAAQ,uBACR,iBAAiB,KACM;CACvB,MAAM,CAAC,cAAc,mBAAmB,SAAgC,YAAY;CACpF,MAAM,QAAQ,cAAc,KAAA,IAAY,eAAe;CAEvD,SAAS,aAAa,MAA6B;EACjD,IAAI,cAAc,KAAA,GAAW,gBAAgB,IAAI;EACjD,gBAAgB,IAAI;CACtB;CAEA,MAAM,YAAY,OAAO,OACrB,MAAM,KACJ,GAAG,WAAW,MAAM,MAAM,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,MAAM,MAClE,WAAW,MAAM,MAAM,MAAM,IAC/B;CAEJ,OACE,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;EAAgB,SAAA;EACd,UAAA,oBAAC,mBAAD;GACE,aAAU;GACG;GACb,UAAU,QAAQ,OAAO,IAAI;GACnB;GACC;GAEV,UAAA;EACgB,CAAA;CACL,CAAA,GAChB,oBAAC,gBAAD;EAAgB,WAAU;EAAa,cAAY;EACjD,UAAA,oBAAC,UAAD;GACE,MAAK;GACL,UAAU;GACV,cAAc,OAAO;GACrB,UAAU;GACM;GAChB,WAAA;EACD,CAAA;CACa,CAAA,CACT,EAAA,CAAA;AAEb"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/date-picker/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "date-picker",
|
|
5
|
+
title: "Date Picker",
|
|
6
|
+
description: "A button that opens a calendar to pick a date or a date range.",
|
|
7
|
+
category: "form",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: ["react-day-picker"],
|
|
10
|
+
registryDependencies: [
|
|
11
|
+
"button",
|
|
12
|
+
"calendar",
|
|
13
|
+
"popover"
|
|
14
|
+
],
|
|
15
|
+
files: ["date-picker.tsx"],
|
|
16
|
+
a11y: "The trigger states the selected date, formatted for the locale, so its accessible name changes with the value. The popover is named because it carries role=\"dialog\". Selecting a single date closes the popover and returns focus to the trigger; a range stays open, since one click is only half an answer. Offer a typed input alongside it for dates the user already knows."
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
export { meta };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/date-picker/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"date-picker\",\n title: \"Date Picker\",\n description: \"A button that opens a calendar to pick a date or a date range.\",\n category: \"form\",\n status: \"stable\",\n dependencies: [\"react-day-picker\"],\n registryDependencies: [\"button\", \"calendar\", \"popover\"],\n files: [\"date-picker.tsx\"],\n a11y:\n \"The trigger states the selected date, formatted for the locale, so its accessible name \" +\n 'changes with the value. The popover is named because it carries role=\"dialog\". Selecting a ' +\n \"single date closes the popover and returns focus to the trigger; a range stays open, since \" +\n \"one click is only half an answer. Offer a typed input alongside it for dates the user \" +\n \"already knows.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC,kBAAkB;CACjC,sBAAsB;EAAC;EAAU;EAAY;CAAS;CACtD,OAAO,CAAC,iBAAiB;CACzB,MACE;AAKJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Dialog } from "radix-ui";
|
|
2
|
+
import { ComponentPropsWithRef } from "react";
|
|
3
|
+
//#region src/components/dialog/dialog.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* A modal window that interrupts the user to gather a response.
|
|
6
|
+
*
|
|
7
|
+
* Focus is trapped while open, restored to the trigger on close, and the rest
|
|
8
|
+
* of the page is hidden from assistive technology — all handled by the
|
|
9
|
+
* underlying primitive rather than reimplemented here.
|
|
10
|
+
*/
|
|
11
|
+
declare const Dialog$1: import("react").FC<Dialog.DialogProps>;
|
|
12
|
+
declare const DialogTrigger: import("react").ForwardRefExoticComponent<Dialog.DialogTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
13
|
+
declare const DialogPortal: import("react").FC<Dialog.DialogPortalProps>;
|
|
14
|
+
declare const DialogClose: import("react").ForwardRefExoticComponent<Dialog.DialogCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
15
|
+
type DialogOverlayProps = ComponentPropsWithRef<typeof Dialog.Overlay>;
|
|
16
|
+
declare function DialogOverlay({ className, ...props }: DialogOverlayProps): import("react").JSX.Element;
|
|
17
|
+
interface DialogContentProps extends ComponentPropsWithRef<typeof Dialog.Content> {
|
|
18
|
+
/** Renders the built-in close button. Turn off to supply your own. */
|
|
19
|
+
showCloseButton?: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function DialogContent({ className, children, showCloseButton, ...props }: DialogContentProps): import("react").JSX.Element;
|
|
22
|
+
declare function DialogHeader({ className, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element;
|
|
23
|
+
declare function DialogFooter({ className, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element;
|
|
24
|
+
type DialogTitleProps = ComponentPropsWithRef<typeof Dialog.Title>;
|
|
25
|
+
declare function DialogTitle({ className, ...props }: DialogTitleProps): import("react").JSX.Element;
|
|
26
|
+
type DialogDescriptionProps = ComponentPropsWithRef<typeof Dialog.Description>;
|
|
27
|
+
declare function DialogDescription({ className, ...props }: DialogDescriptionProps): import("react").JSX.Element;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { Dialog$1 as Dialog, DialogClose, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, DialogFooter, DialogHeader, DialogOverlay, DialogOverlayProps, DialogPortal, DialogTitle, DialogTitleProps, DialogTrigger };
|
|
30
|
+
//# sourceMappingURL=dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","names":[],"sources":["../../../src/components/dialog/dialog.tsx"],"mappings":";;;;;;;;;;cAea,0BAAM,GAAA,OAAA;cACN,+BAAa,0BAAA,OAAA,qCAAA,cAAA;cACb,8BAAY,GAAA,OAAA;cACZ,6BAAW,0BAAA,OAAA,mCAAA,cAAA;KAEZ,qBAAqB,6BAA6B,OAAgB;iBAE9D,gBAAgB,cAAc,SAAS,qCAAkB,IAAA;UAcxD,2BAA2B,6BACnC,OAAgB;;EAGvB;;iBAGc,gBACd,WACA,UACA,oBACG,SACF,qCAAkB,IAAA;iBAyCL,eAAe,cAAc,SAAS,+CAA4B,IAAA;iBAUlE,eAAe,cAAc,SAAS,+CAA4B,IAAA;KAUtE,mBAAmB,6BAA6B,OAAgB;iBAE5D,cAAc,cAAc,SAAS,mCAAgB,IAAA;KAUzD,yBAAyB,6BAA6B,OAAgB;iBAElE,oBAAoB,cAAc,SAAS,yCAAsB,IAAA"}
|