@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 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model-selector.js","names":[],"sources":["../../../src/components/ai-model-selector/ai-model-selector.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithRef, ReactNode } from \"react\";\n\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"@/components/select\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Picks the model a conversation runs on.\n *\n * A thin, opinionated layer over Select rather than a new control: model\n * pickers differ between products in what they show, not in how they behave.\n * What this adds is the shape of the option — a name, a short description, and\n * the fact that some models are unavailable on the current plan — which is the\n * part every implementation gets wrong in the same way, by hiding the reason a\n * model cannot be chosen.\n */\n\nexport interface ModelOption {\n id: string;\n name: string;\n /** One line on what the model is for. */\n description?: string;\n /** Grouping, for example a provider name. */\n group?: string;\n disabled?: boolean;\n /**\n * Why it is unavailable.\n *\n * Shown and announced alongside the name. A disabled option with no reason\n * makes the user think the interface is broken.\n */\n disabledReason?: string;\n badge?: ReactNode;\n}\n\nexport interface ModelSelectorProps extends Omit<\n ComponentPropsWithRef<typeof SelectTrigger>,\n \"children\"\n> {\n models: ModelOption[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n placeholder?: string;\n}\n\nexport function ModelSelector({\n className,\n models,\n value,\n defaultValue,\n onValueChange,\n placeholder = \"Select a model\",\n ...props\n}: ModelSelectorProps) {\n // Preserves the order the caller gave, rather than sorting group names.\n const groups = new Map<string, ModelOption[]>();\n for (const model of models) {\n const key = model.group ?? \"\";\n groups.set(key, [...(groups.get(key) ?? []), model]);\n }\n\n return (\n <Select value={value} defaultValue={defaultValue} onValueChange={onValueChange}>\n <SelectTrigger\n data-slot=\"model-selector\"\n className={cn(\"w-auto min-w-44 gap-2\", className)}\n {...props}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent className=\"min-w-64\">\n {[...groups].map(([group, groupModels]) => (\n <SelectGroup key={group || \"ungrouped\"}>\n {group ? <SelectLabel>{group}</SelectLabel> : null}\n {groupModels.map((model) => (\n <SelectItem\n key={model.id}\n value={model.id}\n disabled={model.disabled}\n textValue={model.name}\n // Only the name reaches the trigger; the description stays in\n // the list where there is room for it.\n label={model.name}\n >\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"flex items-center gap-2\">{model.badge}</span>\n {model.disabled && model.disabledReason ? (\n <span className=\"text-2xs text-muted-foreground\">\n {model.disabledReason}\n </span>\n ) : model.description ? (\n <span className=\"text-2xs text-muted-foreground\">{model.description}</span>\n ) : null}\n </span>\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n );\n}\n"],"mappings":";;;;;AAuDA,SAAgB,cAAc,EAC5B,WACA,QACA,OACA,cACA,eACA,cAAc,kBACd,GAAG,SACkB;CAErB,MAAM,yBAAS,IAAI,IAA2B;CAC9C,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,MAAM,MAAM,SAAS;EAC3B,OAAO,IAAI,KAAK,CAAC,GAAI,OAAO,IAAI,GAAG,KAAK,CAAC,GAAI,KAAK,CAAC;CACrD;CAEA,OACE,qBAAC,QAAD;EAAe;EAAqB;EAA6B;EAAjE,UAAA,CACE,oBAAC,eAAD;GACE,aAAU;GACV,WAAW,GAAG,yBAAyB,SAAS;GAChD,GAAI;GAEJ,UAAA,oBAAC,aAAD,EAA0B,YAAc,CAAA;EAC3B,CAAA,GACf,oBAAC,eAAD;GAAe,WAAU;GACtB,UAAA,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,iBACxB,qBAAC,aAAD,EAAA,UAAA,CACG,QAAQ,oBAAC,aAAD,EAAA,UAAc,MAAmB,CAAA,IAAI,MAC7C,YAAY,KAAK,UAChB,oBAAC,YAAD;IAEE,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,WAAW,MAAM;IAGjB,OAAO,MAAM;IAEb,UAAA,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAA2B,UAAA,MAAM;KAAY,CAAA,GAC5D,MAAM,YAAY,MAAM,iBACvB,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,MAAM;KACH,CAAA,IACJ,MAAM,cACR,oBAAC,QAAD;MAAM,WAAU;MAAkC,UAAA,MAAM;KAAkB,CAAA,IACxE,IACA;;GACI,GAlBL,MAAM,EAkBD,CACb,CACU,EAAA,GAxBK,SAAS,WAwBd,CACd;EACY,CAAA,CACT;;AAEZ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/ai-model-selector/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "ai-model-selector",
|
|
5
|
+
title: "AI Model Selector",
|
|
6
|
+
description: "Picks the model a conversation runs on, with descriptions and availability.",
|
|
7
|
+
category: "ai",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: [],
|
|
10
|
+
registryDependencies: ["select"],
|
|
11
|
+
files: ["ai-model-selector.tsx"],
|
|
12
|
+
a11y: "Inherits Select's listbox keyboard model. Each option sets textValue to the model name so typeahead matches the name rather than the description. A disabled model shows and announces why it is unavailable — a disabled option with no reason reads as a broken interface."
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export { meta };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/ai-model-selector/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"ai-model-selector\",\n title: \"AI Model Selector\",\n description: \"Picks the model a conversation runs on, with descriptions and availability.\",\n category: \"ai\",\n status: \"stable\",\n dependencies: [],\n registryDependencies: [\"select\"],\n files: [\"ai-model-selector.tsx\"],\n a11y:\n \"Inherits Select's listbox keyboard model. Each option sets textValue to the model name so \" +\n \"typeahead matches the name rather than the description. A disabled model shows and \" +\n \"announces why it is unavailable — a disabled option with no reason reads as a broken \" +\n \"interface.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC;CACf,sBAAsB,CAAC,QAAQ;CAC/B,OAAO,CAAC,uBAAuB;CAC/B,MACE;AAIJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, FormEvent } from "react";
|
|
2
|
+
//#region src/components/ai-prompt-input/ai-prompt-input.d.ts
|
|
3
|
+
interface PromptInputProps extends Omit<ComponentPropsWithRef<"form">, "onSubmit"> {
|
|
4
|
+
onSubmit?: (event: FormEvent<HTMLFormElement>) => void;
|
|
5
|
+
/** Blocks submission and dims the composer. */
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
/** A response is in flight: submission is blocked and Stop is shown instead. */
|
|
8
|
+
busy?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare function PromptInput({ className, onSubmit, disabled, busy, children, ...props }: PromptInputProps): import("react").JSX.Element;
|
|
11
|
+
interface PromptInputTextareaProps extends Omit<ComponentPropsWithRef<"textarea">, "rows"> {
|
|
12
|
+
maxRows?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Send on Enter, newline on Shift+Enter.
|
|
15
|
+
*
|
|
16
|
+
* Turn it off for a composer where Enter should always insert a newline and
|
|
17
|
+
* sending is only ever an explicit button press.
|
|
18
|
+
*/
|
|
19
|
+
submitOnEnter?: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function PromptInputTextarea({ className, maxRows, submitOnEnter, onKeyDown, onChange, ...props }: PromptInputTextareaProps): import("react").JSX.Element;
|
|
22
|
+
/** The row beneath the textarea: attachments, model picker, send. */
|
|
23
|
+
declare function PromptInputToolbar({ className, ...props }: ComponentPropsWithRef<"div">): import("react").JSX.Element;
|
|
24
|
+
interface PromptInputSubmitProps extends ComponentPropsWithRef<"button"> {
|
|
25
|
+
/** Label while idle. */
|
|
26
|
+
label?: string;
|
|
27
|
+
/** Label while a response is streaming. */
|
|
28
|
+
stopLabel?: string;
|
|
29
|
+
/** Called instead of submitting when busy. */
|
|
30
|
+
onStop?: () => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Send, or stop.
|
|
34
|
+
*
|
|
35
|
+
* One control with two jobs, because that is what the space affords and what
|
|
36
|
+
* people expect. The accessible name changes with the state, so it is never
|
|
37
|
+
* "Send" while it actually stops.
|
|
38
|
+
*/
|
|
39
|
+
declare function PromptInputSubmit({ className, label, stopLabel, onStop, ...props }: PromptInputSubmitProps): import("react").JSX.Element;
|
|
40
|
+
interface PromptInputCounterProps extends ComponentPropsWithRef<"div"> {
|
|
41
|
+
value: number;
|
|
42
|
+
max: number;
|
|
43
|
+
/** Fraction of the limit past which the counter starts warning. */
|
|
44
|
+
warnAt?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Characters used against a limit.
|
|
48
|
+
*
|
|
49
|
+
* The visible count updates on every keystroke; the live region does not.
|
|
50
|
+
*
|
|
51
|
+
* The naive version toggles `aria-live` on once the count matters, but a region
|
|
52
|
+
* only announces changes that happen *while* it is live — switching it on at
|
|
53
|
+
* the same moment the content changes means the one update worth hearing is the
|
|
54
|
+
* one that is missed. So the region is live from the start and simply has
|
|
55
|
+
* nothing in it until the limit is close, which is also what keeps ordinary
|
|
56
|
+
* typing silent.
|
|
57
|
+
*/
|
|
58
|
+
declare function PromptInputCounter({ className, value, max, warnAt, ...props }: PromptInputCounterProps): import("react").JSX.Element;
|
|
59
|
+
//#endregion
|
|
60
|
+
export { PromptInput, PromptInputCounter, PromptInputCounterProps, PromptInputProps, PromptInputSubmit, PromptInputSubmitProps, PromptInputTextarea, PromptInputTextareaProps, PromptInputToolbar };
|
|
61
|
+
//# sourceMappingURL=ai-prompt-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompt-input.d.ts","names":[],"sources":["../../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"mappings":";;UA2CiB,yBAAyB,KAAK;EAC7C,YAAY,OAAO,UAAU;;EAE7B;;EAEA;;iBAGc,cACd,WACA,UACA,UACA,MACA,aACG,SACF,mCAAgB,IAAA;UA+CF,iCAAiC,KAChD;EAGA;;;;;;;EAOA;;iBAGc,sBACd,WACA,SACA,eACA,WACA,aACG,SACF,2CAAwB,IAAA;;iBAuDX,qBAAqB,cAAc,SAAS,+CAA4B,IAAA;UAUvE,+BAA+B;;EAE9C;;EAEA;;EAEA;;;;;;;;;iBAUc,oBACd,WACA,OACA,WACA,WACG,SACF,yCAAsB,IAAA;UAsCR,gCAAgC;EAC/C;EACA;;EAEA;;;;;;;;;;;;;;iBAec,qBACd,WACA,OACA,KACA,WACG,SACF,0CAAuB,IAAA"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { focusRing, focusRingInset } from "../../lib/styles.js";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { createContext, useContext, useId, useLayoutEffect, useMemo, useRef } from "react";
|
|
6
|
+
//#region src/components/ai-prompt-input/ai-prompt-input.tsx
|
|
7
|
+
const PromptInputContext = createContext(null);
|
|
8
|
+
function usePromptInput(component) {
|
|
9
|
+
const context = useContext(PromptInputContext);
|
|
10
|
+
if (!context) throw new Error(`${component} must be rendered inside <PromptInput>.`);
|
|
11
|
+
return context;
|
|
12
|
+
}
|
|
13
|
+
function PromptInput({ className, onSubmit, disabled = false, busy = false, children, ...props }) {
|
|
14
|
+
const uid = useId();
|
|
15
|
+
const formRef = useRef(null);
|
|
16
|
+
const context = useMemo(() => ({
|
|
17
|
+
textareaId: `${uid}-textarea`,
|
|
18
|
+
disabled,
|
|
19
|
+
busy,
|
|
20
|
+
submit: () => {
|
|
21
|
+
formRef.current?.requestSubmit();
|
|
22
|
+
}
|
|
23
|
+
}), [
|
|
24
|
+
uid,
|
|
25
|
+
disabled,
|
|
26
|
+
busy
|
|
27
|
+
]);
|
|
28
|
+
return /* @__PURE__ */ jsx(PromptInputContext.Provider, {
|
|
29
|
+
value: context,
|
|
30
|
+
children: /* @__PURE__ */ jsx("form", {
|
|
31
|
+
ref: formRef,
|
|
32
|
+
"data-slot": "prompt-input",
|
|
33
|
+
"data-busy": busy || void 0,
|
|
34
|
+
onSubmit: (event) => {
|
|
35
|
+
if (disabled || busy) {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
onSubmit?.(event);
|
|
40
|
+
},
|
|
41
|
+
className: cn("rounded-xl border border-input bg-background shadow-xs", "transition-[border-color,box-shadow] duration-[var(--duration-fast)]", "focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/55", disabled && "opacity-60", className),
|
|
42
|
+
...props,
|
|
43
|
+
children
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Rows the textarea will grow to before it starts scrolling. */
|
|
48
|
+
const DEFAULT_MAX_ROWS = 8;
|
|
49
|
+
function PromptInputTextarea({ className, maxRows = DEFAULT_MAX_ROWS, submitOnEnter = true, onKeyDown, onChange, ...props }) {
|
|
50
|
+
const { textareaId, submit, disabled, busy } = usePromptInput("PromptInputTextarea");
|
|
51
|
+
const ref = useRef(null);
|
|
52
|
+
useLayoutEffect(() => {
|
|
53
|
+
const textarea = ref.current;
|
|
54
|
+
if (!textarea) return;
|
|
55
|
+
textarea.style.height = "auto";
|
|
56
|
+
const maxHeight = (Number.parseFloat(getComputedStyle(textarea).lineHeight) || 20) * maxRows;
|
|
57
|
+
textarea.style.height = `${String(Math.min(textarea.scrollHeight, maxHeight))}px`;
|
|
58
|
+
textarea.style.overflowY = textarea.scrollHeight > maxHeight ? "auto" : "hidden";
|
|
59
|
+
});
|
|
60
|
+
function handleKeyDown(event) {
|
|
61
|
+
onKeyDown?.(event);
|
|
62
|
+
if (event.defaultPrevented || !submitOnEnter) return;
|
|
63
|
+
if (event.key !== "Enter" || event.shiftKey) return;
|
|
64
|
+
if (event.nativeEvent.isComposing) return;
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
submit();
|
|
67
|
+
}
|
|
68
|
+
return /* @__PURE__ */ jsx("textarea", {
|
|
69
|
+
ref,
|
|
70
|
+
id: textareaId,
|
|
71
|
+
"data-slot": "prompt-input-textarea",
|
|
72
|
+
rows: 1,
|
|
73
|
+
disabled,
|
|
74
|
+
"aria-disabled": busy || void 0,
|
|
75
|
+
onKeyDown: handleKeyDown,
|
|
76
|
+
onChange,
|
|
77
|
+
className: cn("block w-full resize-none bg-transparent px-4 py-3 text-sm outline-none", "placeholder:text-muted-foreground disabled:cursor-not-allowed", focusRingInset, "focus-visible:ring-0", className),
|
|
78
|
+
...props
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** The row beneath the textarea: attachments, model picker, send. */
|
|
82
|
+
function PromptInputToolbar({ className, ...props }) {
|
|
83
|
+
return /* @__PURE__ */ jsx("div", {
|
|
84
|
+
"data-slot": "prompt-input-toolbar",
|
|
85
|
+
className: cn("flex items-center gap-2 px-2 pb-2", className),
|
|
86
|
+
...props
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Send, or stop.
|
|
91
|
+
*
|
|
92
|
+
* One control with two jobs, because that is what the space affords and what
|
|
93
|
+
* people expect. The accessible name changes with the state, so it is never
|
|
94
|
+
* "Send" while it actually stops.
|
|
95
|
+
*/
|
|
96
|
+
function PromptInputSubmit({ className, label = "Send message", stopLabel = "Stop generating", onStop, ...props }) {
|
|
97
|
+
const { busy, disabled } = usePromptInput("PromptInputSubmit");
|
|
98
|
+
return /* @__PURE__ */ jsx("button", {
|
|
99
|
+
type: busy ? "button" : "submit",
|
|
100
|
+
"data-slot": "prompt-input-submit",
|
|
101
|
+
"aria-label": busy ? stopLabel : label,
|
|
102
|
+
disabled,
|
|
103
|
+
onClick: busy ? onStop : void 0,
|
|
104
|
+
className: cn("ml-auto grid size-8 shrink-0 place-items-center rounded-lg", "bg-primary text-primary-foreground transition-colors duration-[var(--duration-fast)]", "hover:bg-primary-hover disabled:pointer-events-none disabled:opacity-55", focusRing, className),
|
|
105
|
+
...props,
|
|
106
|
+
children: busy ? /* @__PURE__ */ jsx("svg", {
|
|
107
|
+
viewBox: "0 0 24 24",
|
|
108
|
+
fill: "none",
|
|
109
|
+
"aria-hidden": "true",
|
|
110
|
+
className: "size-3.5",
|
|
111
|
+
children: /* @__PURE__ */ jsx("rect", {
|
|
112
|
+
x: "6",
|
|
113
|
+
y: "6",
|
|
114
|
+
width: "12",
|
|
115
|
+
height: "12",
|
|
116
|
+
rx: "2",
|
|
117
|
+
fill: "currentColor"
|
|
118
|
+
})
|
|
119
|
+
}) : /* @__PURE__ */ jsx("svg", {
|
|
120
|
+
viewBox: "0 0 24 24",
|
|
121
|
+
fill: "none",
|
|
122
|
+
"aria-hidden": "true",
|
|
123
|
+
className: "size-4",
|
|
124
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
125
|
+
d: "M12 19V5m0 0-6 6m6-6 6 6",
|
|
126
|
+
stroke: "currentColor",
|
|
127
|
+
strokeWidth: "2",
|
|
128
|
+
strokeLinecap: "round",
|
|
129
|
+
strokeLinejoin: "round"
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Characters used against a limit.
|
|
136
|
+
*
|
|
137
|
+
* The visible count updates on every keystroke; the live region does not.
|
|
138
|
+
*
|
|
139
|
+
* The naive version toggles `aria-live` on once the count matters, but a region
|
|
140
|
+
* only announces changes that happen *while* it is live — switching it on at
|
|
141
|
+
* the same moment the content changes means the one update worth hearing is the
|
|
142
|
+
* one that is missed. So the region is live from the start and simply has
|
|
143
|
+
* nothing in it until the limit is close, which is also what keeps ordinary
|
|
144
|
+
* typing silent.
|
|
145
|
+
*/
|
|
146
|
+
function PromptInputCounter({ className, value, max, warnAt = .9, ...props }) {
|
|
147
|
+
const warning = value >= max * warnAt;
|
|
148
|
+
const over = value > max;
|
|
149
|
+
const remaining = max - value;
|
|
150
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
151
|
+
"data-slot": "prompt-input-counter",
|
|
152
|
+
"data-warning": warning || void 0,
|
|
153
|
+
"data-over": over || void 0,
|
|
154
|
+
className: cn("text-xs tabular-nums", over ? "text-destructive" : warning ? "text-warning" : "text-muted-foreground", className),
|
|
155
|
+
...props,
|
|
156
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
157
|
+
"aria-hidden": "true",
|
|
158
|
+
children: warning ? `${String(value)} / ${String(max)}` : String(value)
|
|
159
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
160
|
+
role: "status",
|
|
161
|
+
"aria-live": "polite",
|
|
162
|
+
className: "sr-only",
|
|
163
|
+
children: over ? `Over the limit by ${String(-remaining)} characters` : warning ? `${String(remaining)} characters remaining` : ""
|
|
164
|
+
})]
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//#endregion
|
|
168
|
+
export { PromptInput, PromptInputCounter, PromptInputSubmit, PromptInputTextarea, PromptInputToolbar };
|
|
169
|
+
|
|
170
|
+
//# sourceMappingURL=ai-prompt-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompt-input.js","names":[],"sources":["../../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n type ComponentPropsWithRef,\n type FormEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\n\nimport { focusRing, focusRingInset } from \"@/lib/styles\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * The composer.\n *\n * Handles the parts of a chat input that are easy to get subtly wrong:\n * auto-growing to fit the text up to a ceiling, sending on Enter without\n * breaking multi-line input, and — the one almost everybody misses —\n * not sending mid-composition when someone is typing with an IME.\n */\n\ninterface PromptInputContextValue {\n textareaId: string;\n submit: () => void;\n disabled: boolean;\n busy: boolean;\n}\n\nconst PromptInputContext = createContext<PromptInputContextValue | null>(null);\n\nfunction usePromptInput(component: string): PromptInputContextValue {\n const context = useContext(PromptInputContext);\n if (!context) {\n throw new Error(`${component} must be rendered inside <PromptInput>.`);\n }\n return context;\n}\n\nexport interface PromptInputProps extends Omit<ComponentPropsWithRef<\"form\">, \"onSubmit\"> {\n onSubmit?: (event: FormEvent<HTMLFormElement>) => void;\n /** Blocks submission and dims the composer. */\n disabled?: boolean;\n /** A response is in flight: submission is blocked and Stop is shown instead. */\n busy?: boolean;\n}\n\nexport function PromptInput({\n className,\n onSubmit,\n disabled = false,\n busy = false,\n children,\n ...props\n}: PromptInputProps) {\n const uid = useId();\n const formRef = useRef<HTMLFormElement | null>(null);\n\n const context = useMemo<PromptInputContextValue>(\n () => ({\n textareaId: `${uid}-textarea`,\n disabled,\n busy,\n submit: () => {\n formRef.current?.requestSubmit();\n },\n }),\n [uid, disabled, busy],\n );\n\n return (\n <PromptInputContext.Provider value={context}>\n <form\n ref={formRef}\n data-slot=\"prompt-input\"\n data-busy={busy || undefined}\n onSubmit={(event) => {\n if (disabled || busy) {\n event.preventDefault();\n return;\n }\n onSubmit?.(event);\n }}\n className={cn(\n \"rounded-xl border border-input bg-background shadow-xs\",\n \"transition-[border-color,box-shadow] duration-[var(--duration-fast)]\",\n \"focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/55\",\n disabled && \"opacity-60\",\n className,\n )}\n {...props}\n >\n {children}\n </form>\n </PromptInputContext.Provider>\n );\n}\n\n/** Rows the textarea will grow to before it starts scrolling. */\nconst DEFAULT_MAX_ROWS = 8;\n\nexport interface PromptInputTextareaProps extends Omit<\n ComponentPropsWithRef<\"textarea\">,\n \"rows\"\n> {\n maxRows?: number;\n /**\n * Send on Enter, newline on Shift+Enter.\n *\n * Turn it off for a composer where Enter should always insert a newline and\n * sending is only ever an explicit button press.\n */\n submitOnEnter?: boolean;\n}\n\nexport function PromptInputTextarea({\n className,\n maxRows = DEFAULT_MAX_ROWS,\n submitOnEnter = true,\n onKeyDown,\n onChange,\n ...props\n}: PromptInputTextareaProps) {\n const { textareaId, submit, disabled, busy } = usePromptInput(\"PromptInputTextarea\");\n const ref = useRef<HTMLTextAreaElement | null>(null);\n\n // Grows with the content up to maxRows, then scrolls. Measured after layout\n // so the height is right on the first paint rather than one frame late.\n useLayoutEffect(() => {\n const textarea = ref.current;\n if (!textarea) return;\n\n textarea.style.height = \"auto\";\n const lineHeight = Number.parseFloat(getComputedStyle(textarea).lineHeight) || 20;\n const maxHeight = lineHeight * maxRows;\n textarea.style.height = `${String(Math.min(textarea.scrollHeight, maxHeight))}px`;\n textarea.style.overflowY = textarea.scrollHeight > maxHeight ? \"auto\" : \"hidden\";\n });\n\n function handleKeyDown(event: ReactKeyboardEvent<HTMLTextAreaElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented || !submitOnEnter) return;\n if (event.key !== \"Enter\" || event.shiftKey) return;\n\n // Mid-composition Enter confirms the candidate an IME is offering — for\n // Japanese, Chinese, Korean and others it is part of typing a word, not a\n // request to send. Sending here truncates the sentence and is the single\n // most common way a chat composer breaks for those users.\n if (event.nativeEvent.isComposing) return;\n\n event.preventDefault();\n submit();\n }\n\n return (\n <textarea\n ref={ref}\n id={textareaId}\n data-slot=\"prompt-input-textarea\"\n rows={1}\n disabled={disabled}\n aria-disabled={busy || undefined}\n onKeyDown={handleKeyDown}\n onChange={onChange}\n className={cn(\n \"block w-full resize-none bg-transparent px-4 py-3 text-sm outline-none\",\n \"placeholder:text-muted-foreground disabled:cursor-not-allowed\",\n focusRingInset,\n \"focus-visible:ring-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The row beneath the textarea: attachments, model picker, send. */\nexport function PromptInputToolbar({ className, ...props }: ComponentPropsWithRef<\"div\">) {\n return (\n <div\n data-slot=\"prompt-input-toolbar\"\n className={cn(\"flex items-center gap-2 px-2 pb-2\", className)}\n {...props}\n />\n );\n}\n\nexport interface PromptInputSubmitProps extends ComponentPropsWithRef<\"button\"> {\n /** Label while idle. */\n label?: string;\n /** Label while a response is streaming. */\n stopLabel?: string;\n /** Called instead of submitting when busy. */\n onStop?: () => void;\n}\n\n/**\n * Send, or stop.\n *\n * One control with two jobs, because that is what the space affords and what\n * people expect. The accessible name changes with the state, so it is never\n * \"Send\" while it actually stops.\n */\nexport function PromptInputSubmit({\n className,\n label = \"Send message\",\n stopLabel = \"Stop generating\",\n onStop,\n ...props\n}: PromptInputSubmitProps) {\n const { busy, disabled } = usePromptInput(\"PromptInputSubmit\");\n\n return (\n <button\n type={busy ? \"button\" : \"submit\"}\n data-slot=\"prompt-input-submit\"\n aria-label={busy ? stopLabel : label}\n disabled={disabled}\n onClick={busy ? onStop : undefined}\n className={cn(\n \"ml-auto grid size-8 shrink-0 place-items-center rounded-lg\",\n \"bg-primary text-primary-foreground transition-colors duration-[var(--duration-fast)]\",\n \"hover:bg-primary-hover disabled:pointer-events-none disabled:opacity-55\",\n focusRing,\n className,\n )}\n {...props}\n >\n {busy ? (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-3.5\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" fill=\"currentColor\" />\n </svg>\n ) : (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-4\">\n <path\n d=\"M12 19V5m0 0-6 6m6-6 6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n\nexport interface PromptInputCounterProps extends ComponentPropsWithRef<\"div\"> {\n value: number;\n max: number;\n /** Fraction of the limit past which the counter starts warning. */\n warnAt?: number;\n}\n\n/**\n * Characters used against a limit.\n *\n * The visible count updates on every keystroke; the live region does not.\n *\n * The naive version toggles `aria-live` on once the count matters, but a region\n * only announces changes that happen *while* it is live — switching it on at\n * the same moment the content changes means the one update worth hearing is the\n * one that is missed. So the region is live from the start and simply has\n * nothing in it until the limit is close, which is also what keeps ordinary\n * typing silent.\n */\nexport function PromptInputCounter({\n className,\n value,\n max,\n warnAt = 0.9,\n ...props\n}: PromptInputCounterProps) {\n const warning = value >= max * warnAt;\n const over = value > max;\n const remaining = max - value;\n\n return (\n <div\n data-slot=\"prompt-input-counter\"\n data-warning={warning || undefined}\n data-over={over || undefined}\n className={cn(\n \"text-xs tabular-nums\",\n over ? \"text-destructive\" : warning ? \"text-warning\" : \"text-muted-foreground\",\n className,\n )}\n {...props}\n >\n <span aria-hidden=\"true\">\n {warning ? `${String(value)} / ${String(max)}` : String(value)}\n </span>\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {over\n ? `Over the limit by ${String(-remaining)} characters`\n : warning\n ? `${String(remaining)} characters remaining`\n : \"\"}\n </span>\n </div>\n );\n}\n"],"mappings":";;;;;;AAiCA,MAAM,qBAAqB,cAA8C,IAAI;AAE7E,SAAS,eAAe,WAA4C;CAClE,MAAM,UAAU,WAAW,kBAAkB;CAC7C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,GAAG,UAAU,wCAAwC;CAEvE,OAAO;AACT;AAUA,SAAgB,YAAY,EAC1B,WACA,UACA,WAAW,OACX,OAAO,OACP,UACA,GAAG,SACgB;CACnB,MAAM,MAAM,MAAM;CAClB,MAAM,UAAU,OAA+B,IAAI;CAEnD,MAAM,UAAU,eACP;EACL,YAAY,GAAG,IAAI;EACnB;EACA;EACA,cAAc;GACZ,QAAQ,SAAS,cAAc;EACjC;CACF,IACA;EAAC;EAAK;EAAU;CAAI,CACtB;CAEA,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO;EAClC,UAAA,oBAAC,QAAD;GACE,KAAK;GACL,aAAU;GACV,aAAW,QAAQ,KAAA;GACnB,WAAW,UAAU;IACnB,IAAI,YAAY,MAAM;KACpB,MAAM,eAAe;KACrB;IACF;IACA,WAAW,KAAK;GAClB;GACA,WAAW,GACT,0DACA,wEACA,0EACA,YAAY,cACZ,SACF;GACA,GAAI;GAEH;EACG,CAAA;CACqB,CAAA;AAEjC;;AAGA,MAAM,mBAAmB;AAgBzB,SAAgB,oBAAoB,EAClC,WACA,UAAU,kBACV,gBAAgB,MAChB,WACA,UACA,GAAG,SACwB;CAC3B,MAAM,EAAE,YAAY,QAAQ,UAAU,SAAS,eAAe,qBAAqB;CACnF,MAAM,MAAM,OAAmC,IAAI;CAInD,sBAAsB;EACpB,MAAM,WAAW,IAAI;EACrB,IAAI,CAAC,UAAU;EAEf,SAAS,MAAM,SAAS;EAExB,MAAM,aADa,OAAO,WAAW,iBAAiB,QAAQ,CAAC,CAAC,UAAU,KAAK,MAChD;EAC/B,SAAS,MAAM,SAAS,GAAG,OAAO,KAAK,IAAI,SAAS,cAAc,SAAS,CAAC,EAAE;EAC9E,SAAS,MAAM,YAAY,SAAS,eAAe,YAAY,SAAS;CAC1E,CAAC;CAED,SAAS,cAAc,OAAgD;EACrE,YAAY,KAAK;EACjB,IAAI,MAAM,oBAAoB,CAAC,eAAe;EAC9C,IAAI,MAAM,QAAQ,WAAW,MAAM,UAAU;EAM7C,IAAI,MAAM,YAAY,aAAa;EAEnC,MAAM,eAAe;EACrB,OAAO;CACT;CAEA,OACE,oBAAC,YAAD;EACO;EACL,IAAI;EACJ,aAAU;EACV,MAAM;EACI;EACV,iBAAe,QAAQ,KAAA;EACvB,WAAW;EACD;EACV,WAAW,GACT,0EACA,iEACA,gBACA,wBACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAgB,mBAAmB,EAAE,WAAW,GAAG,SAAuC;CACxF,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,qCAAqC,SAAS;EAC5D,GAAI;CACL,CAAA;AAEL;;;;;;;;AAkBA,SAAgB,kBAAkB,EAChC,WACA,QAAQ,gBACR,YAAY,mBACZ,QACA,GAAG,SACsB;CACzB,MAAM,EAAE,MAAM,aAAa,eAAe,mBAAmB;CAE7D,OACE,oBAAC,UAAD;EACE,MAAM,OAAO,WAAW;EACxB,aAAU;EACV,cAAY,OAAO,YAAY;EACrB;EACV,SAAS,OAAO,SAAS,KAAA;EACzB,WAAW,GACT,8DACA,wFACA,2EACA,WACA,SACF;EACA,GAAI;EAEH,UAAA,OACC,oBAAC,OAAD;GAAK,SAAQ;GAAY,MAAK;GAAO,eAAY;GAAO,WAAU;GAChE,UAAA,oBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IAAK,IAAG;IAAI,MAAK;GAAgB,CAAA;EAClE,CAAA,IAEL,oBAAC,OAAD;GAAK,SAAQ;GAAY,MAAK;GAAO,eAAY;GAAO,WAAU;GAChE,UAAA,oBAAC,QAAD;IACE,GAAE;IACF,QAAO;IACP,aAAY;IACZ,eAAc;IACd,gBAAe;GAChB,CAAA;EACE,CAAA;CAED,CAAA;AAEZ;;;;;;;;;;;;;AAqBA,SAAgB,mBAAmB,EACjC,WACA,OACA,KACA,SAAS,IACT,GAAG,SACuB;CAC1B,MAAM,UAAU,SAAS,MAAM;CAC/B,MAAM,OAAO,QAAQ;CACrB,MAAM,YAAY,MAAM;CAExB,OACE,qBAAC,OAAD;EACE,aAAU;EACV,gBAAc,WAAW,KAAA;EACzB,aAAW,QAAQ,KAAA;EACnB,WAAW,GACT,wBACA,OAAO,qBAAqB,UAAU,iBAAiB,yBACvD,SACF;EACA,GAAI;EATN,UAAA,CAWE,oBAAC,QAAD;GAAM,eAAY;GACf,UAAA,UAAU,GAAG,OAAO,KAAK,EAAE,KAAK,OAAO,GAAG,MAAM,OAAO,KAAK;EACzD,CAAA,GACN,oBAAC,QAAD;GAAM,MAAK;GAAS,aAAU;GAAS,WAAU;GAC9C,UAAA,OACG,qBAAqB,OAAO,CAAC,SAAS,EAAE,eACxC,UACE,GAAG,OAAO,SAAS,EAAE,yBACrB;EACF,CAAA,CACH;;AAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { PromptInput, PromptInputCounter, PromptInputCounterProps, PromptInputProps, PromptInputSubmit, PromptInputSubmitProps, PromptInputTextarea, PromptInputTextareaProps, PromptInputToolbar } from "./ai-prompt-input.js";
|
|
2
|
+
export { PromptInput, PromptInputCounter, type PromptInputCounterProps, type PromptInputProps, PromptInputSubmit, type PromptInputSubmitProps, PromptInputTextarea, type PromptInputTextareaProps, PromptInputToolbar };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/ai-prompt-input/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "ai-prompt-input",
|
|
5
|
+
title: "AI Prompt Input",
|
|
6
|
+
description: "The composer: auto-growing textarea, send-on-Enter, and a send/stop control.",
|
|
7
|
+
category: "ai",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: [],
|
|
10
|
+
registryDependencies: [],
|
|
11
|
+
files: ["ai-prompt-input.tsx"],
|
|
12
|
+
a11y: "Enter sends and Shift+Enter inserts a newline, but never while an IME composition is active — for Japanese, Chinese and Korean input Enter confirms a candidate, and sending there truncates the sentence mid-word. The submit control renames itself to \"Stop generating\" while busy, so its accessible name always matches what it does. The character counter stays silent until it nears the limit; announcing every keystroke would be unusable."
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export { meta };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/ai-prompt-input/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"ai-prompt-input\",\n title: \"AI Prompt Input\",\n description: \"The composer: auto-growing textarea, send-on-Enter, and a send/stop control.\",\n category: \"ai\",\n status: \"stable\",\n dependencies: [],\n registryDependencies: [],\n files: [\"ai-prompt-input.tsx\"],\n a11y:\n \"Enter sends and Shift+Enter inserts a newline, but never while an IME composition is active \" +\n \"— for Japanese, Chinese and Korean input Enter confirms a candidate, and sending there \" +\n 'truncates the sentence mid-word. The submit control renames itself to \"Stop generating\" ' +\n \"while busy, so its accessible name always matches what it does. The character counter stays \" +\n \"silent until it nears the limit; announcing every keystroke would be unusable.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC;CACf,sBAAsB,CAAC;CACvB,OAAO,CAAC,qBAAqB;CAC7B,MACE;AAKJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Collapsible } from "radix-ui";
|
|
2
|
+
import { ComponentPropsWithRef } from "react";
|
|
3
|
+
//#region src/components/ai-reasoning/ai-reasoning.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The model's reasoning, tucked away.
|
|
6
|
+
*
|
|
7
|
+
* Collapsed by default and deliberately understated. Reasoning is supporting
|
|
8
|
+
* material — surfacing it at the same weight as the answer buries the answer,
|
|
9
|
+
* and most readers never want it. It stays one keystroke away for the people
|
|
10
|
+
* who do.
|
|
11
|
+
*/
|
|
12
|
+
type ReasoningProps = ComponentPropsWithRef<typeof Collapsible.Root>;
|
|
13
|
+
declare function Reasoning({ className, ...props }: ReasoningProps): import("react").JSX.Element;
|
|
14
|
+
interface ReasoningTriggerProps extends ComponentPropsWithRef<typeof Collapsible.Trigger> {
|
|
15
|
+
/** Shown while reasoning is still arriving. */
|
|
16
|
+
streaming?: boolean;
|
|
17
|
+
label?: string;
|
|
18
|
+
streamingLabel?: string;
|
|
19
|
+
}
|
|
20
|
+
declare function ReasoningTrigger({ className, streaming, label, streamingLabel, children, ...props }: ReasoningTriggerProps): import("react").JSX.Element;
|
|
21
|
+
declare function ReasoningContent({ className, children, ...props }: ComponentPropsWithRef<typeof Collapsible.Content>): import("react").JSX.Element;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { Reasoning, ReasoningContent, ReasoningProps, ReasoningTrigger, ReasoningTriggerProps };
|
|
24
|
+
//# sourceMappingURL=ai-reasoning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-reasoning.d.ts","names":[],"sources":["../../../src/components/ai-reasoning/ai-reasoning.tsx"],"mappings":";;;;;;;;;;;KAgBY,iBAAiB,6BAA6B,YAAqB;iBAE/D,YAAY,cAAc,SAAS,iCAAc,IAAA;UAUhD,8BAA8B,6BACtC,YAAqB;;EAG5B;EACA;EACA;;iBAGc,mBACd,WACA,WACA,OACA,gBACA,aACG,SACF,wCAAqB,IAAA;iBAyCR,mBACd,WACA,aACG,SACF,6BAA6B,YAAqB,2BAAQ,IAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { focusRing } from "../../lib/styles.js";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
import { Collapsible } from "radix-ui";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/ai-reasoning/ai-reasoning.tsx
|
|
7
|
+
function Reasoning({ className, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Collapsible.Root, {
|
|
9
|
+
"data-slot": "reasoning",
|
|
10
|
+
className: cn("text-sm", className),
|
|
11
|
+
...props
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function ReasoningTrigger({ className, streaming, label = "Reasoning", streamingLabel = "Thinking…", children, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsxs(Collapsible.Trigger, {
|
|
16
|
+
"data-slot": "reasoning-trigger",
|
|
17
|
+
className: cn("flex items-center gap-1.5 rounded-md text-xs text-muted-foreground", "transition-colors duration-[var(--duration-fast)] hover:text-foreground", "[&[data-state=open]>svg:last-child]:rotate-180", focusRing, className),
|
|
18
|
+
...props,
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx("svg", {
|
|
21
|
+
viewBox: "0 0 24 24",
|
|
22
|
+
fill: "none",
|
|
23
|
+
"aria-hidden": "true",
|
|
24
|
+
className: "size-3.5 shrink-0",
|
|
25
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
26
|
+
d: "M9.5 21h5M12 3a6 6 0 0 1 3.6 10.8c-.6.5-.9 1.1-1 1.7l-.1.5h-5l-.1-.5c-.1-.6-.4-1.2-1-1.7A6 6 0 0 1 12 3Z",
|
|
27
|
+
stroke: "currentColor",
|
|
28
|
+
strokeWidth: "1.75",
|
|
29
|
+
strokeLinecap: "round",
|
|
30
|
+
strokeLinejoin: "round"
|
|
31
|
+
})
|
|
32
|
+
}),
|
|
33
|
+
children ?? (streaming ? streamingLabel : label),
|
|
34
|
+
/* @__PURE__ */ jsx("svg", {
|
|
35
|
+
viewBox: "0 0 24 24",
|
|
36
|
+
fill: "none",
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
className: "size-3.5 shrink-0 transition-transform duration-[var(--duration-normal)]",
|
|
39
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
40
|
+
d: "m6 9 6 6 6-6",
|
|
41
|
+
stroke: "currentColor",
|
|
42
|
+
strokeWidth: "2",
|
|
43
|
+
strokeLinecap: "round",
|
|
44
|
+
strokeLinejoin: "round"
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function ReasoningContent({ className, children, ...props }) {
|
|
51
|
+
return /* @__PURE__ */ jsx(Collapsible.Content, {
|
|
52
|
+
"data-slot": "reasoning-content",
|
|
53
|
+
className: cn("overflow-hidden", "data-[state=closed]:animate-accordion-close data-[state=open]:animate-accordion-open", className),
|
|
54
|
+
...props,
|
|
55
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
56
|
+
className: "mt-2 border-l-2 border-border pl-3 text-sm whitespace-pre-wrap text-muted-foreground",
|
|
57
|
+
children
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { Reasoning, ReasoningContent, ReasoningTrigger };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=ai-reasoning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-reasoning.js","names":["CollapsiblePrimitive"],"sources":["../../../src/components/ai-reasoning/ai-reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\";\nimport type { ComponentPropsWithRef } from \"react\";\n\nimport { focusRing } from \"@/lib/styles\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * The model's reasoning, tucked away.\n *\n * Collapsed by default and deliberately understated. Reasoning is supporting\n * material — surfacing it at the same weight as the answer buries the answer,\n * and most readers never want it. It stays one keystroke away for the people\n * who do.\n */\nexport type ReasoningProps = ComponentPropsWithRef<typeof CollapsiblePrimitive.Root>;\n\nexport function Reasoning({ className, ...props }: ReasoningProps) {\n return (\n <CollapsiblePrimitive.Root\n data-slot=\"reasoning\"\n className={cn(\"text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport interface ReasoningTriggerProps extends ComponentPropsWithRef<\n typeof CollapsiblePrimitive.Trigger\n> {\n /** Shown while reasoning is still arriving. */\n streaming?: boolean;\n label?: string;\n streamingLabel?: string;\n}\n\nexport function ReasoningTrigger({\n className,\n streaming,\n label = \"Reasoning\",\n streamingLabel = \"Thinking…\",\n children,\n ...props\n}: ReasoningTriggerProps) {\n return (\n <CollapsiblePrimitive.Trigger\n data-slot=\"reasoning-trigger\"\n className={cn(\n \"flex items-center gap-1.5 rounded-md text-xs text-muted-foreground\",\n \"transition-colors duration-[var(--duration-fast)] hover:text-foreground\",\n \"[&[data-state=open]>svg:last-child]:rotate-180\",\n focusRing,\n className,\n )}\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className=\"size-3.5 shrink-0\">\n <path\n d=\"M9.5 21h5M12 3a6 6 0 0 1 3.6 10.8c-.6.5-.9 1.1-1 1.7l-.1.5h-5l-.1-.5c-.1-.6-.4-1.2-1-1.7A6 6 0 0 1 12 3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {children ?? (streaming ? streamingLabel : label)}\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 transition-transform duration-[var(--duration-normal)]\"\n >\n <path\n d=\"m6 9 6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </CollapsiblePrimitive.Trigger>\n );\n}\n\nexport function ReasoningContent({\n className,\n children,\n ...props\n}: ComponentPropsWithRef<typeof CollapsiblePrimitive.Content>) {\n return (\n <CollapsiblePrimitive.Content\n data-slot=\"reasoning-content\"\n className={cn(\n \"overflow-hidden\",\n \"data-[state=closed]:animate-accordion-close data-[state=open]:animate-accordion-open\",\n className,\n )}\n {...props}\n >\n <div className=\"mt-2 border-l-2 border-border pl-3 text-sm whitespace-pre-wrap text-muted-foreground\">\n {children}\n </div>\n </CollapsiblePrimitive.Content>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;CACjE,OACE,oBAACA,YAAqB,MAAtB;EACE,aAAU;EACV,WAAW,GAAG,WAAW,SAAS;EAClC,GAAI;CACL,CAAA;AAEL;AAWA,SAAgB,iBAAiB,EAC/B,WACA,WACA,QAAQ,aACR,iBAAiB,aACjB,UACA,GAAG,SACqB;CACxB,OACE,qBAACA,YAAqB,SAAtB;EACE,aAAU;EACV,WAAW,GACT,sEACA,2EACA,kDACA,WACA,SACF;EACA,GAAI;EATN,UAAA;GAWE,oBAAC,OAAD;IAAK,SAAQ;IAAY,MAAK;IAAO,eAAY;IAAO,WAAU;IAChE,UAAA,oBAAC,QAAD;KACE,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;IAChB,CAAA;GACE,CAAA;GACJ,aAAa,YAAY,iBAAiB;GAC3C,oBAAC,OAAD;IACE,SAAQ;IACR,MAAK;IACL,eAAY;IACZ,WAAU;IAEV,UAAA,oBAAC,QAAD;KACE,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,gBAAe;IAChB,CAAA;GACE,CAAA;EACuB;;AAElC;AAEA,SAAgB,iBAAiB,EAC/B,WACA,UACA,GAAG,SAC0D;CAC7D,OACE,oBAACA,YAAqB,SAAtB;EACE,aAAU;EACV,WAAW,GACT,mBACA,wFACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAU;GACZ;EACE,CAAA;CACuB,CAAA;AAElC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/ai-reasoning/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "ai-reasoning",
|
|
5
|
+
title: "AI Reasoning",
|
|
6
|
+
description: "A collapsible disclosure for the model's reasoning.",
|
|
7
|
+
category: "ai",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: ["radix-ui"],
|
|
10
|
+
registryDependencies: [],
|
|
11
|
+
files: ["ai-reasoning.tsx"],
|
|
12
|
+
a11y: "A standard disclosure with aria-expanded on the trigger. Collapsed by default because reasoning is supporting material — giving it the same weight as the answer buries the answer. The trigger's label changes while reasoning streams, so its accessible name matches what is happening."
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export { meta };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/ai-reasoning/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"ai-reasoning\",\n title: \"AI Reasoning\",\n description: \"A collapsible disclosure for the model's reasoning.\",\n category: \"ai\",\n status: \"stable\",\n dependencies: [\"radix-ui\"],\n registryDependencies: [],\n files: [\"ai-reasoning.tsx\"],\n a11y:\n \"A standard disclosure with aria-expanded on the trigger. Collapsed by default because \" +\n \"reasoning is supporting material — giving it the same weight as the answer buries the \" +\n \"answer. The trigger's label changes while reasoning streams, so its accessible name matches \" +\n \"what is happening.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC,UAAU;CACzB,sBAAsB,CAAC;CACvB,OAAO,CAAC,kBAAkB;CAC1B,MACE;AAIJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ComponentPropsWithRef } from "react";
|
|
2
|
+
//#region src/components/ai-response/ai-response.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The text of an assistant response.
|
|
5
|
+
*
|
|
6
|
+
* Renders plain text with paragraph whitespace preserved. Markdown is
|
|
7
|
+
* deliberately not parsed here: a Markdown renderer is a dependency, a security
|
|
8
|
+
* decision about raw HTML, and a styling surface all at once, and every product
|
|
9
|
+
* makes those differently. Pass already-rendered content as children when you
|
|
10
|
+
* need it — the prose styling below applies either way.
|
|
11
|
+
*
|
|
12
|
+
* Not a live region, and not by omission. See the note on `Conversation`:
|
|
13
|
+
* announcing streamed text token by token is unusable with a screen reader.
|
|
14
|
+
*/
|
|
15
|
+
interface ResponseProps extends ComponentPropsWithRef<"div"> {
|
|
16
|
+
/** Shows the caret. Purely visual — it carries no announcement. */
|
|
17
|
+
streaming?: boolean;
|
|
18
|
+
}
|
|
19
|
+
declare function Response({ className, streaming, children, ...props }: ResponseProps): import("react").JSX.Element;
|
|
20
|
+
/** The trailing cursor. Decorative — the streaming state is announced, if at
|
|
21
|
+
* all, through ConversationStatus. */
|
|
22
|
+
declare function ResponseCaret({ className, ...props }: ComponentPropsWithRef<"span">): import("react").JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* Shown while waiting for the first token.
|
|
25
|
+
*
|
|
26
|
+
* A distinct state from streaming: nothing has arrived yet, so there is no text
|
|
27
|
+
* to show a caret after. Labelled for assistive technology because, unlike the
|
|
28
|
+
* caret, this is the only thing on screen.
|
|
29
|
+
*/
|
|
30
|
+
interface ThinkingIndicatorProps extends ComponentPropsWithRef<"div"> {
|
|
31
|
+
label?: string;
|
|
32
|
+
}
|
|
33
|
+
declare function ThinkingIndicator({ className, label, ...props }: ThinkingIndicatorProps): import("react").JSX.Element;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { Response, ResponseCaret, ResponseProps, ThinkingIndicator, ThinkingIndicatorProps };
|
|
36
|
+
//# sourceMappingURL=ai-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-response.d.ts","names":[],"sources":["../../../src/components/ai-response/ai-response.tsx"],"mappings":";;;;;;;;;;;;;;UAkBiB,sBAAsB;;EAErC;;iBAGc,WAAW,WAAW,WAAW,aAAa,SAAS,gCAAa,IAAA;;;iBAwBpE,gBAAgB,cAAc,SAAS,gDAA6B,IAAA;;;;;;;;UAqBnE,+BAA+B;EAC9C;;iBAGc,oBACd,WACA,UACG,SACF,yCAAsB,IAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/ai-response/ai-response.tsx
|
|
5
|
+
function Response({ className, streaming, children, ...props }) {
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
7
|
+
"data-slot": "response",
|
|
8
|
+
"data-streaming": streaming || void 0,
|
|
9
|
+
className: cn("text-sm leading-relaxed whitespace-pre-wrap text-foreground", "[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4", "[&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.9em]", "[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-5 [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-5", "[&_p+p]:mt-3", className),
|
|
10
|
+
...props,
|
|
11
|
+
children: [children, streaming ? /* @__PURE__ */ jsx(ResponseCaret, {}) : null]
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/** The trailing cursor. Decorative — the streaming state is announced, if at
|
|
15
|
+
* all, through ConversationStatus. */
|
|
16
|
+
function ResponseCaret({ className, ...props }) {
|
|
17
|
+
return /* @__PURE__ */ jsx("span", {
|
|
18
|
+
"data-slot": "response-caret",
|
|
19
|
+
"aria-hidden": "true",
|
|
20
|
+
className: cn("ml-0.5 inline-block h-[1em] w-[2px] translate-y-[0.15em] animate-caret bg-current align-baseline", className),
|
|
21
|
+
...props
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function ThinkingIndicator({ className, label = "Thinking", ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
26
|
+
"data-slot": "thinking-indicator",
|
|
27
|
+
className: cn("flex items-center gap-1.5 text-sm text-muted-foreground", className),
|
|
28
|
+
...props,
|
|
29
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
30
|
+
className: "sr-only",
|
|
31
|
+
children: label
|
|
32
|
+
}), [
|
|
33
|
+
0,
|
|
34
|
+
1,
|
|
35
|
+
2
|
|
36
|
+
].map((index) => /* @__PURE__ */ jsx("span", {
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
className: "size-1.5 animate-pulse-soft rounded-full bg-current",
|
|
39
|
+
style: { animationDelay: `${String(index * 160)}ms` }
|
|
40
|
+
}, index))]
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { Response, ResponseCaret, ThinkingIndicator };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=ai-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-response.js","names":[],"sources":["../../../src/components/ai-response/ai-response.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentPropsWithRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * The text of an assistant response.\n *\n * Renders plain text with paragraph whitespace preserved. Markdown is\n * deliberately not parsed here: a Markdown renderer is a dependency, a security\n * decision about raw HTML, and a styling surface all at once, and every product\n * makes those differently. Pass already-rendered content as children when you\n * need it — the prose styling below applies either way.\n *\n * Not a live region, and not by omission. See the note on `Conversation`:\n * announcing streamed text token by token is unusable with a screen reader.\n */\nexport interface ResponseProps extends ComponentPropsWithRef<\"div\"> {\n /** Shows the caret. Purely visual — it carries no announcement. */\n streaming?: boolean;\n}\n\nexport function Response({ className, streaming, children, ...props }: ResponseProps) {\n return (\n <div\n data-slot=\"response\"\n data-streaming={streaming || undefined}\n className={cn(\n \"text-sm leading-relaxed whitespace-pre-wrap text-foreground\",\n // Minimal prose styling for consumers who pass rendered Markdown.\n \"[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4\",\n \"[&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[0.9em]\",\n \"[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-5 [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-5\",\n \"[&_p+p]:mt-3\",\n className,\n )}\n {...props}\n >\n {children}\n {streaming ? <ResponseCaret /> : null}\n </div>\n );\n}\n\n/** The trailing cursor. Decorative — the streaming state is announced, if at\n * all, through ConversationStatus. */\nexport function ResponseCaret({ className, ...props }: ComponentPropsWithRef<\"span\">) {\n return (\n <span\n data-slot=\"response-caret\"\n aria-hidden=\"true\"\n className={cn(\n \"ml-0.5 inline-block h-[1em] w-[2px] translate-y-[0.15em] animate-caret bg-current align-baseline\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Shown while waiting for the first token.\n *\n * A distinct state from streaming: nothing has arrived yet, so there is no text\n * to show a caret after. Labelled for assistive technology because, unlike the\n * caret, this is the only thing on screen.\n */\nexport interface ThinkingIndicatorProps extends ComponentPropsWithRef<\"div\"> {\n label?: string;\n}\n\nexport function ThinkingIndicator({\n className,\n label = \"Thinking\",\n ...props\n}: ThinkingIndicatorProps) {\n return (\n <div\n data-slot=\"thinking-indicator\"\n className={cn(\"flex items-center gap-1.5 text-sm text-muted-foreground\", className)}\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n {[0, 1, 2].map((index) => (\n <span\n key={index}\n aria-hidden=\"true\"\n className=\"size-1.5 animate-pulse-soft rounded-full bg-current\"\n style={{ animationDelay: `${String(index * 160)}ms` }}\n />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;AAuBA,SAAgB,SAAS,EAAE,WAAW,WAAW,UAAU,GAAG,SAAwB;CACpF,OACE,qBAAC,OAAD;EACE,aAAU;EACV,kBAAgB,aAAa,KAAA;EAC7B,WAAW,GACT,+DAEA,+DACA,6GACA,wFACA,gBACA,SACF;EACA,GAAI;EAZN,UAAA,CAcG,UACA,YAAY,oBAAC,eAAD,CAAgB,CAAA,IAAI,IAC9B;;AAET;;;AAIA,SAAgB,cAAc,EAAE,WAAW,GAAG,SAAwC;CACpF,OACE,oBAAC,QAAD;EACE,aAAU;EACV,eAAY;EACZ,WAAW,GACT,oGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAaA,SAAgB,kBAAkB,EAChC,WACA,QAAQ,YACR,GAAG,SACsB;CACzB,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,2DAA2D,SAAS;EAClF,GAAI;EAHN,UAAA,CAKE,oBAAC,QAAD;GAAM,WAAU;GAAW,UAAA;EAAY,CAAA,GACtC;GAAC;GAAG;GAAG;EAAC,CAAC,CAAC,KAAK,UACd,oBAAC,QAAD;GAEE,eAAY;GACZ,WAAU;GACV,OAAO,EAAE,gBAAgB,GAAG,OAAO,QAAQ,GAAG,EAAE,IAAI;EACrD,GAJM,KAIN,CACF,CACE;;AAET"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineMeta } from "../../registry/schema.js";
|
|
2
|
+
//#region src/components/ai-response/meta.ts
|
|
3
|
+
const meta = defineMeta({
|
|
4
|
+
name: "ai-response",
|
|
5
|
+
title: "AI Response",
|
|
6
|
+
description: "Assistant response text, with a streaming caret and a thinking indicator.",
|
|
7
|
+
category: "ai",
|
|
8
|
+
status: "stable",
|
|
9
|
+
dependencies: [],
|
|
10
|
+
registryDependencies: [],
|
|
11
|
+
files: ["ai-response.tsx"],
|
|
12
|
+
a11y: "Deliberately not a live region: announcing streamed text as it arrives interrupts a screen reader user on every token. Announce state through ConversationStatus and let them read the response when it settles. The caret is decorative; ThinkingIndicator carries a label because it is the only thing on screen while waiting for the first token."
|
|
13
|
+
});
|
|
14
|
+
//#endregion
|
|
15
|
+
export { meta };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../../src/components/ai-response/meta.ts"],"sourcesContent":["import { defineMeta } from \"@/registry/schema\";\n\nexport const meta = defineMeta({\n name: \"ai-response\",\n title: \"AI Response\",\n description: \"Assistant response text, with a streaming caret and a thinking indicator.\",\n category: \"ai\",\n status: \"stable\",\n dependencies: [],\n registryDependencies: [],\n files: [\"ai-response.tsx\"],\n a11y:\n \"Deliberately not a live region: announcing streamed text as it arrives interrupts a screen \" +\n \"reader user on every token. Announce state through ConversationStatus and let them read the \" +\n \"response when it settles. The caret is decorative; ThinkingIndicator carries a label because \" +\n \"it is the only thing on screen while waiting for the first token.\",\n});\n"],"mappings":";;AAEA,MAAa,OAAO,WAAW;CAC7B,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,QAAQ;CACR,cAAc,CAAC;CACf,sBAAsB,CAAC;CACvB,OAAO,CAAC,iBAAiB;CACzB,MACE;AAIJ,CAAC"}
|