@rimelight/ui 0.0.4 → 0.0.6

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 (310) hide show
  1. package/package.json +36 -6
  2. package/src/components/BlogPost.astro +181 -0
  3. package/src/components/DynamicShowcase.astro +681 -0
  4. package/src/components/ExtendedCarousel.astro +107 -0
  5. package/src/components/Head.astro +150 -0
  6. package/src/components/LanguageSwitcher.astro +128 -0
  7. package/src/components/ProjectPost.astro +183 -0
  8. package/src/components/RLHead.astro +3 -0
  9. package/src/components/ThemeToggle.astro +30 -42
  10. package/src/components/astro/RLAButton.astro +85 -0
  11. package/src/components/astro/RLAHeader.astro +75 -0
  12. package/src/components/vue/RLVButton.vue +90 -0
  13. package/src/components/vue/RLVHeader.vue +78 -0
  14. package/src/composables/index.ts +1 -0
  15. package/src/composables/useUi.ts +27 -0
  16. package/src/config/index.ts +0 -2
  17. package/src/config/site.config.ts +1 -1
  18. package/src/env.d.ts +9 -42
  19. package/src/integrations/index.ts +2 -0
  20. package/src/integrations/ui.ts +87 -0
  21. package/src/themes/button.theme.ts +361 -0
  22. package/src/themes/header.theme.ts +33 -0
  23. package/src/themes/index.ts +13 -0
  24. package/src/utils/index.ts +3 -2
  25. package/i18n-data.json +0 -186
  26. package/src/components/accordion/Accordion.astro +0 -257
  27. package/src/components/accordion/AccordionContent.astro +0 -34
  28. package/src/components/accordion/AccordionItem.astro +0 -29
  29. package/src/components/accordion/AccordionTrigger.astro +0 -33
  30. package/src/components/alert/Alert.astro +0 -34
  31. package/src/components/alert/AlertDescription.astro +0 -15
  32. package/src/components/alert/AlertTitle.astro +0 -17
  33. package/src/components/alert-dialog/AlertDialog.astro +0 -275
  34. package/src/components/alert-dialog/AlertDialogAction.astro +0 -46
  35. package/src/components/alert-dialog/AlertDialogCancel.astro +0 -46
  36. package/src/components/alert-dialog/AlertDialogContent.astro +0 -52
  37. package/src/components/alert-dialog/AlertDialogDescription.astro +0 -18
  38. package/src/components/alert-dialog/AlertDialogFooter.astro +0 -16
  39. package/src/components/alert-dialog/AlertDialogHeader.astro +0 -14
  40. package/src/components/alert-dialog/AlertDialogTitle.astro +0 -20
  41. package/src/components/alert-dialog/AlertDialogTrigger.astro +0 -47
  42. package/src/components/aspect-ratio/AspectRatio.astro +0 -32
  43. package/src/components/avatar/Avatar.astro +0 -29
  44. package/src/components/avatar/AvatarFallback.astro +0 -18
  45. package/src/components/avatar/AvatarImage.astro +0 -66
  46. package/src/components/badge/Badge.astro +0 -57
  47. package/src/components/breadcrumb/Breadcrumb.astro +0 -12
  48. package/src/components/breadcrumb/BreadcrumbEllipsis.astro +0 -29
  49. package/src/components/breadcrumb/BreadcrumbItem.astro +0 -15
  50. package/src/components/breadcrumb/BreadcrumbLink.astro +0 -24
  51. package/src/components/breadcrumb/BreadcrumbList.astro +0 -17
  52. package/src/components/breadcrumb/BreadcrumbPage.astro +0 -22
  53. package/src/components/breadcrumb/BreadcrumbSeparator.astro +0 -24
  54. package/src/components/button/Button.astro +0 -58
  55. package/src/components/button-group/ButtonGroup.astro +0 -64
  56. package/src/components/button-group/ButtonGroupSeparator.astro +0 -20
  57. package/src/components/button-group/ButtonGroupText.astro +0 -19
  58. package/src/components/card/Card.astro +0 -36
  59. package/src/components/card/CardAction.astro +0 -16
  60. package/src/components/card/CardContent.astro +0 -16
  61. package/src/components/card/CardDescription.astro +0 -16
  62. package/src/components/card/CardFooter.astro +0 -16
  63. package/src/components/card/CardHeader.astro +0 -19
  64. package/src/components/card/CardTitle.astro +0 -16
  65. package/src/components/carousel/Carousel.astro +0 -55
  66. package/src/components/carousel/CarouselContent.astro +0 -26
  67. package/src/components/carousel/CarouselItem.astro +0 -26
  68. package/src/components/carousel/CarouselNext.astro +0 -39
  69. package/src/components/carousel/CarouselPrevious.astro +0 -41
  70. package/src/components/carousel/carousel-script.ts +0 -188
  71. package/src/components/carousel/index.ts +0 -1
  72. package/src/components/checkbox/Checkbox.astro +0 -133
  73. package/src/components/collapsible/Collapsible.astro +0 -161
  74. package/src/components/collapsible/CollapsibleContent.astro +0 -22
  75. package/src/components/collapsible/CollapsibleTrigger.astro +0 -44
  76. package/src/components/dialog/Dialog.astro +0 -389
  77. package/src/components/dialog/DialogClose.astro +0 -35
  78. package/src/components/dialog/DialogContent.astro +0 -78
  79. package/src/components/dialog/DialogDescription.astro +0 -14
  80. package/src/components/dialog/DialogFooter.astro +0 -14
  81. package/src/components/dialog/DialogHeader.astro +0 -14
  82. package/src/components/dialog/DialogTitle.astro +0 -18
  83. package/src/components/dialog/DialogTrigger.astro +0 -47
  84. package/src/components/dropdown/Dropdown.astro +0 -604
  85. package/src/components/dropdown/DropdownContent.astro +0 -118
  86. package/src/components/dropdown/DropdownItem.astro +0 -48
  87. package/src/components/dropdown/DropdownLabel.astro +0 -29
  88. package/src/components/dropdown/DropdownSeparator.astro +0 -21
  89. package/src/components/dropdown/DropdownShortcut.astro +0 -17
  90. package/src/components/dropdown/DropdownSub.astro +0 -15
  91. package/src/components/dropdown/DropdownSubContent.astro +0 -39
  92. package/src/components/dropdown/DropdownSubTrigger.astro +0 -34
  93. package/src/components/dropdown/DropdownTrigger.astro +0 -52
  94. package/src/components/dropzone/Dropzone.astro +0 -236
  95. package/src/components/dropzone/DropzoneFilesList.astro +0 -26
  96. package/src/components/dropzone/DropzoneLoadingIndicator.astro +0 -10
  97. package/src/components/dropzone/DropzoneUploadIndicator.astro +0 -10
  98. package/src/components/embeds/YoutubeEmbed.astro +0 -94
  99. package/src/components/hero/Hero.astro +0 -166
  100. package/src/components/icons/Flag.astro +0 -62
  101. package/src/components/image/ExtendedImage.astro +0 -46
  102. package/src/components/image/Image.astro +0 -25
  103. package/src/components/input/Input.astro +0 -27
  104. package/src/components/input-group/InputGroup.astro +0 -28
  105. package/src/components/input-group/InputGroupAddon.astro +0 -76
  106. package/src/components/input-group/InputGroupButton.astro +0 -36
  107. package/src/components/input-group/InputGroupInput.astro +0 -18
  108. package/src/components/input-group/InputGroupText.astro +0 -17
  109. package/src/components/input-group/InputGroupTextarea.astro +0 -22
  110. package/src/components/input-otp/InputOtp.astro +0 -352
  111. package/src/components/input-otp/InputOtpGroup.astro +0 -16
  112. package/src/components/input-otp/InputOtpSeparator.astro +0 -25
  113. package/src/components/input-otp/InputOtpSlot.astro +0 -50
  114. package/src/components/input-otp/InputOtpTypes.ts +0 -6
  115. package/src/components/item/Item.astro +0 -52
  116. package/src/components/item/ItemActions.astro +0 -16
  117. package/src/components/item/ItemContent.astro +0 -16
  118. package/src/components/item/ItemDescription.astro +0 -19
  119. package/src/components/item/ItemFooter.astro +0 -16
  120. package/src/components/item/ItemGroup.astro +0 -16
  121. package/src/components/item/ItemHeader.astro +0 -16
  122. package/src/components/item/ItemMedia.astro +0 -40
  123. package/src/components/item/ItemSeparator.astro +0 -23
  124. package/src/components/item/ItemTitle.astro +0 -16
  125. package/src/components/kbd/Kbd.astro +0 -21
  126. package/src/components/kbd/KbdGroup.astro +0 -16
  127. package/src/components/label/Label.astro +0 -24
  128. package/src/components/marquee/Marquee.astro +0 -73
  129. package/src/components/native-select/NativeSelect.astro +0 -68
  130. package/src/components/native-select/NativeSelectOptGroup.astro +0 -15
  131. package/src/components/native-select/NativeSelectOption.astro +0 -15
  132. package/src/components/pagination/Pagination.astro +0 -20
  133. package/src/components/pagination/PaginationContent.astro +0 -16
  134. package/src/components/pagination/PaginationEllipsis.astro +0 -37
  135. package/src/components/pagination/PaginationItem.astro +0 -16
  136. package/src/components/pagination/PaginationLink.astro +0 -27
  137. package/src/components/pagination/PaginationNext.astro +0 -33
  138. package/src/components/pagination/PaginationPrevious.astro +0 -33
  139. package/src/components/popover/Popover.astro +0 -717
  140. package/src/components/popover/PopoverContent.astro +0 -102
  141. package/src/components/popover/PopoverDescription.astro +0 -14
  142. package/src/components/popover/PopoverHeader.astro +0 -14
  143. package/src/components/popover/PopoverTitle.astro +0 -14
  144. package/src/components/popover/PopoverTrigger.astro +0 -51
  145. package/src/components/progress/Progress.astro +0 -154
  146. package/src/components/prose/Prose.astro +0 -619
  147. package/src/components/radio-group/RadioGroup.astro +0 -162
  148. package/src/components/radio-group/RadioGroupItem.astro +0 -133
  149. package/src/components/radio-group/RadioGroupTypes.ts +0 -6
  150. package/src/components/section/Section.astro +0 -167
  151. package/src/components/select/Select.astro +0 -752
  152. package/src/components/select/SelectContent.astro +0 -94
  153. package/src/components/select/SelectGroup.astro +0 -9
  154. package/src/components/select/SelectItem.astro +0 -51
  155. package/src/components/select/SelectLabel.astro +0 -14
  156. package/src/components/select/SelectSearch.astro +0 -49
  157. package/src/components/select/SelectSeparator.astro +0 -12
  158. package/src/components/select/SelectTrigger.astro +0 -56
  159. package/src/components/select/SelectTypes.ts +0 -13
  160. package/src/components/select/SelectValue.astro +0 -19
  161. package/src/components/separator/Separator.astro +0 -36
  162. package/src/components/sheet/Sheet.astro +0 -15
  163. package/src/components/sheet/SheetClose.astro +0 -15
  164. package/src/components/sheet/SheetContent.astro +0 -89
  165. package/src/components/sheet/SheetDescription.astro +0 -16
  166. package/src/components/sheet/SheetFooter.astro +0 -16
  167. package/src/components/sheet/SheetHeader.astro +0 -16
  168. package/src/components/sheet/SheetTitle.astro +0 -16
  169. package/src/components/sheet/SheetTrigger.astro +0 -15
  170. package/src/components/sidebar/Sidebar.astro +0 -231
  171. package/src/components/sidebar/SidebarContent.astro +0 -25
  172. package/src/components/sidebar/SidebarFooter.astro +0 -22
  173. package/src/components/sidebar/SidebarGroup.astro +0 -22
  174. package/src/components/sidebar/SidebarGroupContent.astro +0 -22
  175. package/src/components/sidebar/SidebarGroupLabel.astro +0 -53
  176. package/src/components/sidebar/SidebarHeader.astro +0 -22
  177. package/src/components/sidebar/SidebarInput.astro +0 -24
  178. package/src/components/sidebar/SidebarInset.astro +0 -22
  179. package/src/components/sidebar/SidebarMenu.astro +0 -22
  180. package/src/components/sidebar/SidebarMenuAction.astro +0 -63
  181. package/src/components/sidebar/SidebarMenuBadge.astro +0 -31
  182. package/src/components/sidebar/SidebarMenuButton.astro +0 -124
  183. package/src/components/sidebar/SidebarMenuItem.astro +0 -22
  184. package/src/components/sidebar/SidebarMenuSkeleton.astro +0 -43
  185. package/src/components/sidebar/SidebarMenuSub.astro +0 -25
  186. package/src/components/sidebar/SidebarMenuSubButton.astro +0 -52
  187. package/src/components/sidebar/SidebarMenuSubItem.astro +0 -17
  188. package/src/components/sidebar/SidebarProvider.astro +0 -215
  189. package/src/components/sidebar/SidebarRail.astro +0 -72
  190. package/src/components/sidebar/SidebarSeparator.astro +0 -25
  191. package/src/components/sidebar/SidebarTrigger.astro +0 -69
  192. package/src/components/skeleton/Skeleton.astro +0 -14
  193. package/src/components/slider/Slider.astro +0 -425
  194. package/src/components/spinner/Spinner.astro +0 -23
  195. package/src/components/switch/Switch.astro +0 -192
  196. package/src/components/switch/SwitchTypes.ts +0 -6
  197. package/src/components/table/Table.astro +0 -20
  198. package/src/components/table/TableBody.astro +0 -18
  199. package/src/components/table/TableCaption.astro +0 -18
  200. package/src/components/table/TableCell.astro +0 -18
  201. package/src/components/table/TableFoot.astro +0 -18
  202. package/src/components/table/TableHead.astro +0 -18
  203. package/src/components/table/TableHeader.astro +0 -18
  204. package/src/components/table/TableRow.astro +0 -17
  205. package/src/components/tabs/Tabs.astro +0 -270
  206. package/src/components/tabs/TabsContent.astro +0 -28
  207. package/src/components/tabs/TabsList.astro +0 -23
  208. package/src/components/tabs/TabsTrigger.astro +0 -34
  209. package/src/components/textarea/Textarea.astro +0 -31
  210. package/src/components/toast/ToastDescription.astro +0 -22
  211. package/src/components/toast/ToastItem.astro +0 -56
  212. package/src/components/toast/ToastTemplate.astro +0 -27
  213. package/src/components/toast/ToastTitle.astro +0 -59
  214. package/src/components/toast/Toaster.astro +0 -981
  215. package/src/components/toast/index.ts +0 -1
  216. package/src/components/toast/toast-manager.ts +0 -234
  217. package/src/components/toggle/Toggle.astro +0 -174
  218. package/src/components/toggle/ToggleTypes.ts +0 -14
  219. package/src/components/tooltip/Tooltip.astro +0 -422
  220. package/src/components/tooltip/TooltipContent.astro +0 -83
  221. package/src/components/tooltip/TooltipTrigger.astro +0 -13
  222. package/src/components/video/Video.astro +0 -121
  223. package/src/config/cookies.ts +0 -5
  224. package/src/config/links.ts +0 -4
  225. package/src/domain/cms/index.ts +0 -1
  226. package/src/domain/cms/types.ts +0 -20
  227. package/src/domain/i18n/constants.ts +0 -21
  228. package/src/domain/i18n/cookie-storage.ts +0 -13
  229. package/src/domain/i18n/country-to-locale-map.ts +0 -67
  230. package/src/domain/i18n/fallbacks.generated.ts +0 -230
  231. package/src/domain/i18n/fetcher.ts +0 -278
  232. package/src/domain/i18n/flags.ts +0 -16
  233. package/src/domain/i18n/format.ts +0 -90
  234. package/src/domain/i18n/index.ts +0 -10
  235. package/src/domain/i18n/middleware/i18n.ts +0 -161
  236. package/src/domain/i18n/resolve-locale.ts +0 -55
  237. package/src/domain/i18n/runtime-constants.ts +0 -14
  238. package/src/domain/i18n/schema.ts +0 -29
  239. package/src/domain/index.ts +0 -4
  240. package/src/domain/seo/constants.ts +0 -6
  241. package/src/domain/seo/index.ts +0 -3
  242. package/src/domain/seo/services/index.ts +0 -3
  243. package/src/domain/seo/services/llms.ts +0 -56
  244. package/src/domain/seo/services/robots.ts +0 -12
  245. package/src/domain/seo/services/sitemap.ts +0 -56
  246. package/src/domain/seo/utils.ts +0 -36
  247. package/src/domain/theme/constants.ts +0 -6
  248. package/src/domain/theme/index.ts +0 -2
  249. package/src/domain/theme/schema.ts +0 -10
  250. package/src/i18n.generated.d.ts +0 -202
  251. package/src/lib/component-preview.ts +0 -73
  252. package/src/lib/index.ts +0 -6
  253. package/src/lib/remark/remark-modified-time.ts +0 -13
  254. package/src/lib/showcase-preview-elements.ts +0 -408
  255. package/src/lib/showcase-renderer.ts +0 -218
  256. package/src/lib/showcase-utils.ts +0 -189
  257. package/src/lib/turnstile.ts +0 -35
  258. package/src/lib/utils/starwind/positioning.ts +0 -318
  259. package/src/locales/de/blog.json +0 -9
  260. package/src/locales/de/common.json +0 -19
  261. package/src/locales/de/errors.json +0 -6
  262. package/src/locales/de/home.json +0 -20
  263. package/src/locales/de/messages.json +0 -8
  264. package/src/locales/de/nav.json +0 -13
  265. package/src/locales/de/projects.json +0 -9
  266. package/src/locales/de/services.json +0 -43
  267. package/src/locales/en/blog.json +0 -9
  268. package/src/locales/en/chat.json +0 -29
  269. package/src/locales/en/common.json +0 -19
  270. package/src/locales/en/cookie_notice.json +0 -11
  271. package/src/locales/en/editor.json +0 -24
  272. package/src/locales/en/errors.json +0 -6
  273. package/src/locales/en/home.json +0 -20
  274. package/src/locales/en/messages.json +0 -8
  275. package/src/locales/en/nav.json +0 -13
  276. package/src/locales/en/projects.json +0 -9
  277. package/src/locales/en/services.json +0 -43
  278. package/src/locales/es/blog.json +0 -9
  279. package/src/locales/es/common.json +0 -19
  280. package/src/locales/es/errors.json +0 -6
  281. package/src/locales/es/home.json +0 -20
  282. package/src/locales/es/messages.json +0 -8
  283. package/src/locales/es/nav.json +0 -13
  284. package/src/locales/es/projects.json +0 -9
  285. package/src/locales/es/services.json +0 -43
  286. package/src/locales/ja/blog.json +0 -9
  287. package/src/locales/ja/common.json +0 -19
  288. package/src/locales/ja/errors.json +0 -6
  289. package/src/locales/ja/home.json +0 -20
  290. package/src/locales/ja/messages.json +0 -8
  291. package/src/locales/ja/nav.json +0 -13
  292. package/src/locales/ja/projects.json +0 -9
  293. package/src/locales/ja/services.json +0 -43
  294. package/src/locales/pt/blog.json +0 -9
  295. package/src/locales/pt/chat.json +0 -29
  296. package/src/locales/pt/common.json +0 -19
  297. package/src/locales/pt/cookie_notice.json +0 -11
  298. package/src/locales/pt/editor.json +0 -24
  299. package/src/locales/pt/errors.json +0 -6
  300. package/src/locales/pt/home.json +0 -20
  301. package/src/locales/pt/messages.json +0 -8
  302. package/src/locales/pt/nav.json +0 -13
  303. package/src/locales/pt/projects.json +0 -9
  304. package/src/locales/pt/services.json +0 -43
  305. package/src/utils/server/cookies.ts +0 -98
  306. package/src/utils/server/index.ts +0 -1
  307. package/src/utils/shared/index.ts +0 -3
  308. /package/src/utils/{shared/deep-merge.ts → deep-merge.ts} +0 -0
  309. /package/src/utils/{shared/embed.ts → embed.ts} +0 -0
  310. /package/src/utils/{shared/parse-boolean.ts → parse-boolean.ts} +0 -0
