@codefast/ui 0.3.16-canary.1 → 0.3.16-canary.3

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 (223) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/dist/components/accordion.mjs +2 -2
  4. package/dist/components/alert-dialog.d.mts +1 -1
  5. package/dist/components/alert-dialog.mjs +4 -4
  6. package/dist/components/alert.d.mts +3 -13
  7. package/dist/components/alert.mjs +3 -23
  8. package/dist/components/badge.d.mts +3 -15
  9. package/dist/components/badge.mjs +2 -44
  10. package/dist/components/breadcrumb.mjs +1 -1
  11. package/dist/components/button-group.d.mts +3 -13
  12. package/dist/components/button-group.mjs +3 -24
  13. package/dist/components/button.d.mts +3 -25
  14. package/dist/components/button.mjs +2 -72
  15. package/dist/components/calendar.mjs +2 -1
  16. package/dist/components/carousel.d.mts +1 -2
  17. package/dist/components/chart.d.mts +2 -4
  18. package/dist/components/checkbox.mjs +2 -2
  19. package/dist/components/context-menu.mjs +2 -2
  20. package/dist/components/dialog.d.mts +1 -1
  21. package/dist/components/dialog.mjs +4 -4
  22. package/dist/components/drawer.d.mts +1 -1
  23. package/dist/components/drawer.mjs +2 -2
  24. package/dist/components/dropdown-menu.mjs +2 -2
  25. package/dist/components/empty.d.mts +3 -13
  26. package/dist/components/empty.mjs +3 -18
  27. package/dist/components/field.d.mts +3 -14
  28. package/dist/components/field.mjs +3 -32
  29. package/dist/components/form.d.mts +2 -4
  30. package/dist/components/hover-card.mjs +1 -1
  31. package/dist/components/input-group.d.mts +4 -31
  32. package/dist/components/input-group.mjs +3 -90
  33. package/dist/components/input-number.mjs +4 -4
  34. package/dist/components/input-otp.mjs +2 -2
  35. package/dist/components/input.mjs +1 -1
  36. package/dist/components/item.d.mts +4 -29
  37. package/dist/components/item.mjs +3 -56
  38. package/dist/components/menubar.mjs +2 -2
  39. package/dist/components/native-select.mjs +1 -1
  40. package/dist/components/navigation-menu.d.mts +1 -6
  41. package/dist/components/navigation-menu.mjs +8 -15
  42. package/dist/components/pagination.d.mts +1 -1
  43. package/dist/components/pagination.mjs +1 -1
  44. package/dist/components/popover.mjs +1 -1
  45. package/dist/components/progress-circle.d.mts +3 -47
  46. package/dist/components/progress-circle.mjs +2 -47
  47. package/dist/components/progress.mjs +1 -1
  48. package/dist/components/radio-group.mjs +1 -1
  49. package/dist/components/radio.mjs +1 -1
  50. package/dist/components/scroll-area.d.mts +3 -19
  51. package/dist/components/scroll-area.mjs +4 -61
  52. package/dist/components/select.d.mts +1 -1
  53. package/dist/components/select.mjs +3 -3
  54. package/dist/components/separator.d.mts +3 -18
  55. package/dist/components/separator.mjs +3 -23
  56. package/dist/components/sheet.d.mts +6 -18
  57. package/dist/components/sheet.mjs +6 -49
  58. package/dist/components/sidebar.d.mts +4 -19
  59. package/dist/components/sidebar.mjs +10 -46
  60. package/dist/components/skeleton.mjs +1 -1
  61. package/dist/components/slider.mjs +1 -1
  62. package/dist/components/spinner.mjs +1 -1
  63. package/dist/components/switch.mjs +2 -2
  64. package/dist/components/table.mjs +1 -1
  65. package/dist/components/tabs.mjs +1 -1
  66. package/dist/components/textarea.mjs +1 -1
  67. package/dist/components/toggle-group.d.mts +3 -2
  68. package/dist/components/toggle-group.mjs +1 -1
  69. package/dist/components/toggle.d.mts +2 -21
  70. package/dist/components/toggle.mjs +2 -39
  71. package/dist/components/tooltip.mjs +1 -1
  72. package/dist/index.d.mts +31 -16
  73. package/dist/index.mjs +30 -15
  74. package/dist/lib/utils.d.mts +1 -12
  75. package/dist/lib/utils.mjs +1 -9
  76. package/dist/primitives/checkbox-group.d.mts +1 -2
  77. package/dist/primitives/input-number.d.mts +1 -2
  78. package/dist/primitives/input.d.mts +1 -2
  79. package/dist/primitives/progress-circle.d.mts +1 -2
  80. package/dist/variants/alert.d.mts +18 -0
  81. package/dist/variants/alert.mjs +25 -0
  82. package/dist/variants/badge.d.mts +20 -0
  83. package/dist/variants/badge.mjs +46 -0
  84. package/dist/variants/button-group.d.mts +18 -0
  85. package/dist/variants/button-group.mjs +26 -0
  86. package/dist/variants/button.d.mts +30 -0
  87. package/dist/variants/button.mjs +76 -0
  88. package/dist/variants/empty.d.mts +18 -0
  89. package/dist/variants/empty.mjs +20 -0
  90. package/dist/variants/field.d.mts +19 -0
  91. package/dist/variants/field.mjs +34 -0
  92. package/dist/variants/input-group.d.mts +43 -0
  93. package/dist/variants/input-group.mjs +93 -0
  94. package/dist/variants/item.d.mts +37 -0
  95. package/dist/variants/item.mjs +60 -0
  96. package/dist/variants/navigation-menu.d.mts +13 -0
  97. package/dist/variants/navigation-menu.mjs +12 -0
  98. package/dist/variants/progress-circle.d.mts +52 -0
  99. package/dist/variants/progress-circle.mjs +49 -0
  100. package/dist/variants/scroll-area.d.mts +24 -0
  101. package/dist/variants/scroll-area.mjs +63 -0
  102. package/dist/variants/separator.d.mts +23 -0
  103. package/dist/variants/separator.mjs +25 -0
  104. package/dist/variants/sheet.d.mts +20 -0
  105. package/dist/variants/sheet.mjs +50 -0
  106. package/dist/variants/sidebar.d.mts +23 -0
  107. package/dist/variants/sidebar.mjs +42 -0
  108. package/dist/variants/toggle.d.mts +23 -0
  109. package/dist/variants/toggle.mjs +43 -0
  110. package/package.json +169 -21
  111. package/src/components/accordion.tsx +156 -0
  112. package/src/components/alert-dialog.tsx +314 -0
  113. package/src/components/alert.tsx +86 -0
  114. package/src/components/aspect-ratio.tsx +28 -0
  115. package/src/components/avatar.tsx +84 -0
  116. package/src/components/badge.tsx +38 -0
  117. package/src/components/breadcrumb.tsx +197 -0
  118. package/src/components/button-group.tsx +107 -0
  119. package/src/components/button.tsx +66 -0
  120. package/src/components/calendar.tsx +277 -0
  121. package/src/components/card.tsx +175 -0
  122. package/src/components/carousel.tsx +367 -0
  123. package/src/components/chart.tsx +587 -0
  124. package/src/components/checkbox-cards.tsx +92 -0
  125. package/src/components/checkbox-group.tsx +83 -0
  126. package/src/components/checkbox.tsx +65 -0
  127. package/src/components/collapsible.tsx +60 -0
  128. package/src/components/command.tsx +311 -0
  129. package/src/components/context-menu.tsx +489 -0
  130. package/src/components/dialog.tsx +295 -0
  131. package/src/components/drawer.tsx +271 -0
  132. package/src/components/dropdown-menu.tsx +498 -0
  133. package/src/components/empty.tsx +169 -0
  134. package/src/components/field.tsx +362 -0
  135. package/src/components/form.tsx +300 -0
  136. package/src/components/hover-card.tsx +116 -0
  137. package/src/components/input-group.tsx +224 -0
  138. package/src/components/input-number.tsx +161 -0
  139. package/src/components/input-otp.tsx +151 -0
  140. package/src/components/input-password.tsx +74 -0
  141. package/src/components/input-search.tsx +98 -0
  142. package/src/components/input.tsx +52 -0
  143. package/src/components/item.tsx +280 -0
  144. package/src/components/kbd.tsx +59 -0
  145. package/src/components/label.tsx +44 -0
  146. package/src/components/menubar.tsx +531 -0
  147. package/src/components/native-select.tsx +96 -0
  148. package/src/components/navigation-menu.tsx +295 -0
  149. package/src/components/pagination.tsx +204 -0
  150. package/src/components/popover.tsx +139 -0
  151. package/src/components/progress-circle.tsx +203 -0
  152. package/src/components/progress.tsx +54 -0
  153. package/src/components/radio-cards.tsx +85 -0
  154. package/src/components/radio-group.tsx +79 -0
  155. package/src/components/radio.tsx +61 -0
  156. package/src/components/resizable.tsx +99 -0
  157. package/src/components/scroll-area.tsx +115 -0
  158. package/src/components/select.tsx +319 -0
  159. package/src/components/separator.tsx +74 -0
  160. package/src/components/sheet.tsx +278 -0
  161. package/src/components/sidebar.tsx +1056 -0
  162. package/src/components/skeleton.tsx +37 -0
  163. package/src/components/slider.tsx +95 -0
  164. package/src/components/sonner.tsx +47 -0
  165. package/src/components/spinner.tsx +75 -0
  166. package/src/components/switch.tsx +66 -0
  167. package/src/components/table.tsx +200 -0
  168. package/src/components/tabs.tsx +128 -0
  169. package/src/components/textarea.tsx +49 -0
  170. package/src/components/toggle-group.tsx +141 -0
  171. package/src/components/toggle.tsx +39 -0
  172. package/src/components/tooltip.tsx +141 -0
  173. package/src/css/amber.css +59 -22
  174. package/src/css/blue.css +59 -22
  175. package/src/css/cyan.css +59 -22
  176. package/src/css/emerald.css +59 -22
  177. package/src/css/fuchsia.css +59 -22
  178. package/src/css/gray.css +59 -22
  179. package/src/css/green.css +59 -22
  180. package/src/css/indigo.css +59 -22
  181. package/src/css/lime.css +59 -22
  182. package/src/css/neutral.css +59 -22
  183. package/src/css/orange.css +59 -22
  184. package/src/css/pink.css +59 -22
  185. package/src/css/preset.css +32 -13
  186. package/src/css/purple.css +59 -22
  187. package/src/css/red.css +59 -22
  188. package/src/css/rose.css +59 -22
  189. package/src/css/sky.css +59 -22
  190. package/src/css/slate.css +59 -22
  191. package/src/css/stone.css +59 -22
  192. package/src/css/teal.css +59 -22
  193. package/src/css/violet.css +59 -22
  194. package/src/css/yellow.css +59 -22
  195. package/src/css/zinc.css +59 -22
  196. package/src/hooks/use-animated-value.ts +97 -0
  197. package/src/hooks/use-copy-to-clipboard.ts +63 -0
  198. package/src/hooks/use-is-mobile.ts +27 -0
  199. package/src/hooks/use-media-query.ts +71 -0
  200. package/src/hooks/use-mutation-observer.ts +54 -0
  201. package/src/hooks/use-pagination.ts +166 -0
  202. package/src/index.ts +720 -0
  203. package/src/lib/utils.ts +5 -0
  204. package/src/primitives/checkbox-group.tsx +360 -0
  205. package/src/primitives/input-number.tsx +1013 -0
  206. package/src/primitives/input.tsx +243 -0
  207. package/src/primitives/progress-circle.tsx +537 -0
  208. package/src/variants/alert.ts +45 -0
  209. package/src/variants/badge.ts +66 -0
  210. package/src/variants/button-group.ts +49 -0
  211. package/src/variants/button.ts +93 -0
  212. package/src/variants/empty.ts +43 -0
  213. package/src/variants/field.ts +50 -0
  214. package/src/variants/input-group.ts +132 -0
  215. package/src/variants/item.ts +90 -0
  216. package/src/variants/navigation-menu.ts +32 -0
  217. package/src/variants/progress-circle.ts +47 -0
  218. package/src/variants/scroll-area.ts +79 -0
  219. package/src/variants/separator.ts +41 -0
  220. package/src/variants/sheet.ts +70 -0
  221. package/src/variants/sidebar.ts +61 -0
  222. package/src/variants/toggle.ts +59 -0
  223. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
