@arolariu/components 0.1.2 → 0.2.0

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 (323) hide show
  1. package/DEBUGGING.md +396 -396
  2. package/LICENSE.md +21 -21
  3. package/changelog.md +109 -118
  4. package/dist/components/ui/accordion.d.ts +2 -2
  5. package/dist/components/ui/accordion.d.ts.map +1 -1
  6. package/dist/components/ui/accordion.js +4 -4
  7. package/dist/components/ui/accordion.js.map +1 -1
  8. package/dist/components/ui/alert-dialog.d.ts +13 -13
  9. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  10. package/dist/components/ui/alert-dialog.js +4 -4
  11. package/dist/components/ui/alert-dialog.js.map +1 -1
  12. package/dist/components/ui/alert.d.ts +5 -5
  13. package/dist/components/ui/alert.d.ts.map +1 -1
  14. package/dist/components/ui/alert.js +3 -3
  15. package/dist/components/ui/alert.js.map +1 -1
  16. package/dist/components/ui/aspect-ratio.d.ts +1 -1
  17. package/dist/components/ui/aspect-ratio.d.ts.map +1 -1
  18. package/dist/components/ui/aspect-ratio.js +1 -1
  19. package/dist/components/ui/aspect-ratio.js.map +1 -1
  20. package/dist/components/ui/avatar.d.ts +2 -2
  21. package/dist/components/ui/avatar.d.ts.map +1 -1
  22. package/dist/components/ui/avatar.js +3 -3
  23. package/dist/components/ui/avatar.js.map +1 -1
  24. package/dist/components/ui/background-beams.d.ts.map +1 -1
  25. package/dist/components/ui/background-beams.js +6 -6
  26. package/dist/components/ui/background-beams.js.map +1 -1
  27. package/dist/components/ui/badge.d.ts +4 -4
  28. package/dist/components/ui/badge.d.ts.map +1 -1
  29. package/dist/components/ui/badge.js +2 -2
  30. package/dist/components/ui/badge.js.map +1 -1
  31. package/dist/components/ui/breadcrumb.d.ts +6 -6
  32. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  33. package/dist/components/ui/breadcrumb.js +5 -5
  34. package/dist/components/ui/breadcrumb.js.map +1 -1
  35. package/dist/components/ui/bubble-background.d.ts +1 -1
  36. package/dist/components/ui/bubble-background.d.ts.map +1 -1
  37. package/dist/components/ui/bubble-background.js +13 -13
  38. package/dist/components/ui/bubble-background.js.map +1 -1
  39. package/dist/components/ui/button.d.ts +5 -5
  40. package/dist/components/ui/button.d.ts.map +1 -1
  41. package/dist/components/ui/button.js +2 -2
  42. package/dist/components/ui/button.js.map +1 -1
  43. package/dist/components/ui/calendar.d.ts.map +1 -1
  44. package/dist/components/ui/calendar.js +4 -4
  45. package/dist/components/ui/calendar.js.map +1 -1
  46. package/dist/components/ui/card.d.ts +1 -1
  47. package/dist/components/ui/card.d.ts.map +1 -1
  48. package/dist/components/ui/card.js +3 -3
  49. package/dist/components/ui/card.js.map +1 -1
  50. package/dist/components/ui/carousel.d.ts +2 -2
  51. package/dist/components/ui/carousel.d.ts.map +1 -1
  52. package/dist/components/ui/carousel.js +3 -3
  53. package/dist/components/ui/carousel.js.map +1 -1
  54. package/dist/components/ui/chart.d.ts +4 -4
  55. package/dist/components/ui/chart.d.ts.map +1 -1
  56. package/dist/components/ui/chart.js +1 -1
  57. package/dist/components/ui/chart.js.map +1 -1
  58. package/dist/components/ui/checkbox.d.ts +1 -1
  59. package/dist/components/ui/checkbox.d.ts.map +1 -1
  60. package/dist/components/ui/checkbox.js +3 -3
  61. package/dist/components/ui/checkbox.js.map +1 -1
  62. package/dist/components/ui/collapsible.d.ts +2 -2
  63. package/dist/components/ui/collapsible.d.ts.map +1 -1
  64. package/dist/components/ui/collapsible.js +1 -1
  65. package/dist/components/ui/collapsible.js.map +1 -1
  66. package/dist/components/ui/command.d.ts +2 -2
  67. package/dist/components/ui/command.d.ts.map +1 -1
  68. package/dist/components/ui/command.js +9 -9
  69. package/dist/components/ui/command.js.map +1 -1
  70. package/dist/components/ui/context-menu.d.ts +2 -2
  71. package/dist/components/ui/context-menu.d.ts.map +1 -1
  72. package/dist/components/ui/context-menu.js +11 -11
  73. package/dist/components/ui/context-menu.js.map +1 -1
  74. package/dist/components/ui/counting-number.d.ts +1 -1
  75. package/dist/components/ui/counting-number.d.ts.map +1 -1
  76. package/dist/components/ui/counting-number.js +4 -3
  77. package/dist/components/ui/counting-number.js.map +1 -1
  78. package/dist/components/ui/dialog.d.ts +1 -1
  79. package/dist/components/ui/dialog.d.ts.map +1 -1
  80. package/dist/components/ui/dialog.js +6 -6
  81. package/dist/components/ui/dialog.js.map +1 -1
  82. package/dist/components/ui/dot-background.d.ts +10 -17
  83. package/dist/components/ui/dot-background.d.ts.map +1 -1
  84. package/dist/components/ui/dot-background.js +2 -2
  85. package/dist/components/ui/dot-background.js.map +1 -1
  86. package/dist/components/ui/drawer.d.ts +1 -1
  87. package/dist/components/ui/drawer.d.ts.map +1 -1
  88. package/dist/components/ui/drawer.js +5 -5
  89. package/dist/components/ui/drawer.js.map +1 -1
  90. package/dist/components/ui/dropdown-menu.d.ts +2 -2
  91. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  92. package/dist/components/ui/dropdown-menu.js +10 -10
  93. package/dist/components/ui/dropdown-menu.js.map +1 -1
  94. package/dist/components/ui/dropdrawer.d.ts +2 -2
  95. package/dist/components/ui/dropdrawer.d.ts.map +1 -1
  96. package/dist/components/ui/dropdrawer.js +12 -12
  97. package/dist/components/ui/dropdrawer.js.map +1 -1
  98. package/dist/components/ui/fireworks-background.d.ts.map +1 -1
  99. package/dist/components/ui/fireworks-background.js +1 -1
  100. package/dist/components/ui/fireworks-background.js.map +1 -1
  101. package/dist/components/ui/flip-button.d.ts +1 -1
  102. package/dist/components/ui/flip-button.d.ts.map +1 -1
  103. package/dist/components/ui/flip-button.js +3 -3
  104. package/dist/components/ui/flip-button.js.map +1 -1
  105. package/dist/components/ui/form.d.ts +3 -3
  106. package/dist/components/ui/form.d.ts.map +1 -1
  107. package/dist/components/ui/form.js +4 -4
  108. package/dist/components/ui/form.js.map +1 -1
  109. package/dist/components/ui/gradient-background.d.ts +1 -1
  110. package/dist/components/ui/gradient-background.d.ts.map +1 -1
  111. package/dist/components/ui/gradient-background.js +2 -2
  112. package/dist/components/ui/gradient-background.js.map +1 -1
  113. package/dist/components/ui/gradient-text.d.ts +1 -1
  114. package/dist/components/ui/gradient-text.d.ts.map +1 -1
  115. package/dist/components/ui/gradient-text.js +5 -5
  116. package/dist/components/ui/gradient-text.js.map +1 -1
  117. package/dist/components/ui/highlight-text.d.ts +1 -1
  118. package/dist/components/ui/highlight-text.d.ts.map +1 -1
  119. package/dist/components/ui/highlight-text.js +3 -3
  120. package/dist/components/ui/highlight-text.js.map +1 -1
  121. package/dist/components/ui/hole-background.d.ts.map +1 -1
  122. package/dist/components/ui/hole-background.js +11 -10
  123. package/dist/components/ui/hole-background.js.map +1 -1
  124. package/dist/components/ui/hover-card.d.ts +2 -2
  125. package/dist/components/ui/hover-card.d.ts.map +1 -1
  126. package/dist/components/ui/hover-card.js +3 -3
  127. package/dist/components/ui/hover-card.js.map +1 -1
  128. package/dist/components/ui/input-otp.d.ts +2 -2
  129. package/dist/components/ui/input-otp.d.ts.map +1 -1
  130. package/dist/components/ui/input-otp.js +5 -5
  131. package/dist/components/ui/input-otp.js.map +1 -1
  132. package/dist/components/ui/input.d.ts.map +1 -1
  133. package/dist/components/ui/input.js +2 -2
  134. package/dist/components/ui/input.js.map +1 -1
  135. package/dist/components/ui/label.d.ts +1 -1
  136. package/dist/components/ui/label.d.ts.map +1 -1
  137. package/dist/components/ui/label.js +2 -2
  138. package/dist/components/ui/label.js.map +1 -1
  139. package/dist/components/ui/menubar.d.ts +2 -2
  140. package/dist/components/ui/menubar.d.ts.map +1 -1
  141. package/dist/components/ui/menubar.js +12 -12
  142. package/dist/components/ui/menubar.js.map +1 -1
  143. package/dist/components/ui/navigation-menu.d.ts +3 -3
  144. package/dist/components/ui/navigation-menu.d.ts.map +1 -1
  145. package/dist/components/ui/navigation-menu.js +6 -7
  146. package/dist/components/ui/navigation-menu.js.map +1 -1
  147. package/dist/components/ui/pagination.d.ts +2 -2
  148. package/dist/components/ui/pagination.d.ts.map +1 -1
  149. package/dist/components/ui/pagination.js +8 -4
  150. package/dist/components/ui/pagination.js.map +1 -1
  151. package/dist/components/ui/popover.d.ts +2 -2
  152. package/dist/components/ui/popover.d.ts.map +1 -1
  153. package/dist/components/ui/popover.js +3 -3
  154. package/dist/components/ui/popover.js.map +1 -1
  155. package/dist/components/ui/progress.d.ts +1 -1
  156. package/dist/components/ui/progress.d.ts.map +1 -1
  157. package/dist/components/ui/progress.js +4 -4
  158. package/dist/components/ui/progress.js.map +1 -1
  159. package/dist/components/ui/radio-group.d.ts +1 -1
  160. package/dist/components/ui/radio-group.d.ts.map +1 -1
  161. package/dist/components/ui/radio-group.js +3 -3
  162. package/dist/components/ui/radio-group.js.map +1 -1
  163. package/dist/components/ui/resizable.d.ts +1 -1
  164. package/dist/components/ui/resizable.d.ts.map +1 -1
  165. package/dist/components/ui/resizable.js +5 -5
  166. package/dist/components/ui/resizable.js.map +1 -1
  167. package/dist/components/ui/ripple-button.d.ts +1 -1
  168. package/dist/components/ui/ripple-button.d.ts.map +1 -1
  169. package/dist/components/ui/ripple-button.js +4 -4
  170. package/dist/components/ui/ripple-button.js.map +1 -1
  171. package/dist/components/ui/scratcher.d.ts.map +1 -1
  172. package/dist/components/ui/scratcher.js +7 -5
  173. package/dist/components/ui/scratcher.js.map +1 -1
  174. package/dist/components/ui/scroll-area.d.ts +1 -1
  175. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  176. package/dist/components/ui/scroll-area.js +4 -4
  177. package/dist/components/ui/scroll-area.js.map +1 -1
  178. package/dist/components/ui/select.d.ts +1 -1
  179. package/dist/components/ui/select.d.ts.map +1 -1
  180. package/dist/components/ui/select.js +7 -7
  181. package/dist/components/ui/select.js.map +1 -1
  182. package/dist/components/ui/separator.d.ts +1 -1
  183. package/dist/components/ui/separator.d.ts.map +1 -1
  184. package/dist/components/ui/separator.js +3 -3
  185. package/dist/components/ui/separator.js.map +1 -1
  186. package/dist/components/ui/sheet.d.ts +2 -2
  187. package/dist/components/ui/sheet.d.ts.map +1 -1
  188. package/dist/components/ui/sheet.js +6 -6
  189. package/dist/components/ui/sheet.js.map +1 -1
  190. package/dist/components/ui/sidebar.d.ts +5 -5
  191. package/dist/components/ui/sidebar.d.ts.map +1 -1
  192. package/dist/components/ui/sidebar.js +5 -5
  193. package/dist/components/ui/sidebar.js.map +1 -1
  194. package/dist/components/ui/skeleton.d.ts.map +1 -1
  195. package/dist/components/ui/skeleton.js +2 -2
  196. package/dist/components/ui/skeleton.js.map +1 -1
  197. package/dist/components/ui/slider.d.ts +1 -1
  198. package/dist/components/ui/slider.d.ts.map +1 -1
  199. package/dist/components/ui/slider.js +5 -5
  200. package/dist/components/ui/slider.js.map +1 -1
  201. package/dist/components/ui/sonner.d.ts +1 -1
  202. package/dist/components/ui/sonner.d.ts.map +1 -1
  203. package/dist/components/ui/sonner.js +1 -1
  204. package/dist/components/ui/sonner.js.map +1 -1
  205. package/dist/components/ui/switch.d.ts +1 -1
  206. package/dist/components/ui/switch.d.ts.map +1 -1
  207. package/dist/components/ui/switch.js +4 -4
  208. package/dist/components/ui/switch.js.map +1 -1
  209. package/dist/components/ui/table.d.ts +1 -1
  210. package/dist/components/ui/table.d.ts.map +1 -1
  211. package/dist/components/ui/table.js +5 -5
  212. package/dist/components/ui/table.js.map +1 -1
  213. package/dist/components/ui/tabs.d.ts +2 -2
  214. package/dist/components/ui/tabs.d.ts.map +1 -1
  215. package/dist/components/ui/tabs.js +4 -4
  216. package/dist/components/ui/tabs.js.map +1 -1
  217. package/dist/components/ui/textarea.d.ts +1 -1
  218. package/dist/components/ui/textarea.d.ts.map +1 -1
  219. package/dist/components/ui/textarea.js +2 -2
  220. package/dist/components/ui/textarea.js.map +1 -1
  221. package/dist/components/ui/toggle-group.d.ts +3 -3
  222. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  223. package/dist/components/ui/toggle-group.js +2 -2
  224. package/dist/components/ui/toggle-group.js.map +1 -1
  225. package/dist/components/ui/toggle.d.ts +6 -6
  226. package/dist/components/ui/toggle.d.ts.map +1 -1
  227. package/dist/components/ui/toggle.js +2 -2
  228. package/dist/components/ui/toggle.js.map +1 -1
  229. package/dist/components/ui/tooltip.d.ts +6 -6
  230. package/dist/components/ui/tooltip.d.ts.map +1 -1
  231. package/dist/components/ui/tooltip.js +4 -4
  232. package/dist/components/ui/tooltip.js.map +1 -1
  233. package/dist/components/ui/typewriter.d.ts.map +1 -1
  234. package/dist/components/ui/typewriter.js +15 -11
  235. package/dist/components/ui/typewriter.js.map +1 -1
  236. package/dist/hooks/useIsMobile.d.ts +2 -5
  237. package/dist/hooks/useIsMobile.d.ts.map +1 -1
  238. package/dist/hooks/useIsMobile.js +1 -1
  239. package/dist/hooks/useIsMobile.js.map +1 -1
  240. package/dist/hooks/useWindowSize.d.ts +0 -1
  241. package/dist/hooks/useWindowSize.d.ts.map +1 -1
  242. package/dist/hooks/useWindowSize.js +1 -1
  243. package/dist/hooks/useWindowSize.js.map +1 -1
  244. package/dist/index.css +2 -2
  245. package/dist/index.css.map +1 -1
  246. package/dist/index.d.ts +37 -37
  247. package/dist/index.d.ts.map +1 -1
  248. package/dist/index.js +2 -2
  249. package/dist/lib/utilities.d.ts +9 -0
  250. package/dist/lib/utilities.d.ts.map +1 -0
  251. package/dist/lib/{utils.js → utilities.js} +1 -1
  252. package/dist/lib/utilities.js.map +1 -0
  253. package/package.json +85 -89
  254. package/{README.md → readme.md} +627 -627
  255. package/src/components/ui/accordion.tsx +56 -66
  256. package/src/components/ui/alert-dialog.tsx +135 -160
  257. package/src/components/ui/alert.tsx +58 -69
  258. package/src/components/ui/aspect-ratio.tsx +15 -12
  259. package/src/components/ui/avatar.tsx +38 -53
  260. package/src/components/ui/background-beams.tsx +145 -142
  261. package/src/components/ui/badge.tsx +47 -48
  262. package/src/components/ui/breadcrumb.tsx +97 -117
  263. package/src/components/ui/bubble-background.tsx +170 -189
  264. package/src/components/ui/button.tsx +61 -61
  265. package/src/components/ui/calendar.tsx +177 -216
  266. package/src/components/ui/card.tsx +83 -97
  267. package/src/components/ui/carousel.tsx +204 -241
  268. package/src/components/ui/chart.tsx +303 -385
  269. package/src/components/ui/checkbox.tsx +27 -32
  270. package/src/components/ui/collapsible.tsx +33 -34
  271. package/src/components/ui/command.tsx +137 -184
  272. package/src/components/ui/context-menu.tsx +229 -255
  273. package/src/components/ui/counting-number.tsx +92 -108
  274. package/src/components/ui/dialog.tsx +141 -146
  275. package/src/components/ui/dot-background.tsx +153 -158
  276. package/src/components/ui/drawer.tsx +133 -141
  277. package/src/components/ui/dropdown-menu.tsx +235 -260
  278. package/src/components/ui/dropdrawer.tsx +870 -973
  279. package/src/components/ui/fireworks-background.tsx +325 -378
  280. package/src/components/ui/flip-button.tsx +89 -110
  281. package/src/components/ui/form.tsx +145 -174
  282. package/src/components/ui/gradient-background.tsx +30 -43
  283. package/src/components/ui/gradient-text.tsx +62 -65
  284. package/src/components/ui/highlight-text.tsx +54 -71
  285. package/src/components/ui/hole-background.tsx +326 -361
  286. package/src/components/ui/hover-card.tsx +48 -44
  287. package/src/components/ui/input-otp.tsx +76 -77
  288. package/src/components/ui/input.tsx +22 -22
  289. package/src/components/ui/label.tsx +21 -24
  290. package/src/components/ui/menubar.tsx +256 -279
  291. package/src/components/ui/navigation-menu.tsx +135 -171
  292. package/src/components/ui/pagination.tsx +103 -129
  293. package/src/components/ui/popover.tsx +52 -48
  294. package/src/components/ui/progress.tsx +23 -31
  295. package/src/components/ui/radio-group.tsx +37 -45
  296. package/src/components/ui/resizable.tsx +52 -56
  297. package/src/components/ui/ripple-button.tsx +90 -111
  298. package/src/components/ui/scratcher.tsx +167 -171
  299. package/src/components/ui/scroll-area.tsx +45 -58
  300. package/src/components/ui/select.tsx +160 -191
  301. package/src/components/ui/separator.tsx +28 -28
  302. package/src/components/ui/sheet.tsx +133 -145
  303. package/src/components/ui/sidebar.tsx +673 -729
  304. package/src/components/ui/skeleton.tsx +16 -19
  305. package/src/components/ui/slider.tsx +49 -63
  306. package/src/components/ui/sonner.tsx +30 -26
  307. package/src/components/ui/switch.tsx +27 -31
  308. package/src/components/ui/table.tsx +98 -119
  309. package/src/components/ui/tabs.tsx +54 -66
  310. package/src/components/ui/textarea.tsx +20 -20
  311. package/src/components/ui/toggle-group.tsx +66 -73
  312. package/src/components/ui/toggle.tsx +46 -47
  313. package/src/components/ui/tooltip.tsx +56 -61
  314. package/src/components/ui/typewriter.tsx +174 -188
  315. package/src/hooks/useIsMobile.tsx +42 -45
  316. package/src/hooks/useWindowSize.tsx +66 -72
  317. package/src/index.css +73 -73
  318. package/src/index.ts +303 -408
  319. package/src/lib/utilities.ts +12 -0
  320. package/dist/lib/utils.d.ts +0 -7
  321. package/dist/lib/utils.d.ts.map +0 -1
  322. package/dist/lib/utils.js.map +0 -1
  323. package/src/lib/utils.ts +0 -10
