@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.
Files changed (334) hide show
  1. package/dist/accordion/index.ts +1 -0
  2. package/dist/ai/ai-manager.ts +121 -0
  3. package/dist/ai/index.ts +23 -0
  4. package/dist/ai/mock-providers.ts +68 -0
  5. package/dist/ai/sanitizer.ts +174 -0
  6. package/dist/ai/tts-manager.ts +80 -0
  7. package/dist/ai/types.ts +72 -0
  8. package/dist/animated-text/animated-text.styles.ts +28 -0
  9. package/dist/animated-text/animated-text.ts +83 -0
  10. package/dist/animated-text/index.ts +15 -0
  11. package/dist/app-shell/app-shell.ts +252 -0
  12. package/dist/app-shell/auth-shell.ts +84 -0
  13. package/dist/app-shell/index.ts +22 -0
  14. package/dist/app-shell/page-shell.ts +125 -0
  15. package/dist/astro-accordion/Button.astro +1 -1
  16. package/dist/astro-ai/index.ts +1 -1
  17. package/dist/astro-animated-text/AnimatedText.astro +1 -1
  18. package/dist/astro-animated-text/TypewriterText.astro +1 -1
  19. package/dist/astro-app-shell/AppShell.astro +1 -1
  20. package/dist/astro-app-shell/AuthShell.astro +1 -1
  21. package/dist/astro-app-shell/AuthShellCard.astro +1 -1
  22. package/dist/astro-app-shell/PageShell.astro +1 -1
  23. package/dist/astro-app-shell/PageShellSection.astro +1 -1
  24. package/dist/astro-app-shell/index.ts +1 -1
  25. package/dist/astro-auth/index.ts +2 -2
  26. package/dist/astro-avatar/Avatar.astro +1 -1
  27. package/dist/astro-avatar/AvatarFallback.astro +1 -1
  28. package/dist/astro-avatar/AvatarImage.astro +1 -1
  29. package/dist/astro-avatar-group/AvatarGroup.astro +1 -1
  30. package/dist/astro-badge/Badge.astro +1 -1
  31. package/dist/astro-bottom-nav/BottomNav.astro +1 -1
  32. package/dist/astro-breadcrumbs/Breadcrumbs.astro +1 -1
  33. package/dist/astro-button/Button.astro +1 -1
  34. package/dist/astro-calendar/Calendar.astro +1 -1
  35. package/dist/astro-card/Card.astro +1 -1
  36. package/dist/astro-card/CardContent.astro +1 -1
  37. package/dist/astro-card/CardDescription.astro +1 -1
  38. package/dist/astro-card/CardFooter.astro +1 -1
  39. package/dist/astro-card/CardHeader.astro +1 -1
  40. package/dist/astro-card/CardTitle.astro +1 -1
  41. package/dist/astro-card-grid/CardGrid.astro +1 -1
  42. package/dist/astro-carousel/Button.astro +1 -1
  43. package/dist/astro-charts/Bars.astro +1 -1
  44. package/dist/astro-charts/Chart.astro +1 -1
  45. package/dist/astro-charts/Circles.astro +1 -1
  46. package/dist/astro-charts/Histogram.astro +1 -1
  47. package/dist/astro-charts/Line.astro +1 -1
  48. package/dist/astro-charts/PieChart.astro +1 -1
  49. package/dist/astro-charts/ScatterPlot.astro +1 -1
  50. package/dist/astro-charts/index.ts +1 -1
  51. package/dist/astro-checkbox/Checkbox.astro +1 -1
  52. package/dist/astro-code-editor/CodeEditor.astro +1 -1
  53. package/dist/astro-collapsible/Collapsible.astro +1 -1
  54. package/dist/astro-collapsible/CollapsibleContent.astro +1 -1
  55. package/dist/astro-command/Command.astro +1 -1
  56. package/dist/astro-command/CommandGroup.astro +1 -1
  57. package/dist/astro-command/CommandInput.astro +1 -1
  58. package/dist/astro-command/CommandItem.astro +1 -1
  59. package/dist/astro-command-input/CommandInput.astro +1 -1
  60. package/dist/astro-content-protection/ContentProtection.astro +1 -1
  61. package/dist/astro-data-table/DataTable.astro +1 -1
  62. package/dist/astro-date-picker/DatePicker.astro +1 -1
  63. package/dist/astro-device-frame/DeviceFrame.astro +1 -1
  64. package/dist/astro-dialog/DialogContent.astro +1 -1
  65. package/dist/astro-dialog/DialogOverlay.astro +1 -1
  66. package/dist/astro-diff-viewer/DiffViewer.astro +1 -1
  67. package/dist/astro-dropdown-menu/DropdownMenuContent.astro +1 -1
  68. package/dist/astro-dropdown-menu/DropdownMenuItem.astro +1 -1
  69. package/dist/astro-emoji-picker/EmojiPicker.astro +1 -1
  70. package/dist/astro-feedback-dialog/FeedbackDialog.astro +1 -1
  71. package/dist/astro-file-upload/FileUpload.astro +1 -1
  72. package/dist/astro-footer/Footer.astro +1 -1
  73. package/dist/astro-inline-editor/InlineEditor.astro +1 -1
  74. package/dist/astro-input/Input.astro +1 -1
  75. package/dist/astro-input-group/InputGroup.astro +1 -1
  76. package/dist/astro-input-group/InputGroupAddon.astro +1 -1
  77. package/dist/astro-input-group/InputGroupButton.astro +1 -1
  78. package/dist/astro-install-prompt/InstallPrompt.astro +1 -1
  79. package/dist/astro-keyboard-shortcut/ShortcutBadge.astro +1 -1
  80. package/dist/astro-language-selector/LanguageSelector.astro +1 -1
  81. package/dist/astro-link-card/LinkCard.astro +1 -1
  82. package/dist/astro-markdown-renderer/MarkdownRenderer.astro +1 -1
  83. package/dist/astro-mobile-nav/MobileNav.astro +1 -1
  84. package/dist/astro-mobile-nav/MobileNavLink.astro +1 -1
  85. package/dist/astro-mobile-nav/MobileNavTrigger.astro +1 -1
  86. package/dist/astro-navbar/Navbar.astro +1 -1
  87. package/dist/astro-otp-input/OtpInput.astro +1 -1
  88. package/dist/astro-payment/Payment.astro +1 -1
  89. package/dist/astro-popover/PopoverContent.astro +1 -1
  90. package/dist/astro-presence-indicator/PresenceIndicator.astro +1 -1
  91. package/dist/astro-progress-display/BadgeDisplay.astro +1 -1
  92. package/dist/astro-progress-display/ProgressBar.astro +1 -1
  93. package/dist/astro-progress-display/StatsGrid.astro +1 -1
  94. package/dist/astro-radio/RadioGroup.astro +1 -1
  95. package/dist/astro-radio/RadioItem.astro +1 -1
  96. package/dist/astro-reaction-bar/ReactionBar.astro +1 -1
  97. package/dist/astro-resizable-layout/ResizableDivider.astro +1 -1
  98. package/dist/astro-resizable-layout/ResizableLayout.astro +1 -1
  99. package/dist/astro-resizable-layout/ResizablePane.astro +1 -1
  100. package/dist/astro-resizable-layout/index.ts +1 -1
  101. package/dist/astro-rich-editor/index.ts +2 -2
  102. package/dist/astro-search-bar/SearchBar.astro +1 -1
  103. package/dist/astro-search-bar/SearchResults.astro +1 -1
  104. package/dist/astro-select/Select.astro +1 -1
  105. package/dist/astro-select/SelectContent.astro +1 -1
  106. package/dist/astro-select/SelectItem.astro +1 -1
  107. package/dist/astro-select/SelectTrigger.astro +1 -1
  108. package/dist/astro-sidebar/Sidebar.astro +1 -1
  109. package/dist/astro-skeleton/Skeleton.astro +1 -1
  110. package/dist/astro-slide-viewer/SlideViewer.astro +1 -1
  111. package/dist/astro-status-indicator/StatusIndicator.astro +1 -1
  112. package/dist/astro-switch/Switch.astro +1 -1
  113. package/dist/astro-table-of-contents/TableOfContents.astro +1 -1
  114. package/dist/astro-tabs/Tabs.astro +1 -1
  115. package/dist/astro-tabs/TabsList.astro +1 -1
  116. package/dist/astro-tabs/TabsTrigger.astro +1 -1
  117. package/dist/astro-textarea/Textarea.astro +1 -1
  118. package/dist/astro-theme/ThemeScript.astro +1 -1
  119. package/dist/astro-thread-view/ThreadView.astro +1 -1
  120. package/dist/astro-toast/Toast.astro +1 -1
  121. package/dist/astro-tooltip/TooltipContent.astro +1 -1
  122. package/dist/astro-version-selector/VersionSelector.astro +1 -1
  123. package/dist/astro-video-player/VideoPlayer.astro +1 -1
  124. package/dist/auth/adapters/mock.ts +74 -0
  125. package/dist/auth/auth-machine.ts +120 -0
  126. package/dist/auth/index.ts +22 -0
  127. package/dist/auth/rbac.ts +44 -0
  128. package/dist/auth/types.ts +44 -0
  129. package/dist/avatar/avatar.styles.ts +47 -0
  130. package/dist/avatar/avatar.ts +73 -0
  131. package/dist/avatar/index.ts +15 -0
  132. package/dist/avatar-group/avatar-group.styles.ts +63 -0
  133. package/dist/avatar-group/avatar-group.ts +106 -0
  134. package/dist/avatar-group/index.ts +18 -0
  135. package/dist/badge/badge.styles.ts +24 -0
  136. package/dist/badge/badge.ts +48 -0
  137. package/dist/badge/index.ts +10 -0
  138. package/dist/bottom-nav/bottom-nav.styles.ts +18 -0
  139. package/dist/bottom-nav/bottom-nav.ts +33 -0
  140. package/dist/bottom-nav/index.ts +2 -0
  141. package/dist/breadcrumbs/breadcrumbs.styles.ts +20 -0
  142. package/dist/breadcrumbs/breadcrumbs.ts +72 -0
  143. package/dist/breadcrumbs/index.ts +8 -0
  144. package/dist/button/button.styles.ts +38 -0
  145. package/dist/button/button.ts +64 -0
  146. package/dist/button/index.ts +10 -0
  147. package/dist/calendar/calendar.styles.ts +21 -0
  148. package/dist/calendar/calendar.ts +202 -0
  149. package/dist/calendar/index.ts +9 -0
  150. package/dist/callout/callout.ts +1 -0
  151. package/dist/callout/index.ts +1 -0
  152. package/dist/card/card.styles.ts +55 -0
  153. package/dist/card/card.ts +45 -0
  154. package/dist/card/index.ts +20 -0
  155. package/dist/card-grid/card-grid.ts +9 -0
  156. package/dist/card-grid/index.ts +1 -0
  157. package/dist/carousel/index.ts +1 -0
  158. package/dist/charts/axis.ts +50 -0
  159. package/dist/charts/chart.ts +73 -0
  160. package/dist/charts/colorblind.ts +100 -0
  161. package/dist/charts/data.ts +72 -0
  162. package/dist/charts/geometry.ts +54 -0
  163. package/dist/charts/index.ts +61 -0
  164. package/dist/charts/scales.ts +151 -0
  165. package/dist/checkbox/checkbox.styles.ts +33 -0
  166. package/dist/checkbox/checkbox.ts +73 -0
  167. package/dist/checkbox/index.ts +10 -0
  168. package/dist/code-block/code-block.ts +1 -0
  169. package/dist/code-block/index.ts +1 -0
  170. package/dist/code-editor/code-editor.styles.ts +32 -0
  171. package/dist/code-editor/code-editor.ts +140 -0
  172. package/dist/code-editor/index.ts +9 -0
  173. package/dist/collapsible/collapsible.styles.ts +14 -0
  174. package/dist/collapsible/collapsible.ts +93 -0
  175. package/dist/collapsible/index.ts +7 -0
  176. package/dist/command/command.styles.ts +27 -0
  177. package/dist/command/command.ts +179 -0
  178. package/dist/command/index.ts +14 -0
  179. package/dist/command-input/command-input.ts +176 -0
  180. package/dist/command-input/index.ts +1 -0
  181. package/dist/content-protection/content-protection.styles.ts +9 -0
  182. package/dist/content-protection/content-protection.ts +68 -0
  183. package/dist/content-protection/index.ts +8 -0
  184. package/dist/data-table/data-table.styles.ts +55 -0
  185. package/dist/data-table/data-table.ts +183 -0
  186. package/dist/data-table/index.ts +15 -0
  187. package/dist/date-picker/date-picker.styles.ts +31 -0
  188. package/dist/date-picker/date-picker.ts +333 -0
  189. package/dist/date-picker/index.ts +18 -0
  190. package/dist/device-frame/device-frame.styles.ts +21 -0
  191. package/dist/device-frame/device-frame.ts +112 -0
  192. package/dist/device-frame/index.ts +10 -0
  193. package/dist/dialog/dialog.styles.ts +8 -0
  194. package/dist/dialog/dialog.ts +133 -0
  195. package/dist/dialog/index.ts +8 -0
  196. package/dist/diff-viewer/diff-viewer.styles.ts +124 -0
  197. package/dist/diff-viewer/diff-viewer.ts +255 -0
  198. package/dist/diff-viewer/index.ts +20 -0
  199. package/dist/dropdown-menu/dropdown-menu.styles.ts +9 -0
  200. package/dist/dropdown-menu/dropdown-menu.ts +139 -0
  201. package/dist/dropdown-menu/index.ts +9 -0
  202. package/dist/emoji-picker/emoji-data.ts +282 -0
  203. package/dist/emoji-picker/emoji-picker.styles.ts +32 -0
  204. package/dist/emoji-picker/emoji-picker.ts +165 -0
  205. package/dist/emoji-picker/index.ts +25 -0
  206. package/dist/feedback-dialog/feedback-dialog.styles.ts +15 -0
  207. package/dist/feedback-dialog/feedback-dialog.ts +147 -0
  208. package/dist/feedback-dialog/index.ts +11 -0
  209. package/dist/file-upload/file-upload.styles.ts +30 -0
  210. package/dist/file-upload/file-upload.ts +260 -0
  211. package/dist/file-upload/index.ts +19 -0
  212. package/dist/footer/footer.styles.ts +5 -0
  213. package/dist/footer/footer.ts +32 -0
  214. package/dist/footer/index.ts +9 -0
  215. package/dist/index.ts +1 -1
  216. package/dist/inline-editor/index.ts +13 -0
  217. package/dist/inline-editor/inline-editor.styles.ts +42 -0
  218. package/dist/inline-editor/inline-editor.ts +96 -0
  219. package/dist/input/index.ts +9 -0
  220. package/dist/input/input.styles.ts +15 -0
  221. package/dist/input/input.ts +84 -0
  222. package/dist/input-group/index.ts +13 -0
  223. package/dist/input-group/input-group.styles.ts +50 -0
  224. package/dist/input-group/input-group.ts +44 -0
  225. package/dist/install-prompt/index.ts +9 -0
  226. package/dist/install-prompt/install-prompt.styles.ts +5 -0
  227. package/dist/install-prompt/install-prompt.ts +68 -0
  228. package/dist/keyboard-shortcut/index.ts +12 -0
  229. package/dist/keyboard-shortcut/keyboard-shortcut.styles.ts +8 -0
  230. package/dist/keyboard-shortcut/keyboard-shortcut.ts +153 -0
  231. package/dist/language-selector/index.ts +8 -0
  232. package/dist/language-selector/language-selector.styles.ts +28 -0
  233. package/dist/language-selector/language-selector.ts +149 -0
  234. package/dist/link-card/index.ts +1 -0
  235. package/dist/link-card/link-card.ts +9 -0
  236. package/dist/markdown-renderer/index.ts +8 -0
  237. package/dist/markdown-renderer/markdown-renderer.styles.ts +31 -0
  238. package/dist/markdown-renderer/markdown-renderer.ts +251 -0
  239. package/dist/mobile-nav/index.ts +14 -0
  240. package/dist/mobile-nav/mobile-nav.styles.ts +39 -0
  241. package/dist/mobile-nav/mobile-nav.ts +74 -0
  242. package/dist/navbar/index.ts +9 -0
  243. package/dist/navbar/navbar.styles.ts +29 -0
  244. package/dist/navbar/navbar.ts +39 -0
  245. package/dist/otp-input/index.ts +13 -0
  246. package/dist/otp-input/otp-input.styles.ts +51 -0
  247. package/dist/otp-input/otp-input.ts +198 -0
  248. package/dist/pagination/index.ts +1 -0
  249. package/dist/payment/index.ts +1 -0
  250. package/dist/payment/payment.ts +16 -0
  251. package/dist/popover/index.ts +7 -0
  252. package/dist/popover/popover.styles.ts +16 -0
  253. package/dist/popover/popover.ts +89 -0
  254. package/dist/presence-indicator/index.ts +14 -0
  255. package/dist/presence-indicator/presence-indicator.styles.ts +29 -0
  256. package/dist/presence-indicator/presence-indicator.ts +63 -0
  257. package/dist/progress-display/index.ts +15 -0
  258. package/dist/progress-display/progress-display.styles.ts +72 -0
  259. package/dist/progress-display/progress-display.ts +60 -0
  260. package/dist/radio/index.ts +8 -0
  261. package/dist/radio/radio.styles.ts +34 -0
  262. package/dist/radio/radio.ts +70 -0
  263. package/dist/reaction-bar/index.ts +14 -0
  264. package/dist/reaction-bar/reaction-bar.styles.ts +23 -0
  265. package/dist/reaction-bar/reaction-bar.ts +87 -0
  266. package/dist/resizable-layout/index.ts +12 -0
  267. package/dist/resizable-layout/resizable-layout.styles.ts +50 -0
  268. package/dist/resizable-layout/resizable-layout.ts +139 -0
  269. package/dist/rich-editor/editor.ts +342 -0
  270. package/dist/rich-editor/emoji.ts +175 -0
  271. package/dist/rich-editor/history.ts +79 -0
  272. package/dist/rich-editor/index.ts +106 -0
  273. package/dist/rich-editor/markdown-shortcuts.ts +248 -0
  274. package/dist/rich-editor/mentions.ts +162 -0
  275. package/dist/rich-editor/model.ts +206 -0
  276. package/dist/rich-editor/operations.ts +772 -0
  277. package/dist/rich-editor/selection.ts +157 -0
  278. package/dist/rich-editor/serialization.ts +711 -0
  279. package/dist/rich-editor/slash-commands.ts +212 -0
  280. package/dist/search-bar/index.ts +7 -0
  281. package/dist/search-bar/search-bar.styles.ts +29 -0
  282. package/dist/search-bar/search-bar.ts +130 -0
  283. package/dist/select/index.ts +13 -0
  284. package/dist/select/select.styles.ts +52 -0
  285. package/dist/select/select.ts +152 -0
  286. package/dist/sidebar/index.ts +9 -0
  287. package/dist/sidebar/sidebar.styles.ts +27 -0
  288. package/dist/sidebar/sidebar.ts +59 -0
  289. package/dist/skeleton/index.ts +8 -0
  290. package/dist/skeleton/skeleton.styles.ts +16 -0
  291. package/dist/skeleton/skeleton.ts +39 -0
  292. package/dist/skip-to-content/index.ts +1 -0
  293. package/dist/skip-to-content/skip-to-content.ts +1 -0
  294. package/dist/slide-viewer/index.ts +16 -0
  295. package/dist/slide-viewer/slide-viewer.styles.ts +57 -0
  296. package/dist/slide-viewer/slide-viewer.ts +152 -0
  297. package/dist/slider/index.ts +1 -0
  298. package/dist/slider/slider.ts +2 -0
  299. package/dist/status-indicator/index.ts +15 -0
  300. package/dist/status-indicator/status-indicator.styles.ts +41 -0
  301. package/dist/status-indicator/status-indicator.ts +66 -0
  302. package/dist/steps/index.ts +1 -0
  303. package/dist/steps/steps.ts +1 -0
  304. package/dist/switch/index.ts +7 -0
  305. package/dist/switch/switch.styles.ts +55 -0
  306. package/dist/switch/switch.ts +63 -0
  307. package/dist/table-of-contents/index.ts +1 -0
  308. package/dist/table-of-contents/table-of-contents.ts +37 -0
  309. package/dist/tabs/index.ts +8 -0
  310. package/dist/tabs/tabs.styles.ts +9 -0
  311. package/dist/tabs/tabs.ts +133 -0
  312. package/dist/textarea/index.ts +7 -0
  313. package/dist/textarea/textarea.styles.ts +15 -0
  314. package/dist/textarea/textarea.ts +59 -0
  315. package/dist/theme/dom-adapters.ts +60 -0
  316. package/dist/theme/index.ts +18 -0
  317. package/dist/theme/theme-machine.ts +130 -0
  318. package/dist/theme/theme-script.ts +18 -0
  319. package/dist/thread-view/index.ts +26 -0
  320. package/dist/thread-view/thread-view.styles.ts +35 -0
  321. package/dist/thread-view/thread-view.ts +176 -0
  322. package/dist/toast/index.ts +13 -0
  323. package/dist/toast/toast.styles.ts +19 -0
  324. package/dist/toast/toast.ts +203 -0
  325. package/dist/tooltip/index.ts +7 -0
  326. package/dist/tooltip/tooltip.styles.ts +16 -0
  327. package/dist/tooltip/tooltip.ts +109 -0
  328. package/dist/version-selector/index.ts +12 -0
  329. package/dist/version-selector/version-selector.styles.ts +41 -0
  330. package/dist/version-selector/version-selector.ts +136 -0
  331. package/dist/video-player/index.ts +12 -0
  332. package/dist/video-player/video-player.styles.ts +42 -0
  333. package/dist/video-player/video-player.ts +100 -0
  334. 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