package/src/css/teal.css CHANGED
@@ -1,9 +1,4 @@
1
1
  :root {
2
- --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
3
- --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
4
-
5
- --ring: oklch(0.78 0.13 182); /* --color-teal-400 */
6
-
7
2
  --background: oklch(1 0 0); /* --color-zinc-50 */
8
3
  --foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
9
4
 
@@ -15,27 +10,28 @@
15
10
 
16
11
  --destructive: oklch(0.577 0.245 27.325); /* --color-red-600 */
17
12
 
18
- --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
19
- --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
20
-
21
13
  --muted: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
22
14
  --muted-foreground: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
23
15
 
16
+ --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
17
+ --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
18
+
24
19
  --popover: oklch(1 0 0); /* --color-zinc-50 */
25
20
  --popover-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
26
21
 
27
22
  --card: oklch(1 0 0); /* --color-zinc-50 */
28
23
  --card-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
29
24
 
25
+ --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
26
+ --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
27
+ --ring: oklch(0.78 0.13 182); /* --color-teal-400 */
28
+
30
29
  --sidebar: oklch(0.985 0 0); /* --color-zinc-50 */
31
30
  --sidebar-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
32
-
33
31
  --sidebar-primary: oklch(0.6 0.1 185); /* --color-teal-600 */
34
32
  --sidebar-primary-foreground: oklch(0.98 0.01 181); /* --color-teal-50 */
35
-
36
33
  --sidebar-accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
37
34
  --sidebar-accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
38
-
39
35
  --sidebar-border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
40
36
  --sidebar-ring: oklch(0.78 0.13 182); /* --color-teal-400 */
41
37
 
@@ -47,11 +43,6 @@
47
43
  }
