@refraction-ui/astro 0.4.2 → 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 +1 -1
- package/dist/astro-ai/index.ts +1 -1
- package/dist/astro-animated-text/AnimatedText.astro +1 -1
- package/dist/astro-animated-text/TypewriterText.astro +1 -1
- package/dist/astro-app-shell/AppShell.astro +1 -1
- package/dist/astro-app-shell/AuthShell.astro +1 -1
- package/dist/astro-app-shell/AuthShellCard.astro +1 -1
- package/dist/astro-app-shell/PageShell.astro +1 -1
- package/dist/astro-app-shell/PageShellSection.astro +1 -1
- package/dist/astro-app-shell/index.ts +1 -1
- package/dist/astro-auth/index.ts +2 -2
- package/dist/astro-avatar/Avatar.astro +1 -1
- package/dist/astro-avatar/AvatarFallback.astro +1 -1
- package/dist/astro-avatar/AvatarImage.astro +1 -1
- package/dist/astro-avatar-group/AvatarGroup.astro +1 -1
- package/dist/astro-badge/Badge.astro +1 -1
- package/dist/astro-bottom-nav/BottomNav.astro +1 -1
- package/dist/astro-breadcrumbs/Breadcrumbs.astro +1 -1
- package/dist/astro-button/Button.astro +1 -1
- package/dist/astro-calendar/Calendar.astro +1 -1
- package/dist/astro-card/Card.astro +1 -1
- package/dist/astro-card/CardContent.astro +1 -1
- package/dist/astro-card/CardDescription.astro +1 -1
- package/dist/astro-card/CardFooter.astro +1 -1
- package/dist/astro-card/CardHeader.astro +1 -1
- package/dist/astro-card/CardTitle.astro +1 -1
- package/dist/astro-card-grid/CardGrid.astro +1 -1
- package/dist/astro-carousel/Button.astro +1 -1
- package/dist/astro-charts/Bars.astro +1 -1
- package/dist/astro-charts/Chart.astro +1 -1
- package/dist/astro-charts/Circles.astro +1 -1
- package/dist/astro-charts/Histogram.astro +1 -1
- package/dist/astro-charts/Line.astro +1 -1
- package/dist/astro-charts/PieChart.astro +1 -1
- package/dist/astro-charts/ScatterPlot.astro +1 -1
- package/dist/astro-charts/index.ts +1 -1
- package/dist/astro-checkbox/Checkbox.astro +1 -1
- package/dist/astro-code-editor/CodeEditor.astro +1 -1
- package/dist/astro-collapsible/Collapsible.astro +1 -1
- package/dist/astro-collapsible/CollapsibleContent.astro +1 -1
- package/dist/astro-command/Command.astro +1 -1
- package/dist/astro-command/CommandGroup.astro +1 -1
- package/dist/astro-command/CommandInput.astro +1 -1
- package/dist/astro-command/CommandItem.astro +1 -1
- package/dist/astro-command-input/CommandInput.astro +1 -1
- package/dist/astro-content-protection/ContentProtection.astro +1 -1
- package/dist/astro-data-table/DataTable.astro +1 -1
- package/dist/astro-date-picker/DatePicker.astro +1 -1
- package/dist/astro-device-frame/DeviceFrame.astro +1 -1
- package/dist/astro-dialog/DialogContent.astro +1 -1
- package/dist/astro-dialog/DialogOverlay.astro +1 -1
- package/dist/astro-diff-viewer/DiffViewer.astro +1 -1
- package/dist/astro-dropdown-menu/DropdownMenuContent.astro +1 -1
- package/dist/astro-dropdown-menu/DropdownMenuItem.astro +1 -1
- package/dist/astro-emoji-picker/EmojiPicker.astro +1 -1
- package/dist/astro-feedback-dialog/FeedbackDialog.astro +1 -1
- package/dist/astro-file-upload/FileUpload.astro +1 -1
- package/dist/astro-footer/Footer.astro +1 -1
- package/dist/astro-inline-editor/InlineEditor.astro +1 -1
- package/dist/astro-input/Input.astro +1 -1
- package/dist/astro-input-group/InputGroup.astro +1 -1
- package/dist/astro-input-group/InputGroupAddon.astro +1 -1
- package/dist/astro-input-group/InputGroupButton.astro +1 -1
- package/dist/astro-install-prompt/InstallPrompt.astro +1 -1
- package/dist/astro-keyboard-shortcut/ShortcutBadge.astro +1 -1
- package/dist/astro-language-selector/LanguageSelector.astro +1 -1
- package/dist/astro-link-card/LinkCard.astro +1 -1
- package/dist/astro-markdown-renderer/MarkdownRenderer.astro +1 -1
- package/dist/astro-mobile-nav/MobileNav.astro +1 -1
- package/dist/astro-mobile-nav/MobileNavLink.astro +1 -1
- package/dist/astro-mobile-nav/MobileNavTrigger.astro +1 -1
- package/dist/astro-navbar/Navbar.astro +1 -1
- package/dist/astro-otp-input/OtpInput.astro +1 -1
- package/dist/astro-payment/Payment.astro +1 -1
- package/dist/astro-popover/PopoverContent.astro +1 -1
- package/dist/astro-presence-indicator/PresenceIndicator.astro +1 -1
- package/dist/astro-progress-display/BadgeDisplay.astro +1 -1
- package/dist/astro-progress-display/ProgressBar.astro +1 -1
- package/dist/astro-progress-display/StatsGrid.astro +1 -1
- package/dist/astro-radio/RadioGroup.astro +1 -1
- package/dist/astro-radio/RadioItem.astro +1 -1
- package/dist/astro-reaction-bar/ReactionBar.astro +1 -1
- package/dist/astro-resizable-layout/ResizableDivider.astro +1 -1
- package/dist/astro-resizable-layout/ResizableLayout.astro +1 -1
- package/dist/astro-resizable-layout/ResizablePane.astro +1 -1
- package/dist/astro-resizable-layout/index.ts +1 -1
- package/dist/astro-rich-editor/index.ts +2 -2
- package/dist/astro-search-bar/SearchBar.astro +1 -1
- package/dist/astro-search-bar/SearchResults.astro +1 -1
- package/dist/astro-select/Select.astro +1 -1
- package/dist/astro-select/SelectContent.astro +1 -1
- package/dist/astro-select/SelectItem.astro +1 -1
- package/dist/astro-select/SelectTrigger.astro +1 -1
- package/dist/astro-sidebar/Sidebar.astro +1 -1
- package/dist/astro-skeleton/Skeleton.astro +1 -1
- package/dist/astro-slide-viewer/SlideViewer.astro +1 -1
- package/dist/astro-status-indicator/StatusIndicator.astro +1 -1
- package/dist/astro-switch/Switch.astro +1 -1
- package/dist/astro-table-of-contents/TableOfContents.astro +1 -1
- package/dist/astro-tabs/Tabs.astro +1 -1
- package/dist/astro-tabs/TabsList.astro +1 -1
- package/dist/astro-tabs/TabsTrigger.astro +1 -1
- package/dist/astro-textarea/Textarea.astro +1 -1
- package/dist/astro-theme/ThemeScript.astro +1 -1
- package/dist/astro-thread-view/ThreadView.astro +1 -1
- package/dist/astro-toast/Toast.astro +1 -1
- package/dist/astro-tooltip/TooltipContent.astro +1 -1
- package/dist/astro-version-selector/VersionSelector.astro +1 -1
- package/dist/astro-video-player/VideoPlayer.astro +1 -1
- 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 +1 -1
- 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/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 +1 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { generateId } from '../shared/index.ts'
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Types
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
export type BreakpointName = 'mobile' | 'tablet' | 'desktop'
|
|
8
|
+
|
|
9
|
+
export interface AppShellConfig {
|
|
10
|
+
/** Sidebar width when expanded (default '16rem') */
|
|
11
|
+
sidebarWidth?: string
|
|
12
|
+
/** Sidebar width when collapsed to icon-only (default '4rem') */
|
|
13
|
+
sidebarCollapsedWidth?: string
|
|
14
|
+
/** Header height (default '3.5rem') */
|
|
15
|
+
headerHeight?: string
|
|
16
|
+
/** Breakpoint below which layout is mobile (default 768) */
|
|
17
|
+
mobileBreakpoint?: number
|
|
18
|
+
/** Breakpoint below which layout is tablet (default 1024) */
|
|
19
|
+
tabletBreakpoint?: number
|
|
20
|
+
/** Sidebar position (default 'left') */
|
|
21
|
+
sidebarPosition?: 'left' | 'right'
|
|
22
|
+
/** Whether sidebar can be collapsed on desktop (default true) */
|
|
23
|
+
sidebarCollapsible?: boolean
|
|
24
|
+
/** Whether sidebar starts collapsed on desktop (default false) */
|
|
25
|
+
sidebarDefaultCollapsed?: boolean
|
|
26
|
+
/** Mobile nav position (default 'bottom') */
|
|
27
|
+
mobileNavPosition?: 'bottom' | 'none'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AppShellState {
|
|
31
|
+
/** On mobile: drawer open/closed */
|
|
32
|
+
sidebarOpen: boolean
|
|
33
|
+
/** On desktop: full/icon-only */
|
|
34
|
+
sidebarCollapsed: boolean
|
|
35
|
+
/** Current responsive breakpoint */
|
|
36
|
+
breakpoint: BreakpointName
|
|
37
|
+
/** Convenience: breakpoint === 'mobile' */
|
|
38
|
+
isMobile: boolean
|
|
39
|
+
/** Convenience: breakpoint === 'tablet' */
|
|
40
|
+
isTablet: boolean
|
|
41
|
+
/** Convenience: breakpoint === 'desktop' */
|
|
42
|
+
isDesktop: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type AppShellSubscriber = (state: AppShellState) => void
|
|
46
|
+
|
|
47
|
+
export interface AppShellAPI {
|
|
48
|
+
/** Current state (snapshot — will not mutate) */
|
|
49
|
+
state: AppShellState
|
|
50
|
+
/** Resolved config with all defaults applied */
|
|
51
|
+
config: Required<AppShellConfig>
|
|
52
|
+
|
|
53
|
+
/** Mobile: open/close drawer. Desktop: collapse/expand sidebar. */
|
|
54
|
+
toggleSidebar(): void
|
|
55
|
+
/** Open sidebar (mobile drawer) */
|
|
56
|
+
openSidebar(): void
|
|
57
|
+
/** Close sidebar (mobile drawer) */
|
|
58
|
+
closeSidebar(): void
|
|
59
|
+
/** Collapse sidebar to icon-only (desktop) */
|
|
60
|
+
collapseSidebar(): void
|
|
61
|
+
/** Expand sidebar from icon-only (desktop) */
|
|
62
|
+
expandSidebar(): void
|
|
63
|
+
/** Update the current breakpoint */
|
|
64
|
+
setBreakpoint(bp: BreakpointName): void
|
|
65
|
+
|
|
66
|
+
/** CSS custom property map for layout dimensions */
|
|
67
|
+
getCSSVariables(): Record<string, string>
|
|
68
|
+
|
|
69
|
+
/** ARIA attributes for sidebar region */
|
|
70
|
+
sidebarAriaProps: Record<string, string>
|
|
71
|
+
/** ARIA attributes for main region */
|
|
72
|
+
mainAriaProps: Record<string, string>
|
|
73
|
+
/** ARIA attributes for header region */
|
|
74
|
+
headerAriaProps: Record<string, string>
|
|
75
|
+
/** ARIA attributes for mobile bottom nav */
|
|
76
|
+
mobileNavAriaProps: Record<string, string>
|
|
77
|
+
/** ARIA attributes for mobile sidebar overlay/backdrop */
|
|
78
|
+
overlayAriaProps: Record<string, string>
|
|
79
|
+
|
|
80
|
+
/** Subscribe to state changes. Returns unsubscribe function. */
|
|
81
|
+
subscribe(fn: AppShellSubscriber): () => void
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Defaults
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
const DEFAULTS: Required<AppShellConfig> = {
|
|
89
|
+
sidebarWidth: '16rem',
|
|
90
|
+
sidebarCollapsedWidth: '4rem',
|
|
91
|
+
headerHeight: '3.5rem',
|
|
92
|
+
mobileBreakpoint: 768,
|
|
93
|
+
tabletBreakpoint: 1024,
|
|
94
|
+
sidebarPosition: 'left',
|
|
95
|
+
sidebarCollapsible: true,
|
|
96
|
+
sidebarDefaultCollapsed: false,
|
|
97
|
+
mobileNavPosition: 'bottom',
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Helpers
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
function resolveBreakpoint(
|
|
105
|
+
width: number,
|
|
106
|
+
mobileBp: number,
|
|
107
|
+
tabletBp: number,
|
|
108
|
+
): BreakpointName {
|
|
109
|
+
if (width < mobileBp) return 'mobile'
|
|
110
|
+
if (width < tabletBp) return 'tablet'
|
|
111
|
+
return 'desktop'
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function makeState(
|
|
115
|
+
sidebarOpen: boolean,
|
|
116
|
+
sidebarCollapsed: boolean,
|
|
117
|
+
breakpoint: BreakpointName,
|
|
118
|
+
): AppShellState {
|
|
119
|
+
return {
|
|
120
|
+
sidebarOpen,
|
|
121
|
+
sidebarCollapsed,
|
|
122
|
+
breakpoint,
|
|
123
|
+
isMobile: breakpoint === 'mobile',
|
|
124
|
+
isTablet: breakpoint === 'tablet',
|
|
125
|
+
isDesktop: breakpoint === 'desktop',
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Factory
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
|
|
133
|
+
export function createAppShell(config?: AppShellConfig): AppShellAPI {
|
|
134
|
+
const resolved: Required<AppShellConfig> = { ...DEFAULTS, ...config }
|
|
135
|
+
|
|
136
|
+
// Internal mutable state
|
|
137
|
+
let sidebarOpen = false
|
|
138
|
+
let sidebarCollapsed = resolved.sidebarDefaultCollapsed
|
|
139
|
+
let breakpoint: BreakpointName = 'desktop' // SSR default
|
|
140
|
+
|
|
141
|
+
const subscribers = new Set<AppShellSubscriber>()
|
|
142
|
+
|
|
143
|
+
const sidebarId = generateId('rfr-shell-sidebar')
|
|
144
|
+
|
|
145
|
+
function getState(): AppShellState {
|
|
146
|
+
return makeState(sidebarOpen, sidebarCollapsed, breakpoint)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function notify(): void {
|
|
150
|
+
const s = getState()
|
|
151
|
+
for (const fn of subscribers) {
|
|
152
|
+
fn(s)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function toggleSidebar(): void {
|
|
157
|
+
if (breakpoint === 'mobile') {
|
|
158
|
+
sidebarOpen = !sidebarOpen
|
|
159
|
+
} else if (resolved.sidebarCollapsible) {
|
|
160
|
+
sidebarCollapsed = !sidebarCollapsed
|
|
161
|
+
}
|
|
162
|
+
notify()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function openSidebar(): void {
|
|
166
|
+
sidebarOpen = true
|
|
167
|
+
notify()
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function closeSidebar(): void {
|
|
171
|
+
sidebarOpen = false
|
|
172
|
+
notify()
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function collapseSidebar(): void {
|
|
176
|
+
sidebarCollapsed = true
|
|
177
|
+
notify()
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function expandSidebar(): void {
|
|
181
|
+
sidebarCollapsed = false
|
|
182
|
+
notify()
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function setBreakpoint(bp: BreakpointName): void {
|
|
186
|
+
if (bp === breakpoint) return
|
|
187
|
+
breakpoint = bp
|
|
188
|
+
// Auto-close mobile drawer when moving to desktop
|
|
189
|
+
if (bp !== 'mobile') {
|
|
190
|
+
sidebarOpen = false
|
|
191
|
+
}
|
|
192
|
+
notify()
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function getCSSVariables(): Record<string, string> {
|
|
196
|
+
const currentWidth = sidebarCollapsed
|
|
197
|
+
? resolved.sidebarCollapsedWidth
|
|
198
|
+
: resolved.sidebarWidth
|
|
199
|
+
return {
|
|
200
|
+
'--shell-sidebar-width': currentWidth,
|
|
201
|
+
'--shell-sidebar-full-width': resolved.sidebarWidth,
|
|
202
|
+
'--shell-sidebar-collapsed-width': resolved.sidebarCollapsedWidth,
|
|
203
|
+
'--shell-header-height': resolved.headerHeight,
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function subscribe(fn: AppShellSubscriber): () => void {
|
|
208
|
+
subscribers.add(fn)
|
|
209
|
+
return () => {
|
|
210
|
+
subscribers.delete(fn)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
get state() {
|
|
216
|
+
return getState()
|
|
217
|
+
},
|
|
218
|
+
config: resolved,
|
|
219
|
+
|
|
220
|
+
toggleSidebar,
|
|
221
|
+
openSidebar,
|
|
222
|
+
closeSidebar,
|
|
223
|
+
collapseSidebar,
|
|
224
|
+
expandSidebar,
|
|
225
|
+
setBreakpoint,
|
|
226
|
+
|
|
227
|
+
getCSSVariables,
|
|
228
|
+
|
|
229
|
+
sidebarAriaProps: {
|
|
230
|
+
role: 'navigation',
|
|
231
|
+
'aria-label': 'Sidebar',
|
|
232
|
+
id: sidebarId,
|
|
233
|
+
},
|
|
234
|
+
mainAriaProps: {
|
|
235
|
+
role: 'main',
|
|
236
|
+
},
|
|
237
|
+
headerAriaProps: {
|
|
238
|
+
role: 'banner',
|
|
239
|
+
},
|
|
240
|
+
mobileNavAriaProps: {
|
|
241
|
+
role: 'navigation',
|
|
242
|
+
'aria-label': 'Mobile navigation',
|
|
243
|
+
},
|
|
244
|
+
overlayAriaProps: {
|
|
245
|
+
'aria-hidden': 'true',
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
subscribe,
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export { resolveBreakpoint }
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Types
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
export interface AuthShellConfig {
|
|
6
|
+
/** Card max-width preset (default 'sm') */
|
|
7
|
+
maxWidth?: 'xs' | 'sm' | 'md'
|
|
8
|
+
/** Card position (default 'center') */
|
|
9
|
+
position?: 'center' | 'left'
|
|
10
|
+
/** Show decorative background pattern (default true) */
|
|
11
|
+
showBackground?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface AuthShellAPI {
|
|
15
|
+
/** Resolved config with all defaults */
|
|
16
|
+
config: Required<AuthShellConfig>
|
|
17
|
+
/** Tailwind classes for the outer container */
|
|
18
|
+
containerClasses: string
|
|
19
|
+
/** Tailwind classes for the card */
|
|
20
|
+
cardClasses: string
|
|
21
|
+
/** ARIA attributes for the auth region */
|
|
22
|
+
ariaProps: Record<string, string>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Defaults
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
const DEFAULTS: Required<AuthShellConfig> = {
|
|
30
|
+
maxWidth: 'sm',
|
|
31
|
+
position: 'center',
|
|
32
|
+
showBackground: true,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Class maps
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
const MAX_WIDTH_CLASSES: Record<AuthShellConfig['maxWidth'] & string, string> = {
|
|
40
|
+
xs: 'max-w-xs',
|
|
41
|
+
sm: 'max-w-sm',
|
|
42
|
+
md: 'max-w-md',
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Factory
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
export function createAuthShell(config?: AuthShellConfig): AuthShellAPI {
|
|
50
|
+
const resolved: Required<AuthShellConfig> = { ...DEFAULTS, ...config }
|
|
51
|
+
|
|
52
|
+
const containerParts: string[] = ['min-h-screen', 'flex', 'w-full']
|
|
53
|
+
|
|
54
|
+
if (resolved.position === 'center') {
|
|
55
|
+
containerParts.push('items-center', 'justify-center')
|
|
56
|
+
} else {
|
|
57
|
+
// left-aligned: vertically centered, padded from left
|
|
58
|
+
containerParts.push('items-center', 'justify-start', 'pl-8 sm:pl-16 lg:pl-24')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (resolved.showBackground) {
|
|
62
|
+
containerParts.push('bg-muted')
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const cardParts: string[] = [
|
|
66
|
+
'w-full',
|
|
67
|
+
MAX_WIDTH_CLASSES[resolved.maxWidth],
|
|
68
|
+
'rounded-lg',
|
|
69
|
+
'border',
|
|
70
|
+
'bg-card',
|
|
71
|
+
'p-6',
|
|
72
|
+
'shadow-sm',
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
config: resolved,
|
|
77
|
+
containerClasses: containerParts.join(' '),
|
|
78
|
+
cardClasses: cardParts.join(' '),
|
|
79
|
+
ariaProps: {
|
|
80
|
+
role: 'main',
|
|
81
|
+
'aria-label': 'Authentication',
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export {
|
|
2
|
+
createAppShell,
|
|
3
|
+
resolveBreakpoint,
|
|
4
|
+
type BreakpointName,
|
|
5
|
+
type AppShellConfig,
|
|
6
|
+
type AppShellState,
|
|
7
|
+
type AppShellSubscriber,
|
|
8
|
+
type AppShellAPI,
|
|
9
|
+
} from './app-shell.js'
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
createPageShell,
|
|
13
|
+
type PageShellConfig,
|
|
14
|
+
type SectionConfig,
|
|
15
|
+
type PageShellAPI,
|
|
16
|
+
} from './page-shell.js'
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
createAuthShell,
|
|
20
|
+
type AuthShellConfig,
|
|
21
|
+
type AuthShellAPI,
|
|
22
|
+
} from './auth-shell.js'
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Types
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
export interface PageShellConfig {
|
|
6
|
+
/** Max width for contained sections (default '80rem') */
|
|
7
|
+
maxWidth?: string
|
|
8
|
+
/** Navigation bar height (default '4rem') */
|
|
9
|
+
navHeight?: string
|
|
10
|
+
/** Whether nav is transparent (for hero sections, default false) */
|
|
11
|
+
navTransparent?: boolean
|
|
12
|
+
/** Whether nav is sticky (default true) */
|
|
13
|
+
navSticky?: boolean
|
|
14
|
+
/** Number of footer columns (default 4) */
|
|
15
|
+
footerColumns?: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface SectionConfig {
|
|
19
|
+
/** Whether section spans edge-to-edge (default false) */
|
|
20
|
+
fullWidth?: boolean
|
|
21
|
+
/** Override max-width for this section */
|
|
22
|
+
maxWidth?: string
|
|
23
|
+
/** Whether section has padding (default true) */
|
|
24
|
+
padding?: boolean
|
|
25
|
+
/** Background variant */
|
|
26
|
+
background?: 'default' | 'muted' | 'primary' | 'none'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PageShellAPI {
|
|
30
|
+
/** Resolved config with all defaults applied */
|
|
31
|
+
config: Required<PageShellConfig>
|
|
32
|
+
/** ARIA attributes for the nav region */
|
|
33
|
+
navAriaProps: Record<string, string>
|
|
34
|
+
/** ARIA attributes for the footer region */
|
|
35
|
+
footerAriaProps: Record<string, string>
|
|
36
|
+
/** Returns Tailwind utility classes for a section */
|
|
37
|
+
getSectionClasses(sectionConfig?: SectionConfig): string
|
|
38
|
+
/** CSS custom property map */
|
|
39
|
+
getCSSVariables(): Record<string, string>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Defaults
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
const DEFAULTS: Required<PageShellConfig> = {
|
|
47
|
+
maxWidth: '80rem',
|
|
48
|
+
navHeight: '4rem',
|
|
49
|
+
navTransparent: false,
|
|
50
|
+
navSticky: true,
|
|
51
|
+
footerColumns: 4,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Background class map
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
const BACKGROUND_CLASSES: Record<NonNullable<SectionConfig['background']>, string> = {
|
|
59
|
+
default: '',
|
|
60
|
+
muted: 'bg-muted',
|
|
61
|
+
primary: 'bg-primary text-primary-foreground',
|
|
62
|
+
none: '',
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Factory
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
export function createPageShell(config?: PageShellConfig): PageShellAPI {
|
|
70
|
+
const resolved: Required<PageShellConfig> = { ...DEFAULTS, ...config }
|
|
71
|
+
|
|
72
|
+
function getSectionClasses(sectionConfig?: SectionConfig): string {
|
|
73
|
+
const {
|
|
74
|
+
fullWidth = false,
|
|
75
|
+
maxWidth,
|
|
76
|
+
padding = true,
|
|
77
|
+
background = 'default',
|
|
78
|
+
} = sectionConfig ?? {}
|
|
79
|
+
|
|
80
|
+
const classes: string[] = []
|
|
81
|
+
|
|
82
|
+
if (!fullWidth) {
|
|
83
|
+
classes.push('mx-auto')
|
|
84
|
+
classes.push('w-full')
|
|
85
|
+
// Use custom max-width or fall through to CSS variable
|
|
86
|
+
if (maxWidth) {
|
|
87
|
+
classes.push(`max-w-${maxWidth}`)
|
|
88
|
+
} else {
|
|
89
|
+
classes.push('max-w-[var(--page-max-width)]')
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (padding) {
|
|
94
|
+
classes.push('px-4 sm:px-6 lg:px-8')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const bg = BACKGROUND_CLASSES[background]
|
|
98
|
+
if (bg) {
|
|
99
|
+
classes.push(bg)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return classes.join(' ')
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getCSSVariables(): Record<string, string> {
|
|
106
|
+
return {
|
|
107
|
+
'--page-max-width': resolved.maxWidth,
|
|
108
|
+
'--page-nav-height': resolved.navHeight,
|
|
109
|
+
'--page-footer-columns': String(resolved.footerColumns),
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
config: resolved,
|
|
115
|
+
navAriaProps: {
|
|
116
|
+
role: 'navigation',
|
|
117
|
+
'aria-label': 'Main navigation',
|
|
118
|
+
},
|
|
119
|
+
footerAriaProps: {
|
|
120
|
+
role: 'contentinfo',
|
|
121
|
+
},
|
|
122
|
+
getSectionClasses,
|
|
123
|
+
getCSSVariables,
|
|
124
|
+
}
|
|
125
|
+
}
|
package/dist/astro-ai/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* AppShell — root layout container for app-style layouts with sidebar, header, and main content.
|
|
4
4
|
* Includes a client-side script for responsive breakpoint detection and sidebar toggling.
|
|
5
5
|
*/
|
|
6
|
-
import { createAppShell, type AppShellConfig } from '
|
|
6
|
+
import { createAppShell, type AppShellConfig } from '../app-shell/index.ts'
|
|
7
7
|
import { cn } from '../shared/index.ts'
|
|
8
8
|
|
|
9
9
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* AuthShell — centered layout for authentication pages (sign-in, sign-up, etc.).
|
|
4
4
|
*/
|
|
5
|
-
import { createAuthShell, type AuthShellConfig } from '
|
|
5
|
+
import { createAuthShell, type AuthShellConfig } from '../app-shell/index.ts'
|
|
6
6
|
import { cn } from '../shared/index.ts'
|
|
7
7
|
|
|
8
8
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* AuthShellCard — card container within AuthShell for form content.
|
|
4
4
|
*/
|
|
5
|
-
import { createAuthShell, type AuthShellConfig } from '
|
|
5
|
+
import { createAuthShell, type AuthShellConfig } from '../app-shell/index.ts'
|
|
6
6
|
import { cn } from '../shared/index.ts'
|
|
7
7
|
|
|
8
8
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* PageShell — root layout for marketing/landing pages with nav, sections, footer.
|
|
4
4
|
*/
|
|
5
|
-
import { createPageShell, type PageShellConfig } from '
|
|
5
|
+
import { createPageShell, type PageShellConfig } from '../app-shell/index.ts'
|
|
6
6
|
import { cn } from '../shared/index.ts'
|
|
7
7
|
|
|
8
8
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* PageShellSection — a content section within PageShell.
|
|
4
4
|
*/
|
|
5
|
-
import { createPageShell } from '
|
|
5
|
+
import { createPageShell } from '../app-shell/index.ts'
|
|
6
6
|
import { cn } from '../shared/index.ts'
|
|
7
7
|
|
|
8
8
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|
|
@@ -18,4 +18,4 @@ export { default as AuthShell } from './AuthShell.astro'
|
|
|
18
18
|
export { default as AuthShellCard } from './AuthShellCard.astro'
|
|
19
19
|
|
|
20
20
|
// Re-export core types
|
|
21
|
-
export { createAppShell, createPageShell, createAuthShell } from '
|
|
21
|
+
export { createAppShell, createPageShell, createAuthShell } from '../app-shell/index.ts'
|
package/dist/astro-auth/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { default as AuthGuard } from './AuthGuard.astro'
|
|
2
2
|
|
|
3
3
|
// Re-export core types for convenience
|
|
4
|
-
export type { User, AuthState, AuthConfig } from '
|
|
5
|
-
export { createAuth } from '
|
|
4
|
+
export type { User, AuthState, AuthConfig } from '../auth/index.ts'
|
|
5
|
+
export { createAuth } from '../auth/index.ts'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import { createAvatar, avatarVariants, type AvatarSize } from '
|
|
2
|
+
import { createAvatar, avatarVariants, type AvatarSize } from '../avatar/index.ts'
|
|
3
3
|
import { cn } from '../shared/index.ts'
|
|
4
4
|
|
|
5
5
|
interface Props extends astroHTML.JSX.HTMLAttributes {
|