+ }
@@ -5,7 +5,7 @@ import {
5
5
  getButtonType,
6
6
  type ButtonVariant,
7
7
  type ButtonSize,
8
- } from '@refraction-ui/button'
8
+ } from '../button/index.ts'
9
9
  import { cn } from '../shared/index.ts'
10
10
 
11
11
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -13,4 +13,4 @@ export {
13
13
  type TTSProvider,
14
14
  type GenerateOptions,
15
15
  type TTSOptions,
16
- } from '@refraction-ui/ai'
16
+ } from '../ai/index.ts'
@@ -1,5 +1,5 @@
1
1
  ---
2
- import { animatedTextVariants } from '@refraction-ui/animated-text'
2
+ import { animatedTextVariants } from '../animated-text/index.ts'
3
3
  import { cn } from '../shared/index.ts'
4
4
 
5
5
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -1,5 +1,5 @@
1
1
  ---
2
- import { typewriterVariants } from '@refraction-ui/animated-text'
2
+ import { typewriterVariants } from '../animated-text/index.ts'
3
3
  import { cn } from '../shared/index.ts'
4
4
 
5
5
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -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 '@refraction-ui/app-shell'
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 '@refraction-ui/app-shell'
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 '@refraction-ui/app-shell'
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 '@refraction-ui/app-shell'
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 '@refraction-ui/app-shell'
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 '@refraction-ui/app-shell'
21
+ export { createAppShell, createPageShell, createAuthShell } from '../app-shell/index.ts'
@@ -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 '@refraction-ui/auth'
5
- export { createAuth } from '@refraction-ui/auth'
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 '@refraction-ui/avatar'
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 {
@@ -1,5 +1,5 @@
1
1
  ---
2
- import { avatarFallbackVariants, type AvatarSize } from '@refraction-ui/avatar'
2
+ import { avatarFallbackVariants, type AvatarSize } from '../avatar/index.ts'
3
3
  import { cn } from '../shared/index.ts'
4
4
 
5
5
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -1,5 +1,5 @@
1
1
  ---
2
- import { avatarImageVariants } from '@refraction-ui/avatar'
2
+ import { avatarImageVariants } from '../avatar/index.ts'
3
3
  import { cn } from '../shared/index.ts'
4
4
 
5
5
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -8,7 +8,7 @@ import {
8
8
  avatarPresenceDotVariants,
9
9
  type AvatarUser,
10
10
  type AvatarSize,
11
- } from '@refraction-ui/avatar-group'
11
+ } from '../avatar-group/index.ts'
12
12
  import { cn } from '../shared/index.ts'
