@codefast/ui 0.3.16-canary.2 → 0.4.0-canary.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +28 -17
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +14 -14
  8. package/dist/components/alert.mjs +17 -28
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.d.mts +3 -15
  14. package/dist/components/badge.mjs +6 -48
  15. package/dist/components/breadcrumb.d.mts +1 -0
  16. package/dist/components/breadcrumb.mjs +11 -10
  17. package/dist/components/button-group.d.mts +3 -13
  18. package/dist/components/button-group.mjs +9 -31
  19. package/dist/components/button.d.mts +3 -26
  20. package/dist/components/button.mjs +9 -79
  21. package/dist/components/calendar.d.mts +6 -2
  22. package/dist/components/calendar.mjs +41 -44
  23. package/dist/components/card.d.mts +4 -2
  24. package/dist/components/card.mjs +9 -9
  25. package/dist/components/carousel.d.mts +16 -5
  26. package/dist/components/carousel.mjs +24 -11
  27. package/dist/components/chart.d.mts +9 -6
  28. package/dist/components/chart.mjs +21 -15
  29. package/dist/components/checkbox-cards.mjs +4 -4
  30. package/dist/components/checkbox-group.mjs +3 -4
  31. package/dist/components/checkbox.d.mts +2 -2
  32. package/dist/components/checkbox.mjs +6 -7
  33. package/dist/components/collapsible.d.mts +4 -4
  34. package/dist/components/collapsible.mjs +4 -5
  35. package/dist/components/command.d.mts +11 -1
  36. package/dist/components/command.mjs +35 -32
  37. package/dist/components/context-menu.d.mts +22 -15
  38. package/dist/components/context-menu.mjs +44 -39
  39. package/dist/components/dialog.d.mts +19 -23
  40. package/dist/components/dialog.mjs +48 -47
  41. package/dist/components/direction.d.mts +24 -0
  42. package/dist/components/direction.mjs +18 -0
  43. package/dist/components/drawer.d.mts +3 -21
  44. package/dist/components/drawer.mjs +19 -27
  45. package/dist/components/dropdown-menu.d.mts +22 -15
  46. package/dist/components/dropdown-menu.mjs +41 -37
  47. package/dist/components/empty.d.mts +3 -13
  48. package/dist/components/empty.mjs +8 -23
  49. package/dist/components/field.d.mts +3 -14
  50. package/dist/components/field.mjs +14 -44
  51. package/dist/components/form.d.mts +7 -10
  52. package/dist/components/form.mjs +6 -7
  53. package/dist/components/hover-card.d.mts +5 -5
  54. package/dist/components/hover-card.mjs +14 -12
  55. package/dist/components/input-group.d.mts +4 -31
  56. package/dist/components/input-group.mjs +14 -96
  57. package/dist/components/input-number.d.mts +3 -1
  58. package/dist/components/input-number.mjs +50 -28
  59. package/dist/components/input-otp.mjs +9 -7
  60. package/dist/components/input-password.mjs +1 -4
  61. package/dist/components/input-search.mjs +3 -5
  62. package/dist/components/input.mjs +1 -2
  63. package/dist/components/item.d.mts +4 -29
  64. package/dist/components/item.mjs +12 -65
  65. package/dist/components/kbd.mjs +1 -1
  66. package/dist/components/label.d.mts +2 -2
  67. package/dist/components/label.mjs +3 -4
  68. package/dist/components/menubar.d.mts +22 -16
  69. package/dist/components/menubar.mjs +54 -47
  70. package/dist/components/native-select.d.mts +5 -1
  71. package/dist/components/native-select.mjs +9 -6
  72. package/dist/components/navigation-menu.d.mts +30 -13
  73. package/dist/components/navigation-menu.mjs +35 -32
  74. package/dist/components/pagination.d.mts +7 -1
  75. package/dist/components/pagination.mjs +27 -12
  76. package/dist/components/popover.d.mts +40 -7
  77. package/dist/components/popover.mjs +46 -14
  78. package/dist/components/progress-circle.d.mts +3 -47
  79. package/dist/components/progress-circle.mjs +2 -48
  80. package/dist/components/progress.d.mts +2 -2
  81. package/dist/components/progress.mjs +5 -6
  82. package/dist/components/radio-cards.d.mts +3 -3
  83. package/dist/components/radio-cards.mjs +11 -11
  84. package/dist/components/radio-group.d.mts +3 -3
  85. package/dist/components/radio-group.mjs +9 -9
  86. package/dist/components/radio.mjs +2 -3
  87. package/dist/components/resizable.mjs +3 -8
  88. package/dist/components/scroll-area.d.mts +8 -24
  89. package/dist/components/scroll-area.mjs +16 -70
  90. package/dist/components/select.d.mts +14 -14
  91. package/dist/components/select.mjs +47 -47
  92. package/dist/components/separator.d.mts +4 -19
  93. package/dist/components/separator.mjs +6 -27
  94. package/dist/components/sheet.d.mts +18 -31
  95. package/dist/components/sheet.mjs +46 -87
  96. package/dist/components/sidebar.d.mts +3 -19
  97. package/dist/components/sidebar.mjs +48 -84
  98. package/dist/components/skeleton.mjs +1 -1
  99. package/dist/components/slider.d.mts +2 -2
  100. package/dist/components/slider.mjs +9 -11
  101. package/dist/components/sonner.mjs +11 -3
  102. package/dist/components/spinner.mjs +6 -7
  103. package/dist/components/switch.d.mts +5 -2
  104. package/dist/components/switch.mjs +7 -7
  105. package/dist/components/table.mjs +10 -10
  106. package/dist/components/tabs.d.mts +8 -5
  107. package/dist/components/tabs.mjs +18 -12
  108. package/dist/components/textarea.mjs +1 -1
  109. package/dist/components/toggle-group.d.mts +11 -7
  110. package/dist/components/toggle-group.mjs +20 -21
  111. package/dist/components/toggle.d.mts +4 -24
  112. package/dist/components/toggle.mjs +6 -45
  113. package/dist/components/tooltip.d.mts +7 -6
  114. package/dist/components/tooltip.mjs +19 -17
  115. package/dist/hooks/use-animated-value.mjs +0 -1
  116. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  117. package/dist/hooks/use-is-mobile.mjs +0 -1
  118. package/dist/hooks/use-media-query.mjs +0 -1
  119. package/dist/hooks/use-mutation-observer.mjs +0 -1
  120. package/dist/hooks/use-pagination.mjs +0 -1
  121. package/dist/index.d.mts +38 -21
  122. package/dist/index.mjs +40 -23
  123. package/dist/lib/utils.d.mts +1 -12
  124. package/dist/lib/utils.mjs +1 -9
  125. package/dist/primitives/checkbox-group.d.mts +9 -11
  126. package/dist/primitives/checkbox-group.mjs +14 -19
  127. package/dist/primitives/input-number.d.mts +3 -4
  128. package/dist/primitives/input-number.mjs +3 -5
  129. package/dist/primitives/input.d.mts +4 -5
  130. package/dist/primitives/input.mjs +2 -3
  131. package/dist/primitives/progress-circle.d.mts +3 -4
  132. package/dist/primitives/progress-circle.mjs +2 -3
  133. package/dist/variants/alert.d.mts +18 -0
  134. package/dist/variants/alert.mjs +15 -0
  135. package/dist/variants/badge.d.mts +22 -0
  136. package/dist/variants/badge.mjs +19 -0
  137. package/dist/variants/button-group.d.mts +18 -0
  138. package/dist/variants/button-group.mjs +15 -0
  139. package/dist/variants/button.d.mts +32 -0
  140. package/dist/variants/button.mjs +34 -0
  141. package/dist/variants/empty.d.mts +18 -0
  142. package/dist/variants/empty.mjs +15 -0
  143. package/dist/variants/field.d.mts +19 -0
  144. package/dist/variants/field.mjs +16 -0
  145. package/dist/variants/input-group.d.mts +43 -0
  146. package/dist/variants/input-group.mjs +34 -0
  147. package/dist/variants/input-number.d.mts +45 -0
  148. package/dist/variants/input-number.mjs +40 -0
  149. package/dist/variants/item.d.mts +38 -0
  150. package/dist/variants/item.mjs +38 -0
  151. package/dist/variants/navigation-menu.d.mts +13 -0
  152. package/dist/variants/navigation-menu.mjs +8 -0
  153. package/dist/variants/progress-circle.d.mts +52 -0
  154. package/dist/variants/progress-circle.mjs +45 -0
  155. package/dist/variants/scroll-area.d.mts +24 -0
  156. package/dist/variants/scroll-area.mjs +58 -0
  157. package/dist/variants/separator.d.mts +23 -0
  158. package/dist/variants/separator.mjs +25 -0
  159. package/dist/variants/sheet.d.mts +20 -0
  160. package/dist/variants/sheet.mjs +17 -0
  161. package/dist/variants/sidebar.d.mts +23 -0
  162. package/dist/variants/sidebar.mjs +25 -0
  163. package/dist/variants/tabs.d.mts +18 -0
  164. package/dist/variants/tabs.mjs +15 -0
  165. package/dist/variants/toggle.d.mts +23 -0
  166. package/dist/variants/toggle.mjs +25 -0
  167. package/package.json +186 -55
  168. package/src/components/accordion.tsx +114 -0
  169. package/src/components/alert-dialog.tsx +298 -0
  170. package/src/components/alert.tsx +94 -0
  171. package/src/components/aspect-ratio.tsx +25 -0
  172. package/src/components/avatar.tsx +171 -0
  173. package/src/components/badge.tsx +35 -0
  174. package/src/components/breadcrumb.tsx +191 -0
  175. package/src/components/button-group.tsx +97 -0
  176. package/src/components/button.tsx +55 -0
  177. package/src/components/calendar.tsx +222 -0
  178. package/src/components/card.tsx +169 -0
  179. package/src/components/carousel.tsx +349 -0
  180. package/src/components/chart.tsx +536 -0
  181. package/src/components/checkbox-cards.tsx +72 -0
  182. package/src/components/checkbox-group.tsx +60 -0
  183. package/src/components/checkbox.tsx +44 -0
  184. package/src/components/collapsible.tsx +57 -0
  185. package/src/components/command.tsx +298 -0
  186. package/src/components/context-menu.tsx +410 -0
  187. package/src/components/dialog.tsx +243 -0
  188. package/src/components/direction.tsx +32 -0
  189. package/src/components/drawer.tsx +209 -0
  190. package/src/components/dropdown-menu.tsx +419 -0
  191. package/src/components/empty.tsx +155 -0
  192. package/src/components/field.tsx +329 -0
  193. package/src/components/form.tsx +258 -0
  194. package/src/components/hover-card.tsx +93 -0
  195. package/src/components/input-group.tsx +185 -0
  196. package/src/components/input-number.tsx +141 -0
  197. package/src/components/input-otp.tsx +132 -0
  198. package/src/components/input-password.tsx +50 -0
  199. package/src/components/input-search.tsx +81 -0
  200. package/src/components/input.tsx +36 -0
  201. package/src/components/item.tsx +266 -0
  202. package/src/components/kbd.tsx +47 -0
  203. package/src/components/label.tsx +36 -0
  204. package/src/components/menubar.tsx +440 -0
  205. package/src/components/native-select.tsx +87 -0
  206. package/src/components/navigation-menu.tsx +235 -0
  207. package/src/components/pagination.tsx +198 -0
  208. package/src/components/popover.tsx +170 -0
  209. package/src/components/progress-circle.tsx +185 -0
  210. package/src/components/progress.tsx +41 -0
  211. package/src/components/radio-cards.tsx +66 -0
  212. package/src/components/radio-group.tsx +59 -0
  213. package/src/components/radio.tsx +40 -0
  214. package/src/components/resizable.tsx +78 -0
  215. package/src/components/scroll-area.tsx +95 -0
  216. package/src/components/select.tsx +296 -0
  217. package/src/components/separator.tsx +60 -0
  218. package/src/components/sheet.tsx +241 -0
  219. package/src/components/sidebar.tsx +926 -0
  220. package/src/components/skeleton.tsx +35 -0
  221. package/src/components/slider.tsx +66 -0
  222. package/src/components/sonner.tsx +57 -0
  223. package/src/components/spinner.tsx +66 -0
  224. package/src/components/switch.tsx +44 -0
  225. package/src/components/table.tsx +183 -0
  226. package/src/components/tabs.tsx +110 -0
  227. package/src/components/textarea.tsx +35 -0
  228. package/src/components/toggle-group.tsx +137 -0
  229. package/src/components/toggle.tsx +30 -0
  230. package/src/components/tooltip.tsx +115 -0
  231. package/src/css/foundation/base.css +50 -0
  232. package/src/css/foundation/motion.css +36 -0
  233. package/src/css/foundation/source.css +3 -0
  234. package/src/css/foundation/tokens.css +71 -0
  235. package/src/css/foundation/variants.css +113 -0
  236. package/src/css/preset.css +5 -195
  237. package/src/css/style.css +1 -1
  238. package/src/css/{amber.css → themes/amber.css} +59 -22
  239. package/src/css/{blue.css → themes/blue.css} +59 -22
  240. package/src/css/{cyan.css → themes/cyan.css} +59 -22
  241. package/src/css/{emerald.css → themes/emerald.css} +59 -22
  242. package/src/css/{fuchsia.css → themes/fuchsia.css} +59 -22
  243. package/src/css/{gray.css → themes/gray.css} +59 -22
  244. package/src/css/{green.css → themes/green.css} +59 -22
  245. package/src/css/{indigo.css → themes/indigo.css} +59 -22
  246. package/src/css/{lime.css → themes/lime.css} +59 -22
  247. package/src/css/{neutral.css → themes/neutral.css} +59 -22
  248. package/src/css/{orange.css → themes/orange.css} +59 -22
  249. package/src/css/{pink.css → themes/pink.css} +59 -22
  250. package/src/css/{purple.css → themes/purple.css} +59 -22
  251. package/src/css/{red.css → themes/red.css} +59 -22
  252. package/src/css/{rose.css → themes/rose.css} +59 -22
  253. package/src/css/{sky.css → themes/sky.css} +59 -22
  254. package/src/css/{slate.css → themes/slate.css} +59 -22
  255. package/src/css/{stone.css → themes/stone.css} +59 -22
  256. package/src/css/{teal.css → themes/teal.css} +59 -22
  257. package/src/css/{violet.css → themes/violet.css} +59 -22
  258. package/src/css/{yellow.css → themes/yellow.css} +59 -22
  259. package/src/css/{zinc.css → themes/zinc.css} +59 -22
  260. package/src/hooks/use-animated-value.ts +91 -0
  261. package/src/hooks/use-copy-to-clipboard.ts +58 -0
  262. package/src/hooks/use-is-mobile.ts +25 -0
  263. package/src/hooks/use-media-query.ts +69 -0
  264. package/src/hooks/use-mutation-observer.ts +51 -0
  265. package/src/hooks/use-pagination.ts +164 -0
  266. package/src/index.ts +679 -0
  267. package/src/lib/utils.ts +5 -0
  268. package/src/primitives/checkbox-group.tsx +346 -0
  269. package/src/primitives/input-number.tsx +967 -0
  270. package/src/primitives/input.tsx +227 -0
  271. package/src/primitives/progress-circle.tsx +507 -0
  272. package/src/variants/alert.ts +34 -0
  273. package/src/variants/badge.ts +39 -0
  274. package/src/variants/button-group.ts +36 -0
  275. package/src/variants/button.ts +56 -0
  276. package/src/variants/empty.ts +34 -0
  277. package/src/variants/field.ts +37 -0
  278. package/src/variants/input-group.ts +80 -0
  279. package/src/variants/input-number.ts +65 -0
  280. package/src/variants/item.ts +68 -0
  281. package/src/variants/navigation-menu.ts +25 -0
  282. package/src/variants/progress-circle.ts +46 -0
  283. package/src/variants/scroll-area.ts +73 -0
  284. package/src/variants/separator.ts +40 -0
  285. package/src/variants/sheet.ts +37 -0
  286. package/src/variants/sidebar.ts +41 -0
  287. package/src/variants/tabs.ts +34 -0
  288. package/src/variants/toggle.ts +40 -0
  289. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,235 @@
