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