@arolariu/components 0.1.2 → 0.3.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 (360) hide show
  1. package/DEBUGGING.md +396 -396
  2. package/LICENSE.md +21 -21
  3. package/changelog.md +120 -118
  4. package/dist/components/ui/accordion.d.ts +6 -6
  5. package/dist/components/ui/accordion.d.ts.map +1 -1
  6. package/dist/components/ui/accordion.js +20 -28
  7. package/dist/components/ui/accordion.js.map +1 -1
  8. package/dist/components/ui/alert-dialog.d.ts +19 -13
  9. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  10. package/dist/components/ui/alert-dialog.js +40 -63
  11. package/dist/components/ui/alert-dialog.js.map +1 -1
  12. package/dist/components/ui/alert.d.ts +7 -8
  13. package/dist/components/ui/alert.d.ts.map +1 -1
  14. package/dist/components/ui/alert.js +18 -21
  15. package/dist/components/ui/alert.js.map +1 -1
  16. package/dist/components/ui/aspect-ratio.d.ts +1 -2
  17. package/dist/components/ui/aspect-ratio.d.ts.map +1 -1
  18. package/dist/components/ui/aspect-ratio.js +1 -8
  19. package/dist/components/ui/aspect-ratio.js.map +1 -1
  20. package/dist/components/ui/avatar.d.ts +5 -5
  21. package/dist/components/ui/avatar.d.ts.map +1 -1
  22. package/dist/components/ui/avatar.js +17 -20
  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 +7 -7
  28. package/dist/components/ui/badge.d.ts.map +1 -1
  29. package/dist/components/ui/badge.js +9 -12
  30. package/dist/components/ui/badge.js.map +1 -1
  31. package/dist/components/ui/breadcrumb.d.ts +17 -9
  32. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  33. package/dist/components/ui/breadcrumb.js +32 -39
  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-group.d.ts +13 -0
  40. package/dist/components/ui/button-group.d.ts.map +1 -0
  41. package/dist/components/ui/button-group.js +47 -0
  42. package/dist/components/ui/button-group.js.map +1 -0
  43. package/dist/components/ui/button.d.ts +8 -7
  44. package/dist/components/ui/button.d.ts.map +1 -1
  45. package/dist/components/ui/button.js +16 -15
  46. package/dist/components/ui/button.js.map +1 -1
  47. package/dist/components/ui/calendar.d.ts.map +1 -1
  48. package/dist/components/ui/calendar.js +22 -22
  49. package/dist/components/ui/calendar.js.map +1 -1
  50. package/dist/components/ui/card.d.ts +7 -8
  51. package/dist/components/ui/card.d.ts.map +1 -1
  52. package/dist/components/ui/card.js +33 -46
  53. package/dist/components/ui/card.js.map +1 -1
  54. package/dist/components/ui/carousel.d.ts +7 -8
  55. package/dist/components/ui/carousel.d.ts.map +1 -1
  56. package/dist/components/ui/carousel.js +30 -21
  57. package/dist/components/ui/carousel.js.map +1 -1
  58. package/dist/components/ui/chart.d.ts +37 -29
  59. package/dist/components/ui/chart.d.ts.map +1 -1
  60. package/dist/components/ui/chart.js +29 -27
  61. package/dist/components/ui/chart.js.map +1 -1
  62. package/dist/components/ui/checkbox.d.ts +2 -2
  63. package/dist/components/ui/checkbox.d.ts.map +1 -1
  64. package/dist/components/ui/checkbox.js +11 -13
  65. package/dist/components/ui/checkbox.js.map +1 -1
  66. package/dist/components/ui/collapsible.d.ts +4 -5
  67. package/dist/components/ui/collapsible.d.ts.map +1 -1
  68. package/dist/components/ui/collapsible.js +3 -20
  69. package/dist/components/ui/collapsible.js.map +1 -1
  70. package/dist/components/ui/command.d.ts +79 -17
  71. package/dist/components/ui/command.d.ts.map +1 -1
  72. package/dist/components/ui/command.js +52 -77
  73. package/dist/components/ui/command.js.map +1 -1
  74. package/dist/components/ui/context-menu.d.ts +23 -21
  75. package/dist/components/ui/context-menu.d.ts.map +1 -1
  76. package/dist/components/ui/context-menu.js +60 -104
  77. package/dist/components/ui/context-menu.js.map +1 -1
  78. package/dist/components/ui/counting-number.d.ts +1 -1
  79. package/dist/components/ui/counting-number.d.ts.map +1 -1
  80. package/dist/components/ui/counting-number.js +4 -3
  81. package/dist/components/ui/counting-number.js.map +1 -1
  82. package/dist/components/ui/dialog.d.ts +17 -13
  83. package/dist/components/ui/dialog.d.ts.map +1 -1
  84. package/dist/components/ui/dialog.js +38 -66
  85. package/dist/components/ui/dialog.js.map +1 -1
  86. package/dist/components/ui/dot-background.d.ts +10 -17
  87. package/dist/components/ui/dot-background.d.ts.map +1 -1
  88. package/dist/components/ui/dot-background.js +2 -2
  89. package/dist/components/ui/dot-background.js.map +1 -1
  90. package/dist/components/ui/drawer.d.ts +20 -11
  91. package/dist/components/ui/drawer.d.ts.map +1 -1
  92. package/dist/components/ui/drawer.js +37 -62
  93. package/dist/components/ui/drawer.js.map +1 -1
  94. package/dist/components/ui/dropdown-menu.d.ts +23 -21
  95. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  96. package/dist/components/ui/dropdown-menu.js +65 -109
  97. package/dist/components/ui/dropdown-menu.js.map +1 -1
  98. package/dist/components/ui/dropdrawer.d.ts +3 -3
  99. package/dist/components/ui/dropdrawer.d.ts.map +1 -1
  100. package/dist/components/ui/dropdrawer.js +13 -16
  101. package/dist/components/ui/dropdrawer.js.map +1 -1
  102. package/dist/components/ui/empty.d.ts +13 -0
  103. package/dist/components/ui/empty.d.ts.map +1 -0
  104. package/dist/components/ui/empty.js +65 -0
  105. package/dist/components/ui/empty.js.map +1 -0
  106. package/dist/components/ui/field.d.ts +25 -0
  107. package/dist/components/ui/field.d.ts.map +1 -0
  108. package/dist/components/ui/field.js +135 -0
  109. package/dist/components/ui/field.js.map +1 -0
  110. package/dist/components/ui/fireworks-background.d.ts.map +1 -1
  111. package/dist/components/ui/fireworks-background.js +1 -1
  112. package/dist/components/ui/fireworks-background.js.map +1 -1
  113. package/dist/components/ui/flip-button.d.ts +1 -1
  114. package/dist/components/ui/flip-button.d.ts.map +1 -1
  115. package/dist/components/ui/flip-button.js +3 -3
  116. package/dist/components/ui/flip-button.js.map +1 -1
  117. package/dist/components/ui/form.d.ts +7 -8
  118. package/dist/components/ui/form.d.ts.map +1 -1
  119. package/dist/components/ui/form.js +29 -28
  120. package/dist/components/ui/form.js.map +1 -1
  121. package/dist/components/ui/gradient-background.d.ts +1 -1
  122. package/dist/components/ui/gradient-background.d.ts.map +1 -1
  123. package/dist/components/ui/gradient-background.js +2 -2
  124. package/dist/components/ui/gradient-background.js.map +1 -1
  125. package/dist/components/ui/gradient-text.d.ts +1 -1
  126. package/dist/components/ui/gradient-text.d.ts.map +1 -1
  127. package/dist/components/ui/gradient-text.js +5 -5
  128. package/dist/components/ui/gradient-text.js.map +1 -1
  129. package/dist/components/ui/highlight-text.d.ts +1 -1
  130. package/dist/components/ui/highlight-text.d.ts.map +1 -1
  131. package/dist/components/ui/highlight-text.js +3 -3
  132. package/dist/components/ui/highlight-text.js.map +1 -1
  133. package/dist/components/ui/hole-background.d.ts.map +1 -1
  134. package/dist/components/ui/hole-background.js +11 -10
  135. package/dist/components/ui/hole-background.js.map +1 -1
  136. package/dist/components/ui/hover-card.d.ts +5 -5
  137. package/dist/components/ui/hover-card.d.ts.map +1 -1
  138. package/dist/components/ui/hover-card.js +12 -26
  139. package/dist/components/ui/hover-card.js.map +1 -1
  140. package/dist/components/ui/input-group.d.ts +17 -0
  141. package/dist/components/ui/input-group.d.ts.map +1 -0
  142. package/dist/components/ui/input-group.js +91 -0
  143. package/dist/components/ui/input-group.js.map +1 -0
  144. package/dist/components/ui/input-otp.d.ts +31 -8
  145. package/dist/components/ui/input-otp.d.ts.map +1 -1
  146. package/dist/components/ui/input-otp.js +24 -27
  147. package/dist/components/ui/input-otp.js.map +1 -1
  148. package/dist/components/ui/input.d.ts +1 -1
  149. package/dist/components/ui/input.d.ts.map +1 -1
  150. package/dist/components/ui/input.js +7 -8
  151. package/dist/components/ui/input.js.map +1 -1
  152. package/dist/components/ui/item.d.ts +24 -0
  153. package/dist/components/ui/item.d.ts.map +1 -0
  154. package/dist/components/ui/item.js +122 -0
  155. package/dist/components/ui/item.js.map +1 -0
  156. package/dist/components/ui/kbd.d.ts +5 -0
  157. package/dist/components/ui/kbd.d.ts.map +1 -0
  158. package/dist/components/ui/kbd.js +21 -0
  159. package/dist/components/ui/kbd.js.map +1 -0
  160. package/dist/components/ui/label.d.ts +3 -2
  161. package/dist/components/ui/label.d.ts.map +1 -1
  162. package/dist/components/ui/label.js +9 -8
  163. package/dist/components/ui/label.js.map +1 -1
  164. package/dist/components/ui/menubar.d.ts +20 -18
  165. package/dist/components/ui/menubar.d.ts.map +1 -1
  166. package/dist/components/ui/menubar.js +75 -95
  167. package/dist/components/ui/menubar.js.map +1 -1
  168. package/dist/components/ui/navigation-menu.d.ts +11 -13
  169. package/dist/components/ui/navigation-menu.d.ts.map +1 -1
  170. package/dist/components/ui/navigation-menu.js +39 -58
  171. package/dist/components/ui/navigation-menu.js.map +1 -1
  172. package/dist/components/ui/pagination.d.ts +25 -10
  173. package/dist/components/ui/pagination.d.ts.map +1 -1
  174. package/dist/components/ui/pagination.js +33 -41
  175. package/dist/components/ui/pagination.js.map +1 -1
  176. package/dist/components/ui/popover.d.ts +6 -6
  177. package/dist/components/ui/popover.d.ts.map +1 -1
  178. package/dist/components/ui/popover.js +10 -26
  179. package/dist/components/ui/popover.js.map +1 -1
  180. package/dist/components/ui/progress.d.ts +2 -2
  181. package/dist/components/ui/progress.d.ts.map +1 -1
  182. package/dist/components/ui/progress.js +8 -10
  183. package/dist/components/ui/progress.js.map +1 -1
  184. package/dist/components/ui/radio-group.d.ts +3 -3
  185. package/dist/components/ui/radio-group.d.ts.map +1 -1
  186. package/dist/components/ui/radio-group.js +17 -20
  187. package/dist/components/ui/radio-group.js.map +1 -1
  188. package/dist/components/ui/resizable.d.ts +21 -6
  189. package/dist/components/ui/resizable.d.ts.map +1 -1
  190. package/dist/components/ui/resizable.js +9 -21
  191. package/dist/components/ui/resizable.js.map +1 -1
  192. package/dist/components/ui/ripple-button.d.ts +1 -1
  193. package/dist/components/ui/ripple-button.d.ts.map +1 -1
  194. package/dist/components/ui/ripple-button.js +4 -4
  195. package/dist/components/ui/ripple-button.js.map +1 -1
  196. package/dist/components/ui/scratcher.d.ts.map +1 -1
  197. package/dist/components/ui/scratcher.js +7 -5
  198. package/dist/components/ui/scratcher.js.map +1 -1
  199. package/dist/components/ui/scroll-area.d.ts +3 -3
  200. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  201. package/dist/components/ui/scroll-area.js +14 -18
  202. package/dist/components/ui/scroll-area.js.map +1 -1
  203. package/dist/components/ui/select.d.ts +11 -13
  204. package/dist/components/ui/select.d.ts.map +1 -1
  205. package/dist/components/ui/select.js +55 -78
  206. package/dist/components/ui/select.js.map +1 -1
  207. package/dist/components/ui/separator.d.ts +2 -2
  208. package/dist/components/ui/separator.d.ts.map +1 -1
  209. package/dist/components/ui/separator.js +7 -8
  210. package/dist/components/ui/separator.js.map +1 -1
  211. package/dist/components/ui/sheet.d.ts +24 -12
  212. package/dist/components/ui/sheet.d.ts.map +1 -1
  213. package/dist/components/ui/sheet.js +56 -68
  214. package/dist/components/ui/sheet.js.map +1 -1
  215. package/dist/components/ui/sidebar.d.ts +35 -39
  216. package/dist/components/ui/sidebar.d.ts.map +1 -1
  217. package/dist/components/ui/sidebar.js +115 -124
  218. package/dist/components/ui/sidebar.js.map +1 -1
  219. package/dist/components/ui/skeleton.d.ts +1 -1
  220. package/dist/components/ui/skeleton.d.ts.map +1 -1
  221. package/dist/components/ui/skeleton.js +2 -3
  222. package/dist/components/ui/skeleton.js.map +1 -1
  223. package/dist/components/ui/slider.d.ts +2 -2
  224. package/dist/components/ui/slider.d.ts.map +1 -1
  225. package/dist/components/ui/slider.js +12 -31
  226. package/dist/components/ui/slider.js.map +1 -1
  227. package/dist/components/ui/sonner.d.ts +4 -2
  228. package/dist/components/ui/sonner.d.ts.map +1 -1
  229. package/dist/components/ui/sonner.js +8 -5
  230. package/dist/components/ui/sonner.js.map +1 -1
  231. package/dist/components/ui/spinner.d.ts +4 -0
  232. package/dist/components/ui/spinner.d.ts.map +1 -0
  233. package/dist/components/ui/spinner.js +16 -0
  234. package/dist/components/ui/spinner.js.map +1 -0
  235. package/dist/components/ui/switch.d.ts +2 -2
  236. package/dist/components/ui/switch.d.ts.map +1 -1
  237. package/dist/components/ui/switch.js +8 -10
  238. package/dist/components/ui/switch.js.map +1 -1
  239. package/dist/components/ui/table.d.ts +9 -9
  240. package/dist/components/ui/table.d.ts.map +1 -1
  241. package/dist/components/ui/table.js +40 -49
  242. package/dist/components/ui/table.js.map +1 -1
  243. package/dist/components/ui/tabs.d.ts +6 -6
  244. package/dist/components/ui/tabs.d.ts.map +1 -1
  245. package/dist/components/ui/tabs.js +18 -27
  246. package/dist/components/ui/tabs.js.map +1 -1
  247. package/dist/components/ui/textarea.d.ts +1 -1
  248. package/dist/components/ui/textarea.d.ts.map +1 -1
  249. package/dist/components/ui/textarea.js +7 -8
  250. package/dist/components/ui/textarea.js.map +1 -1
  251. package/dist/components/ui/toggle-group.d.ts +9 -4
  252. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  253. package/dist/components/ui/toggle-group.js +12 -16
  254. package/dist/components/ui/toggle-group.js.map +1 -1
  255. package/dist/components/ui/toggle.d.ts +9 -6
  256. package/dist/components/ui/toggle.d.ts.map +1 -1
  257. package/dist/components/ui/toggle.js +8 -9
  258. package/dist/components/ui/toggle.js.map +1 -1
  259. package/dist/components/ui/tooltip.d.ts +6 -6
  260. package/dist/components/ui/tooltip.d.ts.map +1 -1
  261. package/dist/components/ui/tooltip.js +14 -39
  262. package/dist/components/ui/tooltip.js.map +1 -1
  263. package/dist/components/ui/typewriter.d.ts.map +1 -1
  264. package/dist/components/ui/typewriter.js +9 -9
  265. package/dist/components/ui/typewriter.js.map +1 -1
  266. package/dist/hooks/useIsMobile.d.ts +2 -5
  267. package/dist/hooks/useIsMobile.d.ts.map +1 -1
  268. package/dist/hooks/useIsMobile.js +1 -1
  269. package/dist/hooks/useIsMobile.js.map +1 -1
  270. package/dist/hooks/useWindowSize.d.ts +0 -1
  271. package/dist/hooks/useWindowSize.d.ts.map +1 -1
  272. package/dist/hooks/useWindowSize.js +1 -1
  273. package/dist/hooks/useWindowSize.js.map +1 -1
  274. package/dist/index.css +841 -1128
  275. package/dist/index.css.map +1 -1
  276. package/dist/index.d.ts +43 -37
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +11 -5
  279. package/dist/lib/utilities.d.ts +9 -0
  280. package/dist/lib/utilities.d.ts.map +1 -0
  281. package/dist/lib/{utils.js → utilities.js} +1 -1
  282. package/dist/lib/utilities.js.map +1 -0
  283. package/package.json +121 -90
  284. package/{README.md → readme.md} +627 -627
  285. package/src/components/ui/accordion.tsx +55 -66
  286. package/src/components/ui/alert-dialog.tsx +124 -160
  287. package/src/components/ui/alert.tsx +56 -69
  288. package/src/components/ui/aspect-ratio.tsx +7 -12
  289. package/src/components/ui/avatar.tsx +43 -53
  290. package/src/components/ui/background-beams.tsx +145 -142
  291. package/src/components/ui/badge.tsx +39 -48
  292. package/src/components/ui/breadcrumb.tsx +94 -117
  293. package/src/components/ui/bubble-background.tsx +170 -189
  294. package/src/components/ui/button-group.tsx +69 -0
  295. package/src/components/ui/button.tsx +55 -61
  296. package/src/components/ui/calendar.tsx +175 -216
  297. package/src/components/ui/card.tsx +64 -97
  298. package/src/components/ui/carousel.tsx +216 -241
  299. package/src/components/ui/chart.tsx +293 -385
  300. package/src/components/ui/checkbox.tsx +27 -32
  301. package/src/components/ui/collapsible.tsx +11 -34
  302. package/src/components/ui/command.tsx +138 -184
  303. package/src/components/ui/context-menu.tsx +186 -255
  304. package/src/components/ui/counting-number.tsx +92 -108
  305. package/src/components/ui/dialog.tsx +106 -146
  306. package/src/components/ui/dot-background.tsx +153 -158
  307. package/src/components/ui/drawer.tsx +105 -141
  308. package/src/components/ui/dropdown-menu.tsx +188 -260
  309. package/src/components/ui/dropdrawer.tsx +865 -973
  310. package/src/components/ui/empty.tsx +86 -0
  311. package/src/components/ui/field.tsx +198 -0
  312. package/src/components/ui/fireworks-background.tsx +325 -378
  313. package/src/components/ui/flip-button.tsx +89 -110
  314. package/src/components/ui/form.tsx +144 -174
  315. package/src/components/ui/gradient-background.tsx +30 -43
  316. package/src/components/ui/gradient-text.tsx +62 -65
  317. package/src/components/ui/highlight-text.tsx +54 -71
  318. package/src/components/ui/hole-background.tsx +326 -361
  319. package/src/components/ui/hover-card.tsx +29 -44
  320. package/src/components/ui/input-group.tsx +145 -0
  321. package/src/components/ui/input-otp.tsx +66 -77
  322. package/src/components/ui/input.tsx +21 -22
  323. package/src/components/ui/item.tsx +163 -0
  324. package/src/components/ui/kbd.tsx +31 -0
  325. package/src/components/ui/label.tsx +23 -24
  326. package/src/components/ui/menubar.tsx +233 -279
  327. package/src/components/ui/navigation-menu.tsx +120 -171
  328. package/src/components/ui/pagination.tsx +92 -129
  329. package/src/components/ui/popover.tsx +33 -48
  330. package/src/components/ui/progress.tsx +24 -31
  331. package/src/components/ui/radio-group.tsx +43 -45
  332. package/src/components/ui/resizable.tsx +38 -56
  333. package/src/components/ui/ripple-button.tsx +90 -111
  334. package/src/components/ui/scratcher.tsx +167 -171
  335. package/src/components/ui/scroll-area.tsx +42 -58
  336. package/src/components/ui/select.tsx +145 -191
  337. package/src/components/ui/separator.tsx +26 -28
  338. package/src/components/ui/sheet.tsx +112 -145
  339. package/src/components/ui/sidebar.tsx +664 -729
  340. package/src/components/ui/skeleton.tsx +15 -19
  341. package/src/components/ui/slider.tsx +23 -63
  342. package/src/components/ui/sonner.tsx +36 -26
  343. package/src/components/ui/spinner.tsx +18 -0
  344. package/src/components/ui/switch.tsx +28 -31
  345. package/src/components/ui/table.tsx +93 -119
  346. package/src/components/ui/tabs.tsx +54 -66
  347. package/src/components/ui/textarea.tsx +21 -20
  348. package/src/components/ui/toggle-group.tsx +53 -73
  349. package/src/components/ui/toggle.tsx +44 -47
  350. package/src/components/ui/tooltip.tsx +32 -61
  351. package/src/components/ui/typewriter.tsx +173 -188
  352. package/src/hooks/useIsMobile.tsx +42 -45
  353. package/src/hooks/useWindowSize.tsx +66 -72
  354. package/src/index.css +67 -67
  355. package/src/index.ts +342 -408
  356. package/src/lib/utilities.ts +12 -0
  357. package/dist/lib/utils.d.ts +0 -7
  358. package/dist/lib/utils.d.ts.map +0 -1
  359. package/dist/lib/utils.js.map +0 -1
  360. package/src/lib/utils.ts +0 -10