48
44
 
49
45
  .dark {
50
- --input: oklch(1 0 0 / 15%); /* --color-white */
51
- --border: oklch(1 0 0 / 10%); /* --color-white */
52
-
53
- --ring: oklch(0.39 0.06 188); /* --color-teal-900 */
54
-
55
46
  --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
56
47
  --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
57
48
 
@@ -63,27 +54,28 @@
63
54
 
64
55
  --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
65
56
 
66
- --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
67
- --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
68
-
69
57
  --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
70
58
  --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
71
59
 
60
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
61
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
62
+
72
63
  --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
73
64
  --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
74
65
 
75
66
  --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
76
67
  --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
77
68
 
69
+ --border: oklch(1 0 0 / 10%); /* --color-white */
70
+ --input: oklch(1 0 0 / 15%); /* --color-white */
71
+ --ring: oklch(0.39 0.06 188); /* --color-teal-900 */
72
+
78
73
  --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
79
74
  --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
80
-
81
75
  --sidebar-primary: oklch(0.7 0.12 183); /* --color-teal-500 */
82
76
  --sidebar-primary-foreground: oklch(0.98 0.01 181); /* --color-teal-50 */
83
-
84
77
  --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
85
78
  --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
86
-
87
79
  --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
88
80
  --sidebar-ring: oklch(0.39 0.06 188); /* --color-teal-900 */
89
81
 
@@ -93,3 +85,48 @@
93
85
  --chart-4: oklch(0.6 0.1 185); /* --color-teal-600 */
94
86
  --chart-5: oklch(0.51 0.09 186); /* --color-teal-700 */
95
87
  }