13
13
 
14
14
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -4,7 +4,7 @@ import {
4
4
  badgeVariants,
5
5
  type BadgeVariant,
6
6
  type BadgeSize,
7
- } from '@refraction-ui/badge'
7
+ } from '../badge/index.ts'
8
8
  import { cn } from '../shared/index.ts'
9
9
 
10
10
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -4,7 +4,7 @@ import {
4
4
  bottomNavVariants,
5
5
  bottomNavTabVariants,
6
6
  type NavTab,
7
- } from '@refraction-ui/bottom-nav'
7
+ } from '../bottom-nav/index.ts'
8
8
  import { cn } from '../shared/index.ts'
9
9
 
10
10
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -5,7 +5,7 @@ import {
5
5
  breadcrumbItemVariants,
6
6
  breadcrumbSeparatorStyles,
7
7
  type BreadcrumbItem,
8
- } from '@refraction-ui/breadcrumbs'
8
+ } from '../breadcrumbs/index.ts'
9
9
  import { cn } from '../shared/index.ts'
10
10
 
11
11
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -5,7 +5,7 @@ import {
5
5
  getButtonType,
6
6
  type ButtonVariant,
7
7
  type ButtonSize,
8
- } from '@refraction-ui/button'
8
+ } from '../button/index.ts'
9
9
  import { cn } from '../shared/index.ts'
10
10
 
11
11
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -4,7 +4,7 @@ import {
4
4
  calendarVariants,
5
5
  dayVariants,
6
6
  type CalendarDay,
7
- } from '@refraction-ui/calendar'
7
+ } from '../calendar/index.ts'
8
8
  import { cn } from '../shared/index.ts'
9
9
 
10
10
  interface Props extends astroHTML.JSX.HTMLAttributes {
@@ -1,5 +1,5 @@
1
1
  ---
2
- import { createCard, cardVariants } from '@refraction-ui/card'
2
+ import { createCard, cardVariants } from '../card/index.ts'
3
3
  import { cn } from '../shared/index.ts'
4
4
 
5
5
  interface Props extends astroHTML.JSX.HTMLAttributes {