@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,28 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const popoverTheme = defineTheme({
4
+ slots: ["root", "trigger", "content"],
5
+ base: {
6
+ root: "relative inline-block group/popover",
7
+ trigger: "",
8
+ content: [
9
+ "absolute z-50 w-72 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none",
10
+ "transition-all duration-200 invisible opacity-0 scale-95 origin-center",
11
+ "group-hover/popover:visible group-hover/popover:opacity-100 group-hover/popover:scale-100",
12
+ "focus-within:visible focus-within:opacity-100 focus-within:scale-100"
13
+ ]
14
+ },
15
+ variants: {
16
+ placement: {
17
+ top: { content: "bottom-full left-1/2 -translate-x-1/2 mb-2" },
18
+ bottom: { content: "top-full left-1/2 -translate-x-1/2 mt-2" },
19
+ left: { content: "right-full top-1/2 -translate-y-1/2 mr-2" },
20
+ right: { content: "left-full top-1/2 -translate-y-1/2 ml-2" }
21
+ }
22
+ },
23
+ defaultVariants: {
24
+ placement: "bottom"
25
+ }
26
+ })
27
+
28
+ export default popoverTheme
@@ -0,0 +1,26 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createProgressTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root", "indicator"],
8
+ base: {
9
+ root: "relative w-full overflow-hidden rounded-full bg-muted shadow-inner",
10
+ indicator: "h-full w-full flex-1 transition-all duration-300 ease-in-out"
11
+ },
12
+ variants: {
13
+ color: Object.fromEntries(colors.map((color) => [color, { indicator: `bg-${color}-500` }])),
14
+ size: {
15
+ sm: { root: "h-1.5" },
16
+ md: { root: "h-3" },
17
+ lg: { root: "h-5" }
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ color: "primary",
22
+ size: "md"
23
+ }
24
+ })
25
+
26
+ export default createProgressTheme()
@@ -0,0 +1,22 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createResizableTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "panel", "handle"],
6
+ base: {
7
+ root: "flex w-full h-full",
8
+ panel: "overflow-auto transition-all",
9
+ handle: "flex items-center justify-center bg-border hover:bg-primary/50 transition-colors cursor-col-resize select-none"
10
+ },
11
+ variants: {
12
+ direction: {
13
+ horizontal: { root: "flex-row", handle: "w-1.5 h-full cursor-col-resize" },
14
+ vertical: { root: "flex-col", handle: "h-1.5 w-full cursor-row-resize" }
15
+ }
16
+ },
17
+ defaultVariants: {
18
+ direction: "horizontal"
19
+ }
20
+ })
21
+
22
+ export default createResizableTheme()
@@ -0,0 +1,24 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createScrollAreaTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "viewport", "scrollbar", "thumb"],
6
+ base: {
7
+ root: "relative overflow-hidden w-full",
8
+ viewport: "h-full w-full rounded-[inherit] overflow-auto [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden",
9
+ scrollbar: "absolute flex user-select-none touch-action-none p-0.5 bg-transparent transition-colors duration-150 ease-out hover:bg-muted/10",
10
+ thumb: "relative flex-1 rounded-full bg-border transition-colors hover:bg-muted-foreground/45"
11
+ },
12
+ variants: {
13
+ orientation: {
14
+ vertical: { scrollbar: "right-0 top-0 bottom-0 w-2.5 flex-col" },
15
+ horizontal: { scrollbar: "bottom-0 left-0 right-0 h-2.5 flex-row" },
16
+ both: { scrollbar: "" }
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ orientation: "vertical"
21
+ }
22
+ })
23
+
24
+ export default createScrollAreaTheme()
@@ -181,7 +181,6 @@ export default defineTheme({
181
181
  ],
182
182
  defaultVariants: {
183
183
  variant: "default",
184
- orientation: "vertical",
185
- ctaVariant: "solid"
184
+ orientation: "vertical"
186
185
  }
187
186
  })