88
+ @media (prefers-color-scheme: dark) {
89
+ :root:not(.light) {
90
+ --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
91
+ --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
92
+
93
+ --primary: oklch(0.7 0.12 183); /* --color-teal-500 */
94
+ --primary-foreground: oklch(0.98 0.01 181); /* --color-teal-50 */
95
+
96
+ --secondary: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
97
+ --secondary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
98
+
99
+ --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
100
+
101
+ --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
102
+ --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
103
+
104
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
105
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
106
+
107
+ --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
108
+ --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
109
+
110
+ --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
111
+ --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
112
+
113
+ --border: oklch(1 0 0 / 10%); /* --color-white */
114
+ --input: oklch(1 0 0 / 15%); /* --color-white */
115
+ --ring: oklch(0.39 0.06 188); /* --color-teal-900 */
116
+
117
+ --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
118
+ --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
119
+ --sidebar-primary: oklch(0.7 0.12 183); /* --color-teal-500 */
120
+ --sidebar-primary-foreground: oklch(0.98 0.01 181); /* --color-teal-50 */
121
+ --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
122
+ --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
123
+ --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
124
+ --sidebar-ring: oklch(0.39 0.06 188); /* --color-teal-900 */
125
+
126
+ --chart-1: oklch(0.85 0.13 181); /* --color-teal-300 */
127
+ --chart-2: oklch(0.78 0.13 182); /* --color-teal-400 */
128
+ --chart-3: oklch(0.7 0.12 183); /* --color-teal-500 */
129
+ --chart-4: oklch(0.6 0.1 185); /* --color-teal-600 */
130
+ --chart-5: oklch(0.51 0.09 186); /* --color-teal-700 */
131
+ }
132
+ }
@@ -1,9 +1,4 @@
1
1
  :root {
2
- --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
3
- --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
4
-
5
- --ring: oklch(0.702 0.183 293.541); /* --color-violet-400 */
6
-
7
2
  --background: oklch(1 0 0); /* --color-zinc-50 */
8
3
  --foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
9
4
 
@@ -15,27 +10,28 @@
15
10
 
16
11
  --destructive: oklch(0.577 0.245 27.325); /* --color-red-600 */
17
12
 
18
- --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
19
- --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
20
-
21
13
  --muted: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
22
14
  --muted-foreground: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
23
15
 
16
+ --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
17
+ --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
18
+
24
19
  --popover: oklch(1 0 0); /* --color-zinc-50 */
25
20
  --popover-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
26
21
 
27
22
  --card: oklch(1 0 0); /* --color-zinc-50 */
28
23
  --card-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
29
24
 
25
+ --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
26
+ --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
27
+ --ring: oklch(0.702 0.183 293.541); /* --color-violet-400 */
28
+
30
29
  --sidebar: oklch(0.985 0 0); /* --color-zinc-50 */
31
30
  --sidebar-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
32
-
33
31
  --sidebar-primary: oklch(0.541 0.281 293.009); /* --color-violet-600 */
34
32
  --sidebar-primary-foreground: oklch(0.969 0.016 293.756); /* --color-violet-50 */
35
-
36
33
  --sidebar-accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
37
34
  --sidebar-accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
38
-
39
35
  --sidebar-border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
40
36
  --sidebar-ring: oklch(0.702 0.183 293.541); /* --color-violet-400 */
41
37
 
@@ -47,11 +43,6 @@
47
43
  }