@@ -0,0 +1,85 @@
1
+ ---
2
+ import { scv, cx } from "css-variants"
3
+ import { twMerge } from "tailwind-merge"
4
+ import defu from "defu"
5
+ import { buttonTheme } from "@/themes/button.theme.ts"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const button = scv({
9
+ slots: [...buttonTheme.slots],
10
+ base: buttonTheme.base,
11
+ variants: buttonTheme.variants,
12
+ compoundVariants: [...buttonTheme.compoundVariants],
13
+ defaultVariants: buttonTheme.defaultVariants,
14
+ classNameResolver: (...args) => twMerge(cx(...args)),
15
+ });
16
+
17
+ export interface RLAButtonProps {
18
+ /**
19
+ * Button variant style.
20
+ * @default "solid"
21
+ */
22
+ variant?: keyof typeof buttonTheme.variants.variant;
23
+ /**
24
+ * Button color.
25
+ * @default "primary"
26
+ */
27
+ color?: keyof typeof buttonTheme.variants.color;
28
+ /**
29
+ * Button size.
30
+ * @default "md"
31
+ */
32
+ size?: keyof typeof buttonTheme.variants.size;
33
+ /**
34
+ * When provided, renders as <a> instead of <button>.
35
+ */
36
+ href?: string;
37
+ /**
38
+ * UI overrides for individual slots, derived from the button theme.
39
+ */
40
+ ui?: Partial<Record<keyof typeof buttonTheme.base, string>>;
41
+ /**
42
+ * External class — applied to the root element.
43
+ */
44
+ class?: string;
45
+ /**
46
+ * Standard HTML attributes for <button>
47
+ */
48
+ [key: string]: unknown;
49
+ }
50
+
51
+ const {
52
+ variant = "solid",
53
+ color = "primary",
54
+ size = "md",
55
+ class: className,
56
+ ui: uiProp,
57
+ href,
58
+ ...rest
59
+ } = Astro.props as RLAButtonProps
60
+
61
+ const globalConfig = getUIConfig();
62
+
63
+ const mergedUI = defu(
64
+ uiProp ?? {},
65
+ (globalConfig.button as Record<string, unknown>) ?? {},
66
+ ) as Record<keyof typeof buttonTheme.base, string | undefined>;
67
+
68
+ const { root } = button({
69
+ variant,
70
+ color,
71
+ size,
72
+ });
73
+
74
+ // Determine whether to render <a> or <button>
75
+ const Tag = href ? "a" : "button";
76
+ ---
77
+
78
+ <Tag
79
+ class={twMerge(root, mergedUI.root, className)}
80
+ data-slot="rla-button"
81
+ {...(Tag === "a" ? { href } : {})}
82
+ {...rest}
83
+ >
84
+ <slot />
85
+ </Tag>
@@ -0,0 +1,75 @@
1
+ ---
2
+ import { scv, cx } from "css-variants";
3
+ import { twMerge } from "tailwind-merge";
4
+ import defu from "defu";
5
+ import { headerTheme } from "@/themes/header.theme.ts";
6
+ import { getUIConfig } from "virtual:rimelight-ui";
7
+
8
+ const header = scv({
9
+ slots: [...headerTheme.slots],
10
+ base: headerTheme.base,
11
+ variants: headerTheme.variants,
12
+ defaultVariants: headerTheme.defaultVariants,
13
+ classNameResolver: (...args) => twMerge(cx(...args)),
14
+ });
15
+
16
+ export interface RLAHeaderProps {
17
+ /**
18
+ * Whether to contain the header content in a max-width container.
19
+ * @default true
20
+ */
21
+ contain?: boolean;
22
+ /**
23
+ * Whether the header should be sticky at the top.
24
+ * @default true
25
+ */
26
+ sticky?: boolean;
27
+ /**
28
+ * UI overrides for individual slots, derived from the header theme.
29
+ */
30
+ ui?: Partial<Record<keyof typeof headerTheme.base, string>>;
31
+ /**
32
+ * External class — applied to the root element.
33
+ */
34
+ class?: string;
35
+ /**
36
+ * Standard HTML attributes for <header>
37
+ */
38
+ [key: string]: unknown;
39
+ }
40
+
41
+ const {
42
+ contain = true,
43
+ sticky = true,
44
+ class: className,
45
+ ui: uiProp,
46
+ ...rest
47
+ } = Astro.props as RLAHeaderProps
48
+
49
+ const globalConfig = getUIConfig();
50
+
51
+ const mergedUI = defu(
52
+ uiProp ?? {},
53
+ (globalConfig.header as Record<string, unknown>) ?? {},
54
+ ) as Record<keyof typeof headerTheme.base, string | undefined>;
55
+
56
+ const { root, container, left, center, right } = header({ contain, sticky });
57
+ ---
58
+
59
+ <header
60
+ class:list={[twMerge(root, mergedUI.root, className)]}
61
+ data-slot="rla-header"
62
+ {...rest}
63
+ >
64
+ <div class:list={[twMerge(container, mergedUI.container)]}>
65
+ <div class:list={[twMerge(left, mergedUI.left)]} data-slot="header-left">
66
+ <slot name="left" />
67
+ </div>
68
+ <div class:list={[twMerge(center, mergedUI.center)]} data-slot="header-center">
69
+ <slot name="center" />
70
+ </div>
71
+ <div class:list={[twMerge(right, mergedUI.right)]} data-slot="header-right">
72
+ <slot name="right" />
73
+ </div>
74
+ </div>
75
+ </header>
@@ -0,0 +1,90 @@
1
+ <script setup lang="ts">
2
+ import { scv, cx } from "css-variants"
3
+ import { twMerge } from "tailwind-merge"
4
+ import defu from "defu"
5
+ import { buttonTheme } from "@/themes/button.theme.ts"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const button = scv({
9
+ slots: [...buttonTheme.slots],
10
+ base: buttonTheme.base,
11
+ variants: buttonTheme.variants,
12
+ compoundVariants: [...buttonTheme.compoundVariants],
13
+ defaultVariants: buttonTheme.defaultVariants,
14
+ classNameResolver: (...args) => twMerge(cx(...args))
15
+ })
16
+
17
+ export interface RLVButtonProps {
18
+ /**
19
+ * Button variant.
20
+ *
21
+ * @default "solid"
22
+ */
23
+ variant?: keyof typeof buttonTheme.variants.variant
24
+ /**
25
+ * Button color.
26
+ *
27
+ * @default "primary"
28
+ */
29
+ color?: keyof typeof buttonTheme.variants.color
30
+ /**
31
+ * Button size.
32
+ *
33
+ * @default "md"
34
+ */
35
+ size?: keyof typeof buttonTheme.variants.size
36
+ /**
37
+ * When provided, renders as <a> instead of <button>.
38
+ */
39
+ href?: string
40
+ /**
41
+ * UI overrides for individual slots, derived from the button theme.
42
+ */
43
+ ui?: Partial<Record<keyof typeof buttonTheme.base, string>>
44
+ /**
45
+ * External class — applied to the root element.
46
+ */
47
+ class?: string
48
+ /**
49
+ * Standard HTML attributes for <button>
50
+ */
51
+ [key: string]: unknown
52
+ }
53
+
54
+ const {
55
+ variant = "solid",
56
+ color = "primary",
57
+ size = "md",
58
+ class: className,
59
+ ui: uiProp,
60
+ href
61
+ } = defineProps<RLVButtonProps>()
62
+
63
+ const globalConfig = getUIConfig()
64
+
65
+ const mergedUI = defu(
66
+ uiProp ?? {},
67
+ (globalConfig.button as Record<string, unknown>) ?? {}
68
+ ) as Record<keyof typeof buttonTheme.base, string | undefined>
69
+
70
+ const { root } = button({
71
+ variant,
72
+ color,
73
+ size
74
+ })
75
+
76
+ // Determine whether to render <a> or <button>
77
+ const Tag = href ? "a" : "button"
78
+ </script>
79
+
80
+ <template>
81
+ <component
82
+ v-bind="$attrs"
83
+ :is="Tag"
84
+ :href="href"
85
+ :class="twMerge(root, mergedUI.root, className)"
86
+ data-slot="rlv-button"
87
+ >
88
+ <slot />
89
+ </component>
90
+ </template>
@@ -0,0 +1,78 @@
1
+ <script setup lang="ts">
2
+ import { computed } from "vue"
3
+ import { scv, cx } from "css-variants"
4
+ import { twMerge } from "tailwind-merge"
5
+ import { useUi } from "../../composables"
6
+ import { headerTheme } from "@/themes/header.theme.ts"
7
+
8
+ const header = scv({
9
+ slots: [...headerTheme.slots],
10
+ base: headerTheme.base,
11
+ variants: headerTheme.variants,
12
+ defaultVariants: headerTheme.defaultVariants,
13
+ classNameResolver: (...args) => twMerge(cx(...args))
14
+ })
15
+
16
+ export interface RLVHeaderProps {
17
+ /**
18
+ * Whether to contain the header content in a max-width container.
19
+ *
20
+ * @default true
21
+ */
22
+ contain?: boolean
23
+ /**
24
+ * Whether the header should be sticky at the top.
25
+ *
26
+ * @default true
27
+ */
28
+ sticky?: boolean
29
+ /**
30
+ * UI overrides for individual slots, derived from the header theme.
31
+ */
32
+ ui?: Partial<Record<keyof typeof headerTheme.base, string>>
33
+ /**
34
+ * External class — applied to the root element.
35
+ */
36
+ class?: string
37
+ }
38
+
39
+ const {
40
+ contain = true,
41
+ sticky = true,
42
+ class: className,
43
+ ui: uiProp
44
+ } = defineProps<RLVHeaderProps>()
45
+
46
+ const mergedUI = useUi("header", uiProp as Record<string, unknown> | undefined)
47
+
48
+ const resolvedClasses = computed(() => {
49
+ const classes = header({
50
+ contain,
51
+ sticky
52
+ })
53
+
54
+ return {
55
+ root: twMerge(classes.root, mergedUI.value.root as string | undefined),
56
+ container: twMerge(classes.container, mergedUI.value.container as string | undefined),
57
+ left: twMerge(classes.left, mergedUI.value.left as string | undefined),
58
+ center: twMerge(classes.center, mergedUI.value.center as string | undefined),
59
+ right: twMerge(classes.right, mergedUI.value.right as string | undefined)
60
+ }
61
+ })
62
+ </script>
63
+
64
+ <template>
65
+ <header :class="[resolvedClasses.root, className]" data-slot="rlv-header" v-bind="$attrs">
66
+ <div :class="resolvedClasses.container">
67
+ <div :class="resolvedClasses.left" data-slot="header-left">
68
+ <slot name="left" />
69
+ </div>
70
+ <div :class="resolvedClasses.center" data-slot="header-center">
71
+ <slot name="center" />
72
+ </div>
73
+ <div :class="resolvedClasses.right" data-slot="header-right">
74
+ <slot name="right" />
75
+ </div>
76
+ </div>
77
+ </header>
78
+ </template>
@@ -0,0 +1 @@
1
+ export { useUi } from "./useUi"
@@ -0,0 +1,27 @@
1
+ import { computed, type ComputedRef } from "vue"
2
+ import defu from "defu"
3
+ import { getUIConfig } from "virtual:rimelight-ui"
4
+ import type { DefaultUIConfig } from "@/themes"
5
+
6
+ /**
7
+ * Reactive UI config merge composable for Vue components.
8
+ *
9
+ * Merges (highest priority first): 1. Local `ui` prop override 2. Global config from integration
10
+ * (virtual:rimelight-ui)
11
+ *
12
+ * @param componentName - The component key in the config (e.g. 'button')
13
+ * @param uiProp - The local `ui` prop from defineProps
14
+ * @returns ComputedRef of merged UI overrides
15
+ */
16
+ export function useUi<T extends keyof DefaultUIConfig>(
17
+ componentName: T,
18
+ uiProp: Record<string, unknown> | undefined
19
+ ): ComputedRef<Record<string, unknown>> {
20
+ const globalConfig = getUIConfig()
21
+
22
+ return computed(() => {
23
+ const componentConfig = globalConfig[componentName]
24
+
25
+ return defu(uiProp ?? {}, componentConfig ?? {})
26
+ })
27
+ }
@@ -1,3 +1 @@
1
1
  export * from "./site.config"