@@ -1,110 +1,89 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import {
5
- type HTMLMotionProps,
6
- type Transition,
7
- type Variant,
8
- motion,
9
- } from "motion/react";
10
-
11
- import { cn } from "@/lib/utils";
12
-
13
- type FlipDirection = "top" | "bottom" | "left" | "righ";
14
-
15
- interface FlipButtonProps extends HTMLMotionProps<"button"> {
16
- frontText: string;
17
- backText: string;
18
- transition?: Transition;
19
- frontClassName?: string;
20
- backClassName?: string;
21
- from?: FlipDirection;
22
- }
23
-
24
- const defaultSpanClassName =
25
- "absolute inset-0 flex items-center justify-center rounded-lg";
26
-
27
- const FlipButton = React.forwardRef<HTMLButtonElement, FlipButtonProps>(
28
- (
29
- {
30
- frontText,
31
- backText,
32
- transition = { type: "spring", stiffness: 280, damping: 20 },
33
- className,
34
- frontClassName,
35
- backClassName,
36
- from = "top",
37
- ...props
38
- },
39
- ref,
40
- ) => {
41
- const isVertical = from === "top" || from === "bottom";
42
- const rotateAxis = isVertical ? "rotateX" : "rotateY";
43
-
44
- const frontOffset = from === "top" || from === "left" ? "50%" : "-50%";
45
- const backOffset = from === "top" || from === "left" ? "-50%" : "50%";
46
-
47
- const buildVariant = (
48
- opacity: number,
49
- rotation: number,
50
- offset: string | null = null,
51
- ): Variant => ({
52
- opacity,
53
- [rotateAxis]: rotation,
54
- ...(isVertical && offset !== null ? { y: offset } : {}),
55
- ...(!isVertical && offset !== null ? { x: offset } : {}),
56
- });
57
-
58
- const frontVariants = {
59
- initial: buildVariant(1, 0, "0%"),
60
- hover: buildVariant(0, 90, frontOffset),
61
- };
62
-
63
- const backVariants = {
64
- initial: buildVariant(0, 90, backOffset),
65
- hover: buildVariant(1, 0, "0%"),
66
- };
67
-
68
- return (
69
- <motion.button
70
- ref={ref}
71
- initial="initial"
72
- whileHover="hover"
73
- whileTap={{ scale: 0.95 }}
74
- className={cn(
75
- "relative inline-block h-10 px-4 py-2 text-sm font-medium cursor-pointer perspective-[1000px] focus:outline-none",
76
- className,
77
- )}
78
- {...props}
79
- >
80
- <motion.span
81
- variants={frontVariants}
82
- transition={transition}
83
- className={cn(
84
- defaultSpanClassName,
85
- "bg-muted text-black dark:text-white",
86
- frontClassName,
87
- )}
88
- >
89
- {frontText}
90
- </motion.span>
91
- <motion.span
92
- variants={backVariants}
93
- transition={transition}
94
- className={cn(
95
- defaultSpanClassName,
96
- "bg-primary text-primary-foreground",
97
- backClassName,
98
- )}
99
- >
100
- {backText}
101
- </motion.span>
102
- <span className="invisible">{frontText}</span>
103
- </motion.button>
104
- );
105
- },
106
- );
107
-
108
- FlipButton.displayName = "FlipButton";
109
-
110
- export { FlipButton, type FlipButtonProps, type FlipDirection };
1
+ "use client";
2
+
3
+ import {type HTMLMotionProps, type Transition, type Variant, motion} from "motion/react";
4
+ import * as React from "react";
5
+
6
+ import {cn} from "@/lib/utilities";
7
+
8
+ type FlipDirection = "top" | "bottom" | "left" | "righ";
9
+
10
+ interface FlipButtonProps extends HTMLMotionProps<"button"> {
11
+ frontText: string;
12
+ backText: string;
13
+ transition?: Transition;
14
+ frontClassName?: string;
15
+ backClassName?: string;
16
+ from?: FlipDirection;
17
+ }
18
+
19
+ const defaultSpanClassName = "absolute inset-0 flex items-center justify-center rounded-lg";
20
+
21
+ const FlipButton = React.forwardRef<HTMLButtonElement, FlipButtonProps>(
22
+ (
23
+ {
24
+ frontText,
25
+ backText,
26
+ transition = {type: "spring", stiffness: 280, damping: 20},
27
+ className,
28
+ frontClassName,
29
+ backClassName,
30
+ from = "top",
31
+ ...props
32
+ },
33
+ ref,
34
+ ) => {
35
+ const isVertical = from === "top" || from === "bottom";
36
+ const rotateAxis = isVertical ? "rotateX" : "rotateY";
37
+
38
+ const frontOffset = from === "top" || from === "left" ? "50%" : "-50%";
39
+ const backOffset = from === "top" || from === "left" ? "-50%" : "50%";
40
+
41
+ const buildVariant = (opacity: number, rotation: number, offset: string | null = null): Variant => ({
42
+ opacity,
43
+ [rotateAxis]: rotation,
44
+ ...(isVertical && offset !== null ? {y: offset} : {}),
45
+ ...(!isVertical && offset !== null ? {x: offset} : {}),
46
+ });
47
+
48
+ const frontVariants = {
49
+ initial: buildVariant(1, 0, "0%"),
50
+ hover: buildVariant(0, 90, frontOffset),
51
+ };
52
+
53
+ const backVariants = {
54
+ initial: buildVariant(0, 90, backOffset),
55
+ hover: buildVariant(1, 0, "0%"),
56
+ };
57
+
58
+ return (
59
+ <motion.button
60
+ ref={ref}
61
+ initial='initial'
62
+ whileHover='hover'
63
+ whileTap={{scale: 0.95}}
64
+ className={cn(
65
+ "relative inline-block h-10 cursor-pointer px-4 py-2 text-sm font-medium perspective-[1000px] focus:outline-none",
66
+ className,
67
+ )}
68
+ {...props}>
69
+ <motion.span
70
+ variants={frontVariants}
71
+ transition={transition}
72
+ className={cn(defaultSpanClassName, "bg-muted text-black dark:text-white", frontClassName)}>
73
+ {frontText}
74
+ </motion.span>
75
+ <motion.span
76
+ variants={backVariants}
77
+ transition={transition}
78
+ className={cn(defaultSpanClassName, "bg-primary text-primary-foreground", backClassName)}>
79
+ {backText}
80
+ </motion.span>
81
+ <span className='invisible'>{frontText}</span>
82
+ </motion.button>
83
+ );
84
+ },
85
+ );
86
+
87
+ FlipButton.displayName = "FlipButton";
88
+
89
+ export {FlipButton, type FlipButtonProps, type FlipDirection};
@@ -1,174 +1,145 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import * as LabelPrimitive from "@radix-ui/react-label";
5
- import { Slot } from "@radix-ui/react-slot";
6
- import {
7
- Controller,
8
- FormProvider,
9
- useFormContext,
10
- useFormState,
11
- type ControllerProps,
12
- type FieldPath,
13
- type FieldValues,
14
- } from "react-hook-form";
15
-
16
- import { cn } from "@/lib/utils";
17
- import { Label } from "@/components/ui/label";
18
-
19
- const Form = FormProvider;
20
-
21
- type FormFieldContextValue<
22
- TFieldValues extends FieldValues = FieldValues,
23
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
24
- > = {
25
- name: TName;
26
- };
27
-
28
- const FormFieldContext = React.createContext<FormFieldContextValue>(
29
- {} as FormFieldContextValue,
30
- );
31
-
32
- const FormField = <
33
- TFieldValues extends FieldValues = FieldValues,
34
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
35
- >({
36
- ...props
37
- }: ControllerProps<TFieldValues, TName>) => {
38
- return (
39
- <FormFieldContext.Provider value={{ name: props.name }}>
40
- <Controller {...props} />
41
- </FormFieldContext.Provider>
42
- );
43
- };
44
-
45
- const useFormField = () => {
46
- const fieldContext = React.useContext(FormFieldContext);
47
- const itemContext = React.useContext(FormItemContext);
48
- const { getFieldState } = useFormContext();
49
- const formState = useFormState({ name: fieldContext.name });
50
- const fieldState = getFieldState(fieldContext.name, formState);
51
-
52
- if (!fieldContext) {
53
- throw new Error("useFormField should be used within <FormField>");
54
- }
55
-
56
- const { id } = itemContext;
57
-
58
- return {
59
- id,
60
- name: fieldContext.name,
61
- formItemId: `${id}-form-item`,
62
- formDescriptionId: `${id}-form-item-description`,
63
- formMessageId: `${id}-form-item-message`,
64
- ...fieldState,
65
- };
66
- };
67
-
68
- type FormItemContextValue = {
69
- id: string;
70
- };
71
-
72
- const FormItemContext = React.createContext<FormItemContextValue>(
73
- {} as FormItemContextValue,
74
- );
75
-
76
- function FormItem({ className, ...props }: React.ComponentProps<"div">) {
77
- const id = React.useId();
78
-
79
- return (
80
- <FormItemContext.Provider value={{ id }}>
81
- <div
82
- data-slot="form-item"
83
- className={cn("grid gap-2", className)}
84
- {...props}
85
- />
86
- </FormItemContext.Provider>
87
- );
88
- }
89
-
90
- function FormLabel({
91
- className,
92
- ...props
93
- }: React.ComponentProps<typeof LabelPrimitive.Root>) {
94
- const { error, formItemId } = useFormField();
95
-
96
- return (
97
- <Label
98
- data-slot="form-label"
99
- data-error={!!error}
100
- className={cn(
101
- "data-[error=true]:text-red-500 dark:data-[error=true]:text-red-900",
102
- className,
103
- )}
104
- htmlFor={formItemId}
105
- {...props}
106
- />
107
- );
108
- }
109
-
110
- function FormControl({ ...props }: React.ComponentProps<typeof Slot>) {
111
- const { error, formItemId, formDescriptionId, formMessageId } =
112
- useFormField();
113
-
114
- return (
115
- <Slot
116
- data-slot="form-control"
117
- id={formItemId}
118
- aria-describedby={
119
- !error
120
- ? `${formDescriptionId}`
121
- : `${formDescriptionId} ${formMessageId}`
122
- }
123
- aria-invalid={!!error}
124
- {...props}
125
- />
126
- );
127
- }
128
-
129
- function FormDescription({ className, ...props }: React.ComponentProps<"p">) {
130
- const { formDescriptionId } = useFormField();
131
-
132
- return (
133
- <p
134
- data-slot="form-description"
135
- id={formDescriptionId}
136
- className={cn(
137
- "text-neutral-500 text-sm dark:text-neutral-400",
138
- className,
139
- )}
140
- {...props}
141
- />
142
- );
143
- }
144
-
145
- function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
146
- const { error, formMessageId } = useFormField();
147
- const body = error ? String(error?.message ?? "") : props.children;
148
-
149
- if (!body) {
150
- return null;
151
- }
152
-
153
- return (
154
- <p
155
- data-slot="form-message"
156
- id={formMessageId}
157
- className={cn("text-red-500 text-sm dark:text-red-900", className)}
158
- {...props}
159
- >
160
- {body}
161
- </p>
162
- );
163
- }
164
-
165
- export {
166
- useFormField,
167
- Form,
168
- FormItem,
169
- FormLabel,
170
- FormControl,
171
- FormDescription,
172
- FormMessage,
173
- FormField,
174
- };
1
+ "use client";
2
+
3
+ /* eslint-disable */
4
+
5
+ import * as LabelPrimitive from "@radix-ui/react-label";
6
+ import {Slot} from "@radix-ui/react-slot";
7
+ import * as React from "react";
8
+ import {
9
+ Controller,
10
+ FormProvider,
11
+ useFormContext,
12
+ useFormState,
13
+ type ControllerProps,
14
+ type FieldPath,
15
+ type FieldValues,
16
+ } from "react-hook-form";
17
+
18
+ import {Label} from "@/components/ui/label";
19
+ import {cn} from "@/lib/utilities";
20
+
21
+ const Form = FormProvider;
22
+
23
+ type FormFieldContextValue<
24
+ TFieldValues extends FieldValues = FieldValues,
25
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
26
+ > = {
27
+ name: TName;
28
+ };
29
+
30
+ const FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);
31
+
32
+ const FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({
33
+ ...props
34
+ }: ControllerProps<TFieldValues, TName>) => {
35
+ return (
36
+ <FormFieldContext.Provider value={{name: props.name}}>
37
+ <Controller {...props} />
38
+ </FormFieldContext.Provider>
39
+ );
40
+ };
41
+
42
+ const useFormField = () => {
43
+ const fieldContext = React.useContext(FormFieldContext);
44
+ const itemContext = React.useContext(FormItemContext);
45
+ const {getFieldState} = useFormContext();
46
+ const formState = useFormState({name: fieldContext.name});
47
+ const fieldState = getFieldState(fieldContext.name, formState);
48
+
49
+ if (!fieldContext) {
50
+ throw new Error("useFormField should be used within <FormField>");
51
+ }
52
+
53
+ const {id} = itemContext;
54
+
55
+ return {
56
+ id,
57
+ name: fieldContext.name,
58
+ formItemId: `${id}-form-item`,
59
+ formDescriptionId: `${id}-form-item-description`,
60
+ formMessageId: `${id}-form-item-message`,
61
+ ...fieldState,
62
+ };
63
+ };
64
+
65
+ type FormItemContextValue = {
66
+ id: string;
67
+ };
68
+
69
+ const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);
70
+
71
+ function FormItem({className, ...props}: React.ComponentProps<"div">) {
72
+ const id = React.useId();
73
+
74
+ return (
75
+ <FormItemContext.Provider value={{id}}>
76
+ <div
77
+ data-slot='form-item'
78
+ className={cn("grid gap-2", className)}
79
+ {...props}
80
+ />
81
+ </FormItemContext.Provider>
82
+ );
83
+ }
84
+
85
+ function FormLabel({className, ...props}: React.ComponentProps<typeof LabelPrimitive.Root>) {
86
+ const {error, formItemId} = useFormField();
87
+
88
+ return (
89
+ <Label
90
+ data-slot='form-label'
91
+ data-error={!!error}
92
+ className={cn("data-[error=true]:text-red-500 dark:data-[error=true]:text-red-900", className)}
93
+ htmlFor={formItemId}
94
+ {...props}
95
+ />
96
+ );
97
+ }
98
+
99
+ function FormControl({...props}: React.ComponentProps<typeof Slot>) {
100
+ const {error, formItemId, formDescriptionId, formMessageId} = useFormField();
101
+
102
+ return (
103
+ <Slot
104
+ data-slot='form-control'
105
+ id={formItemId}
106
+ aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}
107
+ aria-invalid={!!error}
108
+ {...props}
109
+ />
110
+ );
111
+ }
112
+
113
+ function FormDescription({className, ...props}: React.ComponentProps<"p">) {
114
+ const {formDescriptionId} = useFormField();
115
+
116
+ return (
117
+ <p
118
+ data-slot='form-description'
119
+ id={formDescriptionId}
120
+ className={cn("text-sm text-neutral-500 dark:text-neutral-400", className)}
121
+ {...props}
122
+ />
123
+ );
124
+ }
125
+
126
+ function FormMessage({className, ...props}: React.ComponentProps<"p">) {
127
+ const {error, formMessageId} = useFormField();
128
+ const body = error ? String(error?.message ?? "") : props.children;
129
+
130
+ if (!body) {
131
+ return null;
132
+ }
133
+
134
+ return (
135
+ <p
136
+ data-slot='form-message'
137
+ id={formMessageId}
138
+ className={cn("text-sm text-red-500 dark:text-red-900", className)}
139
+ {...props}>
140
+ {body}
141
+ </p>
142
+ );
143
+ }
144
+
145
+ export {Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField};
@@ -1,43 +1,30 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import { HTMLMotionProps, motion, type Transition } from "motion/react";
5
-
6
- import { cn } from "@/lib/utils";
7
-
8
- interface GradientBackgroundProps extends HTMLMotionProps<"div"> {
9
- transition?: Transition;
10
- }
11
-
12
- const GradientBackground = React.forwardRef<
13
- HTMLDivElement,
14
- GradientBackgroundProps
15
- >(
16
- (
17
- {
18
- className,
19
- transition = { duration: 15, ease: "easeInOut", repeat: Infinity },
20
- ...props
21
- },
22
- ref,
23
- ) => {
24
- return (
25
- <motion.div
26
- ref={ref}
27
- className={cn(
28
- "size-full bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 bg-[length:400%_400%]",
29
- className,
30
- )}
31
- animate={{
32
- backgroundPosition: ["0% 50%", "100% 50%", "0% 50%"],
33
- }}
34
- transition={transition}
35
- {...props}
36
- />
37
- );
38
- },
39
- );
40
-
41
- GradientBackground.displayName = "GradientBackground";
42
-
43
- export { GradientBackground, type GradientBackgroundProps };
1
+ "use client";
2
+
3
+ import {HTMLMotionProps, motion, type Transition} from "motion/react";
4
+ import * as React from "react";
5
+
6
+ import {cn} from "@/lib/utilities";
7
+
8
+ interface GradientBackgroundProps extends HTMLMotionProps<"div"> {
9
+ transition?: Transition;
10
+ }
11
+
12
+ const GradientBackground = React.forwardRef<HTMLDivElement, GradientBackgroundProps>(
13
+ ({className, transition = {duration: 15, ease: "easeInOut", repeat: Infinity}, ...props}, ref) => {
14
+ return (
15
+ <motion.div
16
+ ref={ref}
17
+ className={cn("size-full bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 bg-[length:400%_400%]", className)}
18
+ animate={{
19
+ backgroundPosition: ["0% 50%", "100% 50%", "0% 50%"],
20
+ }}
21
+ transition={transition}
22
+ {...props}
23
+ />
24
+ );
25
+ },
26
+ );
27
+
28
+ GradientBackground.displayName = "GradientBackground";
29
+
30
+ export {GradientBackground, type GradientBackgroundProps};