48
44
 
49
45
  .dark {
50
- --input: oklch(1 0 0 / 15%); /* --color-white */
51
- --border: oklch(1 0 0 / 10%); /* --color-white */
52
-
53
- --ring: oklch(0.38 0.189 293.745); /* --color-violet-900 */
54
-
55
46
  --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
56
47
  --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
57
48
 
@@ -63,27 +54,28 @@
63
54
 
64
55
  --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
65
56
 
66
- --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
67
- --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
68
-
69
57
  --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
70
58
  --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
71
59
 
60
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
61
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
62
+
72
63
  --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
73
64
  --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
74
65
 
75
66
  --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
76
67
  --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
77
68
 
69
+ --border: oklch(1 0 0 / 10%); /* --color-white */
70
+ --input: oklch(1 0 0 / 15%); /* --color-white */
71
+ --ring: oklch(0.38 0.189 293.745); /* --color-violet-900 */
72
+
78
73
  --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
79
74
  --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
80
-
81
75
  --sidebar-primary: oklch(0.606 0.25 292.717); /* --color-violet-500 */
82
76
  --sidebar-primary-foreground: oklch(0.969 0.016 293.756); /* --color-violet-50 */
83
-
84
77
  --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
85
78
  --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
86
-
87
79
  --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
88
80
  --sidebar-ring: oklch(0.38 0.189 293.745); /* --color-violet-900 */
89
81
 
@@ -93,3 +85,48 @@
93
85
  --chart-4: oklch(0.491 0.27 292.581); /* --color-violet-700 */
94
86
  --chart-5: oklch(0.432 0.232 292.759); /* --color-violet-800 */
95
87
  }
