@rimelight/ui 0.0.30 → 0.0.31

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 (152) hide show
  1. package/package.json +1 -1
  2. package/src/components/astro/RLAAlert.astro +60 -0
  3. package/src/components/astro/RLAAlertDialog.astro +86 -0
  4. package/src/components/astro/RLAAspectRatio.astro +23 -0
  5. package/src/components/astro/RLAAvatar.astro +56 -0
  6. package/src/components/astro/RLAAvatarGroup.astro +19 -0
  7. package/src/components/astro/RLABadge.astro +31 -0
  8. package/src/components/astro/RLABreadcrumb.astro +44 -0
  9. package/src/components/astro/RLACard.astro +74 -0
  10. package/src/components/astro/RLACarousel.astro +71 -0
  11. package/src/components/astro/RLAChart.astro +215 -0
  12. package/src/components/astro/RLACheckbox.astro +51 -0
  13. package/src/components/astro/RLACollapsible.astro +38 -0
  14. package/src/components/astro/RLACombobox.astro +131 -0
  15. package/src/components/astro/RLADialog.astro +95 -0
  16. package/src/components/astro/RLADrawer.astro +74 -0
  17. package/src/components/astro/RLADropdownMenu.astro +82 -0
  18. package/src/components/astro/RLADropzone.astro +134 -0
  19. package/src/components/astro/RLAField.astro +43 -0
  20. package/src/components/{Head.astro → astro/RLAHead.astro} +181 -199
  21. package/src/components/astro/RLAHoverCard.astro +31 -0
  22. package/src/components/astro/RLAInput.astro +60 -0
  23. package/src/components/astro/RLAInputGroup.astro +35 -0
  24. package/src/components/astro/RLAKbd.astro +22 -0
  25. package/src/components/astro/RLALabel.astro +23 -0
  26. package/src/components/astro/RLALocaleSelector.astro +110 -0
  27. package/src/components/astro/RLAMarquee.astro +32 -0
  28. package/src/components/astro/RLANativeSelect.astro +51 -0
  29. package/src/components/astro/RLANavigationMenu.astro +136 -0
  30. package/src/components/astro/RLAPagination.astro +94 -0
  31. package/src/components/astro/RLAPopover.astro +31 -0
  32. package/src/components/astro/RLAProgress.astro +43 -0
  33. package/src/components/astro/RLAResizable.astro +177 -0
  34. package/src/components/astro/RLAScrollArea.astro +157 -0
  35. package/src/components/astro/RLASelect.astro +109 -0
  36. package/src/components/astro/RLASeparator.astro +27 -0
  37. package/src/components/astro/RLASheet.astro +72 -0
  38. package/src/components/astro/RLASidebar.astro +135 -0
  39. package/src/components/astro/RLASkeleton.astro +20 -0
  40. package/src/components/astro/RLASlider.astro +53 -0
  41. package/src/components/astro/RLASpinner.astro +25 -0
  42. package/src/components/astro/RLAStickySurface.astro +27 -0
  43. package/src/components/astro/RLASwitch.astro +49 -0
  44. package/src/components/astro/RLATable.astro +60 -0
  45. package/src/components/astro/RLATabs.astro +92 -0
  46. package/src/components/astro/RLATextarea.astro +42 -0
  47. package/src/components/astro/RLAThemeSelector.astro +73 -0
  48. package/src/components/astro/RLAToast.astro +107 -0
  49. package/src/components/astro/RLAToggle.astro +38 -0
  50. package/src/components/astro/RLAToggleGroup.astro +30 -0
  51. package/src/components/astro/RLATooltip.astro +31 -0
  52. package/src/integrations/ui.ts +1 -0
  53. package/src/themes/alert.theme.ts +51 -0
  54. package/src/themes/alertDialog.theme.ts +33 -0
  55. package/src/themes/aspectRatio.theme.ts +11 -0
  56. package/src/themes/avatar.theme.ts +28 -0
  57. package/src/themes/avatarGroup.theme.ts +10 -0
  58. package/src/themes/badge.theme.ts +61 -0
  59. package/src/themes/breadcrumb.theme.ts +15 -0
  60. package/src/themes/card.theme.ts +34 -0
  61. package/src/themes/carousel.theme.ts +32 -0
  62. package/src/themes/chart.theme.ts +21 -0
  63. package/src/themes/checkbox.theme.ts +42 -0
  64. package/src/themes/collapsible.theme.ts +22 -0
  65. package/src/themes/combobox.theme.ts +28 -0
  66. package/src/themes/dialog.theme.ts +37 -0
  67. package/src/themes/drawer.theme.ts +44 -0
  68. package/src/themes/dropdownMenu.theme.ts +27 -0
  69. package/src/themes/dropzone.theme.ts +24 -0
  70. package/src/themes/field.theme.ts +24 -0
  71. package/src/themes/hoverCard.theme.ts +27 -0
  72. package/src/themes/input.theme.ts +36 -0
  73. package/src/themes/inputGroup.theme.ts +23 -0
  74. package/src/themes/kbd.theme.ts +24 -0
  75. package/src/themes/label.theme.ts +20 -0
  76. package/src/themes/localeSelector.theme.ts +50 -0
  77. package/src/themes/marquee.theme.ts +27 -0
  78. package/src/themes/nativeSelect.theme.ts +24 -0
  79. package/src/themes/navigationMenu.theme.ts +19 -0
  80. package/src/themes/pagination.theme.ts +26 -0
  81. package/src/themes/popover.theme.ts +28 -0
  82. package/src/themes/progress.theme.ts +26 -0
  83. package/src/themes/resizable.theme.ts +22 -0
  84. package/src/themes/scrollArea.theme.ts +24 -0
  85. package/src/themes/section.theme.ts +1 -2
  86. package/src/themes/select.theme.ts +27 -0
  87. package/src/themes/separator.theme.ts +19 -0
  88. package/src/themes/sheet.theme.ts +43 -0
  89. package/src/themes/sidebar.theme.ts +33 -0
  90. package/src/themes/skeleton.theme.ts +20 -0
  91. package/src/themes/slider.theme.ts +28 -0
  92. package/src/themes/spinner.theme.ts +30 -0
  93. package/src/themes/stickySurface.theme.ts +10 -0
  94. package/src/themes/switch.theme.ts +59 -0
  95. package/src/themes/table.theme.ts +36 -0
  96. package/src/themes/tabs.theme.ts +44 -0
  97. package/src/themes/textarea.theme.ts +26 -0
  98. package/src/themes/themeSelector.theme.ts +16 -0
  99. package/src/themes/toast.theme.ts +25 -0
  100. package/src/themes/toggle.theme.ts +42 -0
  101. package/src/themes/toggleGroup.theme.ts +21 -0
  102. package/src/themes/tooltip.theme.ts +27 -0
  103. package/src/types/components/alert-dialog.ts +35 -0
  104. package/src/types/components/alert.ts +31 -0
  105. package/src/types/components/aspect-ratio.ts +15 -0
  106. package/src/types/components/avatar.ts +47 -0
  107. package/src/types/components/badge.ts +27 -0
  108. package/src/types/components/breadcrumb.ts +24 -0
  109. package/src/types/components/card.ts +31 -0
  110. package/src/types/components/carousel.ts +25 -0
  111. package/src/types/components/chart.ts +38 -0
  112. package/src/types/components/checkbox.ts +35 -0
  113. package/src/types/components/collapsible.ts +31 -0
  114. package/src/types/components/combobox.ts +43 -0
  115. package/src/types/components/dialog.ts +39 -0
  116. package/src/types/components/drawer.ts +31 -0
  117. package/src/types/components/dropdown-menu.ts +42 -0
  118. package/src/types/components/dropzone.ts +39 -0
  119. package/src/types/components/field.ts +31 -0
  120. package/src/types/components/hover-card.ts +19 -0
  121. package/src/types/components/index.ts +47 -0
  122. package/src/types/components/input-group.ts +23 -0
  123. package/src/types/components/input.ts +59 -0
  124. package/src/types/components/kbd.ts +15 -0
  125. package/src/types/components/label.ts +19 -0
  126. package/src/types/components/localeSelector.ts +33 -0
  127. package/src/types/components/marquee.ts +23 -0
  128. package/src/types/components/native-select.ts +39 -0
  129. package/src/types/components/navigation-menu.ts +27 -0
  130. package/src/types/components/pagination.ts +23 -0
  131. package/src/types/components/popover.ts +23 -0
  132. package/src/types/components/progress.ts +27 -0
  133. package/src/types/components/resizable.ts +19 -0
  134. package/src/types/components/scroll-area.ts +23 -0
  135. package/src/types/components/select.ts +43 -0
  136. package/src/types/components/separator.ts +19 -0
  137. package/src/types/components/sheet.ts +31 -0
  138. package/src/types/components/sidebar.ts +36 -0
  139. package/src/types/components/skeleton.ts +15 -0
  140. package/src/types/components/slider.ts +35 -0
  141. package/src/types/components/spinner.ts +19 -0
  142. package/src/types/components/sticky-surface.ts +19 -0
  143. package/src/types/components/switch.ts +35 -0
  144. package/src/types/components/table.ts +31 -0
  145. package/src/types/components/tabs.ts +43 -0
  146. package/src/types/components/textarea.ts +51 -0
  147. package/src/types/components/themeSelector.ts +15 -0
  148. package/src/types/components/toast.ts +35 -0
  149. package/src/types/components/toggle-group.ts +23 -0
  150. package/src/types/components/toggle.ts +27 -0
  151. package/src/types/components/tooltip.ts +23 -0
  152. package/src/components/ThemeToggle.astro +0 -57