1
+ import { ChevronDownIcon } from "lucide-react";
2
+ import { NavigationMenu as NavigationMenuPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+ import { navigationMenuTriggerVariants } from "#/variants/navigation-menu";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Component: NavigationMenu
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ /**
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ interface NavigationMenuProps extends ComponentProps<typeof NavigationMenuPrimitive.Root> {
16
+ viewport?: boolean;
17
+ }
18
+
19
+ /**
20
+ * @since 0.3.16-canary.0
21
+ */
22
+ function NavigationMenu({ children, className, viewport = true, ...props }: NavigationMenuProps): JSX.Element {
23
+ return (
24
+ <NavigationMenuPrimitive.Root
25
+ className={cn("group/navigation-menu relative flex max-w-max flex-1 items-center justify-center", className)}
26
+ data-slot="navigation-menu"
27
+ data-viewport={viewport}
28
+ {...props}
29
+ >
30
+ {children}
31
+ {viewport ? <NavigationMenuViewport /> : null}
32
+ </NavigationMenuPrimitive.Root>
33
+ );
34
+ }
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Component: NavigationMenuList
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ /**
41
+ * @since 0.3.16-canary.0
42
+ */
43
+ type NavigationMenuListProps = ComponentProps<typeof NavigationMenuPrimitive.List>;
44
+
45
+ /**
46
+ * @since 0.3.16-canary.0
47
+ */
48
+ function NavigationMenuList({ children, className, ...props }: NavigationMenuListProps): JSX.Element {
49
+ return (
50
+ <NavigationMenuPrimitive.List
51
+ className={cn("group flex flex-1 list-none items-center justify-center gap-0", className)}
52
+ data-slot="navigation-menu-list"
53
+ {...props}
54
+ >
55
+ {children}
56
+ <NavigationMenuIndicator className="invisible" />
57
+ </NavigationMenuPrimitive.List>
58
+ );
59
+ }
60
+
61
+ /* -----------------------------------------------------------------------------
62
+ * Component: NavigationMenuItem
63
+ * -------------------------------------------------------------------------- */
64
+
65
+ /**
66
+ * @since 0.3.16-canary.0
67
+ */
68
+ type NavigationMenuItemProps = ComponentProps<typeof NavigationMenuPrimitive.Item>;
69
+
70
+ /**
71
+ * @since 0.3.16-canary.0
72
+ */
73
+ function NavigationMenuItem({ className, ...props }: NavigationMenuItemProps): JSX.Element {
74
+ return (
75
+ <NavigationMenuPrimitive.Item className={cn("relative", className)} data-slot="navigation-menu-item" {...props} />
76
+ );
77
+ }
78
+
79
+ /* -----------------------------------------------------------------------------
80
+ * Component: NavigationMenuTrigger
81
+ * -------------------------------------------------------------------------- */
82
+
83
+ /**
84
+ * @since 0.3.16-canary.0
85
+ */
86
+ type NavigationMenuTriggerProps = ComponentProps<typeof NavigationMenuPrimitive.Trigger>;
87
+
88
+ /**
89
+ * @since 0.3.16-canary.0
90
+ */
91
+ function NavigationMenuTrigger({ children, className, ...props }: NavigationMenuTriggerProps): JSX.Element {
92
+ return (
93
+ <NavigationMenuPrimitive.Trigger
94
+ className={navigationMenuTriggerVariants({ className: ["group", className] })}
95
+ data-slot="navigation-menu-trigger"
96
+ {...props}
97
+ >
98
+ {children}{" "}
99
+ <ChevronDownIcon
100
+ aria-hidden="true"
101
+ className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180"
102
+ />
103
+ </NavigationMenuPrimitive.Trigger>
104
+ );
105
+ }
106
+
107
+ /* -----------------------------------------------------------------------------
108
+ * Component: NavigationMenuContent
109
+ * -------------------------------------------------------------------------- */
110
+
111
+ /**
112
+ * @since 0.3.16-canary.0
113
+ */
114
+ type NavigationMenuContentProps = ComponentProps<typeof NavigationMenuPrimitive.Content>;
115
+
116
+ /**
117
+ * @since 0.3.16-canary.0
118
+ */
119
+ function NavigationMenuContent({ className, ...props }: NavigationMenuContentProps): JSX.Element {
120
+ return (
121
+ <NavigationMenuPrimitive.Content
122
+ className={cn(
123
+ "top-0 left-0 w-full p-2 pr-2.5 ease-snappy group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:animation-duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:ease-exit data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 data-closed:ease-exit group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
124
+ className,
125
+ )}
126
+ data-slot="navigation-menu-content"
127
+ {...props}
128
+ />
129
+ );
130
+ }
131
+
132
+ /* -----------------------------------------------------------------------------
133
+ * Component: NavigationMenuLink
134
+ * -------------------------------------------------------------------------- */
135
+
136
+ /**
137
+ * @since 0.3.16-canary.0
138
+ */
139
+ type NavigationMenuLinkProps = ComponentProps<typeof NavigationMenuPrimitive.Link>;
140
+
141
+ /**
142
+ * @since 0.3.16-canary.0
143
+ */
144
+ function NavigationMenuLink({ className, ...props }: NavigationMenuLinkProps): JSX.Element {
145
+ return (
146
+ <NavigationMenuPrimitive.Link
147
+ className={cn(
148
+ "flex items-center gap-1.5 rounded-md p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 data-[active=true]:bg-muted/50 data-[active=true]:hover:bg-muted data-[active=true]:focus:bg-muted [&_svg:not([class*='size-'])]:size-4",
149
+ className,
150
+ )}
151
+ data-slot="navigation-menu-link"
152
+ {...props}
153
+ />
154
+ );
155
+ }
156
+
157
+ /* -----------------------------------------------------------------------------
158
+ * Component: NavigationMenuViewport
159
+ * -------------------------------------------------------------------------- */
160
+
161
+ /**
162
+ * @since 0.4.0-canary.4
163
+ */
164
+ type NavigationMenuViewportProps = ComponentProps<typeof NavigationMenuPrimitive.Viewport>;
165
+
166
+ /**
167
+ * @since 0.4.0-canary.4
168
+ */
169
+ function NavigationMenuViewport({ className, ...props }: NavigationMenuViewportProps): JSX.Element {
170
+ return (
171
+ <div className="absolute top-full left-0 isolate z-50 flex justify-center">
172
+ <NavigationMenuPrimitive.Viewport
173
+ className={cn(
174
+ "relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full origin-[top_center] overflow-hidden rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 transition-[width,height] duration-100 ease-snappy md:w-(--radix-navigation-menu-viewport-width) data-open:animate-in data-open:animation-duration-100 data-open:zoom-in-90 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-100 data-closed:zoom-out-90",
175
+ className,
176
+ )}
177
+ data-slot="navigation-menu-viewport"
178
+ {...props}
179
+ />
180
+ </div>
181
+ );
182
+ }
183
+
184
+ /* -----------------------------------------------------------------------------
185
+ * Component: NavigationMenuIndicator
186
+ * -------------------------------------------------------------------------- */
187
+
188
+ /**
189
+ * @since 0.4.0-canary.4
190
+ */
191
+ type NavigationMenuIndicatorProps = ComponentProps<typeof NavigationMenuPrimitive.Indicator>;
192
+
193
+ /**
194
+ * @since 0.4.0-canary.4
195
+ */
196
+ function NavigationMenuIndicator({ className, ...props }: NavigationMenuIndicatorProps): JSX.Element {
197
+ return (
198
+ <NavigationMenuPrimitive.Indicator
199
+ className={cn(
200
+ "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-hidden:animate-out data-hidden:fade-out data-visible:animate-in data-visible:fade-in",
201
+ className,
202
+ )}
203
+ data-slot="navigation-menu-indicator"
204
+ {...props}
205
+ >
206
+ <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
207
+ </NavigationMenuPrimitive.Indicator>
208
+ );
209
+ }
210
+
211
+ /* -----------------------------------------------------------------------------
212
+ * Exports
213
+ * -------------------------------------------------------------------------- */
214
+
215
+ export {
216
+ NavigationMenu,
217
+ NavigationMenuContent,
218
+ NavigationMenuIndicator,
219
+ NavigationMenuItem,
220
+ NavigationMenuLink,
221
+ NavigationMenuList,
222
+ NavigationMenuTrigger,
223
+ NavigationMenuViewport,
224
+ };
225
+
226
+ export type {
227
+ NavigationMenuContentProps,
228
+ NavigationMenuIndicatorProps,
229
+ NavigationMenuItemProps,
230
+ NavigationMenuLinkProps,
231
+ NavigationMenuListProps,
232
+ NavigationMenuProps,
233
+ NavigationMenuTriggerProps,
234
+ NavigationMenuViewportProps,
235
+ };
@@ -0,0 +1,198 @@
1
+ import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import type { VariantProps } from "#/lib/utils";
5
+ import { cn } from "#/lib/utils";
6
+ import { buttonVariants } from "#/variants/button";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Component: Pagination
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ /**
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ type PaginationProps = ComponentProps<"nav">;
16
+
17
+ /**
18
+ * @since 0.3.16-canary.0
19
+ */
20
+ function Pagination({ className, ...props }: PaginationProps): JSX.Element {
21
+ return (
22
+ <nav
23
+ aria-label="pagination"
24
+ className={cn("mx-auto flex w-full justify-center", className)}
25
+ data-slot="pagination"
26
+ {...props}
27
+ />
28
+ );
29
+ }
30
+
31
+ /* -----------------------------------------------------------------------------
32
+ * Component: PaginationContent
33
+ * -------------------------------------------------------------------------- */
34
+
35
+ /**
36
+ * @since 0.3.16-canary.0
37
+ */
38
+ type PaginationContentProps = ComponentProps<"ul">;
39
+
40
+ /**
41
+ * @since 0.3.16-canary.0
42
+ */
43
+ function PaginationContent({ className, ...props }: PaginationContentProps): JSX.Element {
44
+ return <ul className={cn("flex items-center gap-1", className)} data-slot="pagination-content" {...props} />;
45
+ }
46
+
47
+ /* -----------------------------------------------------------------------------
48
+ * Component: PaginationItem
49
+ * -------------------------------------------------------------------------- */
50
+
51
+ /**
52
+ * @since 0.3.16-canary.0
53
+ */
54
+ type PaginationItemProps = ComponentProps<"li">;
55
+
56
+ /**
57
+ * @since 0.3.16-canary.0
58
+ */
59
+ function PaginationItem(props: PaginationItemProps): JSX.Element {
60
+ return <li data-slot="pagination-item" {...props} />;
61
+ }
62
+
63
+ /* -----------------------------------------------------------------------------
64
+ * Component: PaginationLink
65
+ * -------------------------------------------------------------------------- */
66
+
67
+ /**
68
+ * @since 0.3.16-canary.0
69
+ */
70
+ interface PaginationLinkProps extends ComponentProps<"a">, Pick<VariantProps<typeof buttonVariants>, "size"> {
71
+ isActive?: boolean;
72
+ }
73
+
74
+ /**
75
+ * @since 0.3.16-canary.0
76
+ */
77
+ function PaginationLink({ children, className, isActive, size = "icon", ...props }: PaginationLinkProps): JSX.Element {
78
+ return (
79
+ <a
80
+ aria-current={isActive ? "page" : undefined}
81
+ className={buttonVariants({ className, size, variant: isActive ? "outline" : "ghost" })}
82
+ data-active={isActive}
83
+ data-slot="pagination-link"
84
+ {...props}
85
+ >
86
+ {children}
87
+ </a>
88
+ );
89
+ }
90
+
91
+ /* -----------------------------------------------------------------------------
92
+ * Component: PaginationPrevious
93
+ * -------------------------------------------------------------------------- */
94
+
95
+ /**
96
+ * @since 0.3.16-canary.0
97
+ */
98
+ interface PaginationPreviousProps extends ComponentProps<"a">, Pick<VariantProps<typeof buttonVariants>, "size"> {
99
+ isActive?: boolean;
100
+ text?: string;
101
+ }
102
+
103
+ /**
104
+ * @since 0.3.16-canary.0
105
+ */
106
+ function PaginationPrevious({ className, text = "Previous", ...props }: PaginationPreviousProps): JSX.Element {
107
+ return (
108
+ <PaginationLink
109
+ aria-label="Go to previous page"
110
+ className={cn("pl-2!", className)}
111
+ data-slot="pagination-previous"
112
+ size="default"
113
+ {...props}
114
+ >
115
+ <ChevronLeftIcon className="rtl:rotate-180" data-icon="inline-start" />
116
+ <span className="hidden sm:block">{text}</span>
117
+ </PaginationLink>
118
+ );
119
+ }
120
+
121
+ /* -----------------------------------------------------------------------------
122
+ * Component: PaginationNext
123
+ * -------------------------------------------------------------------------- */
124
+
125
+ /**
126
+ * @since 0.3.16-canary.0
127
+ */
128
+ interface PaginationNextProps extends ComponentProps<"a">, Pick<VariantProps<typeof buttonVariants>, "size"> {
129
+ isActive?: boolean;
130
+ text?: string;
131
+ }
132
+
133
+ /**
134
+ * @since 0.3.16-canary.0
135
+ */
136
+ function PaginationNext({ className, text = "Next", ...props }: PaginationNextProps): JSX.Element {
137
+ return (
138
+ <PaginationLink
139
+ aria-label="Go to next page"
140
+ className={cn("pr-2!", className)}
141
+ data-slot="pagination-next"
142
+ size="default"
143
+ {...props}
144
+ >
145
+ <span className="hidden sm:block">{text}</span>
146
+ <ChevronRightIcon className="rtl:rotate-180" data-icon="inline-end" />
147
+ </PaginationLink>
148
+ );
149
+ }
150
+
151
+ /* -----------------------------------------------------------------------------
152
+ * Component: PaginationEllipsis
153
+ * -------------------------------------------------------------------------- */
154
+
155
+ /**
156
+ * @since 0.3.16-canary.0
157
+ */
158
+ type PaginationEllipsisProps = ComponentProps<"span">;
159
+
160
+ /**
161
+ * @since 0.3.16-canary.0
162
+ */
163
+ function PaginationEllipsis({ className, ...props }: PaginationEllipsisProps): JSX.Element {
164
+ return (
165
+ <span
166
+ aria-hidden
167
+ className={cn("flex size-9 items-center justify-center [&_svg:not([class*='size-'])]:size-4", className)}
168
+ data-slot="pagination-ellipsis"
169
+ {...props}
170
+ >
171
+ <MoreHorizontalIcon />
172
+ <span className="sr-only">More pages</span>
173
+ </span>
174
+ );
175
+ }
176
+
177
+ /* -----------------------------------------------------------------------------
178
+ * Exports
179
+ * -------------------------------------------------------------------------- */
180
+
181
+ export {
182
+ Pagination,
183
+ PaginationContent,
184
+ PaginationEllipsis,
185
+ PaginationItem,
186
+ PaginationLink,
187
+ PaginationNext,
188
+ PaginationPrevious,
189
+ };
190
+ export type {
191
+ PaginationContentProps,
192
+ PaginationEllipsisProps,
193
+ PaginationItemProps,
194
+ PaginationLinkProps,
195
+ PaginationNextProps,
196
+ PaginationPreviousProps,
197
+ PaginationProps,
198
+ };
@@ -0,0 +1,170 @@
1
+ import { Popover as PopoverPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: Popover
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type PopoverProps = ComponentProps<typeof PopoverPrimitive.Root>;
14
+
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ function Popover({ ...props }: PopoverProps): JSX.Element {
19
+ return <PopoverPrimitive.Root data-slot="popover" {...props} />;
20
+ }
21
+
22
+ /* -----------------------------------------------------------------------------
23
+ * Component: PopoverTrigger
24
+ * -------------------------------------------------------------------------- */
25
+
26
+ /**
27
+ * @since 0.3.16-canary.0
28
+ */
29
+ type PopoverTriggerProps = ComponentProps<typeof PopoverPrimitive.Trigger>;
30
+
31
+ /**
32
+ * @since 0.3.16-canary.0
33
+ */
34
+ function PopoverTrigger({ ...props }: PopoverTriggerProps): JSX.Element {
35
+ return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
36
+ }
37
+
38
+ /* -----------------------------------------------------------------------------
39
+ * Component: PopoverAnchor
40
+ * -------------------------------------------------------------------------- */
41
+
42
+ /**
43
+ * @since 0.3.16-canary.0
44
+ */
45
+ type PopoverAnchorProps = ComponentProps<typeof PopoverPrimitive.Anchor>;
46
+
47
+ /**
48
+ * @since 0.3.16-canary.0
49
+ */
50
+ function PopoverAnchor({ ...props }: PopoverAnchorProps): JSX.Element {
51
+ return <PopoverPrimitive.Anchor data-slot="popover-anchor" {...props} />;
52
+ }
53
+
54
+ /* -----------------------------------------------------------------------------
55
+ * Component: PopoverContent
56
+ * -------------------------------------------------------------------------- */
57
+
58
+ /**
59
+ * @since 0.3.16-canary.0
60
+ */
61
+ type PopoverContentProps = ComponentProps<typeof PopoverPrimitive.Content>;
62
+
63
+ /**
64
+ * @since 0.3.16-canary.0
65
+ */
66
+ function PopoverContent({ align = "center", className, sideOffset = 4, ...props }: PopoverContentProps): JSX.Element {
67
+ return (
68
+ <PopoverPrimitive.Portal data-slot="popover-portal">
69
+ <PopoverPrimitive.Content
70
+ align={align}
71
+ className={cn(
72
+ "z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden ease-snappy data-open:animate-in data-open:animation-duration-popup-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-popup-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2",
73
+ className,
74
+ )}
75
+ data-slot="popover-content"
76
+ sideOffset={sideOffset}
77
+ {...props}
78
+ />
79
+ </PopoverPrimitive.Portal>
80
+ );
81
+ }
82
+
83
+ /* -----------------------------------------------------------------------------
84
+ * Component: PopoverArrow
85
+ * -------------------------------------------------------------------------- */
86
+
87
+ /**
88
+ * @since 0.3.16-canary.0
89
+ */
90
+ type PopoverArrowProps = ComponentProps<typeof PopoverPrimitive.Arrow>;
91
+
92
+ /**
93
+ * @since 0.3.16-canary.0
94
+ */
95
+ function PopoverArrow({ className, ...props }: PopoverArrowProps): JSX.Element {
96
+ return <PopoverPrimitive.Arrow className={cn("fill-popover", className)} data-slot="popover-arrow" {...props} />;
97
+ }
98
+
99
+ /* -----------------------------------------------------------------------------
100
+ * Component: PopoverHeader
101
+ * -------------------------------------------------------------------------- */
102
+
103
+ /**
104
+ * @since 0.3.16-canary.0
105
+ */
106
+ type PopoverHeaderProps = ComponentProps<"div">;
107
+
108
+ /**
109
+ * @since 0.3.16-canary.0
110
+ */
111
+ function PopoverHeader({ className, ...props }: PopoverHeaderProps): JSX.Element {
112
+ return <div className={cn("flex flex-col gap-1 text-sm", className)} data-slot="popover-header" {...props} />;
113
+ }
114
+
115
+ /* -----------------------------------------------------------------------------
116
+ * Component: PopoverTitle
117
+ * -------------------------------------------------------------------------- */
118
+
119
+ /**
120
+ * @since 0.3.16-canary.0
121
+ */
122
+ type PopoverTitleProps = ComponentProps<"div">;
123
+
124
+ /**
125
+ * @since 0.3.16-canary.0
126
+ */
127
+ function PopoverTitle({ className, ...props }: PopoverTitleProps): JSX.Element {
128
+ return <div className={cn("font-medium", className)} data-slot="popover-title" {...props} />;
129
+ }
130
+
131
+ /* -----------------------------------------------------------------------------
132
+ * Component: PopoverDescription
133
+ * -------------------------------------------------------------------------- */
134
+
135
+ /**
136
+ * @since 0.3.16-canary.0
137
+ */
138
+ type PopoverDescriptionProps = ComponentProps<"p">;
139
+
140
+ /**
141
+ * @since 0.3.16-canary.0
142
+ */
143
+ function PopoverDescription({ className, ...props }: PopoverDescriptionProps): JSX.Element {
144
+ return <p className={cn("text-muted-foreground", className)} data-slot="popover-description" {...props} />;
145
+ }
146
+
147
+ /* -----------------------------------------------------------------------------
148
+ * Exports
149
+ * -------------------------------------------------------------------------- */
150
+
151
+ export {
152
+ Popover,
153
+ PopoverAnchor,
154
+ PopoverArrow,
155
+ PopoverContent,
156
+ PopoverDescription,
157
+ PopoverHeader,
158
+ PopoverTitle,
159
+ PopoverTrigger,
160
+ };
161
+ export type {
162
+ PopoverAnchorProps,
163
+ PopoverArrowProps,
164
+ PopoverContentProps,
165
+ PopoverDescriptionProps,
166
+ PopoverHeaderProps,
167
+ PopoverProps,
168
+ PopoverTitleProps,
169
+ PopoverTriggerProps,
170
+ };