@@ -0,0 +1,27 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createSelectTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "label", "trigger", "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
+ 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",
11
+ 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",
12
+ itemText: "truncate",
13
+ itemIcon: "ml-auto size-4"
14
+ },
15
+ variants: {
16
+ size: {
17
+ sm: { trigger: "h-8 px-2 text-xs", item: "py-1 px-1.5 text-xs" },
18
+ md: { trigger: "h-9 px-3 text-sm", item: "py-1.5 px-2 text-sm" },
19
+ lg: { trigger: "h-10 px-4 text-base", item: "py-2 px-2.5 text-base" }
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ size: "md"
24
+ }
25
+ })
26
+
27
+ export default createSelectTheme()
@@ -0,0 +1,19 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const separatorTheme = defineTheme({
4
+ slots: ["root"],
5
+ base: {
6
+ root: "shrink-0 bg-border"
7
+ },
8
+ variants: {
9
+ orientation: {
10
+ horizontal: { root: "h-[1px] w-full" },
11
+ vertical: { root: "h-full w-[1px]" }
12
+ }
13
+ },
14
+ defaultVariants: {
15
+ orientation: "horizontal"
16
+ }
17
+ })
18
+
19
+ export default separatorTheme
@@ -0,0 +1,43 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const sheetTheme = 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 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
+ header: "flex flex-col gap-1.5 mb-4",
14
+ title: "text-lg font-semibold leading-none tracking-tight text-foreground",
15
+ description: "text-sm text-muted-foreground leading-relaxed",
16
+ footer: "flex flex-col sm:flex-row sm:justify-end gap-2 mt-6",
17
+ closeButton: [
18
+ "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100",
19
+ "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none"
20
+ ]
21
+ },
22
+ variants: {
23
+ side: {
24
+ top: {
25
+ content: "inset-x-0 top-0 border-b data-[state=open]:slide-in-from-top data-[state=closed]:slide-out-to-top"
26
+ },
27
+ bottom: {
28
+ content: "inset-x-0 bottom-0 border-t data-[state=open]:slide-in-from-bottom data-[state=closed]:slide-out-to-bottom"
29
+ },
30
+ left: {
31
+ content: "inset-y-0 left-0 h-full w-3/4 max-w-sm border-r data-[state=open]:slide-in-from-left data-[state=closed]:slide-out-to-left"
32
+ },
33
+ right: {
34
+ content: "inset-y-0 right-0 h-full w-3/4 max-w-sm border-l data-[state=open]:slide-in-from-right data-[state=closed]:slide-out-to-right"
35
+ }
36
+ }
37
+ },
38
+ defaultVariants: {
39
+ side: "right"
40
+ }
41
+ })
42
+
43
+ export default sheetTheme
@@ -0,0 +1,33 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createSidebarTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "header", "content", "footer", "item", "itemLink", "itemIcon", "itemBadge"],
6
+ base: {
7
+ root: "flex flex-col h-full w-64 bg-background border-r border-border shadow-sm transition-all duration-300",
8
+ header: "flex h-16 items-center px-6 border-b border-border gap-2 font-semibold text-lg text-foreground",
9
+ content: "flex-1 overflow-y-auto p-4 flex flex-col gap-1.5",
10
+ footer: "p-4 border-t border-border flex items-center justify-between",
11
+ item: "relative",
12
+ itemLink: "flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium text-muted-foreground hover:bg-muted hover:text-foreground transition-colors cursor-pointer",
13
+ itemIcon: "size-4 text-current",
14
+ itemBadge: "ml-auto flex size-5 items-center justify-center rounded-full bg-primary/10 text-primary text-[10px] font-bold"
15
+ },
16
+ variants: {
17
+ side: {
18
+ left: { root: "left-0 border-r" },
19
+ right: { root: "right-0 border-l" }
20
+ },
21
+ collapsible: {
22
+ icon: { root: "w-16 [&_[data-slot=item-text]]:hidden [&_[data-slot=item-badge]]:hidden [&_[data-slot=sidebar-logo]]:hidden" },
23
+ offcanvas: { root: "-translate-x-full" },
24
+ none: {}
25
+ }
26
+ },
27
+ defaultVariants: {
28
+ side: "left",
29
+ collapsible: "none"
30
+ }
31
+ })
32
+
33
+ export default createSidebarTheme()
@@ -0,0 +1,20 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const skeletonTheme = defineTheme({
4
+ slots: ["root"],
5
+ base: {
6
+ root: "animate-pulse bg-muted shrink-0"
7
+ },
8
+ variants: {
9
+ shape: {
10
+ circle: { root: "rounded-full" },
11
+ rectangle: { root: "rounded-none" },
12
+ rounded: { root: "rounded-md" }
13
+ }
14
+ },
15
+ defaultVariants: {
16
+ shape: "rounded"
17
+ }
18
+ })
19
+
20
+ export default skeletonTheme
@@ -0,0 +1,28 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createSliderTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root", "track", "range", "thumb"],
8
+ base: {
9
+ root: "relative flex w-full touch-none select-none items-center",
10
+ track: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-muted",
11
+ range: "absolute h-full",
12
+ thumb: "block size-4.5 rounded-full border border-border bg-background shadow transition-all focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 cursor-pointer"
13
+ },
14
+ variants: {
15
+ color: Object.fromEntries(colors.map((color) => [
16
+ color,
17
+ {
18
+ range: `bg-${color}-500`,
19
+ thumb: `focus-visible:ring-${color}-500/50 hover:border-${color}-500`
20
+ }
21
+ ]))
22
+ },
23
+ defaultVariants: {
24
+ color: "primary"
25
+ }
26
+ })
27
+
28
+ export default createSliderTheme()
@@ -0,0 +1,30 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createSpinnerTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root"],
8
+ base: {
9
+ root: "animate-spin shrink-0 rounded-full border-2 border-t-transparent border-current"
10
+ },
11
+ variants: {
12
+ size: {
13
+ xs: { root: "size-3" },
14
+ sm: { root: "size-4" },
15
+ md: { root: "size-6" },
16
+ lg: { root: "size-8" },
17
+ xl: { root: "size-10" }
18
+ },
19
+ color: Object.fromEntries([
20
+ ["current", { root: "text-current" }],
21
+ ...colors.map((color) => [color, { root: `text-${color}-500` }])
22
+ ])
23
+ },
24
+ defaultVariants: {
25
+ size: "md",
26
+ color: "current"
27
+ }
28
+ })
29
+
30
+ export default createSpinnerTheme()
@@ -0,0 +1,10 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const stickySurfaceTheme = defineTheme({
4
+ slots: ["root"],
5
+ base: {
6
+ root: "sticky top-0 self-start transition-all duration-300"
7
+ }
8
+ })
9
+
10
+ export default stickySurfaceTheme
@@ -0,0 +1,59 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createSwitchTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root", "input", "track", "thumb", "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
+ track: [
12
+ "inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent bg-muted 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
+ thumb: "pointer-events-none block size-4 rounded-full bg-background shadow-lg ring-0 transition-transform duration-200 translate-x-0",
16
+ label: "text-sm text-foreground leading-none"
17
+ },
18
+ variants: {
19
+ color: Object.fromEntries(colors.map((color) => [
20
+ color,
21
+ {
22
+ track: `peer-checked:bg-${color}-500 focus-within:ring-${color}-500/50`
23
+ }
24
+ ])),
25
+ size: {
26
+ sm: { track: "h-4 w-7", thumb: "size-3", label: "text-xs" },
27
+ md: { track: "h-5 w-9", thumb: "size-4", label: "text-sm" },
28
+ lg: { track: "h-6 w-11", thumb: "size-5", label: "text-base" }
29
+ },
30
+ checked: {
31
+ true: { thumb: "translate-x-full" },
32
+ false: { thumb: "translate-x-0" }
33
+ }
34
+ },
35
+ compoundVariants: [
36
+ {
37
+ size: "sm",
38
+ checked: true,
39
+ classNames: { thumb: "translate-x-3" }
40
+ },
41
+ {
42
+ size: "md",
43
+ checked: true,
44
+ classNames: { thumb: "translate-x-4" }
45
+ },
46
+ {
47
+ size: "lg",
48
+ checked: true,
49
+ classNames: { thumb: "translate-x-5" }
50
+ }
51
+ ],
52
+ defaultVariants: {
53
+ color: "primary",
54
+ size: "md",
55
+ checked: false
56
+ }
57
+ })
58
+
59
+ export default createSwitchTheme()
@@ -0,0 +1,36 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createTableTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "table", "thead", "tbody", "tfoot", "tr", "th", "td", "caption"],
6
+ base: {
7
+ root: "relative w-full overflow-auto rounded-lg border border-border shadow-sm",
8
+ table: "w-full text-sm text-left border-collapse",
9
+ thead: "bg-muted/50 border-b border-border",
10
+ tbody: "divide-y divide-border",
11
+ tfoot: "bg-muted/30 border-t border-border font-medium",
12
+ tr: "transition-colors hover:bg-muted/30",
13
+ th: "p-4 text-xs font-semibold uppercase text-muted-foreground",
14
+ td: "p-4 text-foreground align-middle",
15
+ caption: "p-4 text-xs text-muted-foreground text-center"
16
+ },
17
+ variants: {
18
+ striped: {
19
+ true: { tr: "odd:bg-background even:bg-muted/20 hover:bg-muted/35" }
20
+ },
21
+ bordered: {
22
+ true: {
23
+ root: "border-2 border-border",
24
+ tr: "border-b border-border",
25
+ th: "border-r border-border last:border-r-0",
26
+ td: "border-r border-border last:border-r-0"
27
+ }
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ striped: false,
32
+ bordered: false
33
+ }
34
+ })
35
+
36
+ export default createTableTheme()
@@ -0,0 +1,44 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createTabsTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "list", "trigger", "content"],
6
+ base: {
7
+ root: "w-full flex flex-col gap-4",
8
+ list: "inline-flex items-center justify-start rounded-md bg-muted p-1 text-muted-foreground",
9
+ trigger: "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:text-foreground cursor-pointer",
10
+ content: "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
11
+ },
12
+ variants: {
13
+ variant: {
14
+ solid: {
15
+ list: "bg-muted p-1 rounded-lg",
16
+ trigger: "data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm"
17
+ },
18
+ underline: {
19
+ list: "bg-transparent border-b border-border rounded-none p-0 gap-4",
20
+ trigger: "rounded-none border-b-2 border-transparent px-1 pb-3 pt-2 data-[state=active]:border-primary data-[state=active]:text-foreground hover:border-muted-foreground/30"
21
+ },
22
+ pills: {
23
+ list: "bg-transparent p-0 gap-2",
24
+ trigger: "rounded-full px-4 py-1.5 data-[state=active]:bg-primary data-[state=active]:text-white"
25
+ }
26
+ },
27
+ orientation: {
28
+ horizontal: { root: "flex-col", list: "w-full" },
29
+ vertical: { root: "flex-row gap-6", list: "flex-col items-stretch h-full w-48 border-r border-border rounded-none bg-transparent" }
30
+ },
31
+ size: {
32
+ sm: { trigger: "text-xs px-2.5 py-1" },
33
+ md: { trigger: "text-sm px-3.5 py-1.5" },
34
+ lg: { trigger: "text-base px-4.5 py-2" }
35
+ }
36
+ },
37
+ defaultVariants: {
38
+ variant: "solid",
39
+ orientation: "horizontal",
40
+ size: "md"
41
+ }
42
+ })
43
+
44
+ export default createTabsTheme()
@@ -0,0 +1,26 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createTextareaTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "textarea"],
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
+ textarea: "w-full bg-transparent px-3 py-2 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 min-h-[80px]"
9
+ },
10
+ variants: {
11
+ size: {
12
+ sm: { textarea: "py-1.5 text-xs min-h-[60px]" },
13
+ md: { textarea: "py-2 text-sm min-h-[80px]" },
14
+ lg: { textarea: "py-2.5 text-base min-h-[100px]" }
15
+ },
16
+ error: {
17
+ true: { root: "border-error-500 focus-within:ring-error-500/50" }
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ size: "md",
22
+ error: false
23
+ }
24
+ })
25
+
26
+ export default createTextareaTheme()
@@ -0,0 +1,16 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export default defineTheme({
4
+ slots: [
5
+ "root",
6
+ "sun",
7
+ "moon"
8
+ ],
9
+ base: {
10
+ root: "group rounded-full hover:bg-neutral-900/50 transition-colors inline-flex items-center justify-center text-neutral-400 hover:text-white cursor-pointer",
11
+ sun: "hidden dark:block i-lucide-sun w-5 h-5 text-current",
12
+ moon: "dark:hidden i-lucide-moon w-5 h-5 text-current"
13
+ },
14
+ variants: {},
15
+ defaultVariants: {}
16
+ })
@@ -0,0 +1,25 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createToastTheme = () =>
4
+ defineTheme({
5
+ slots: ["root", "title", "description", "action", "close"],
6
+ base: {
7
+ root: "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all border-border bg-background text-foreground",
8
+ title: "text-sm font-semibold",
9
+ description: "text-xs opacity-90",
10
+ action: "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-xs font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",
11
+ close: "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100"
12
+ },
13
+ variants: {
14
+ variant: {
15
+ default: { root: "bg-background border-border" },
16
+ destructive: { root: "destructive group border-error-500/20 bg-error-500/10 text-error-700 dark:text-error-400" },
17
+ success: { root: "border-success-500/20 bg-success-500/10 text-success-700 dark:text-success-400" }
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ variant: "default"
22
+ }
23
+ })
24
+
25
+ export default createToastTheme()
@@ -0,0 +1,42 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ const defaultColors = ["primary", "secondary", "info", "success", "warning", "error"]
4
+
5
+ export const createToggleTheme = (colors: string[] = defaultColors) =>
6
+ defineTheme({
7
+ slots: ["root"],
8
+ base: {
9
+ root: [
10
+ "inline-flex items-center justify-center rounded-md text-sm font-medium transition-all duration-150 border border-transparent bg-transparent hover:bg-muted text-foreground cursor-pointer select-none",
11
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
12
+ ]
13
+ },
14
+ variants: {
15
+ size: {
16
+ sm: { root: "h-8 px-2 text-xs" },
17
+ md: { root: "h-9 px-3 text-sm" },
18
+ lg: { root: "h-10 px-4 text-base" }
19
+ },
20
+ color: Object.fromEntries(colors.map((color) => [color, { root: "" }])),
21
+ active: {
22
+ true: { root: "bg-muted text-foreground border-border" },
23
+ false: { root: "" }
24
+ }
25
+ },
26
+ compoundVariants: [
27
+ ...colors.map((color) => ({
28
+ active: true as const,
29
+ color,
30
+ classNames: {
31
+ root: `bg-${color}-500/10 text-${color}-600 border-${color}-500/20 hover:bg-${color}-500/20`
32
+ }
33
+ }))
34
+ ],
35
+ defaultVariants: {
36
+ size: "md",
37
+ color: "primary",
38
+ active: false
39
+ }
40
+ })
41
+
42
+ export default createToggleTheme()
@@ -0,0 +1,21 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const createToggleGroupTheme = () =>
4
+ defineTheme({
5
+ slots: ["root"],
6
+ base: {
7
+ root: "inline-flex items-center justify-center gap-1 rounded-md border border-border bg-muted p-1"
8
+ },
9
+ variants: {
10
+ size: {
11
+ sm: { root: "h-8 gap-0.5" },
12
+ md: { root: "h-9 gap-1" },
13
+ lg: { root: "h-10 gap-1.5" }
14
+ }
15
+ },
16
+ defaultVariants: {
17
+ size: "md"
18
+ }
19
+ })
20
+
21
+ export default createToggleGroupTheme()
@@ -0,0 +1,27 @@
1
+ import { defineTheme } from "../utils/defineTheme"
2
+
3
+ export const tooltipTheme = defineTheme({
4
+ slots: ["root", "trigger", "content"],
5
+ base: {
6
+ root: "relative inline-block group/tooltip",
7
+ trigger: "",
8
+ content: [
9
+ "absolute z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md animate-in fade-in-0 zoom-in-95",
10
+ "transition-all duration-150 invisible opacity-0 scale-95 origin-center pointer-events-none",
11
+ "group-hover/tooltip:visible group-hover/tooltip:opacity-100 group-hover/tooltip:scale-100"
12
+ ]
13
+ },
14
+ variants: {
15
+ placement: {
16
+ top: { content: "bottom-full left-1/2 -translate-x-1/2 mb-1.5" },
17
+ bottom: { content: "top-full left-1/2 -translate-x-1/2 mt-1.5" },
18
+ left: { content: "right-full top-1/2 -translate-y-1/2 mr-1.5" },
19
+ right: { content: "left-full top-1/2 -translate-y-1/2 ml-1.5" }
20
+ }
21
+ },
22
+ defaultVariants: {
23
+ placement: "top"
24
+ }
25
+ })
26
+
27
+ export default tooltipTheme