@@ -0,0 +1,15 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const breadcrumbTheme = defineTheme({
4
+ slots: ["root", "list", "item", "link", "separator", "page"],
5
+ base: {
6
+ root: "aria-label='breadcrumb'",
7
+ list: "flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5",
8
+ item: "flex items-center gap-1.5",
9
+ link: "transition-colors hover:text-foreground cursor-pointer decoration-none text-current",
10
+ separator: "flex size-3.5 items-center justify-center [&_svg]:size-3.5 opacity-60",
11
+ page: "font-normal text-foreground"
12
+ }
13
+ })
14
+
15
+ export default breadcrumbTheme
@@ -0,0 +1,34 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const cardTheme = defineTheme({
4
+ slots: ["root", "media", "header", "title", "description", "content", "footer", "overlay"],
5
+ base: {
6
+ root: [
7
+ "rounded-xl border border-border bg-card text-card-foreground shadow-sm overflow-hidden flex flex-col transition-all duration-300",
8
+ "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2"
9
+ ],
10
+ media: "relative w-full aspect-video overflow-hidden shrink-0 bg-muted",
11
+ header: "flex flex-col gap-1.5 p-6 shrink-0",
12
+ title: "text-lg font-semibold leading-none tracking-tight text-foreground",
13
+ description: "text-sm text-muted-foreground leading-relaxed",
14
+ content: "p-6 pt-0 flex-1 leading-relaxed text-sm",
15
+ footer: "flex items-center p-6 pt-0 mt-auto shrink-0",
16
+ overlay: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent p-6 flex flex-col justify-end text-white"
17
+ },
18
+ variants: {
19
+ interactive: {
20
+ true: { root: "hover:shadow-md hover:-translate-y-0.5 cursor-pointer hover:border-primary/30" },
21
+ false: { root: "" }
22
+ },
23
+ overlay: {
24
+ true: { root: "relative aspect-square", content: "absolute inset-0 z-10" },
25
+ false: { root: "" }
26
+ }
27
+ },
28
+ defaultVariants: {
29
+ interactive: false,
30
+ overlay: false
31
+ }
32
+ })
33
+
34
+ export default cardTheme
@@ -0,0 +1,32 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const carouselTheme = defineTheme({
4
+ slots: ["root", "viewport", "container", "slide", "buttonPrev", "buttonNext", "dots", "dot"],
5
+ base: {
6
+ root: "relative w-full overflow-hidden select-none group/carousel",
7
+ viewport: "w-full overflow-hidden cursor-grab active:cursor-grabbing",
8
+ container: "flex backface-hidden",
9
+ slide: "min-w-0 shrink-0 grow-0 basis-full pl-4 relative",
10
+ buttonPrev: [
11
+ "absolute left-4 top-1/2 -translate-y-1/2 z-10 flex size-9 items-center justify-center rounded-full border border-border bg-background/80 backdrop-blur-sm text-foreground shadow transition-all hover:bg-background cursor-pointer",
12
+ "opacity-0 scale-90 group-hover/carousel:opacity-100 group-hover/carousel:scale-100"
13
+ ],
14
+ buttonNext: [
15
+ "absolute right-4 top-1/2 -translate-y-1/2 z-10 flex size-9 items-center justify-center rounded-full border border-border bg-background/80 backdrop-blur-sm text-foreground shadow transition-all hover:bg-background cursor-pointer",
16
+ "opacity-0 scale-90 group-hover/carousel:opacity-100 group-hover/carousel:scale-100"
17
+ ],
18
+ dots: "absolute bottom-4 left-1/2 -translate-x-1/2 z-10 flex gap-1.5 items-center",
19
+ dot: "block size-2 rounded-full bg-foreground/20 cursor-pointer transition-all duration-350 hover:bg-foreground/45"
20
+ },
21
+ variants: {
22
+ active: {
23
+ true: { dot: "bg-foreground size-2.5" },
24
+ false: { dot: "" }
25
+ }
26
+ },
27
+ defaultVariants: {
28
+ active: false
29
+ }
30
+ })
31
+
32
+ export default carouselTheme
@@ -0,0 +1,21 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createChartTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "title", "container", "svg", "axis", "bar", "line", "tooltip", "legend"],
6
+ base: {
7
+ root: "flex flex-col gap-3 p-4 rounded-xl border border-border bg-card text-card-foreground shadow-sm",
8
+ title: "text-sm font-semibold tracking-tight text-foreground",
9
+ container: "relative w-full aspect-video flex items-end justify-between",
10
+ svg: "w-full h-full",
11
+ axis: "text-[10px] text-muted-foreground",
12
+ bar: "rounded-t transition-all hover:opacity-85",
13
+ line: "stroke-2 fill-none",
14
+ tooltip: "absolute z-50 bg-background text-foreground border border-border rounded shadow p-2 text-xs",
15
+ legend: "flex items-center justify-center gap-4 text-xs text-muted-foreground"
16
+ },
17
+ variants: {},
18
+ defaultVariants: {}
19
+ })
20
+
21
+ export default createChartTheme()
@@ -0,0 +1,42 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createCheckboxTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root", "input", "box", "indicator", "label"],
8
+ base: {
9
+ root: "inline-flex items-center gap-2 cursor-pointer select-none",
10
+ input: "absolute opacity-0 size-0 pointer-events-none peer",
11
+ box: [
12
+ "size-4 shrink-0 rounded border border-border bg-background transition-all focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
13
+ "peer-disabled:cursor-not-allowed peer-disabled:opacity-50"
14
+ ],
15
+ indicator: "flex items-center justify-center text-white scale-0 transition-transform duration-150",
16
+ label: "text-sm text-foreground leading-none"
17
+ },
18
+ variants: {
19
+ color: Object.fromEntries(colors.map((color) => [
20
+ color,
21
+ {
22
+ box: `peer-checked:bg-${color}-500 peer-checked:border-${color}-500 focus-within:ring-${color}-500/50`
23
+ }
24
+ ])),
25
+ size: {
26
+ sm: { box: "size-3.5", label: "text-xs" },
27
+ md: { box: "size-4", label: "text-sm" },
28
+ lg: { box: "size-4.5", label: "text-base" }
29
+ },
30
+ checked: {
31
+ true: { indicator: "scale-100" },
32
+ false: { indicator: "scale-0" }
33
+ }
34
+ },
35
+ defaultVariants: {
36
+ color: "primary",
37
+ size: "md",
38
+ checked: false
39
+ }
40
+ })
41
+
42
+ export default createCheckboxTheme()
@@ -0,0 +1,22 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createCollapsibleTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "trigger", "content"],
6
+ base: {
7
+ root: "w-full",
8
+ trigger: "flex items-center justify-between w-full font-medium transition-all",
9
+ content: "overflow-hidden transition-all duration-300"
10
+ },
11
+ variants: {
12
+ open: {
13
+ true: { trigger: "", content: "h-auto" },
14
+ false: { trigger: "", content: "h-0 invisible" }
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ open: false
19
+ }
20
+ })
21
+
22
+ export default createCollapsibleTheme()
@@ -0,0 +1,28 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createComboboxTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "label", "trigger", "input", "content", "item", "itemText", "itemIcon"],
6
+ base: {
7
+ root: "relative w-full flex flex-col gap-1.5",
8
+ label: "text-sm font-medium text-foreground",
9
+ trigger: "flex h-9 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-all focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
10
+ input: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-all placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
11
+ content: "absolute z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md transition-all w-full mt-1 max-h-60 overflow-y-auto",
12
+ item: "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 px-2 text-sm outline-none hover:bg-accent hover:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
13
+ itemText: "truncate",
14
+ itemIcon: "ml-auto size-4"
15
+ },
16
+ variants: {
17
+ size: {
18
+ sm: { trigger: "h-8 px-2 text-xs", input: "h-8 text-xs", item: "py-1 px-1.5 text-xs" },
19
+ md: { trigger: "h-9 px-3 text-sm", input: "h-9 text-sm", item: "py-1.5 px-2 text-sm" },
20
+ lg: { trigger: "h-10 px-4 text-base", input: "h-10 text-base", item: "py-2 px-2.5 text-base" }
21
+ }
22
+ },
23
+ defaultVariants: {
24
+ size: "md"
25
+ }
26
+ })
27
+
28
+ export default createComboboxTheme()
@@ -0,0 +1,37 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const dialogTheme = defineTheme({
4
+ slots: ["root", "trigger", "backdrop", "content", "header", "title", "description", "footer", "closeButton"],
5
+ base: {
6
+ root: "relative inline-block",
7
+ trigger: "",
8
+ backdrop: "fixed inset-0 z-50 bg-black/60 backdrop-blur-sm transition-all duration-300",
9
+ content: [
10
+ "fixed left-1/2 top-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-xl border border-border",
11
+ "bg-background p-6 shadow-xl transition-all duration-300 outline-none",
12
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-1/2",
13
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-1/2"
14
+ ],
15
+ header: "flex flex-col gap-1.5 text-center sm:text-left mb-4",
16
+ title: "text-lg font-semibold leading-none tracking-tight text-foreground",
17
+ description: "text-sm text-muted-foreground leading-relaxed",
18
+ footer: "flex flex-col-reverse sm:flex-row sm:justify-end gap-2 mt-6",
19
+ closeButton: [
20
+ "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100",
21
+ "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none"
22
+ ]
23
+ },
24
+ variants: {
25
+ size: {
26
+ sm: { content: "max-w-sm" },
27
+ md: { content: "max-w-lg" },
28
+ lg: { content: "max-w-2xl" },
29
+ xl: { content: "max-w-4xl" }
30
+ }
31
+ },
32
+ defaultVariants: {
33
+ size: "md"
34
+ }
35
+ })
36
+
37
+ export default dialogTheme
@@ -0,0 +1,44 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const drawerTheme = defineTheme({
4
+ slots: ["root", "trigger", "backdrop", "content", "handle", "header", "title", "description", "footer", "closeButton"],
5
+ base: {
6
+ root: "relative inline-block",
7
+ trigger: "",
8
+ backdrop: "fixed inset-0 z-50 bg-black/60 backdrop-blur-sm transition-all duration-300",
9
+ content: [
10
+ "fixed z-50 bg-background p-6 shadow-xl border-border transition-all duration-300 outline-none",
11
+ "data-[state=open]:animate-in data-[state=closed]:animate-out"
12
+ ],
13
+ handle: "mx-auto h-1.5 w-[100px] rounded-full bg-muted mb-4",
14
+ header: "flex flex-col gap-1.5 mb-4 text-center",
15
+ title: "text-lg font-semibold leading-none tracking-tight text-foreground",
16
+ description: "text-sm text-muted-foreground leading-relaxed",
17
+ footer: "flex flex-col gap-2 mt-6",
18
+ closeButton: [
19
+ "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100",
20
+ "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none"
21
+ ]
22
+ },
23
+ variants: {
24
+ direction: {
25
+ top: {
26
+ content: "inset-x-0 top-0 border-b rounded-b-xl data-[state=open]:slide-in-from-top data-[state=closed]:slide-out-to-top"
27
+ },
28
+ bottom: {
29
+ content: "inset-x-0 bottom-0 border-t rounded-t-xl data-[state=open]:slide-in-from-bottom data-[state=closed]:slide-out-to-bottom"
30
+ },
31
+ left: {
32
+ content: "inset-y-0 left-0 h-full w-3/4 max-w-sm border-r rounded-r-xl data-[state=open]:slide-in-from-left data-[state=closed]:slide-out-to-left"
33
+ },
34
+ right: {
35
+ content: "inset-y-0 right-0 h-full w-3/4 max-w-sm border-l rounded-l-xl data-[state=open]:slide-in-from-right data-[state=closed]:slide-out-to-right"
36
+ }
37
+ }
38
+ },
39
+ defaultVariants: {
40
+ direction: "bottom"
41
+ }
42
+ })
43
+
44
+ export default drawerTheme
@@ -0,0 +1,27 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createDropdownMenuTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "trigger", "content", "item", "shortcut", "separator", "label"],
6
+ base: {
7
+ root: "relative inline-block text-left",
8
+ trigger: "inline-flex justify-center w-full rounded-md border border-input bg-background px-4 py-2 text-sm font-medium shadow-sm hover:bg-muted focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
9
+ content: "absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-md border bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-black ring-opacity-5 focus:outline-none",
10
+ item: "group flex w-full items-center rounded-md px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50",
11
+ shortcut: "ml-auto text-xs tracking-widest opacity-60",
12
+ separator: "-mx-1 my-1 h-px bg-muted",
13
+ label: "px-2 py-1.5 text-xs font-semibold tracking-wider text-muted-foreground uppercase"
14
+ },
15
+ variants: {
16
+ size: {
17
+ sm: { trigger: "px-3 py-1.5 text-xs", item: "px-2 py-1 text-xs" },
18
+ md: { trigger: "px-4 py-2 text-sm", item: "px-2 py-1.5 text-sm" },
19
+ lg: { trigger: "px-5 py-2.5 text-base", item: "px-3 py-2 text-base" }
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ size: "md"
24
+ }
25
+ })
26
+
27
+ export default createDropdownMenuTheme()
@@ -0,0 +1,24 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createDropzoneTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "input", "content", "icon", "title", "description"],
6
+ base: {
7
+ root: "flex flex-col items-center justify-center w-full min-h-[150px] border-2 border-dashed border-border rounded-lg bg-background/50 hover:bg-muted/30 transition-colors cursor-pointer select-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
8
+ input: "absolute opacity-0 size-0 pointer-events-none",
9
+ content: "flex flex-col items-center justify-center p-6 text-center gap-1.5",
10
+ icon: "size-8 text-muted-foreground",
11
+ title: "text-sm font-semibold text-foreground",
12
+ description: "text-xs text-muted-foreground"
13
+ },
14
+ variants: {
15
+ disabled: {
16
+ true: { root: "opacity-50 cursor-not-allowed pointer-events-none" }
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ disabled: false
21
+ }
22
+ })
23
+
24
+ export default createDropzoneTheme()
@@ -0,0 +1,24 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createFieldTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "label", "description", "error"],
6
+ base: {
7
+ root: "flex flex-col gap-1.5 w-full",
8
+ label: "text-sm font-medium text-foreground",
9
+ description: "text-xs text-muted-foreground leading-normal",
10
+ error: "text-xs font-medium text-error-500 leading-normal"
11
+ },
12
+ variants: {
13
+ size: {
14
+ sm: { label: "text-xs", description: "text-[10px]", error: "text-[10px]" },
15
+ md: { label: "text-sm", description: "text-xs", error: "text-xs" },
16
+ lg: { label: "text-base", description: "text-sm", error: "text-sm" }
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ size: "md"
21
+ }
22
+ })
23
+
24
+ export default createFieldTheme()
@@ -0,0 +1,27 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const hoverCardTheme = defineTheme({
4
+ slots: ["root", "trigger", "content"],
5
+ base: {
6
+ root: "relative inline-block group/hover-card",
7
+ trigger: "",
8
+ content: [
9
+ "absolute z-50 w-80 rounded-lg border border-border bg-card p-4 text-card-foreground shadow-md outline-none",
10
+ "transition-all duration-200 invisible opacity-0 scale-95 origin-center pointer-events-none",
11
+ "group-hover/hover-card:visible group-hover/hover-card:opacity-100 group-hover/hover-card:scale-100 group-hover/hover-card:pointer-events-auto"
12
+ ]
13
+ },
14
+ variants: {
15
+ placement: {
16
+ top: { content: "bottom-full left-1/2 -translate-x-1/2 mb-2" },
17
+ bottom: { content: "top-full left-1/2 -translate-x-1/2 mt-2" },
18
+ left: { content: "right-full top-1/2 -translate-y-1/2 mr-2" },
19
+ right: { content: "left-full top-1/2 -translate-y-1/2 ml-2" }
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ placement: "bottom"
24
+ }
25
+ })
26
+
27
+ export default hoverCardTheme
@@ -0,0 +1,36 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createInputTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "input", "leading", "trailing"],
6
+ base: {
7
+ root: "relative flex items-center w-full rounded-md border border-input bg-background shadow-sm focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
8
+ input: "w-full bg-transparent px-3 py-1.5 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
9
+ leading: "absolute left-3 flex items-center justify-center text-muted-foreground",
10
+ trailing: "absolute right-3 flex items-center justify-center text-muted-foreground"
11
+ },
12
+ variants: {
13
+ size: {
14
+ sm: { input: "py-1 text-xs", leading: "left-2.5", trailing: "right-2.5" },
15
+ md: { input: "py-1.5 text-sm", leading: "left-3", trailing: "right-3" },
16
+ lg: { input: "py-2 text-base", leading: "left-3.5", trailing: "right-3.5" }
17
+ },
18
+ hasLeading: {
19
+ true: { input: "pl-9" }
20
+ },
21
+ hasTrailing: {
22
+ true: { input: "pr-9" }
23
+ },
24
+ error: {
25
+ true: { root: "border-error-500 focus-within:ring-error-500/50" }
26
+ }
27
+ },
28
+ defaultVariants: {
29
+ size: "md",
30
+ hasLeading: false,
31
+ hasTrailing: false,
32
+ error: false
33
+ }
34
+ })
35
+
36
+ export default createInputTheme()
@@ -0,0 +1,23 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createInputGroupTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "prepend", "append"],
6
+ base: {
7
+ root: "relative flex items-stretch w-full rounded-md border border-input bg-background shadow-sm focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 overflow-hidden",
8
+ prepend: "flex items-center bg-muted px-3 text-sm text-muted-foreground border-r border-input",
9
+ append: "flex items-center bg-muted px-3 text-sm text-muted-foreground border-l border-input"
10
+ },
11
+ variants: {
12
+ size: {
13
+ sm: { prepend: "px-2 text-xs", append: "px-2 text-xs" },
14
+ md: { prepend: "px-3 text-sm", append: "px-3 text-sm" },
15
+ lg: { prepend: "px-4 text-base", append: "px-4 text-base" }
16
+ }
17
+ },
18
+ defaultVariants: {
19
+ size: "md"
20
+ }
21
+ })
22
+
23
+ export default createInputGroupTheme()
@@ -0,0 +1,24 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const kbdTheme = defineTheme({
4
+ slots: ["root"],
5
+ base: {
6
+ root: [
7
+ "inline-flex items-center justify-center font-sans font-medium select-none pointer-events-none rounded border border-border bg-muted",
8
+ "shadow-[0_1px_0px_0px_rgba(0,0,0,0.1)] dark:shadow-[0_1px_0px_0px_rgba(255,255,255,0.05)]",
9
+ "text-muted-foreground"
10
+ ]
11
+ },
12
+ variants: {
13
+ size: {
14
+ sm: { root: "h-5 min-w-[20px] px-1 text-3xs" },
15
+ md: { root: "h-6 min-w-[24px] px-1.5 text-2xs" },
16
+ lg: { root: "h-7 min-w-[28px] px-2 text-xs" }
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ size: "md"
21
+ }
22
+ })
23
+
24
+ export default kbdTheme
@@ -0,0 +1,20 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const labelTheme = defineTheme({
4
+ slots: ["root"],
5
+ base: {
6
+ root: "font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
7
+ },
8
+ variants: {
9
+ size: {
10
+ sm: { root: "text-xs" },
11
+ md: { root: "text-sm" },
12
+ lg: { root: "text-base" }
13
+ }
14
+ },
15
+ defaultVariants: {
16
+ size: "md"
17
+ }
18
+ })
19
+
20
+ export default labelTheme
@@ -0,0 +1,50 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+ export default defineTheme({
3
+ slots: [
4
+ "root",
5
+ "label",
6
+ "wrapper",
7
+ "select",
8
+ "option",
9
+ "iconWrapper"
10
+ ],
11
+ base: {
12
+ root: "inline-flex flex-col gap-1.5",
13
+ label: "text-xs font-semibold text-muted select-none",
14
+ wrapper: "relative inline-block w-full",
15
+ select: "w-full appearance-none font-medium rounded-lg transition-all focus:outline-none focus:ring-2 focus:ring-emerald-500/40 cursor-pointer pr-10",
16
+ option: "bg-neutral-900 text-white selection:bg-neutral-800",
17
+ iconWrapper: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3 text-current group-hover:text-default"
18
+ },
19
+ variants: {
20
+ variant: {
21
+ default: {
22
+ select: "bg-gray-100 text-gray-800 hover:bg-gray-200 border border-transparent"
23
+ },
24
+ outline: {
25
+ select: "bg-transparent border border-neutral-800 text-white hover:bg-neutral-900 hover:border-neutral-700"
26
+ },
27
+ ghost: {
28
+ select: "bg-transparent border border-transparent text-white hover:bg-neutral-900"
29
+ }
30
+ },
31
+ size: {
32
+ sm: {
33
+ label: "text-xxs",
34
+ select: "text-xs px-3 py-1.5 pr-8"
35
+ },
36
+ md: {
37
+ label: "text-xs",
38
+ select: "text-sm px-4 py-2 pr-9"
39
+ },
40
+ lg: {
41
+ label: "text-sm",
42
+ select: "text-base px-5 py-2.5 pr-10"
43
+ }
44
+ }
45
+ },
46
+ defaultVariants: {
47
+ variant: "default",
48
+ size: "md"
49
+ }
50
+ })
@@ -0,0 +1,27 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const marqueeTheme = defineTheme({
4
+ slots: ["root", "track"],
5
+ base: {
6
+ root: "relative w-full overflow-hidden flex gap-4 mask-gradient-to-r",
7
+ track: "flex shrink-0 gap-4 min-w-full justify-around animate-marquee"
8
+ },
9
+ variants: {
10
+ direction: {
11
+ left: { track: "flex-row animate-marquee-left" },
12
+ right: { track: "flex-row animate-marquee-right" },
13
+ up: { root: "flex-col h-80", track: "flex-col animate-marquee-up" },
14
+ down: { root: "flex-col h-80", track: "flex-col animate-marquee-down" }
15
+ },
16
+ pauseOnHover: {
17
+ true: { track: "hover:[animation-play-state:paused]" },
18
+ false: { track: "" }
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ direction: "left",
23
+ pauseOnHover: true
24
+ }
25
+ })
26
+
27
+ export default marqueeTheme
@@ -0,0 +1,24 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createNativeSelectTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "label", "select", "icon"],
6
+ base: {
7
+ root: "relative w-full flex flex-col gap-1.5",
8
+ label: "text-sm font-medium text-foreground",
9
+ select: "flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-all focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 appearance-none pr-10",
10
+ icon: "pointer-events-none absolute right-3 top-[calc(50%+4px)] size-4 text-muted-foreground transform -translate-y-1/2"
11
+ },
12
+ variants: {
13
+ size: {
14
+ sm: { select: "h-8 text-xs px-2 pr-8" },
15
+ md: { select: "h-9 text-sm px-3 pr-10" },
16
+ lg: { select: "h-10 text-base px-4 pr-12" }
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ size: "md"
21
+ }
22
+ })
23
+
24
+ export default createNativeSelectTheme()
@@ -0,0 +1,19 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createNavigationMenuTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "list", "item", "link", "trigger", "content", "viewport"],
6
+ base: {
7
+ root: "relative z-10 flex max-w-max flex-1 items-center justify-center",
8
+ list: "group flex flex-1 list-none items-center justify-center space-x-1",
9
+ item: "relative",
10
+ link: "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50",
11
+ trigger: "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 gap-1",
12
+ content: "absolute left-0 top-full z-50 mt-1.5 w-56 rounded-md border bg-popover p-1 text-popover-foreground shadow-md origin-top-left",
13
+ viewport: "absolute left-0 top-full flex justify-center w-full"
14
+ },
15
+ variants: {},
16
+ defaultVariants: {}
17
+ })
18
+
19
+ export default createNavigationMenuTheme()
@@ -0,0 +1,26 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const paginationTheme = defineTheme({
4
+ slots: ["root", "list", "item", "link", "ellipsis"],
5
+ base: {
6
+ root: "mx-auto flex w-full justify-center",
7
+ list: "flex flex-row items-center gap-1",
8
+ item: "",
9
+ link: [
10
+ "inline-flex items-center justify-center rounded-md text-sm font-medium transition-all size-9 cursor-pointer border border-border bg-background hover:bg-muted text-foreground decoration-none",
11
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"
12
+ ],
13
+ ellipsis: "flex size-9 items-center justify-center text-muted-foreground"
14
+ },
15
+ variants: {
16
+ active: {
17
+ true: { link: "border-primary bg-primary text-primary-foreground hover:bg-primary/95" },
18
+ false: { link: "" }
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ active: false
23
+ }
24
+ })
25
+
26
+ export default paginationTheme