88
+ @media (prefers-color-scheme: dark) {
89
+ :root:not(.light) {
90
+ --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
91
+ --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
92
+
93
+ --primary: oklch(0.606 0.25 292.717); /* --color-violet-500 */
94
+ --primary-foreground: oklch(0.969 0.016 293.756); /* --color-violet-50 */
95
+
96
+ --secondary: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
97
+ --secondary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
98
+
99
+ --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
100
+
101
+ --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
102
+ --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
103
+
104
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
105
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
106
+
107
+ --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
108
+ --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
109
+
110
+ --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
111
+ --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
112
+
113
+ --border: oklch(1 0 0 / 10%); /* --color-white */
114
+ --input: oklch(1 0 0 / 15%); /* --color-white */
115
+ --ring: oklch(0.38 0.189 293.745); /* --color-violet-900 */
116
+
117
+ --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
118
+ --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
119
+ --sidebar-primary: oklch(0.606 0.25 292.717); /* --color-violet-500 */
120
+ --sidebar-primary-foreground: oklch(0.969 0.016 293.756); /* --color-violet-50 */
121
+ --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
122
+ --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
123
+ --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
124
+ --sidebar-ring: oklch(0.38 0.189 293.745); /* --color-violet-900 */
125
+
126
+ --chart-1: oklch(0.811 0.111 293.571); /* --color-violet-300 */
127
+ --chart-2: oklch(0.606 0.25 292.717); /* --color-violet-500 */
128
+ --chart-3: oklch(0.541 0.281 293.009); /* --color-violet-600 */
129
+ --chart-4: oklch(0.491 0.27 292.581); /* --color-violet-700 */
130
+ --chart-5: oklch(0.432 0.232 292.759); /* --color-violet-800 */
131
+ }
132
+ }
@@ -1,9 +1,4 @@
1
1
  :root {
2
- --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
3
- --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
4
-
5
- --ring: oklch(0.852 0.199 91.936); /* --color-yellow-400 */
6
-
7
2
  --background: oklch(1 0 0); /* --color-zinc-50 */
8
3
  --foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
9
4
 
@@ -15,27 +10,28 @@
15
10
 
16
11
  --destructive: oklch(0.577 0.245 27.325); /* --color-red-600 */
17
12
 
18
- --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
19
- --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
20
-
21
13
  --muted: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
22
14
  --muted-foreground: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
23
15
 
16
+ --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
17
+ --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
18
+
24
19
  --popover: oklch(1 0 0); /* --color-zinc-50 */
25
20
  --popover-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
26
21
 
27
22
  --card: oklch(1 0 0); /* --color-zinc-50 */
28
23
  --card-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
29
24
 
25
+ --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
26
+ --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
27
+ --ring: oklch(0.852 0.199 91.936); /* --color-yellow-400 */
28
+
30
29
  --sidebar: oklch(0.985 0 0); /* --color-zinc-50 */
31
30
  --sidebar-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
32
-
33
31
  --sidebar-primary: oklch(0.681 0.162 75.834); /* --color-yellow-600 */
34
32
  --sidebar-primary-foreground: oklch(0.987 0.026 102.212); /* --color-yellow-50 */
35
-
36
33
  --sidebar-accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
37
34
  --sidebar-accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
38
-
39
35
  --sidebar-border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
40
36
  --sidebar-ring: oklch(0.852 0.199 91.936); /* --color-yellow-400 */
41
37
 
@@ -47,11 +43,6 @@
47
43
  }
48
44
 
49
45
  .dark {
50
- --input: oklch(1 0 0 / 15%); /* --color-white */
51
- --border: oklch(1 0 0 / 10%); /* --color-white */
52
-
53
- --ring: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
54
-
55
46
  --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
56
47
  --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
57
48
 
@@ -63,27 +54,28 @@
63
54
 
64
55
  --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
65
56
 
66
- --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
67
- --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
68
-
69
57
  --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
70
58
  --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
71
59
 
60
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
61
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
62
+
72
63
  --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
73
64
  --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
74
65
 
75
66
  --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
76
67
  --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
77
68
 
69
+ --border: oklch(1 0 0 / 10%); /* --color-white */
70
+ --input: oklch(1 0 0 / 15%); /* --color-white */
71
+ --ring: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
72
+
78
73
  --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
79
74
  --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
80
-
81
75
  --sidebar-primary: oklch(0.795 0.184 86.047); /* --color-yellow-500 */
82
76
  --sidebar-primary-foreground: oklch(0.987 0.026 102.212); /* --color-yellow-50 */
83
-
84
77
  --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
85
78
  --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
86
-
87
79
  --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
88
80
  --sidebar-ring: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
89
81
 
@@ -93,3 +85,48 @@
93
85
  --chart-4: oklch(0.554 0.135 66.442); /* --color-yellow-700 */
94
86
  --chart-5: oklch(0.476 0.114 61.907); /* --color-yellow-800 */
95
87
  }