2
- export * from "./links"
3
- export * from "./cookies"
@@ -22,6 +22,6 @@ export interface SiteConfig {
22
22
  titleTemplate: string
23
23
  ogImageFallback: string
24
24
  maxDescriptionLength: number
25
- authorHandle?: string // e.g., @danielmarchi
25
+ authorHandle?: string
26
26
  }
27
27
  }
package/src/env.d.ts CHANGED
@@ -1,49 +1,16 @@
1
1
  /// <reference types="astro/client" />
2
2
 
3
- interface ImportMetaEnv {
4
- readonly PROD: boolean
5
- readonly DEV: boolean
6
- // add other env vars here...
7
- }
3
+ declare module "virtual:rimelight-ui" {
4
+ import type { DefaultUIConfig } from "../themes"
8
5
 
9
- interface ImportMeta {
10
- readonly env: ImportMetaEnv
6
+ export function getUIConfig(): DefaultUIConfig
11
7
  }
12
8
 
13
- import type { Locale } from "./domain/i18n/schema"
14
-
15
- declare global {
16
- namespace App {
17
- interface Locals {
18
- uiLocale: Locale
19
- translationLocale: Locale
20
- cfContext: any
21
- isMissingContent?: boolean
22
- }
23
- }
24
-
25
- declare module "astro:content" {
26
- export interface CollectionEntry<T extends string = any> {
27
- id: string
28
- data: any
29
- slug: string
30
- body: string
31
- collection: T
32
- }
33
- export const getCollection: (
34
- collection: string,
35
- filter?: (entry: CollectionEntry) => boolean
36
- ) => Promise<CollectionEntry[]>
37
- export const getEntry: (collection: string, id: string) => Promise<CollectionEntry>
38
- }
39
-
40
- declare module "cloudflare:workers" {
41
- export const env: Env
42
- }
43
-
44
- declare module "~icons/*" {
45
- import type { AstroComponentFactory } from "astro/runtime/server/index.js"
46
- const component: AstroComponentFactory
47
- export default component
9
+ declare namespace App {
10
+ interface Locals {
11
+ uiLocale?: string
12
+ translationLocale?: string
13
+ isMissingContent?: boolean
14
+ cfContext?: Record<string, unknown>
48
15
  }
49
16
  }
@@ -1 +1,3 @@
1
1
  export * from "./sri"
2
+ export { ui } from "./ui"
3
+ export type { UIOptions, UIConfigOverrides } from "./ui"
@@ -0,0 +1,87 @@
1
+ import type { AstroIntegration } from "astro"
2
+ import defu from "defu"
3
+ import Icons from "unplugin-icons/vite"
4
+ import { defaultUIConfig } from "../themes"
5
+
6
+ /**
7
+ * Shape of the `ui` config that can be passed to the integration. Keys are component names, values
8
+ * are partial theme configs.
9
+ */
10
+ export type UIConfigOverrides = {
11
+ button?: Partial<(typeof defaultUIConfig)["button"]>
12
+ header?: Partial<(typeof defaultUIConfig)["header"]>
13
+ }
14
+
15
+ export interface UIOptions {
16
+ /**
17
+ * Global UI overrides applied to all components. Merged with defaults via `defu` (first arg
18
+ * wins).
19
+ */
20
+ ui?: UIConfigOverrides
21
+ }
22
+
23
+ /**
24
+ * Astro integration for `@rimelight/ui`.
25
+ *
26
+ * Provides global UI configuration via a virtual module. Components import `virtual:rimelight-ui`
27
+ * to access the merged config.
28
+ *
29
+ * @example
30
+ * // astro.config.mjs
31
+ * import { ui } from "@rimelight/ui/integrations"
32
+ *
33
+ * export default defineConfig({
34
+ * integrations: [
35
+ * ui({
36
+ * ui: {
37
+ * button: {
38
+ * defaultVariants: { variant: "primary" }
39
+ * }
40
+ * }
41
+ * })
42
+ * ]
43
+ * })
44
+ */
45
+ export function ui(options: UIOptions = {}): AstroIntegration {
46
+ // Merge user overrides with defaults (user-provided values win)
47
+ const resolvedConfig = defu(options.ui ?? {}, defaultUIConfig)
48
+
49
+ const virtualModuleId = "virtual:rimelight-ui"
50
+ const resolvedVirtualModuleId = "\0" + virtualModuleId
51
+
52
+ return {
53
+ name: "@rimelight/ui",
54
+ hooks: {
55
+ "astro:config:setup": ({ updateConfig, logger }) => {
56
+ logger.info("Initializing @rimelight/ui configuration")
57
+
58
+ updateConfig({
59
+ vite: {
60
+ plugins: [
61
+ Icons({
62
+ compiler: "astro",
63
+ autoInstall: true
64
+ }),
65
+ {
66
+ name: "vite-plugin-rimelight-ui-config",
67
+ enforce: "pre",
68
+ resolveId(id: string) {
69
+ if (id === virtualModuleId) {
70
+ return resolvedVirtualModuleId
71
+ }
72
+ return null
73
+ },
74
+ load(id: string) {
75
+ if (id === resolvedVirtualModuleId) {
76
+ return `export const getUIConfig = () => (${JSON.stringify(resolvedConfig)});`
77
+ }
78
+ return null
79
+ }
80
+ }
81
+ ]
82
+ }
83
+ })
84
+ }
85
+ }
86
+ }
87
+ }