@@ -1,188 +1,173 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import { cn } from "@/lib/utils";
5
- import { motion, stagger, useAnimate, useInView } from "motion/react";
6
- import { useEffect } from "react";
7
-
8
- export const TypewriterText = ({
9
- words,
10
- className,
11
- cursorClassName,
12
- }: {
13
- words: {
14
- text: string;
15
- className?: string;
16
- }[];
17
- className?: string;
18
- cursorClassName?: string;
19
- }): React.JSX.Element => {
20
- // split text inside of words into array of characters
21
- const wordsArray = words.map((word) => {
22
- return {
23
- ...word,
24
- text: word.text.split(""),
25
- };
26
- });
27
-
28
- const [scope, animate] = useAnimate();
29
- const isInView = useInView(scope);
30
- useEffect(() => {
31
- if (isInView) {
32
- animate(
33
- "span",
34
- {
35
- display: "inline-block",
36
- opacity: 1,
37
- width: "fit-content",
38
- },
39
- {
40
- duration: 0.3,
41
- delay: stagger(0.1),
42
- ease: "easeInOut",
43
- },
44
- );
45
- }
46
- }, [isInView]);
47
-
48
- const renderWords = () => {
49
- return (
50
- <motion.div ref={scope} className="inline">
51
- {wordsArray.map((word, idx) => {
52
- return (
53
- <div key={`word-${idx}`} className="inline-block">
54
- {word.text.map((char, index) => (
55
- <motion.span
56
- initial={{}}
57
- key={`char-${index}`}
58
- className={cn(
59
- `dark:text-white text-black opacity-0 hidden`,
60
- word.className,
61
- )}
62
- >
63
- {char}
64
- </motion.span>
65
- ))}
66
- &nbsp;
67
- </div>
68
- );
69
- })}
70
- </motion.div>
71
- );
72
- };
73
- return (
74
- <div
75
- className={cn(
76
- "text-base sm:text-xl md:text-3xl lg:text-5xl font-bold text-center",
77
- className,
78
- )}
79
- >
80
- {renderWords()}
81
- <motion.span
82
- initial={{
83
- opacity: 0,
84
- }}
85
- animate={{
86
- opacity: 1,
87
- }}
88
- transition={{
89
- duration: 0.8,
90
- repeat: Infinity,
91
- repeatType: "reverse",
92
- }}
93
- className={cn(
94
- "inline-block rounded-sm w-[4px] h-4 md:h-6 lg:h-10 bg-blue-500",
95
- cursorClassName,
96
- )}
97
- ></motion.span>
98
- </div>
99
- );
100
- };
101
-
102
- export const TypewriterTextSmooth = ({
103
- words,
104
- className,
105
- cursorClassName,
106
- }: {
107
- words: {
108
- text: string;
109
- className?: string;
110
- }[];
111
- className?: string;
112
- cursorClassName?: string;
113
- }): React.JSX.Element => {
114
- // split text inside of words into array of characters
115
- const wordsArray = words.map((word) => {
116
- return {
117
- ...word,
118
- text: word.text.split(""),
119
- };
120
- });
121
- const renderWords = () => {
122
- return (
123
- <div>
124
- {wordsArray.map((word, idx) => {
125
- return (
126
- <div key={`word-${idx}`} className="inline-block">
127
- {word.text.map((char, index) => (
128
- <span
129
- key={`char-${index}`}
130
- className={cn(`dark:text-white text-black `, word.className)}
131
- >
132
- {char}
133
- </span>
134
- ))}
135
- &nbsp;
136
- </div>
137
- );
138
- })}
139
- </div>
140
- );
141
- };
142
-
143
- return (
144
- <div className={cn("flex space-x-1 my-6", className)}>
145
- <motion.div
146
- className="overflow-hidden pb-2"
147
- initial={{
148
- width: "0%",
149
- }}
150
- whileInView={{
151
- width: "fit-content",
152
- }}
153
- transition={{
154
- duration: 2,
155
- ease: "linear",
156
- delay: 1,
157
- }}
158
- >
159
- <div
160
- className="text-xs sm:text-base md:text-xl lg:text:3xl xl:text-5xl font-bold"
161
- style={{
162
- whiteSpace: "nowrap",
163
- }}
164
- >
165
- {renderWords()}{" "}
166
- </div>{" "}
167
- </motion.div>
168
- <motion.span
169
- initial={{
170
- opacity: 0,
171
- }}
172
- animate={{
173
- opacity: 1,
174
- }}
175
- transition={{
176
- duration: 0.8,
177
-
178
- repeat: Infinity,
179
- repeatType: "reverse",
180
- }}
181
- className={cn(
182
- "block rounded-sm w-[4px] h-4 sm:h-6 xl:h-12 bg-blue-500",
183
- cursorClassName,
184
- )}
185
- ></motion.span>
186
- </div>
187
- );
188
- };
1
+ "use client";
2
+
3
+ import {cn} from "@/lib/utilities";
4
+ import {motion, stagger, useAnimate, useInView} from "motion/react";
5
+ import * as React from "react";
6
+
7
+ export const TypewriterText = ({
8
+ words,
9
+ className,
10
+ cursorClassName,
11
+ }: {
12
+ words: {
13
+ text: string;
14
+ className?: string;
15
+ }[];
16
+ className?: string;
17
+ cursorClassName?: string;
18
+ }): React.JSX.Element => {
19
+ // split text inside of words into array of characters
20
+ const wordsArray = words.map((word) => {
21
+ return {
22
+ ...word,
23
+ text: word.text.split(""),
24
+ };
25
+ });
26
+
27
+ const [scope, animate] = useAnimate();
28
+ const isInView = useInView(scope);
29
+ React.useEffect(() => {
30
+ if (isInView) {
31
+ animate(
32
+ "span",
33
+ {
34
+ display: "inline-block",
35
+ opacity: 1,
36
+ width: "fit-content",
37
+ },
38
+ {
39
+ duration: 0.3,
40
+ delay: stagger(0.1),
41
+ ease: "easeInOut",
42
+ },
43
+ );
44
+ }
45
+ }, [isInView]);
46
+
47
+ const renderWords = () => {
48
+ return (
49
+ <motion.div
50
+ ref={scope}
51
+ className='inline'>
52
+ {wordsArray.map((word, idx) => {
53
+ return (
54
+ <div
55
+ key={`word-${idx}`}
56
+ className='inline-block'>
57
+ {word.text.map((char, index) => (
58
+ <motion.span
59
+ initial={{}}
60
+ key={`char-${index}`}
61
+ className={cn(`hidden text-black opacity-0 dark:text-white`, word.className)}>
62
+ {char}
63
+ </motion.span>
64
+ ))}
65
+ &nbsp;
66
+ </div>
67
+ );
68
+ })}
69
+ </motion.div>
70
+ );
71
+ };
72
+ return (
73
+ <div className={cn("text-center text-base font-bold sm:text-xl md:text-3xl lg:text-5xl", className)}>
74
+ {renderWords()}
75
+ <motion.span
76
+ initial={{
77
+ opacity: 0,
78
+ }}
79
+ animate={{
80
+ opacity: 1,
81
+ }}
82
+ transition={{
83
+ duration: 0.8,
84
+ repeat: Infinity,
85
+ repeatType: "reverse",
86
+ }}
87
+ className={cn("inline-block h-4 w-[4px] rounded-sm bg-blue-500 md:h-6 lg:h-10", cursorClassName)}></motion.span>
88
+ </div>
89
+ );
90
+ };
91
+
92
+ export const TypewriterTextSmooth = ({
93
+ words,
94
+ className,
95
+ cursorClassName,
96
+ }: {
97
+ words: {
98
+ text: string;
99
+ className?: string;
100
+ }[];
101
+ className?: string;
102
+ cursorClassName?: string;
103
+ }): React.JSX.Element => {
104
+ // split text inside of words into array of characters
105
+ const wordsArray = words.map((word) => {
106
+ return {
107
+ ...word,
108
+ text: word.text.split(""),
109
+ };
110
+ });
111
+ const renderWords = () => {
112
+ return (
113
+ <div>
114
+ {wordsArray.map((word, idx) => {
115
+ return (
116
+ <div
117
+ key={`word-${idx}`}
118
+ className='inline-block'>
119
+ {word.text.map((char, index) => (
120
+ <span
121
+ key={`char-${index}`}
122
+ className={cn(`text-black dark:text-white`, word.className)}>
123
+ {char}
124
+ </span>
125
+ ))}
126
+ &nbsp;
127
+ </div>
128
+ );
129
+ })}
130
+ </div>
131
+ );
132
+ };
133
+
134
+ return (
135
+ <div className={cn("my-6 flex space-x-1", className)}>
136
+ <motion.div
137
+ className='overflow-hidden pb-2'
138
+ initial={{
139
+ width: "0%",
140
+ }}
141
+ whileInView={{
142
+ width: "fit-content",
143
+ }}
144
+ transition={{
145
+ duration: 2,
146
+ ease: "linear",
147
+ delay: 1,
148
+ }}>
149
+ <div
150
+ className='lg:text:3xl text-xs font-bold sm:text-base md:text-xl xl:text-5xl'
151
+ style={{
152
+ whiteSpace: "nowrap",
153
+ }}>
154
+ {renderWords()}{" "}
155
+ </div>{" "}
156
+ </motion.div>
157
+ <motion.span
158
+ initial={{
159
+ opacity: 0,
160
+ }}
161
+ animate={{
162
+ opacity: 1,
163
+ }}
164
+ transition={{
165
+ duration: 0.8,
166
+
167
+ repeat: Infinity,
168
+ repeatType: "reverse",
169
+ }}
170
+ className={cn("block h-4 w-[4px] rounded-sm bg-blue-500 sm:h-6 xl:h-12", cursorClassName)}></motion.span>
171
+ </div>
172
+ );
173
+ };
@@ -1,45 +1,42 @@
1
- "use client";
2
- import * as React from "react";
3
-
4
- const MOBILE_BREAKPOINT = 768;
5
-
6
- /**
7
- * A custom React hook that detects whether the current device is a mobile device
8
- * based on the screen width.
9
- *
10
- * This hook uses a media query to check if the viewport width is less than the defined
11
- * mobile breakpoint (768px). It updates the state when the window size changes.
12
- *
13
- * @returns {boolean} Returns true if the viewport width is less than the mobile breakpoint,
14
- * false otherwise.
15
- *
16
- * @example
17
- * ```tsx
18
- * function MyComponent() {
19
- * const isMobile = useIsMobile();
20
- *
21
- * return (
22
- * <div>
23
- * {isMobile ? 'Mobile View' : 'Desktop View'}
24
- * </div>
25
- * );
26
- * }
27
- * ```
28
- */
29
- export function useIsMobile(): boolean {
30
- const [isMobile, setIsMobile] = React.useState<boolean | null>(null);
31
-
32
- React.useEffect(() => {
33
- const mql = globalThis.window.matchMedia(
34
- `(max-width: ${MOBILE_BREAKPOINT - 1}px)`,
35
- );
36
- const onChange = () => {
37
- setIsMobile(globalThis.window.innerWidth < MOBILE_BREAKPOINT);
38
- };
39
- mql.addEventListener("change", onChange);
40
- setIsMobile(globalThis.window.innerWidth < MOBILE_BREAKPOINT);
41
- return () => mql.removeEventListener("change", onChange);
42
- }, []);
43
-
44
- return !!isMobile;
45
- }
1
+ "use client";
2
+ import * as React from "react";
3
+
4
+ const MOBILE_BREAKPOINT = 768;
5
+
6
+ /**
7
+ * A custom React hook that detects whether the current device is a mobile device
8
+ * based on the screen width.
9
+ * This hook uses a media query to check if the viewport width is less than the defined
10
+ * mobile breakpoint (768px). It updates the state when the window size changes.
11
+ * @returns Returns true if the viewport width is less than the mobile breakpoint,
12
+ * false otherwise.
13
+ * @example
14
+ * ```tsx
15
+ * function MyComponent() {
16
+ * const isMobile = useIsMobile();
17
+ *
18
+ * return (
19
+ * <div>
20
+ * {isMobile ? 'Mobile View' : 'Desktop View'}
21
+ * </div>
22
+ * );
23
+ * }
24
+ * ```
25
+ */
26
+ export function useIsMobile(): boolean {
27
+ const [isMobile, setIsMobile] = React.useState<boolean | null>(null);
28
+
29
+ React.useEffect(() => {
30
+ const mql = globalThis.window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
31
+ const onChange = () => {
32
+ // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect
33
+ setIsMobile(globalThis.window.innerWidth < MOBILE_BREAKPOINT);
34
+ };
35
+ mql.addEventListener("change", onChange);
36
+ // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect
37
+ setIsMobile(globalThis.window.innerWidth < MOBILE_BREAKPOINT);
38
+ return () => mql.removeEventListener("change", onChange);
39
+ }, []);
40
+
41
+ return Boolean(isMobile);
42
+ }
@@ -1,72 +1,66 @@
1
- /** @format */
2
-
3
- "use client";
4
-
5
- import { useEffect, useState } from "react";
6
-
7
- const MOBILE_BREAKPOINT = 768;
8
-
9
- type WindowSize = {
10
- width: number | null;
11
- height: number | null;
12
- };
13
-
14
- type HookReturnType = Readonly<{
15
- windowSize: WindowSize;
16
- isMobile: boolean;
17
- isDesktop: boolean;
18
- }>;
19
-
20
- /**
21
- * Client hook to get the window size and whether the window is mobile or desktop.
22
- * @returns An object containing the window size and whether the window is mobile or desktop.
23
- *@example
24
- * ```tsx
25
- * function MyComponent() {
26
- * const { windowSize, isMobile, isDesktop } = useWindowSize();
27
- *
28
- * return (
29
- * <div>
30
- * <p>Window Size: {windowSize.width} x {windowSize.height}</p>
31
- * <p>{isMobile ? 'Mobile View' : 'Desktop View'}</p>
32
- * </div>
33
- * );
34
- * }
35
- * ```
36
- */
37
- export function useWindowSize(): HookReturnType {
38
- const [windowSize, setWindowSize] = useState<WindowSize>({
39
- width: null,
40
- height: null,
41
- });
42
-
43
- useEffect(() => {
44
- /**
45
- * This function updates the window size.
46
- * It is created inside of useEffect and has a short lifespan.
47
- * After it is attached to the window object, it will be garbage collected
48
- * when the component unmounts or the window is resized.
49
- */
50
- function __handleResize__() {
51
- setWindowSize({
52
- width: globalThis.window.innerWidth,
53
- height: globalThis.window.innerHeight,
54
- });
55
- }
56
-
57
- globalThis.window.addEventListener("resize", __handleResize__);
58
- __handleResize__(); // Call the function once to get the initial window size
59
- return () =>
60
- globalThis.window.removeEventListener("resize", __handleResize__);
61
- }, []); // Empty array ensures that effect is only run on mount
62
-
63
- return {
64
- windowSize,
65
- isMobile:
66
- typeof windowSize.width === "number" &&
67
- windowSize.width < MOBILE_BREAKPOINT,
68
- isDesktop:
69
- typeof windowSize.width === "number" &&
70
- windowSize.width >= MOBILE_BREAKPOINT,
71
- } as const;
72
- }
1
+ "use client";
2
+
3
+ import {useEffect, useState} from "react";
4
+
5
+ const MOBILE_BREAKPOINT = 768;
6
+
7
+ type WindowSize = {
8
+ width: number | null;
9
+ height: number | null;
10
+ };
11
+
12
+ type HookReturnType = Readonly<{
13
+ windowSize: WindowSize;
14
+ isMobile: boolean;
15
+ isDesktop: boolean;
16
+ }>;
17
+
18
+ /**
19
+ * Client hook to get the window size and whether the window is mobile or desktop.
20
+ * @returns An object containing the window size and whether the window is mobile or desktop.
21
+ *@example
22
+ * ```tsx
23
+ * function MyComponent() {
24
+ * const { windowSize, isMobile, isDesktop } = useWindowSize();
25
+ *
26
+ * return (
27
+ * <div>
28
+ * <p>Window Size: {windowSize.width} x {windowSize.height}</p>
29
+ * <p>{isMobile ? 'Mobile View' : 'Desktop View'}</p>
30
+ * </div>
31
+ * );
32
+ * }
33
+ * ```
34
+ */
35
+ export function useWindowSize(): HookReturnType {
36
+ const [windowSize, setWindowSize] = useState<WindowSize>({
37
+ width: null,
38
+ height: null,
39
+ });
40
+
41
+ useEffect(() => {
42
+ /**
43
+ * This function updates the window size.
44
+ * It is created inside of useEffect and has a short lifespan.
45
+ * After it is attached to the window object, it will be garbage collected
46
+ * when the component unmounts or the window is resized.
47
+ */
48
+ function __handleResize__() {
49
+ // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect
50
+ setWindowSize({
51
+ width: globalThis.window.innerWidth,
52
+ height: globalThis.window.innerHeight,
53
+ });
54
+ }
55
+
56
+ globalThis.window.addEventListener("resize", __handleResize__);
57
+ __handleResize__(); // Call the function once to get the initial window size
58
+ return () => globalThis.window.removeEventListener("resize", __handleResize__);
59
+ }, []); // Empty array ensures that effect is only run on mount
60
+
61
+ return {
62
+ windowSize,
63
+ isMobile: typeof windowSize.width === "number" && windowSize.width < MOBILE_BREAKPOINT,
64
+ isDesktop: typeof windowSize.width === "number" && windowSize.width >= MOBILE_BREAKPOINT,
65
+ } as const;
66
+ }