88
+ @media (prefers-color-scheme: dark) {
89
+ :root:not(.light) {
90
+ --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
91
+ --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
92
+
93
+ --primary: oklch(0.795 0.184 86.047); /* --color-yellow-500 */
94
+ --primary-foreground: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
95
+
96
+ --secondary: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
97
+ --secondary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
98
+
99
+ --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
100
+
101
+ --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
102
+ --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
103
+
104
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
105
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
106
+
107
+ --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
108
+ --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
109
+
110
+ --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
111
+ --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
112
+
113
+ --border: oklch(1 0 0 / 10%); /* --color-white */
114
+ --input: oklch(1 0 0 / 15%); /* --color-white */
115
+ --ring: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
116
+
117
+ --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
118
+ --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
119
+ --sidebar-primary: oklch(0.795 0.184 86.047); /* --color-yellow-500 */
120
+ --sidebar-primary-foreground: oklch(0.987 0.026 102.212); /* --color-yellow-50 */
121
+ --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
122
+ --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
123
+ --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
124
+ --sidebar-ring: oklch(0.421 0.095 57.708); /* --color-yellow-900 */
125
+
126
+ --chart-1: oklch(0.905 0.182 98.111); /* --color-yellow-300 */
127
+ --chart-2: oklch(0.795 0.184 86.047); /* --color-yellow-500 */
128
+ --chart-3: oklch(0.681 0.162 75.834); /* --color-yellow-600 */
129
+ --chart-4: oklch(0.554 0.135 66.442); /* --color-yellow-700 */
130
+ --chart-5: oklch(0.476 0.114 61.907); /* --color-yellow-800 */
131
+ }
132
+ }
package/src/css/zinc.css CHANGED
@@ -1,9 +1,4 @@
1
1
  :root {
2
- --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
3
- --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
4
-
5
- --ring: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
6
-
7
2
  --background: oklch(1 0 0); /* --color-zinc-50 */
8
3
  --foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
9
4
 
@@ -15,27 +10,28 @@
15
10
 
16
11
  --destructive: oklch(0.577 0.245 27.325); /* --color-red-600 */
17
12
 
18
- --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
19
- --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
20
-
21
13
  --muted: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
22
14
  --muted-foreground: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
23
15
 
16
+ --accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
17
+ --accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
18
+
24
19
  --popover: oklch(1 0 0); /* --color-zinc-50 */
25
20
  --popover-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
26
21
 
27
22
  --card: oklch(1 0 0); /* --color-zinc-50 */
28
23
  --card-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
29
24
 
25
+ --border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
26
+ --input: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
27
+ --ring: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
28
+
30
29
  --sidebar: oklch(0.985 0 0); /* --color-zinc-50 */
31
30
  --sidebar-foreground: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
32
-
33
31
  --sidebar-primary: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
34
32
  --sidebar-primary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
35
-
36
33
  --sidebar-accent: oklch(0.967 0.001 286.375); /* --color-zinc-100 */
37
34
  --sidebar-accent-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
38
-
39
35
  --sidebar-border: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
40
36
  --sidebar-ring: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
41
37
 
@@ -47,11 +43,6 @@
47
43
  }
48
44
 
49
45
  .dark {
50
- --input: oklch(1 0 0 / 15%); /* --color-white */
51
- --border: oklch(1 0 0 / 10%); /* --color-white */
52
-
53
- --ring: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
54
-
55
46
  --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
56
47
  --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
57
48
 
@@ -63,27 +54,28 @@
63
54
 
64
55
  --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
65
56
 
66
- --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
67
- --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
68
-
69
57
  --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
70
58
  --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
71
59
 
60
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
61
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
62
+
72
63
  --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
73
64
  --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
74
65
 
75
66
  --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
76
67
  --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
77
68
 
69
+ --border: oklch(1 0 0 / 10%); /* --color-white */
70
+ --input: oklch(1 0 0 / 15%); /* --color-white */
71
+ --ring: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
72
+
78
73
  --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
79
74
  --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
80
-
81
75
  --sidebar-primary: oklch(0.488 0.243 264.376); /* --color-blue-700 */
82
76
  --sidebar-primary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
83
-
84
77
  --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
85
78
  --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
86
-
87
79
  --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
88
80
  --sidebar-ring: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
89
81
 
@@ -93,3 +85,48 @@
93
85
  --chart-4: oklch(0.627 0.265 303.9); /* --color-purple-500 */
94
86
  --chart-5: oklch(0.645 0.246 16.439); /* --color-rose-500 */
95
87
  }
