@refraction-ui/astro 0.4.0 → 0.4.4
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/dist/accordion/index.ts +1 -0
- package/dist/ai/ai-manager.ts +121 -0
- package/dist/ai/index.ts +23 -0
- package/dist/ai/mock-providers.ts +68 -0
- package/dist/ai/sanitizer.ts +174 -0
- package/dist/ai/tts-manager.ts +80 -0
- package/dist/ai/types.ts +72 -0
- package/dist/animated-text/animated-text.styles.ts +28 -0
- package/dist/animated-text/animated-text.ts +83 -0
- package/dist/animated-text/index.ts +15 -0
- package/dist/app-shell/app-shell.ts +252 -0
- package/dist/app-shell/auth-shell.ts +84 -0
- package/dist/app-shell/index.ts +22 -0
- package/dist/app-shell/page-shell.ts +125 -0
- package/dist/astro-accordion/Button.astro +55 -0
- package/dist/astro-accordion/index.ts +1 -0
- package/dist/astro-ai/AIScript.astro +69 -0
- package/dist/astro-ai/TTSScript.astro +60 -0
- package/dist/astro-ai/index.ts +16 -0
- package/dist/astro-animated-text/AnimatedText.astro +81 -0
- package/dist/astro-animated-text/TypewriterText.astro +90 -0
- package/dist/astro-animated-text/index.ts +1 -0
- package/dist/astro-app-shell/AppShell.astro +195 -0
- package/dist/astro-app-shell/AppShellContent.astro +29 -0
- package/dist/astro-app-shell/AppShellHeader.astro +54 -0
- package/dist/astro-app-shell/AppShellMain.astro +18 -0
- package/dist/astro-app-shell/AppShellMobileNav.astro +27 -0
- package/dist/astro-app-shell/AppShellOverlay.astro +21 -0
- package/dist/astro-app-shell/AppShellSidebar.astro +26 -0
- package/dist/astro-app-shell/AuthShell.astro +31 -0
- package/dist/astro-app-shell/AuthShellCard.astro +24 -0
- package/dist/astro-app-shell/PageShell.astro +36 -0
- package/dist/astro-app-shell/PageShellFooter.astro +30 -0
- package/dist/astro-app-shell/PageShellNav.astro +33 -0
- package/dist/astro-app-shell/PageShellSection.astro +32 -0
- package/dist/astro-app-shell/index.ts +21 -0
- package/dist/astro-auth/AuthGuard.astro +133 -0
- package/dist/astro-auth/index.ts +5 -0
- package/dist/astro-avatar/Avatar.astro +22 -0
- package/dist/astro-avatar/AvatarFallback.astro +18 -0
- package/dist/astro-avatar/AvatarImage.astro +48 -0
- package/dist/astro-avatar/index.ts +1 -0
- package/dist/astro-avatar-group/AvatarGroup.astro +42 -0
- package/dist/astro-avatar-group/index.ts +1 -0
- package/dist/astro-badge/Badge.astro +27 -0
- package/dist/astro-badge/index.ts +1 -0
- package/dist/astro-bottom-nav/BottomNav.astro +40 -0
- package/dist/astro-bottom-nav/index.ts +1 -0
- package/dist/astro-breadcrumbs/Breadcrumbs.astro +56 -0
- package/dist/astro-breadcrumbs/index.ts +1 -0
- package/dist/astro-button/Button.astro +55 -0
- package/dist/astro-button/index.ts +1 -0
- package/dist/astro-calendar/Calendar.astro +259 -0
- package/dist/astro-calendar/index.ts +1 -0
- package/dist/astro-callout/Callout.astro +3 -0
- package/dist/astro-callout/index.ts +1 -0
- package/dist/astro-card/Card.astro +20 -0
- package/dist/astro-card/CardContent.astro +13 -0
- package/dist/astro-card/CardDescription.astro +13 -0
- package/dist/astro-card/CardFooter.astro +13 -0
- package/dist/astro-card/CardHeader.astro +13 -0
- package/dist/astro-card/CardTitle.astro +15 -0
- package/dist/astro-card/index.ts +1 -0
- package/dist/astro-card-grid/CardGrid.astro +17 -0
- package/dist/astro-card-grid/index.ts +1 -0
- package/dist/astro-carousel/Button.astro +55 -0
- package/dist/astro-carousel/index.ts +1 -0
- package/dist/astro-charts/Bars.astro +53 -0
- package/dist/astro-charts/Chart.astro +31 -0
- package/dist/astro-charts/Circles.astro +48 -0
- package/dist/astro-charts/Gradient.astro +34 -0
- package/dist/astro-charts/Histogram.astro +107 -0
- package/dist/astro-charts/Line.astro +55 -0
- package/dist/astro-charts/PieChart.astro +63 -0
- package/dist/astro-charts/ScatterPlot.astro +95 -0
- package/dist/astro-charts/XAxis.astro +46 -0
- package/dist/astro-charts/YAxis.astro +44 -0
- package/dist/astro-charts/index.ts +26 -0
- package/dist/astro-checkbox/Checkbox.astro +129 -0
- package/dist/astro-checkbox/index.ts +1 -0
- package/dist/astro-code-block/CodeBlock.astro +3 -0
- package/dist/astro-code-block/index.ts +1 -0
- package/dist/astro-code-editor/CodeEditor.astro +123 -0
- package/dist/astro-code-editor/index.ts +1 -0
- package/dist/astro-collapsible/Collapsible.astro +58 -0
- package/dist/astro-collapsible/CollapsibleContent.astro +21 -0
- package/dist/astro-collapsible/CollapsibleTrigger.astro +17 -0
- package/dist/astro-collapsible/index.ts +1 -0
- package/dist/astro-command/Command.astro +170 -0
- package/dist/astro-command/CommandEmpty.astro +17 -0
- package/dist/astro-command/CommandGroup.astro +25 -0
- package/dist/astro-command/CommandInput.astro +21 -0
- package/dist/astro-command/CommandItem.astro +26 -0
- package/dist/astro-command/CommandList.astro +17 -0
- package/dist/astro-command/CommandSeparator.astro +14 -0
- package/dist/astro-command/index.ts +1 -0
- package/dist/astro-command-input/CommandInput.astro +6 -0
- package/dist/astro-command-input/index.ts +1 -0
- package/dist/astro-content-protection/ContentProtection.astro +104 -0
- package/dist/astro-content-protection/index.ts +1 -0
- package/dist/astro-data-table/DataTable.astro +263 -0
- package/dist/astro-data-table/index.ts +1 -0
- package/dist/astro-date-picker/DatePicker.astro +398 -0
- package/dist/astro-date-picker/index.ts +1 -0
- package/dist/astro-device-frame/DeviceFrame.astro +44 -0
- package/dist/astro-device-frame/index.ts +1 -0
- package/dist/astro-dialog/Dialog.astro +138 -0
- package/dist/astro-dialog/DialogClose.astro +16 -0
- package/dist/astro-dialog/DialogContent.astro +24 -0
- package/dist/astro-dialog/DialogDescription.astro +15 -0
- package/dist/astro-dialog/DialogFooter.astro +14 -0
- package/dist/astro-dialog/DialogHeader.astro +14 -0
- package/dist/astro-dialog/DialogOverlay.astro +17 -0
- package/dist/astro-dialog/DialogTitle.astro +15 -0
- package/dist/astro-dialog/DialogTrigger.astro +18 -0
- package/dist/astro-dialog/index.ts +1 -0
- package/dist/astro-diff-viewer/DiffViewer.astro +371 -0
- package/dist/astro-diff-viewer/index.ts +1 -0
- package/dist/astro-dropdown-menu/DropdownMenu.astro +138 -0
- package/dist/astro-dropdown-menu/DropdownMenuContent.astro +20 -0
- package/dist/astro-dropdown-menu/DropdownMenuItem.astro +21 -0
- package/dist/astro-dropdown-menu/DropdownMenuLabel.astro +14 -0
- package/dist/astro-dropdown-menu/DropdownMenuSeparator.astro +14 -0
- package/dist/astro-dropdown-menu/DropdownMenuTrigger.astro +18 -0
- package/dist/astro-dropdown-menu/index.ts +1 -0
- package/dist/astro-emoji-picker/EmojiPicker.astro +255 -0
- package/dist/astro-emoji-picker/index.ts +1 -0
- package/dist/astro-feedback-dialog/FeedbackDialog.astro +152 -0
- package/dist/astro-feedback-dialog/index.ts +1 -0
- package/dist/astro-file-tree/astro-file-tree.astro +4 -0
- package/dist/astro-file-tree/index.ts +1 -0
- package/dist/astro-file-upload/FileUpload.astro +306 -0
- package/dist/astro-file-upload/index.ts +1 -0
- package/dist/astro-footer/Footer.astro +61 -0
- package/dist/astro-footer/index.ts +1 -0
- package/dist/astro-icon-system/astro-icon-system.astro +4 -0
- package/dist/astro-icon-system/index.ts +1 -0
- package/dist/astro-inline-editor/InlineEditor.astro +169 -0
- package/dist/astro-inline-editor/index.ts +1 -0
- package/dist/astro-input/Input.astro +49 -0
- package/dist/astro-input/index.ts +1 -0
- package/dist/astro-input-group/InputGroup.astro +29 -0
- package/dist/astro-input-group/InputGroupAddon.astro +14 -0
- package/dist/astro-input-group/InputGroupButton.astro +19 -0
- package/dist/astro-input-group/InputGroupText.astro +11 -0
- package/dist/astro-input-group/index.ts +1 -0
- package/dist/astro-install-prompt/InstallPrompt.astro +115 -0
- package/dist/astro-install-prompt/index.ts +1 -0
- package/dist/astro-keyboard-shortcut/KeyboardShortcut.astro +83 -0
- package/dist/astro-keyboard-shortcut/ShortcutBadge.astro +41 -0
- package/dist/astro-keyboard-shortcut/index.ts +1 -0
- package/dist/astro-language-selector/LanguageSelector.astro +247 -0
- package/dist/astro-language-selector/index.ts +1 -0
- package/dist/astro-link-card/LinkCard.astro +17 -0
- package/dist/astro-link-card/index.ts +1 -0
- package/dist/astro-markdown-renderer/MarkdownRenderer.astro +62 -0
- package/dist/astro-markdown-renderer/index.ts +1 -0
- package/dist/astro-mobile-nav/MobileNav.astro +84 -0
- package/dist/astro-mobile-nav/MobileNavContent.astro +29 -0
- package/dist/astro-mobile-nav/MobileNavLink.astro +16 -0
- package/dist/astro-mobile-nav/MobileNavTrigger.astro +57 -0
- package/dist/astro-mobile-nav/index.ts +1 -0
- package/dist/astro-navbar/Navbar.astro +49 -0
- package/dist/astro-navbar/index.ts +1 -0
- package/dist/astro-otp-input/OtpInput.astro +253 -0
- package/dist/astro-otp-input/index.ts +1 -0
- package/dist/astro-pagination/Pagination.astro +3 -0
- package/dist/astro-pagination/index.ts +1 -0
- package/dist/astro-payment/Payment.astro +19 -0
- package/dist/astro-payment/index.ts +1 -0
- package/dist/astro-popover/Popover.astro +87 -0
- package/dist/astro-popover/PopoverClose.astro +16 -0
- package/dist/astro-popover/PopoverContent.astro +23 -0
- package/dist/astro-popover/PopoverTrigger.astro +18 -0
- package/dist/astro-popover/index.ts +1 -0
- package/dist/astro-presence-indicator/PresenceIndicator.astro +26 -0
- package/dist/astro-presence-indicator/index.ts +1 -0
- package/dist/astro-progress-display/BadgeDisplay.astro +33 -0
- package/dist/astro-progress-display/ProgressBar.astro +27 -0
- package/dist/astro-progress-display/StatsGrid.astro +32 -0
- package/dist/astro-progress-display/index.ts +1 -0
- package/dist/astro-radio/RadioGroup.astro +111 -0
- package/dist/astro-radio/RadioItem.astro +36 -0
- package/dist/astro-radio/index.ts +1 -0
- package/dist/astro-reaction-bar/ReactionBar.astro +117 -0
- package/dist/astro-reaction-bar/index.ts +1 -0
- package/dist/astro-resizable-layout/ResizableDivider.astro +27 -0
- package/dist/astro-resizable-layout/ResizableLayout.astro +162 -0
- package/dist/astro-resizable-layout/ResizablePane.astro +28 -0
- package/dist/astro-resizable-layout/index.ts +11 -0
- package/dist/astro-rich-editor/RichEditor.astro +260 -0
- package/dist/astro-rich-editor/index.ts +25 -0
- package/dist/astro-search-bar/SearchBar.astro +140 -0
- package/dist/astro-search-bar/SearchResultItem.astro +16 -0
- package/dist/astro-search-bar/SearchResults.astro +17 -0
- package/dist/astro-search-bar/index.ts +1 -0
- package/dist/astro-select/Select.astro +165 -0
- package/dist/astro-select/SelectContent.astro +19 -0
- package/dist/astro-select/SelectItem.astro +42 -0
- package/dist/astro-select/SelectTrigger.astro +36 -0
- package/dist/astro-select/index.ts +1 -0
- package/dist/astro-sidebar/Sidebar.astro +64 -0
- package/dist/astro-sidebar/index.ts +1 -0
- package/dist/astro-skeleton/Skeleton.astro +39 -0
- package/dist/astro-skeleton/SkeletonText.astro +22 -0
- package/dist/astro-skeleton/index.ts +1 -0
- package/dist/astro-skip-to-content/SkipToContent.astro +3 -0
- package/dist/astro-skip-to-content/index.ts +1 -0
- package/dist/astro-slide-viewer/SlideViewer.astro +231 -0
- package/dist/astro-slide-viewer/index.ts +1 -0
- package/dist/astro-slider/index.ts +1 -0
- package/dist/astro-status-indicator/StatusIndicator.astro +31 -0
- package/dist/astro-status-indicator/index.ts +1 -0
- package/dist/astro-steps/Steps.astro +3 -0
- package/dist/astro-steps/index.ts +1 -0
- package/dist/astro-switch/Switch.astro +89 -0
- package/dist/astro-switch/index.ts +1 -0
- package/dist/astro-table-of-contents/TableOfContents.astro +53 -0
- package/dist/astro-table-of-contents/index.ts +1 -0
- package/dist/astro-tabs/Tabs.astro +96 -0
- package/dist/astro-tabs/TabsContent.astro +20 -0
- package/dist/astro-tabs/TabsList.astro +16 -0
- package/dist/astro-tabs/TabsTrigger.astro +24 -0
- package/dist/astro-tabs/index.ts +1 -0
- package/dist/astro-textarea/Textarea.astro +51 -0
- package/dist/astro-textarea/index.ts +1 -0
- package/dist/astro-theme/ThemeScript.astro +13 -0
- package/dist/astro-theme/ThemeToggle.astro +279 -0
- package/dist/astro-theme/index.ts +1 -0
- package/dist/astro-thread-view/ThreadView.astro +159 -0
- package/dist/astro-thread-view/index.ts +1 -0
- package/dist/astro-toast/Toast.astro +49 -0
- package/dist/astro-toast/Toaster.astro +142 -0
- package/dist/astro-toast/index.ts +1 -0
- package/dist/astro-tooltip/Tooltip.astro +95 -0
- package/dist/astro-tooltip/TooltipContent.astro +22 -0
- package/dist/astro-tooltip/TooltipTrigger.astro +16 -0
- package/dist/astro-tooltip/index.ts +1 -0
- package/dist/astro-version-selector/VersionSelector.astro +174 -0
- package/dist/astro-version-selector/index.ts +1 -0
- package/dist/astro-video-player/VideoPlayer.astro +153 -0
- package/dist/astro-video-player/index.ts +1 -0
- package/dist/auth/adapters/mock.ts +74 -0
- package/dist/auth/auth-machine.ts +120 -0
- package/dist/auth/index.ts +22 -0
- package/dist/auth/rbac.ts +44 -0
- package/dist/auth/types.ts +44 -0
- package/dist/avatar/avatar.styles.ts +47 -0
- package/dist/avatar/avatar.ts +73 -0
- package/dist/avatar/index.ts +15 -0
- package/dist/avatar-group/avatar-group.styles.ts +63 -0
- package/dist/avatar-group/avatar-group.ts +106 -0
- package/dist/avatar-group/index.ts +18 -0
- package/dist/badge/badge.styles.ts +24 -0
- package/dist/badge/badge.ts +48 -0
- package/dist/badge/index.ts +10 -0
- package/dist/bottom-nav/bottom-nav.styles.ts +18 -0
- package/dist/bottom-nav/bottom-nav.ts +33 -0
- package/dist/bottom-nav/index.ts +2 -0
- package/dist/breadcrumbs/breadcrumbs.styles.ts +20 -0
- package/dist/breadcrumbs/breadcrumbs.ts +72 -0
- package/dist/breadcrumbs/index.ts +8 -0
- package/dist/button/button.styles.ts +38 -0
- package/dist/button/button.ts +64 -0
- package/dist/button/index.ts +10 -0
- package/dist/calendar/calendar.styles.ts +21 -0
- package/dist/calendar/calendar.ts +202 -0
- package/dist/calendar/index.ts +9 -0
- package/dist/callout/callout.ts +1 -0
- package/dist/callout/index.ts +1 -0
- package/dist/card/card.styles.ts +55 -0
- package/dist/card/card.ts +45 -0
- package/dist/card/index.ts +20 -0
- package/dist/card-grid/card-grid.ts +9 -0
- package/dist/card-grid/index.ts +1 -0
- package/dist/carousel/index.ts +1 -0
- package/dist/charts/axis.ts +50 -0
- package/dist/charts/chart.ts +73 -0
- package/dist/charts/colorblind.ts +100 -0
- package/dist/charts/data.ts +72 -0
- package/dist/charts/geometry.ts +54 -0
- package/dist/charts/index.ts +61 -0
- package/dist/charts/scales.ts +151 -0
- package/dist/checkbox/checkbox.styles.ts +33 -0
- package/dist/checkbox/checkbox.ts +73 -0
- package/dist/checkbox/index.ts +10 -0
- package/dist/code-block/code-block.ts +1 -0
- package/dist/code-block/index.ts +1 -0
- package/dist/code-editor/code-editor.styles.ts +32 -0
- package/dist/code-editor/code-editor.ts +140 -0
- package/dist/code-editor/index.ts +9 -0
- package/dist/collapsible/collapsible.styles.ts +14 -0
- package/dist/collapsible/collapsible.ts +93 -0
- package/dist/collapsible/index.ts +7 -0
- package/dist/command/command.styles.ts +27 -0
- package/dist/command/command.ts +179 -0
- package/dist/command/index.ts +14 -0
- package/dist/command-input/command-input.ts +176 -0
- package/dist/command-input/index.ts +1 -0
- package/dist/content-protection/content-protection.styles.ts +9 -0
- package/dist/content-protection/content-protection.ts +68 -0
- package/dist/content-protection/index.ts +8 -0
- package/dist/data-table/data-table.styles.ts +55 -0
- package/dist/data-table/data-table.ts +183 -0
- package/dist/data-table/index.ts +15 -0
- package/dist/date-picker/date-picker.styles.ts +31 -0
- package/dist/date-picker/date-picker.ts +333 -0
- package/dist/date-picker/index.ts +18 -0
- package/dist/device-frame/device-frame.styles.ts +21 -0
- package/dist/device-frame/device-frame.ts +112 -0
- package/dist/device-frame/index.ts +10 -0
- package/dist/dialog/dialog.styles.ts +8 -0
- package/dist/dialog/dialog.ts +133 -0
- package/dist/dialog/index.ts +8 -0
- package/dist/diff-viewer/diff-viewer.styles.ts +124 -0
- package/dist/diff-viewer/diff-viewer.ts +255 -0
- package/dist/diff-viewer/index.ts +20 -0
- package/dist/dropdown-menu/dropdown-menu.styles.ts +9 -0
- package/dist/dropdown-menu/dropdown-menu.ts +139 -0
- package/dist/dropdown-menu/index.ts +9 -0
- package/dist/emoji-picker/emoji-data.ts +282 -0
- package/dist/emoji-picker/emoji-picker.styles.ts +32 -0
- package/dist/emoji-picker/emoji-picker.ts +165 -0
- package/dist/emoji-picker/index.ts +25 -0
- package/dist/feedback-dialog/feedback-dialog.styles.ts +15 -0
- package/dist/feedback-dialog/feedback-dialog.ts +147 -0
- package/dist/feedback-dialog/index.ts +11 -0
- package/dist/file-upload/file-upload.styles.ts +30 -0
- package/dist/file-upload/file-upload.ts +260 -0
- package/dist/file-upload/index.ts +19 -0
- package/dist/footer/footer.styles.ts +5 -0
- package/dist/footer/footer.ts +32 -0
- package/dist/footer/index.ts +9 -0
- package/dist/index.ts +77 -0
- package/dist/inline-editor/index.ts +13 -0
- package/dist/inline-editor/inline-editor.styles.ts +42 -0
- package/dist/inline-editor/inline-editor.ts +96 -0
- package/dist/input/index.ts +9 -0
- package/dist/input/input.styles.ts +15 -0
- package/dist/input/input.ts +84 -0
- package/dist/input-group/index.ts +13 -0
- package/dist/input-group/input-group.styles.ts +50 -0
- package/dist/input-group/input-group.ts +44 -0
- package/dist/install-prompt/index.ts +9 -0
- package/dist/install-prompt/install-prompt.styles.ts +5 -0
- package/dist/install-prompt/install-prompt.ts +68 -0
- package/dist/keyboard-shortcut/index.ts +12 -0
- package/dist/keyboard-shortcut/keyboard-shortcut.styles.ts +8 -0
- package/dist/keyboard-shortcut/keyboard-shortcut.ts +153 -0
- package/dist/language-selector/index.ts +8 -0
- package/dist/language-selector/language-selector.styles.ts +28 -0
- package/dist/language-selector/language-selector.ts +149 -0
- package/dist/link-card/index.ts +1 -0
- package/dist/link-card/link-card.ts +9 -0
- package/dist/markdown-renderer/index.ts +8 -0
- package/dist/markdown-renderer/markdown-renderer.styles.ts +31 -0
- package/dist/markdown-renderer/markdown-renderer.ts +251 -0
- package/dist/mobile-nav/index.ts +14 -0
- package/dist/mobile-nav/mobile-nav.styles.ts +39 -0
- package/dist/mobile-nav/mobile-nav.ts +74 -0
- package/dist/navbar/index.ts +9 -0
- package/dist/navbar/navbar.styles.ts +29 -0
- package/dist/navbar/navbar.ts +39 -0
- package/dist/otp-input/index.ts +13 -0
- package/dist/otp-input/otp-input.styles.ts +51 -0
- package/dist/otp-input/otp-input.ts +198 -0
- package/dist/pagination/index.ts +1 -0
- package/dist/payment/index.ts +1 -0
- package/dist/payment/payment.ts +16 -0
- package/dist/popover/index.ts +7 -0
- package/dist/popover/popover.styles.ts +16 -0
- package/dist/popover/popover.ts +89 -0
- package/dist/presence-indicator/index.ts +14 -0
- package/dist/presence-indicator/presence-indicator.styles.ts +29 -0
- package/dist/presence-indicator/presence-indicator.ts +63 -0
- package/dist/progress-display/index.ts +15 -0
- package/dist/progress-display/progress-display.styles.ts +72 -0
- package/dist/progress-display/progress-display.ts +60 -0
- package/dist/radio/index.ts +8 -0
- package/dist/radio/radio.styles.ts +34 -0
- package/dist/radio/radio.ts +70 -0
- package/dist/reaction-bar/index.ts +14 -0
- package/dist/reaction-bar/reaction-bar.styles.ts +23 -0
- package/dist/reaction-bar/reaction-bar.ts +87 -0
- package/dist/resizable-layout/index.ts +12 -0
- package/dist/resizable-layout/resizable-layout.styles.ts +50 -0
- package/dist/resizable-layout/resizable-layout.ts +139 -0
- package/dist/rich-editor/editor.ts +342 -0
- package/dist/rich-editor/emoji.ts +175 -0
- package/dist/rich-editor/history.ts +79 -0
- package/dist/rich-editor/index.ts +106 -0
- package/dist/rich-editor/markdown-shortcuts.ts +248 -0
- package/dist/rich-editor/mentions.ts +162 -0
- package/dist/rich-editor/model.ts +206 -0
- package/dist/rich-editor/operations.ts +772 -0
- package/dist/rich-editor/selection.ts +157 -0
- package/dist/rich-editor/serialization.ts +711 -0
- package/dist/rich-editor/slash-commands.ts +212 -0
- package/dist/search-bar/index.ts +7 -0
- package/dist/search-bar/search-bar.styles.ts +29 -0
- package/dist/search-bar/search-bar.ts +130 -0
- package/dist/select/index.ts +13 -0
- package/dist/select/select.styles.ts +52 -0
- package/dist/select/select.ts +152 -0
- package/dist/shared/a11y.ts +33 -0
- package/dist/shared/aria.ts +30 -0
- package/dist/shared/cn.ts +35 -0
- package/dist/shared/cva.ts +79 -0
- package/dist/shared/engine-adapter.ts +10 -0
- package/dist/shared/focus-trap.ts +123 -0
- package/dist/shared/index.ts +60 -0
- package/dist/shared/keyboard.ts +36 -0
- package/dist/shared/live-region.ts +90 -0
- package/dist/shared/motion.ts +15 -0
- package/dist/shared/skip-link.ts +35 -0
- package/dist/shared/state-machine.ts +57 -0
- package/dist/shared/tokens.ts +16 -0
- package/dist/shared/types.ts +45 -0
- package/dist/shared/variants.ts +17 -0
- package/dist/sidebar/index.ts +9 -0
- package/dist/sidebar/sidebar.styles.ts +27 -0
- package/dist/sidebar/sidebar.ts +59 -0
- package/dist/skeleton/index.ts +8 -0
- package/dist/skeleton/skeleton.styles.ts +16 -0
- package/dist/skeleton/skeleton.ts +39 -0
- package/dist/skip-to-content/index.ts +1 -0
- package/dist/skip-to-content/skip-to-content.ts +1 -0
- package/dist/slide-viewer/index.ts +16 -0
- package/dist/slide-viewer/slide-viewer.styles.ts +57 -0
- package/dist/slide-viewer/slide-viewer.ts +152 -0
- package/dist/slider/index.ts +1 -0
- package/dist/slider/slider.ts +2 -0
- package/dist/status-indicator/index.ts +15 -0
- package/dist/status-indicator/status-indicator.styles.ts +41 -0
- package/dist/status-indicator/status-indicator.ts +66 -0
- package/dist/steps/index.ts +1 -0
- package/dist/steps/steps.ts +1 -0
- package/dist/switch/index.ts +7 -0
- package/dist/switch/switch.styles.ts +55 -0
- package/dist/switch/switch.ts +63 -0
- package/dist/table-of-contents/index.ts +1 -0
- package/dist/table-of-contents/table-of-contents.ts +37 -0
- package/dist/tabs/index.ts +8 -0
- package/dist/tabs/tabs.styles.ts +9 -0
- package/dist/tabs/tabs.ts +133 -0
- package/dist/textarea/index.ts +7 -0
- package/dist/textarea/textarea.styles.ts +15 -0
- package/dist/textarea/textarea.ts +59 -0
- package/dist/theme/dom-adapters.ts +60 -0
- package/dist/theme/index.ts +18 -0
- package/dist/theme/theme-machine.ts +130 -0
- package/dist/theme/theme-script.ts +18 -0
- package/dist/thread-view/index.ts +26 -0
- package/dist/thread-view/thread-view.styles.ts +35 -0
- package/dist/thread-view/thread-view.ts +176 -0
- package/dist/toast/index.ts +13 -0
- package/dist/toast/toast.styles.ts +19 -0
- package/dist/toast/toast.ts +203 -0
- package/dist/tooltip/index.ts +7 -0
- package/dist/tooltip/tooltip.styles.ts +16 -0
- package/dist/tooltip/tooltip.ts +109 -0
- package/dist/version-selector/index.ts +12 -0
- package/dist/version-selector/version-selector.styles.ts +41 -0
- package/dist/version-selector/version-selector.ts +136 -0
- package/dist/video-player/index.ts +12 -0
- package/dist/video-player/video-player.styles.ts +42 -0
- package/dist/video-player/video-player.ts +100 -0
- package/package.json +20 -19
- package/src/index.ts +0 -94
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { AIProvider, AIConfig, AIAPI, GenerateOptions } from './types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* createAI — creates an AI manager that routes requests to registered providers.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order: explicit opts.provider -> router -> default -> first available
|
|
7
|
+
* Fallback: on error, try next in fallback chain
|
|
8
|
+
*/
|
|
9
|
+
export function createAI(config?: AIConfig): AIAPI {
|
|
10
|
+
const providers = new Map<string, AIProvider>()
|
|
11
|
+
/** Insertion-ordered list of provider names */
|
|
12
|
+
const providerOrder: string[] = []
|
|
13
|
+
|
|
14
|
+
const defaultProvider = config?.default
|
|
15
|
+
const fallbackChain = config?.fallback ?? []
|
|
16
|
+
const router = config?.router
|
|
17
|
+
|
|
18
|
+
function resolveProvider(opts?: GenerateOptions): AIProvider {
|
|
19
|
+
// 1. Explicit opts.provider
|
|
20
|
+
if (opts?.provider) {
|
|
21
|
+
const p = providers.get(opts.provider)
|
|
22
|
+
if (!p) {
|
|
23
|
+
throw new Error(`AI provider "${opts.provider}" not found. Registered providers: [${providerOrder.join(', ')}]`)
|
|
24
|
+
}
|
|
25
|
+
return p
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 2. Router
|
|
29
|
+
if (router) {
|
|
30
|
+
const chosen = router(opts ?? {}, {
|
|
31
|
+
providers: [...providerOrder],
|
|
32
|
+
default: defaultProvider ?? providerOrder[0] ?? '',
|
|
33
|
+
})
|
|
34
|
+
const p = providers.get(chosen)
|
|
35
|
+
if (p) return p
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 3. Default
|
|
39
|
+
if (defaultProvider) {
|
|
40
|
+
const p = providers.get(defaultProvider)
|
|
41
|
+
if (!p) {
|
|
42
|
+
throw new Error(`Default AI provider "${defaultProvider}" not registered. Registered providers: [${providerOrder.join(', ')}]`)
|
|
43
|
+
}
|
|
44
|
+
return p
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 4. First available
|
|
48
|
+
if (providerOrder.length === 0) {
|
|
49
|
+
throw new Error('No AI providers configured. Call addProvider() to register at least one provider.')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return providers.get(providerOrder[0])!
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function withFallback<T>(
|
|
56
|
+
primary: AIProvider,
|
|
57
|
+
fn: (provider: AIProvider) => Promise<T>,
|
|
58
|
+
): Promise<T> {
|
|
59
|
+
try {
|
|
60
|
+
return await fn(primary)
|
|
61
|
+
} catch (error) {
|
|
62
|
+
// Try fallback chain
|
|
63
|
+
for (const name of fallbackChain) {
|
|
64
|
+
const fallback = providers.get(name)
|
|
65
|
+
if (!fallback || fallback === primary) continue
|
|
66
|
+
try {
|
|
67
|
+
return await fn(fallback)
|
|
68
|
+
} catch {
|
|
69
|
+
// continue to next fallback
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// All fallbacks exhausted or no fallbacks — throw
|
|
73
|
+
// If there were fallbacks, throw the last error from the chain
|
|
74
|
+
if (fallbackChain.length > 0) {
|
|
75
|
+
// Try the last fallback one more time to get its error
|
|
76
|
+
const lastFallbackName = fallbackChain[fallbackChain.length - 1]
|
|
77
|
+
const lastFallback = providers.get(lastFallbackName)
|
|
78
|
+
if (lastFallback && lastFallback !== primary) {
|
|
79
|
+
return await fn(lastFallback)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw error
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const api: AIAPI = {
|
|
87
|
+
get providers() {
|
|
88
|
+
return [...providerOrder]
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
async generateText(prompt: string, opts?: GenerateOptions): Promise<string> {
|
|
92
|
+
const provider = resolveProvider(opts)
|
|
93
|
+
return withFallback(provider, (p) => p.generateText(prompt, opts))
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
async generateJSON<T = unknown>(prompt: string, opts?: GenerateOptions): Promise<T> {
|
|
97
|
+
const provider = resolveProvider(opts)
|
|
98
|
+
return withFallback(provider, (p) => p.generateJSON<T>(prompt, opts))
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
addProvider(name: string, provider: AIProvider): void {
|
|
102
|
+
if (providers.has(name)) {
|
|
103
|
+
// Replace, keep same position
|
|
104
|
+
providers.set(name, provider)
|
|
105
|
+
} else {
|
|
106
|
+
providers.set(name, provider)
|
|
107
|
+
providerOrder.push(name)
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
removeProvider(name: string): void {
|
|
112
|
+
if (providers.has(name)) {
|
|
113
|
+
providers.delete(name)
|
|
114
|
+
const idx = providerOrder.indexOf(name)
|
|
115
|
+
if (idx !== -1) providerOrder.splice(idx, 1)
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return api
|
|
121
|
+
}
|
package/dist/ai/index.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Types
|
|
2
|
+
export type {
|
|
3
|
+
AIProvider,
|
|
4
|
+
GenerateOptions,
|
|
5
|
+
TTSProvider,
|
|
6
|
+
TTSOptions,
|
|
7
|
+
RouterFn,
|
|
8
|
+
AIConfig,
|
|
9
|
+
TTSConfig,
|
|
10
|
+
AIAPI,
|
|
11
|
+
TTSAPI,
|
|
12
|
+
} from './types.js'
|
|
13
|
+
|
|
14
|
+
// Managers
|
|
15
|
+
export { createAI } from './ai-manager.js'
|
|
16
|
+
export { createTTS } from './tts-manager.js'
|
|
17
|
+
|
|
18
|
+
// Mock providers (for testing)
|
|
19
|
+
export { createMockAIProvider, createMockTTSProvider } from './mock-providers.js'
|
|
20
|
+
export type { MockAIResponses, MockTTSProviderExtended } from './mock-providers.js'
|
|
21
|
+
|
|
22
|
+
// Utilities
|
|
23
|
+
export { sanitizeForSpeech } from './sanitizer.js'
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { AIProvider, GenerateOptions, TTSProvider, TTSOptions } from './types.js'
|
|
2
|
+
|
|
3
|
+
export interface MockAIResponses {
|
|
4
|
+
text?: string[]
|
|
5
|
+
json?: unknown[]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface MockTTSProviderExtended extends TTSProvider {
|
|
9
|
+
speakCalls: Array<{ text: string; opts?: TTSOptions }>
|
|
10
|
+
stopCalls: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* createMockAIProvider — returns an AIProvider that returns canned responses.
|
|
15
|
+
* Used for testing without real API calls.
|
|
16
|
+
*/
|
|
17
|
+
export function createMockAIProvider(
|
|
18
|
+
name: string = 'mock',
|
|
19
|
+
responses?: MockAIResponses,
|
|
20
|
+
): AIProvider {
|
|
21
|
+
let textIndex = 0
|
|
22
|
+
let jsonIndex = 0
|
|
23
|
+
|
|
24
|
+
const textResponses = responses?.text ?? ['Mock AI response']
|
|
25
|
+
const jsonResponses = responses?.json ?? [{ mock: true }]
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
name,
|
|
29
|
+
supportsVision: false,
|
|
30
|
+
|
|
31
|
+
async generateText(_prompt: string, _opts?: GenerateOptions): Promise<string> {
|
|
32
|
+
const response = textResponses[Math.min(textIndex, textResponses.length - 1)]
|
|
33
|
+
textIndex++
|
|
34
|
+
return response
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async generateJSON<T = unknown>(_prompt: string, _opts?: GenerateOptions): Promise<T> {
|
|
38
|
+
const response = jsonResponses[Math.min(jsonIndex, jsonResponses.length - 1)]
|
|
39
|
+
jsonIndex++
|
|
40
|
+
return response as T
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* createMockTTSProvider — returns a TTSProvider that tracks calls for assertion.
|
|
47
|
+
* Used for testing without real speech synthesis.
|
|
48
|
+
*/
|
|
49
|
+
export function createMockTTSProvider(
|
|
50
|
+
name: string = 'mock-tts',
|
|
51
|
+
): MockTTSProviderExtended {
|
|
52
|
+
const provider: MockTTSProviderExtended = {
|
|
53
|
+
name,
|
|
54
|
+
isSupported: true,
|
|
55
|
+
speakCalls: [],
|
|
56
|
+
stopCalls: 0,
|
|
57
|
+
|
|
58
|
+
speak(text: string, opts?: TTSOptions): void {
|
|
59
|
+
provider.speakCalls.push({ text, opts })
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
stop(): void {
|
|
63
|
+
provider.stopCalls++
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return provider
|
|
68
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sanitizeForSpeech — converts AI-generated text (with markdown, LaTeX, HTML)
|
|
3
|
+
* into clean, speakable plain text suitable for TTS engines.
|
|
4
|
+
*
|
|
5
|
+
* 30+ regex-based transformation rules applied in order.
|
|
6
|
+
*/
|
|
7
|
+
export function sanitizeForSpeech(text: string): string {
|
|
8
|
+
if (!text) return ''
|
|
9
|
+
|
|
10
|
+
let result = text
|
|
11
|
+
|
|
12
|
+
// === HTML ===
|
|
13
|
+
|
|
14
|
+
// 1. Strip HTML comments
|
|
15
|
+
result = result.replace(/<!--[\s\S]*?-->/g, '')
|
|
16
|
+
|
|
17
|
+
// 2. Strip HTML tags (including self-closing)
|
|
18
|
+
result = result.replace(/<[^>]+>/g, '')
|
|
19
|
+
|
|
20
|
+
// === Code blocks (before other markdown to avoid interference) ===
|
|
21
|
+
|
|
22
|
+
// 3. Strip fenced code blocks (``` with optional language)
|
|
23
|
+
result = result.replace(/```[\w]*\n?([\s\S]*?)```/g, '$1')
|
|
24
|
+
|
|
25
|
+
// 4. Strip inline code backticks
|
|
26
|
+
result = result.replace(/`([^`]+)`/g, '$1')
|
|
27
|
+
|
|
28
|
+
// === LaTeX (before markdown to handle $ delimiters) ===
|
|
29
|
+
|
|
30
|
+
// 5. Strip display math $$...$$
|
|
31
|
+
result = result.replace(/\$\$([\s\S]*?)\$\$/g, '$1')
|
|
32
|
+
|
|
33
|
+
// 6. Strip inline math $...$
|
|
34
|
+
result = result.replace(/\$([^$]+)\$/g, '$1')
|
|
35
|
+
|
|
36
|
+
// 7. Common fractions
|
|
37
|
+
result = result.replace(/\\frac\{1\}\{2\}/g, 'one half')
|
|
38
|
+
result = result.replace(/\\frac\{1\}\{3\}/g, 'one third')
|
|
39
|
+
result = result.replace(/\\frac\{1\}\{4\}/g, 'one quarter')
|
|
40
|
+
result = result.replace(/\\frac\{([^}]+)\}\{([^}]+)\}/g, '$1 over $2')
|
|
41
|
+
|
|
42
|
+
// 8. Square root
|
|
43
|
+
result = result.replace(/\\sqrt\{([^}]+)\}/g, 'square root of $1')
|
|
44
|
+
|
|
45
|
+
// 9. Superscripts (special cases)
|
|
46
|
+
result = result.replace(/\^\{2\}/g, ' squared')
|
|
47
|
+
result = result.replace(/\^\{3\}/g, ' cubed')
|
|
48
|
+
result = result.replace(/\^\{([^}]+)\}/g, ' to the power of $1')
|
|
49
|
+
|
|
50
|
+
// 10. Subscripts
|
|
51
|
+
result = result.replace(/_\{([^}]+)\}/g, ' sub $1')
|
|
52
|
+
|
|
53
|
+
// 11. Greek letters
|
|
54
|
+
result = result.replace(/\\alpha/g, 'alpha')
|
|
55
|
+
result = result.replace(/\\beta/g, 'beta')
|
|
56
|
+
result = result.replace(/\\gamma/g, 'gamma')
|
|
57
|
+
result = result.replace(/\\delta/g, 'delta')
|
|
58
|
+
result = result.replace(/\\theta/g, 'theta')
|
|
59
|
+
result = result.replace(/\\lambda/g, 'lambda')
|
|
60
|
+
result = result.replace(/\\mu/g, 'mu')
|
|
61
|
+
result = result.replace(/\\sigma/g, 'sigma')
|
|
62
|
+
result = result.replace(/\\omega/g, 'omega')
|
|
63
|
+
result = result.replace(/\\pi/g, 'pi')
|
|
64
|
+
result = result.replace(/\\phi/g, 'phi')
|
|
65
|
+
|
|
66
|
+
// 12. Operators
|
|
67
|
+
result = result.replace(/\\times/g, 'times')
|
|
68
|
+
result = result.replace(/\\div/g, 'divided by')
|
|
69
|
+
result = result.replace(/\\pm/g, 'plus or minus')
|
|
70
|
+
result = result.replace(/\\cdot/g, 'dot')
|
|
71
|
+
|
|
72
|
+
// 13. Relations
|
|
73
|
+
result = result.replace(/\\neq/g, 'not equal to')
|
|
74
|
+
result = result.replace(/\\leq/g, 'less than or equal to')
|
|
75
|
+
result = result.replace(/\\geq/g, 'greater than or equal to')
|
|
76
|
+
result = result.replace(/\\approx/g, 'approximately')
|
|
77
|
+
result = result.replace(/\\equiv/g, 'equivalent to')
|
|
78
|
+
|
|
79
|
+
// 14. Special symbols
|
|
80
|
+
result = result.replace(/\\infty/g, 'infinity')
|
|
81
|
+
result = result.replace(/\\partial/g, 'partial')
|
|
82
|
+
|
|
83
|
+
// 15. Summation and integrals
|
|
84
|
+
result = result.replace(/\\sum/g, 'sum')
|
|
85
|
+
result = result.replace(/\\prod/g, 'product')
|
|
86
|
+
result = result.replace(/\\int/g, 'integral')
|
|
87
|
+
result = result.replace(/\\lim/g, 'limit')
|
|
88
|
+
|
|
89
|
+
// 16. Trig functions
|
|
90
|
+
result = result.replace(/\\sin/g, 'sin')
|
|
91
|
+
result = result.replace(/\\cos/g, 'cos')
|
|
92
|
+
result = result.replace(/\\tan/g, 'tan')
|
|
93
|
+
result = result.replace(/\\log/g, 'log')
|
|
94
|
+
result = result.replace(/\\ln/g, 'ln')
|
|
95
|
+
|
|
96
|
+
// 17. Text commands (keep content)
|
|
97
|
+
result = result.replace(/\\text\{([^}]+)\}/g, '$1')
|
|
98
|
+
result = result.replace(/\\mathrm\{([^}]+)\}/g, '$1')
|
|
99
|
+
result = result.replace(/\\mathbf\{([^}]+)\}/g, '$1')
|
|
100
|
+
result = result.replace(/\\mathit\{([^}]+)\}/g, '$1')
|
|
101
|
+
|
|
102
|
+
// 18. Delimiters
|
|
103
|
+
result = result.replace(/\\left/g, '')
|
|
104
|
+
result = result.replace(/\\right/g, '')
|
|
105
|
+
result = result.replace(/\\big/g, '')
|
|
106
|
+
result = result.replace(/\\Big/g, '')
|
|
107
|
+
|
|
108
|
+
// 19. Strip remaining LaTeX commands (\word)
|
|
109
|
+
result = result.replace(/\\[a-zA-Z]+/g, '')
|
|
110
|
+
|
|
111
|
+
// 20. Strip LaTeX curly braces (but keep content)
|
|
112
|
+
result = result.replace(/\{([^}]*)\}/g, '$1')
|
|
113
|
+
// Handle any remaining stray braces
|
|
114
|
+
result = result.replace(/[{}]/g, '')
|
|
115
|
+
|
|
116
|
+
// === Markdown ===
|
|
117
|
+
|
|
118
|
+
// 21. Strip images 
|
|
119
|
+
result = result.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1')
|
|
120
|
+
|
|
121
|
+
// 22. Strip links [text](url) keeping text
|
|
122
|
+
result = result.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
|
123
|
+
|
|
124
|
+
// 23. Strip bold **text** and __text__
|
|
125
|
+
result = result.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
126
|
+
result = result.replace(/__([^_]+)__/g, '$1')
|
|
127
|
+
|
|
128
|
+
// 24. Strip italic *text* and _text_
|
|
129
|
+
result = result.replace(/\*([^*]+)\*/g, '$1')
|
|
130
|
+
result = result.replace(/(?<!\w)_([^_]+)_(?!\w)/g, '$1')
|
|
131
|
+
|
|
132
|
+
// 25. Strip strikethrough ~~text~~
|
|
133
|
+
result = result.replace(/~~([^~]+)~~/g, '$1')
|
|
134
|
+
|
|
135
|
+
// 26. Strip headings (# to ######)
|
|
136
|
+
result = result.replace(/^#{1,6}\s+/gm, '')
|
|
137
|
+
|
|
138
|
+
// 27. Strip blockquotes
|
|
139
|
+
result = result.replace(/^>\s+/gm, '')
|
|
140
|
+
|
|
141
|
+
// 28. Strip unordered list markers (- or * at line start)
|
|
142
|
+
result = result.replace(/^[-*]\s+/gm, '')
|
|
143
|
+
|
|
144
|
+
// 29. Strip ordered list markers (1. 2. etc.)
|
|
145
|
+
result = result.replace(/^\d+\.\s+/gm, '')
|
|
146
|
+
|
|
147
|
+
// 30. Strip horizontal rules (---, ***, ___)
|
|
148
|
+
result = result.replace(/^[-*_]{3,}\s*$/gm, '')
|
|
149
|
+
|
|
150
|
+
// 31. Strip table separator lines (|---|---|)
|
|
151
|
+
result = result.replace(/^\|[-:\s|]+\|\s*$/gm, '')
|
|
152
|
+
|
|
153
|
+
// 32. Strip table pipes (keep cell content)
|
|
154
|
+
result = result.replace(/\|/g, ' ')
|
|
155
|
+
|
|
156
|
+
// === Whitespace normalization ===
|
|
157
|
+
|
|
158
|
+
// 33. Collapse multiple spaces to single space
|
|
159
|
+
result = result.replace(/ {2,}/g, ' ')
|
|
160
|
+
|
|
161
|
+
// 34. Normalize excessive newlines (3+ -> 2)
|
|
162
|
+
result = result.replace(/\n{3,}/g, '\n\n')
|
|
163
|
+
|
|
164
|
+
// 35. Trim each line
|
|
165
|
+
result = result
|
|
166
|
+
.split('\n')
|
|
167
|
+
.map((line) => line.trim())
|
|
168
|
+
.join('\n')
|
|
169
|
+
|
|
170
|
+
// 36. Remove empty lines at start/end
|
|
171
|
+
result = result.trim()
|
|
172
|
+
|
|
173
|
+
return result
|
|
174
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { TTSProvider, TTSConfig, TTSAPI, TTSOptions } from './types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* createTTS — creates a TTS manager that routes requests to registered providers.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order: explicit opts.provider -> router -> default -> first available
|
|
7
|
+
*/
|
|
8
|
+
export function createTTS(config?: TTSConfig): TTSAPI {
|
|
9
|
+
const providers = new Map<string, TTSProvider>()
|
|
10
|
+
const providerOrder: string[] = []
|
|
11
|
+
|
|
12
|
+
const defaultProvider = config?.default
|
|
13
|
+
const router = config?.router
|
|
14
|
+
|
|
15
|
+
function resolveProvider(opts?: TTSOptions): TTSProvider {
|
|
16
|
+
// 1. Explicit opts.provider
|
|
17
|
+
if (opts?.provider) {
|
|
18
|
+
const p = providers.get(opts.provider)
|
|
19
|
+
if (!p) {
|
|
20
|
+
throw new Error(`TTS provider "${opts.provider}" not found. Registered providers: [${providerOrder.join(', ')}]`)
|
|
21
|
+
}
|
|
22
|
+
return p
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 2. Router
|
|
26
|
+
if (router) {
|
|
27
|
+
const chosen = router(opts ?? {}, {
|
|
28
|
+
providers: [...providerOrder],
|
|
29
|
+
default: defaultProvider ?? providerOrder[0] ?? '',
|
|
30
|
+
})
|
|
31
|
+
const p = providers.get(chosen)
|
|
32
|
+
if (p) return p
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 3. Default
|
|
36
|
+
if (defaultProvider) {
|
|
37
|
+
const p = providers.get(defaultProvider)
|
|
38
|
+
if (!p) {
|
|
39
|
+
throw new Error(`Default TTS provider "${defaultProvider}" not registered. Registered providers: [${providerOrder.join(', ')}]`)
|
|
40
|
+
}
|
|
41
|
+
return p
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 4. First available
|
|
45
|
+
if (providerOrder.length === 0) {
|
|
46
|
+
throw new Error('No TTS providers configured. Call addProvider() to register at least one provider.')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return providers.get(providerOrder[0])!
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const api: TTSAPI = {
|
|
53
|
+
get providers() {
|
|
54
|
+
return [...providerOrder]
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
speak(text: string, opts?: TTSOptions): void {
|
|
58
|
+
const provider = resolveProvider(opts)
|
|
59
|
+
provider.speak(text, opts)
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
stop(): void {
|
|
63
|
+
for (const name of providerOrder) {
|
|
64
|
+
const p = providers.get(name)
|
|
65
|
+
if (p) p.stop()
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
addProvider(name: string, provider: TTSProvider): void {
|
|
70
|
+
if (providers.has(name)) {
|
|
71
|
+
providers.set(name, provider)
|
|
72
|
+
} else {
|
|
73
|
+
providers.set(name, provider)
|
|
74
|
+
providerOrder.push(name)
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return api
|
|
80
|
+
}
|
package/dist/ai/types.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** AI provider interface — implemented by adapter packages (OpenAI, Anthropic, etc.) */
|
|
2
|
+
export interface AIProvider {
|
|
3
|
+
name: string
|
|
4
|
+
generateText(prompt: string, opts?: GenerateOptions): Promise<string>
|
|
5
|
+
generateJSON<T = unknown>(prompt: string, opts?: GenerateOptions): Promise<T>
|
|
6
|
+
supportsVision: boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Options passed to generate calls */
|
|
10
|
+
export interface GenerateOptions {
|
|
11
|
+
provider?: string
|
|
12
|
+
model?: string
|
|
13
|
+
intent?: string
|
|
14
|
+
image?: unknown
|
|
15
|
+
maxTokens?: number
|
|
16
|
+
temperature?: number
|
|
17
|
+
[key: string]: unknown
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** TTS provider interface — implemented by TTS adapter packages */
|
|
21
|
+
export interface TTSProvider {
|
|
22
|
+
name: string
|
|
23
|
+
speak(text: string, opts?: TTSOptions): void
|
|
24
|
+
stop(): void
|
|
25
|
+
isSupported: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Options passed to TTS calls */
|
|
29
|
+
export interface TTSOptions {
|
|
30
|
+
provider?: string
|
|
31
|
+
voice?: string
|
|
32
|
+
language?: string
|
|
33
|
+
speed?: number
|
|
34
|
+
onEnd?: () => void
|
|
35
|
+
[key: string]: unknown
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Router function — picks a provider name given a request and context */
|
|
39
|
+
export type RouterFn<T> = (
|
|
40
|
+
request: T,
|
|
41
|
+
context: { providers: string[]; default: string },
|
|
42
|
+
) => string
|
|
43
|
+
|
|
44
|
+
/** Config for createAI */
|
|
45
|
+
export interface AIConfig {
|
|
46
|
+
default?: string
|
|
47
|
+
fallback?: string[]
|
|
48
|
+
router?: RouterFn<GenerateOptions>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Config for createTTS */
|
|
52
|
+
export interface TTSConfig {
|
|
53
|
+
default?: string
|
|
54
|
+
router?: RouterFn<TTSOptions>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Return type of createAI */
|
|
58
|
+
export interface AIAPI {
|
|
59
|
+
providers: string[]
|
|
60
|
+
generateText(prompt: string, opts?: GenerateOptions): Promise<string>
|
|
61
|
+
generateJSON<T = unknown>(prompt: string, opts?: GenerateOptions): Promise<T>
|
|
62
|
+
addProvider(name: string, provider: AIProvider): void
|
|
63
|
+
removeProvider(name: string): void
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Return type of createTTS */
|
|
67
|
+
export interface TTSAPI {
|
|
68
|
+
providers: string[]
|
|
69
|
+
speak(text: string, opts?: TTSOptions): void
|
|
70
|
+
stop(): void
|
|
71
|
+
addProvider(name: string, provider: TTSProvider): void
|
|
72
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cva } from '../shared/index.ts'
|
|
2
|
+
|
|
3
|
+
export const animatedTextVariants = cva({
|
|
4
|
+
base: 'inline-block transition-opacity',
|
|
5
|
+
variants: {
|
|
6
|
+
state: {
|
|
7
|
+
entering: 'opacity-100',
|
|
8
|
+
exiting: 'opacity-0',
|
|
9
|
+
idle: 'opacity-100',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
defaultVariants: {
|
|
13
|
+
state: 'idle',
|
|
14
|
+
},
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
export const typewriterVariants = cva({
|
|
18
|
+
base: 'inline',
|
|
19
|
+
variants: {
|
|
20
|
+
cursor: {
|
|
21
|
+
blinking: 'after:inline-block after:w-[2px] after:h-[1em] after:bg-current after:ml-[1px] after:animate-blink after:align-text-bottom',
|
|
22
|
+
hidden: '',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
cursor: 'blinking',
|
|
27
|
+
},
|
|
28
|
+
})
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export interface AnimatedTextProps {
|
|
2
|
+
words: string[]
|
|
3
|
+
interval?: number
|
|
4
|
+
transitionDuration?: number
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface AnimatedTextState {
|
|
8
|
+
currentIndex: number
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface AnimatedTextAPI {
|
|
12
|
+
/** Get the current word */
|
|
13
|
+
getCurrentWord: () => string
|
|
14
|
+
/** Get the next index (wraps around) */
|
|
15
|
+
getNextIndex: () => number
|
|
16
|
+
/** Current state */
|
|
17
|
+
state: AnimatedTextState
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface TypewriterProps {
|
|
21
|
+
text: string
|
|
22
|
+
speed?: number
|
|
23
|
+
startDelay?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface TypewriterState {
|
|
27
|
+
currentIndex: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface TypewriterAPI {
|
|
31
|
+
/** Get the currently visible portion of text */
|
|
32
|
+
getVisibleText: () => string
|
|
33
|
+
/** Whether the typewriter has finished */
|
|
34
|
+
isComplete: () => boolean
|
|
35
|
+
/** Current state */
|
|
36
|
+
state: TypewriterState
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function createAnimatedText(props: AnimatedTextProps): AnimatedTextAPI {
|
|
40
|
+
const { words } = props
|
|
41
|
+
|
|
42
|
+
const state: AnimatedTextState = {
|
|
43
|
+
currentIndex: 0,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function getCurrentWord(): string {
|
|
47
|
+
if (words.length === 0) return ''
|
|
48
|
+
return words[state.currentIndex]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getNextIndex(): number {
|
|
52
|
+
if (words.length === 0) return 0
|
|
53
|
+
return (state.currentIndex + 1) % words.length
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
getCurrentWord,
|
|
58
|
+
getNextIndex,
|
|
59
|
+
state,
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function createTypewriter(props: TypewriterProps): TypewriterAPI {
|
|
64
|
+
const { text } = props
|
|
65
|
+
|
|
66
|
+
const state: TypewriterState = {
|
|
67
|
+
currentIndex: 0,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getVisibleText(): string {
|
|
71
|
+
return text.slice(0, state.currentIndex)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isComplete(): boolean {
|
|
75
|
+
return state.currentIndex >= text.length
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
getVisibleText,
|
|
80
|
+
isComplete,
|
|
81
|
+
state,
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export {
|
|
2
|
+
createAnimatedText,
|
|
3
|
+
createTypewriter,
|
|
4
|
+
type AnimatedTextProps,
|
|
5
|
+
type AnimatedTextState,
|
|
6
|
+
type AnimatedTextAPI,
|
|
7
|
+
type TypewriterProps,
|
|
8
|
+
type TypewriterState,
|
|
9
|
+
type TypewriterAPI,
|
|
10
|
+
} from './animated-text.js'
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
animatedTextVariants,
|
|
14
|
+
typewriterVariants,
|
|
15
|
+
} from './animated-text.styles.js'
|