88
+ @media (prefers-color-scheme: dark) {
89
+ :root:not(.light) {
90
+ --background: oklch(0.141 0.005 285.823); /* --color-zinc-950 */
91
+ --foreground: oklch(0.985 0 0); /* --color-zinc-50 */
92
+
93
+ --primary: oklch(0.92 0.004 286.32); /* --color-zinc-200 */
94
+ --primary-foreground: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
95
+
96
+ --secondary: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
97
+ --secondary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
98
+
99
+ --destructive: oklch(0.704 0.191 22.216); /* --color-red-400 */
100
+
101
+ --muted: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
102
+ --muted-foreground: oklch(0.705 0.015 286.067); /* --color-zinc-400 */
103
+
104
+ --accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
105
+ --accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
106
+
107
+ --popover: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
108
+ --popover-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
109
+
110
+ --card: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
111
+ --card-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
112
+
113
+ --border: oklch(1 0 0 / 10%); /* --color-white */
114
+ --input: oklch(1 0 0 / 15%); /* --color-white */
115
+ --ring: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
116
+
117
+ --sidebar: oklch(0.21 0.006 285.885); /* --color-zinc-900 */
118
+ --sidebar-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
119
+ --sidebar-primary: oklch(0.488 0.243 264.376); /* --color-blue-700 */
120
+ --sidebar-primary-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
121
+ --sidebar-accent: oklch(0.274 0.006 286.033); /* --color-zinc-800 */
122
+ --sidebar-accent-foreground: oklch(0.985 0 0); /* --color-zinc-50 */
123
+ --sidebar-border: oklch(1 0 0 / 10%); /* --color-white */
124
+ --sidebar-ring: oklch(0.552 0.016 285.938); /* --color-zinc-500 */
125
+
126
+ --chart-1: oklch(0.488 0.243 264.376); /* --color-blue-700 */
127
+ --chart-2: oklch(0.696 0.17 162.48); /* --color-emerald-500 */
128
+ --chart-3: oklch(0.769 0.188 70.08); /* --color-amber-500 */
129
+ --chart-4: oklch(0.627 0.265 303.9); /* --color-purple-500 */
130
+ --chart-5: oklch(0.645 0.246 16.439); /* --color-rose-500 */
131
+ }
132
+ }
@@ -0,0 +1,97 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState } from "react";
4
+
5
+ /**
6
+ * Produce a smoothly animated numeric value in response to changes.
7
+ *
8
+ * Applies a time-based easing (easeOutQuad) between the current and target values
9
+ * over the specified duration. When disabled, the value updates immediately.
10
+ *
11
+ * @param targetValue - Target number to animate toward; null resolves to 0.
12
+ * @param duration - Animation duration in milliseconds.
13
+ * @param animate - When false, bypasses animation and sets the value directly.
14
+ * @returns The current (rounded) animated value.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const value = useAnimatedValue(75, 1000, true);
19
+ * return <div>{value}%</div>;
20
+ * ```
21
+ *
22
+ * @since 0.3.16-canary.0
23
+ */
24
+ export function useAnimatedValue(
25
+ targetValue: null | number,
26
+ duration: number,
27
+ animate?: boolean,
28
+ ): number {
29
+ // Default to 0 when targetValue is null
30
+ const actualTargetValue = targetValue ?? 0;
31
+
32
+ // Current animated output
33
+ const [animatedValue, setAnimatedValue] = useState(actualTargetValue);
34
+
35
+ // Prevent stale closures inside RAF loop
36
+ const animatedValueRef = useRef(actualTargetValue);
37
+
38
+ useEffect(() => {
39
+ animatedValueRef.current = animatedValue;
40
+ }, [animatedValue]);
41
+
42
+ useEffect(() => {
43
+ if (!animate) {
44
+ setAnimatedValue(actualTargetValue);
45
+
46
+ return;
47
+ }
48
+
49
+ // Starting value
50
+ const currentValue = animatedValueRef.current;
51
+
52
+ // Total delta across the animation
53
+ const valueRange = actualTargetValue - currentValue;
54
+
55
+ // Start timestamp
56
+ const startTime = performance.now();
57
+
58
+ if (duration <= 0 || valueRange === 0) {
59
+ setAnimatedValue(actualTargetValue);
60
+
61
+ return;
62
+ }
63
+
64
+ // requestAnimationFrame id for cleanup
65
+ let animationFrame: number;
66
+
67
+ // RAF step
68
+ const animateValue = (currentTime: number): void => {
69
+ // Elapsed milliseconds
70
+ const elapsedTime = currentTime - startTime;
71
+
72
+ if (elapsedTime >= duration) {
73
+ setAnimatedValue(actualTargetValue);
74
+ } else {
75
+ // Linear progress (0..1)
76
+ const progress = elapsedTime / duration;
77
+
78
+ // easeOutQuad easing
79
+ const easeProgress = 1 - (1 - progress) * (1 - progress);
80
+
81
+ // Interpolated value
82
+ const nextValue = currentValue + valueRange * easeProgress;
83
+
84
+ setAnimatedValue(nextValue);
85
+ animationFrame = requestAnimationFrame(animateValue);
86
+ }
87
+ };
88
+
89
+ animationFrame = requestAnimationFrame(animateValue);
90
+
91
+ return (): void => {
92
+ cancelAnimationFrame(animationFrame);
93
+ };
94
+ }, [actualTargetValue, duration, animate]);
95
+
96
+ return Math.round(animatedValue);
97
+ }