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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +27 -16
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +12 -2
  8. package/dist/components/alert.mjs +15 -6
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.mjs +4 -4
  14. package/dist/components/breadcrumb.d.mts +1 -0
  15. package/dist/components/breadcrumb.mjs +11 -10
  16. package/dist/components/button-group.d.mts +1 -1
  17. package/dist/components/button-group.mjs +6 -7
  18. package/dist/components/button.d.mts +0 -1
  19. package/dist/components/button.mjs +7 -7
  20. package/dist/components/calendar.d.mts +6 -2
  21. package/dist/components/calendar.mjs +39 -43
  22. package/dist/components/card.d.mts +4 -2
  23. package/dist/components/card.mjs +9 -9
  24. package/dist/components/carousel.d.mts +16 -4
  25. package/dist/components/carousel.mjs +24 -11
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +4 -4
  29. package/dist/components/checkbox-group.mjs +3 -4
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +6 -7
  32. package/dist/components/collapsible.d.mts +4 -4
  33. package/dist/components/collapsible.mjs +4 -5
  34. package/dist/components/command.d.mts +11 -1
  35. package/dist/components/command.mjs +35 -32
  36. package/dist/components/context-menu.d.mts +22 -15
  37. package/dist/components/context-menu.mjs +44 -39
  38. package/dist/components/dialog.d.mts +19 -23
  39. package/dist/components/dialog.mjs +48 -47
  40. package/dist/components/direction.d.mts +24 -0
  41. package/dist/components/direction.mjs +18 -0
  42. package/dist/components/drawer.d.mts +2 -20
  43. package/dist/components/drawer.mjs +17 -25
  44. package/dist/components/dropdown-menu.d.mts +22 -15
  45. package/dist/components/dropdown-menu.mjs +41 -37
  46. package/dist/components/empty.mjs +5 -5
  47. package/dist/components/field.d.mts +1 -1
  48. package/dist/components/field.mjs +11 -12
  49. package/dist/components/form.d.mts +6 -7
  50. package/dist/components/form.mjs +6 -7
  51. package/dist/components/hover-card.d.mts +5 -5
  52. package/dist/components/hover-card.mjs +14 -12
  53. package/dist/components/input-group.d.mts +1 -1
  54. package/dist/components/input-group.mjs +12 -7
  55. package/dist/components/input-number.d.mts +3 -1
  56. package/dist/components/input-number.mjs +49 -27
  57. package/dist/components/input-otp.mjs +9 -7
  58. package/dist/components/input-password.mjs +1 -4
  59. package/dist/components/input-search.mjs +3 -5
  60. package/dist/components/input.mjs +1 -2
  61. package/dist/components/item.mjs +9 -9
  62. package/dist/components/kbd.mjs +1 -1
  63. package/dist/components/label.d.mts +2 -2
  64. package/dist/components/label.mjs +3 -4
  65. package/dist/components/menubar.d.mts +22 -16
  66. package/dist/components/menubar.mjs +54 -47
  67. package/dist/components/native-select.d.mts +5 -1
  68. package/dist/components/native-select.mjs +9 -6
  69. package/dist/components/navigation-menu.d.mts +30 -8
  70. package/dist/components/navigation-menu.mjs +33 -23
  71. package/dist/components/pagination.d.mts +6 -0
  72. package/dist/components/pagination.mjs +26 -11
  73. package/dist/components/popover.d.mts +40 -7
  74. package/dist/components/popover.mjs +46 -14
  75. package/dist/components/progress-circle.d.mts +1 -1
  76. package/dist/components/progress-circle.mjs +1 -2
  77. package/dist/components/progress.d.mts +2 -2
  78. package/dist/components/progress.mjs +5 -6
  79. package/dist/components/radio-cards.d.mts +3 -3
  80. package/dist/components/radio-cards.mjs +11 -11
  81. package/dist/components/radio-group.d.mts +3 -3
  82. package/dist/components/radio-group.mjs +9 -9
  83. package/dist/components/radio.mjs +2 -3
  84. package/dist/components/resizable.mjs +3 -8
  85. package/dist/components/scroll-area.d.mts +5 -5
  86. package/dist/components/scroll-area.mjs +13 -10
  87. package/dist/components/select.d.mts +14 -14
  88. package/dist/components/select.mjs +47 -47
  89. package/dist/components/separator.d.mts +2 -2
  90. package/dist/components/separator.mjs +3 -4
  91. package/dist/components/sheet.d.mts +13 -14
  92. package/dist/components/sheet.mjs +41 -39
  93. package/dist/components/sidebar.d.mts +2 -3
  94. package/dist/components/sidebar.mjs +46 -46
  95. package/dist/components/skeleton.mjs +1 -1
  96. package/dist/components/slider.d.mts +2 -2
  97. package/dist/components/slider.mjs +9 -11
  98. package/dist/components/sonner.mjs +11 -3
  99. package/dist/components/spinner.mjs +6 -7
  100. package/dist/components/switch.d.mts +5 -2
  101. package/dist/components/switch.mjs +7 -7
  102. package/dist/components/table.mjs +10 -10
  103. package/dist/components/tabs.d.mts +8 -5
  104. package/dist/components/tabs.mjs +18 -12
  105. package/dist/components/textarea.mjs +1 -1
  106. package/dist/components/toggle-group.d.mts +9 -6
  107. package/dist/components/toggle-group.mjs +19 -20
  108. package/dist/components/toggle.d.mts +2 -3
  109. package/dist/components/toggle.mjs +4 -6
  110. package/dist/components/tooltip.d.mts +7 -6
  111. package/dist/components/tooltip.mjs +19 -17
  112. package/dist/hooks/use-animated-value.mjs +0 -1
  113. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  114. package/dist/hooks/use-is-mobile.mjs +0 -1
  115. package/dist/hooks/use-media-query.mjs +0 -1
  116. package/dist/hooks/use-mutation-observer.mjs +0 -1
  117. package/dist/hooks/use-pagination.mjs +0 -1
  118. package/dist/index.d.mts +15 -13
  119. package/dist/index.mjs +18 -16
  120. package/dist/primitives/checkbox-group.d.mts +9 -10
  121. package/dist/primitives/checkbox-group.mjs +14 -19
  122. package/dist/primitives/input-number.d.mts +3 -3
  123. package/dist/primitives/input-number.mjs +3 -5
  124. package/dist/primitives/input.d.mts +4 -4
  125. package/dist/primitives/input.mjs +2 -3
  126. package/dist/primitives/progress-circle.d.mts +3 -3
  127. package/dist/primitives/progress-circle.mjs +2 -3
  128. package/dist/variants/alert.d.mts +1 -1
  129. package/dist/variants/alert.mjs +3 -13
  130. package/dist/variants/badge.d.mts +6 -4
  131. package/dist/variants/badge.mjs +7 -34
  132. package/dist/variants/button-group.d.mts +2 -2
  133. package/dist/variants/button-group.mjs +3 -14
  134. package/dist/variants/button.d.mts +12 -10
  135. package/dist/variants/button.mjs +15 -57
  136. package/dist/variants/empty.d.mts +1 -1
  137. package/dist/variants/empty.mjs +2 -7
  138. package/dist/variants/field.d.mts +3 -3
  139. package/dist/variants/field.mjs +4 -22
  140. package/dist/variants/input-group.d.mts +9 -9
  141. package/dist/variants/input-group.mjs +11 -70
  142. package/dist/variants/input-number.d.mts +45 -0
  143. package/dist/variants/input-number.mjs +40 -0
  144. package/dist/variants/item.d.mts +5 -4
  145. package/dist/variants/item.mjs +9 -31
  146. package/dist/variants/navigation-menu.d.mts +1 -1
  147. package/dist/variants/navigation-menu.mjs +1 -5
  148. package/dist/variants/progress-circle.d.mts +1 -1
  149. package/dist/variants/progress-circle.mjs +1 -5
  150. package/dist/variants/scroll-area.d.mts +2 -2
  151. package/dist/variants/scroll-area.mjs +3 -8
  152. package/dist/variants/separator.mjs +6 -6
  153. package/dist/variants/sheet.d.mts +4 -4
  154. package/dist/variants/sheet.mjs +5 -38
  155. package/dist/variants/sidebar.d.mts +4 -4
  156. package/dist/variants/sidebar.mjs +6 -23
  157. package/dist/variants/tabs.d.mts +18 -0
  158. package/dist/variants/tabs.mjs +15 -0
  159. package/dist/variants/toggle.d.mts +4 -4
  160. package/dist/variants/toggle.mjs +9 -27
  161. package/package.json +27 -44
  162. package/src/components/accordion.tsx +26 -68
  163. package/src/components/alert-dialog.tsx +70 -86
  164. package/src/components/alert.tsx +27 -19
  165. package/src/components/aspect-ratio.tsx +1 -4
  166. package/src/components/avatar.tsx +99 -12
  167. package/src/components/badge.tsx +5 -8
  168. package/src/components/breadcrumb.tsx +18 -24
  169. package/src/components/button-group.tsx +10 -20
  170. package/src/components/button.tsx +8 -19
  171. package/src/components/calendar.tsx +77 -132
  172. package/src/components/card.tsx +16 -22
  173. package/src/components/carousel.tsx +38 -56
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +10 -30
  176. package/src/components/checkbox-group.tsx +5 -28
  177. package/src/components/checkbox.tsx +5 -26
  178. package/src/components/collapsible.tsx +1 -4
  179. package/src/components/command.tsx +52 -65
  180. package/src/components/context-menu.tsx +46 -125
  181. package/src/components/dialog.tsx +49 -101
  182. package/src/components/direction.tsx +32 -0
  183. package/src/components/drawer.tsx +17 -79
  184. package/src/components/dropdown-menu.tsx +39 -118
  185. package/src/components/empty.tsx +6 -20
  186. package/src/components/field.tsx +19 -52
  187. package/src/components/form.tsx +19 -61
  188. package/src/components/hover-card.tsx +4 -27
  189. package/src/components/input-group.tsx +13 -52
  190. package/src/components/input-number.tsx +55 -75
  191. package/src/components/input-otp.tsx +19 -38
  192. package/src/components/input-password.tsx +5 -29
  193. package/src/components/input-search.tsx +6 -23
  194. package/src/components/input.tsx +1 -17
  195. package/src/components/item.tsx +17 -31
  196. package/src/components/kbd.tsx +2 -14
  197. package/src/components/label.tsx +2 -10
  198. package/src/components/menubar.tsx +34 -125
  199. package/src/components/native-select.tsx +21 -30
  200. package/src/components/navigation-menu.tsx +34 -94
  201. package/src/components/pagination.tsx +28 -34
  202. package/src/components/popover.tsx +66 -35
  203. package/src/components/progress-circle.tsx +7 -25
  204. package/src/components/progress.tsx +3 -16
  205. package/src/components/radio-cards.tsx +8 -27
  206. package/src/components/radio-group.tsx +7 -27
  207. package/src/components/radio.tsx +3 -24
  208. package/src/components/resizable.tsx +5 -26
  209. package/src/components/scroll-area.tsx +12 -32
  210. package/src/components/select.tsx +36 -59
  211. package/src/components/separator.tsx +4 -18
  212. package/src/components/sheet.tsx +37 -74
  213. package/src/components/sidebar.tsx +47 -177
  214. package/src/components/skeleton.tsx +1 -3
  215. package/src/components/slider.tsx +7 -36
  216. package/src/components/sonner.tsx +16 -6
  217. package/src/components/spinner.tsx +6 -15
  218. package/src/components/switch.tsx +8 -30
  219. package/src/components/table.tsx +18 -35
  220. package/src/components/tabs.tsx +16 -34
  221. package/src/components/textarea.tsx +1 -15
  222. package/src/components/toggle-group.tsx +34 -38
  223. package/src/components/toggle.tsx +4 -13
  224. package/src/components/tooltip.tsx +11 -37
  225. package/src/css/foundation/base.css +50 -0
  226. package/src/css/foundation/motion.css +36 -0
  227. package/src/css/foundation/source.css +3 -0
  228. package/src/css/foundation/tokens.css +71 -0
  229. package/src/css/foundation/variants.css +113 -0
  230. package/src/css/preset.css +5 -214
  231. package/src/css/style.css +1 -1
  232. package/src/hooks/use-animated-value.ts +1 -7
  233. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  234. package/src/hooks/use-is-mobile.ts +0 -2
  235. package/src/hooks/use-media-query.ts +0 -2
  236. package/src/hooks/use-mutation-observer.ts +0 -3
  237. package/src/hooks/use-pagination.ts +0 -2
  238. package/src/index.ts +39 -80
  239. package/src/primitives/checkbox-group.tsx +25 -39
  240. package/src/primitives/input-number.tsx +17 -63
  241. package/src/primitives/input.tsx +8 -24
  242. package/src/primitives/progress-circle.tsx +13 -43
  243. package/src/variants/alert.ts +3 -14
  244. package/src/variants/badge.ts +8 -35
  245. package/src/variants/button-group.ts +5 -18
  246. package/src/variants/button.ts +21 -58
  247. package/src/variants/empty.ts +2 -11
  248. package/src/variants/field.ts +6 -19
  249. package/src/variants/input-group.ts +12 -64
  250. package/src/variants/input-number.ts +65 -0
  251. package/src/variants/item.ts +10 -32
  252. package/src/variants/navigation-menu.ts +1 -8
  253. package/src/variants/progress-circle.ts +1 -2
  254. package/src/variants/scroll-area.ts +3 -9
  255. package/src/variants/separator.ts +6 -7
  256. package/src/variants/sheet.ts +6 -39
  257. package/src/variants/sidebar.ts +7 -27
  258. package/src/variants/tabs.ts +34 -0
  259. package/src/variants/toggle.ts +9 -28
  260. /package/src/css/{amber.css → themes/amber.css} +0 -0
  261. /package/src/css/{blue.css → themes/blue.css} +0 -0
  262. /package/src/css/{cyan.css → themes/cyan.css} +0 -0
  263. /package/src/css/{emerald.css → themes/emerald.css} +0 -0
  264. /package/src/css/{fuchsia.css → themes/fuchsia.css} +0 -0
  265. /package/src/css/{gray.css → themes/gray.css} +0 -0
  266. /package/src/css/{green.css → themes/green.css} +0 -0
  267. /package/src/css/{indigo.css → themes/indigo.css} +0 -0
  268. /package/src/css/{lime.css → themes/lime.css} +0 -0
  269. /package/src/css/{neutral.css → themes/neutral.css} +0 -0
  270. /package/src/css/{orange.css → themes/orange.css} +0 -0
  271. /package/src/css/{pink.css → themes/pink.css} +0 -0
  272. /package/src/css/{purple.css → themes/purple.css} +0 -0
  273. /package/src/css/{red.css → themes/red.css} +0 -0
  274. /package/src/css/{rose.css → themes/rose.css} +0 -0
  275. /package/src/css/{sky.css → themes/sky.css} +0 -0
  276. /package/src/css/{slate.css → themes/slate.css} +0 -0
  277. /package/src/css/{stone.css → themes/stone.css} +0 -0
  278. /package/src/css/{teal.css → themes/teal.css} +0 -0
  279. /package/src/css/{violet.css → themes/violet.css} +0 -0
  280. /package/src/css/{yellow.css → themes/yellow.css} +0 -0
  281. /package/src/css/{zinc.css → themes/zinc.css} +0 -0
@@ -1,9 +1,7 @@
1
- "use client";
2
-
1
+ import { Tooltip as TooltipPrimitive } from "radix-ui";
3
2
  import type { ComponentProps, JSX } from "react";
4
3
 
5
4
  import { cn } from "#/lib/utils";
6
- import * as TooltipPrimitive from "@radix-ui/react-tooltip";
7
5
 
8
6
  /* -----------------------------------------------------------------------------
9
7
  * Component: TooltipProvider
@@ -17,8 +15,8 @@ type TooltipProviderProps = ComponentProps<typeof TooltipPrimitive.Provider>;
17
15
  /**
18
16
  * @since 0.3.16-canary.0
19
17
  */
20
- function TooltipProvider({ ...props }: TooltipProviderProps): JSX.Element {
21
- return <TooltipPrimitive.Provider data-slot="tooltip-provider" {...props} />;
18
+ function TooltipProvider({ delayDuration = 0, ...props }: TooltipProviderProps): JSX.Element {
19
+ return <TooltipPrimitive.Provider data-slot="tooltip-provider" delayDuration={delayDuration} {...props} />;
22
20
  }
23
21
 
24
22
  /* -----------------------------------------------------------------------------
@@ -65,35 +63,14 @@ type TooltipContentProps = ComponentProps<typeof TooltipPrimitive.Content>;
65
63
  /**
66
64
  * @since 0.3.16-canary.0
67
65
  */
68
- function TooltipContent({
69
- children,
70
- className,
71
- sideOffset = 4,
72
- ...props
73
- }: TooltipContentProps): JSX.Element {
66
+ function TooltipContent({ children, className, sideOffset = 0, ...props }: TooltipContentProps): JSX.Element {
74
67
  return (
75
- <TooltipPrimitive.Portal>
68
+ <TooltipPrimitive.Portal data-slot="tooltip-portal">
76
69
  <TooltipPrimitive.Content
77
70
  className={cn(
78
- "z-50",
79
- "w-fit max-w-(--radix-tooltip-content-available-width) px-3 py-1.5",
80
- "rounded-md",
81
- "bg-primary text-xs text-balance text-primary-foreground",
82
- "ease-snappy data-[state=delayed-open]:animate-in data-[state=delayed-open]:duration-150 data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95",
83
- "data-[state=delayed-open]:data-side-top:slide-in-from-bottom-2",
84
- "data-[state=delayed-open]:data-side-right:slide-in-from-left-2",
85
- "data-[state=delayed-open]:data-side-bottom:slide-in-from-top-2",
86
- "data-[state=delayed-open]:data-side-left:slide-in-from-right-2",
87
- "data-closed:animate-out data-closed:duration-100 data-closed:fade-out-0 data-closed:zoom-out-95",
88
- "data-closed:data-side-top:slide-out-to-bottom-2",
89
- "data-closed:data-side-right:slide-out-to-left-2",
90
- "data-closed:data-side-bottom:slide-out-to-top-2",
91
- "data-closed:data-side-left:slide-out-to-right-2",
92
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
93
- "origin-(--radix-tooltip-content-transform-origin)",
71
+ "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background ease-snappy has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2 data-delayed-open:animate-in data-delayed-open:animation-duration-menu-in data-delayed-open:fade-in-0 data-delayed-open:zoom-in-95 data-delayed-open:data-side-top:slide-in-from-bottom-2 data-delayed-open:data-side-right:slide-in-from-left-2 data-delayed-open:data-side-bottom:slide-in-from-top-2 data-delayed-open:data-side-left:slide-in-from-right-2",
94
72
  className,
95
73
  )}
96
- collisionPadding={8}
97
74
  data-slot="tooltip-content"
98
75
  sideOffset={sideOffset}
99
76
  {...props}
@@ -120,7 +97,10 @@ type TooltipArrowProps = ComponentProps<typeof TooltipPrimitive.Arrow>;
120
97
  function TooltipArrow({ className, ...props }: TooltipArrowProps): JSX.Element {
121
98
  return (
122
99
  <TooltipPrimitive.Arrow
123
- className={cn("fill-primary", className)}
100
+ className={cn(
101
+ "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs bg-foreground fill-foreground",
102
+ className,
103
+ )}
124
104
  data-slot="tooltip-arrow"
125
105
  {...props}
126
106
  />
@@ -132,10 +112,4 @@ function TooltipArrow({ className, ...props }: TooltipArrowProps): JSX.Element {
132
112
  * -------------------------------------------------------------------------- */
133
113
 
134
114
  export { Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipTrigger };
135
- export type {
136
- TooltipArrowProps,
137
- TooltipContentProps,
138
- TooltipProps,
139
- TooltipProviderProps,
140
- TooltipTriggerProps,
141
- };
115
+ export type { TooltipArrowProps, TooltipContentProps, TooltipProps, TooltipProviderProps, TooltipTriggerProps };
@@ -0,0 +1,50 @@
1
+ @layer base {
2
+ *,
3
+ ::after,
4
+ ::before,
5
+ ::backdrop,
6
+ ::file-selector-button {
7
+ border-color: var(--color-border);
8
+ outline-color: --alpha(var(--color-ring) / 20%);
9
+ }
10
+
11
+ ::-webkit-scrollbar {
12
+ @apply size-2;
13
+ }
14
+
15
+ ::-webkit-scrollbar-track {
16
+ @apply bg-transparent;
17
+ }
18
+
19
+ ::-webkit-scrollbar-thumb {
20
+ @apply rounded-full bg-border;
21
+ }
22
+
23
+ * {
24
+ scrollbar-width: thin;
25
+ scrollbar-color: var(--color-border) transparent;
26
+ }
27
+
28
+ html,
29
+ body {
30
+ background-color: var(--color-background);
31
+ color: var(--color-foreground);
32
+ }
33
+
34
+ input {
35
+ &::-webkit-search-cancel-button,
36
+ &::-webkit-search-decoration {
37
+ appearance: none;
38
+ }
39
+
40
+ &::-webkit-outer-spin-button,
41
+ &::-webkit-inner-spin-button {
42
+ -webkit-appearance: none;
43
+ margin: 0;
44
+ }
45
+
46
+ &[type="number"] {
47
+ -moz-appearance: textfield;
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,36 @@
1
+ @theme {
2
+ /* Enter curves — decelerate into place. */
3
+ --ease-ui: cubic-bezier(0.32, 0.72, 0, 1); /* large surfaces: dialog, sheet */
4
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* playful overshoot, opt-in */
5
+ --ease-snappy: cubic-bezier(0.23, 1, 0.32, 1); /* small popups: menu, tooltip */
6
+ --ease-gentle: cubic-bezier(0.4, 0, 0.2, 1); /* continuous layout shifts, fades */
7
+
8
+ /* Exit curve — accelerate away; pair with data-closed:. */
9
+ --ease-exit: cubic-bezier(0.4, 0, 1, 1);
10
+
11
+ /*
12
+ * Semantic durations — enter/exit pairs per surface role.
13
+ * Exit ≈ 60% of enter to offset the slow start of the accelerating exit curve.
14
+ */
15
+ --animation-duration-menu-in: 150ms; /* menus, tooltip — instant tools */
16
+ --animation-duration-menu-out: 100ms;
17
+ --animation-duration-popup-in: 200ms; /* popover, hover card — content surfaces */
18
+ --animation-duration-popup-out: 120ms;
19
+ --animation-duration-overlay-in: 220ms; /* dialog content + backdrop */
20
+ --animation-duration-overlay-out: 150ms;
21
+ --animation-duration-panel-in: 320ms; /* sheet, drawer — large sliding panels */
22
+ --animation-duration-panel-out: 220ms;
23
+ --animation-duration-expand-in: 200ms; /* accordion, inline disclosure */
24
+ --animation-duration-expand-out: 150ms;
25
+
26
+ --animate-shimmer: shimmer 2.2s linear infinite;
27
+
28
+ @keyframes shimmer {
29
+ from {
30
+ background-position: 200% center;
31
+ }
32
+ to {
33
+ background-position: -200% center;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,3 @@
1
+ @import "tw-animate-css";
2
+
3
+ @source "../../**/*.{ts,tsx}";
@@ -0,0 +1,71 @@
1
+ :root {
2
+ --radius: 0.375rem;
3
+ }
4
+
5
+ @theme inline {
6
+ --font-sans: var(--font-sans);
7
+ --font-heading: var(--font-heading);
8
+ --font-mono: var(--font-mono);
9
+
10
+ --color-background: var(--background);
11
+ --color-foreground: var(--foreground);
12
+
13
+ --color-primary: var(--primary);
14
+ --color-primary-foreground: var(--primary-foreground);
15
+
16
+ --color-secondary: var(--secondary);
17
+ --color-secondary-foreground: var(--secondary-foreground);
18
+
19
+ --color-destructive: var(--destructive);
20
+
21
+ --color-muted: var(--muted);
22
+ --color-muted-foreground: var(--muted-foreground);
23
+
24
+ --color-accent: var(--accent);
25
+ --color-accent-foreground: var(--accent-foreground);
26
+
27
+ --color-popover: var(--popover);
28
+ --color-popover-foreground: var(--popover-foreground);
29
+
30
+ --color-card: var(--card);
31
+ --color-card-foreground: var(--card-foreground);
32
+
33
+ --color-border: var(--border);
34
+ --color-input: var(--input);
35
+ --color-ring: var(--ring);
36
+
37
+ --color-sidebar: var(--sidebar);
38
+ --color-sidebar-foreground: var(--sidebar-foreground);
39
+ --color-sidebar-primary: var(--sidebar-primary);
40
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
41
+ --color-sidebar-accent: var(--sidebar-accent);
42
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
43
+ --color-sidebar-border: var(--sidebar-border);
44
+ --color-sidebar-ring: var(--sidebar-ring);
45
+
46
+ --color-chart-1: var(--chart-1);
47
+ --color-chart-2: var(--chart-2);
48
+ --color-chart-3: var(--chart-3);
49
+ --color-chart-4: var(--chart-4);
50
+ --color-chart-5: var(--chart-5);
51
+
52
+ --color-surface: var(--surface);
53
+ --color-surface-foreground: var(--surface-foreground);
54
+
55
+ --color-code: var(--code);
56
+ --color-code-foreground: var(--code-foreground);
57
+ --color-code-highlight: var(--code-highlight);
58
+ --color-code-number: var(--code-number);
59
+
60
+ --color-selection: var(--selection);
61
+ --color-selection-foreground: var(--selection-foreground);
62
+
63
+ --radius-xs: calc(var(--radius) * 2 / 6);
64
+ --radius-sm: calc(var(--radius) * 4 / 6);
65
+ --radius-md: var(--radius);
66
+ --radius-lg: calc(var(--radius) * 8 / 6);
67
+ --radius-xl: calc(var(--radius) * 12 / 6);
68
+ --radius-2xl: calc(var(--radius) * 16 / 6);
69
+ --radius-3xl: calc(var(--radius) * 24 / 6);
70
+ --radius-4xl: calc(var(--radius) * 32 / 6);
71
+ }
@@ -0,0 +1,113 @@
1
+ /*
2
+ * Custom Tailwind variants for @codefast/ui.
3
+ *
4
+ * Shorthand usage (composes with group-, peer-, in-, has- modifiers):
5
+ * data-open: → [data-state="open"] or [data-open]:not([data-open="false"])
6
+ * group-data-disabled: → ancestor .group with matching data-disabled
7
+ * in-data-side-left: → ancestor with [data-side="left"]
8
+ *
9
+ * Prefer these over verbose arbitrary variants (data-[state=open]:, data-[side=left]:).
10
+ */
11
+
12
+ /* -------------------------------------------------------------------------
13
+ * Theme
14
+ * ------------------------------------------------------------------------- */
15
+
16
+ @custom-variant dark {
17
+ &:where(.dark, .dark *) {
18
+ @slot;
19
+ }
20
+
21
+ @media (prefers-color-scheme: dark) {
22
+ &:where(:not(.light, .light *)) {
23
+ @slot;
24
+ }
25
+ }
26
+ }
27
+
28
+ /* -------------------------------------------------------------------------
29
+ * Layout — orientation & placement (Radix Popper)
30
+ * ------------------------------------------------------------------------- */
31
+
32
+ @custom-variant data-horizontal (&:where([data-orientation="horizontal"]));
33
+ @custom-variant data-vertical (&:where([data-orientation="vertical"]));
34
+
35
+ @custom-variant data-side-top (&:where([data-side="top"]));
36
+ @custom-variant data-side-right (&:where([data-side="right"]));
37
+ @custom-variant data-side-bottom (&:where([data-side="bottom"]));
38
+ @custom-variant data-side-left (&:where([data-side="left"]));
39
+
40
+ /* -------------------------------------------------------------------------
41
+ * State — boolean & Radix data-state
42
+ *
43
+ * Block variants match both Radix data-state="…" and boolean data-* attrs
44
+ * so components can use one shorthand regardless of attribute source.
45
+ * ------------------------------------------------------------------------- */
46
+
47
+ /* Matches Radix data-state="open" and boolean data-open (not "false"). */
48
+ @custom-variant data-open {
49
+ &:where([data-state="open"]),
50
+ &:where([data-open]:not([data-open="false"])) {
51
+ @slot;
52
+ }
53
+ }
54
+
55
+ @custom-variant data-closed {
56
+ &:where([data-state="closed"]),
57
+ &:where([data-closed]:not([data-closed="false"])) {
58
+ @slot;
59
+ }
60
+ }
61
+
62
+ @custom-variant data-checked {
63
+ &:where([data-state="checked"]),
64
+ &:where([data-checked]:not([data-checked="false"])) {
65
+ @slot;
66
+ }
67
+ }
68
+
69
+ @custom-variant data-unchecked {
70
+ &:where([data-state="unchecked"]),
71
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
72
+ @slot;
73
+ }
74
+ }
75
+
76
+ /* data-selected only matches explicit true, not bare data-selected. */
77
+ @custom-variant data-selected {
78
+ &:where([data-state="selected"]),
79
+ &:where([data-selected="true"]) {
80
+ @slot;
81
+ }
82
+ }
83
+
84
+ @custom-variant data-active {
85
+ &:where([data-state="active"]),
86
+ &:where([data-active]:not([data-active="false"])) {
87
+ @slot;
88
+ }
89
+ }
90
+
91
+ @custom-variant data-disabled {
92
+ &:where([data-disabled="true"]),
93
+ &:where([data-disabled]:not([data-disabled="false"])) {
94
+ @slot;
95
+ }
96
+ }
97
+
98
+ @custom-variant data-focused {
99
+ &:where([data-focused="true"]),
100
+ &:where([data-focused]:not([data-focused="false"])) {
101
+ @slot;
102
+ }
103
+ }
104
+
105
+ /* -------------------------------------------------------------------------
106
+ * State — Radix-only (no boolean data-* equivalent)
107
+ * ------------------------------------------------------------------------- */
108
+
109
+ @custom-variant data-on (&:where([data-state="on"]));
110
+ @custom-variant data-collapsed (&:where([data-state="collapsed"]));
111
+ @custom-variant data-hidden (&:where([data-state="hidden"]));
112
+ @custom-variant data-visible (&:where([data-state="visible"]));
113
+ @custom-variant data-delayed-open (&:where([data-state="delayed-open"]));
@@ -1,214 +1,5 @@
1
- @import "tw-animate-css";
2
-
3
- @source "../../dist/**/*.{js,mjs}";
4
-
5
- @custom-variant dark {
6
- &:where(.dark, .dark *) {
7
- @slot;
8
- }
9
-
10
- @media (prefers-color-scheme: dark) {
11
- &:where(:not(.light, .light *)) {
12
- @slot;
13
- }
14
- }
15
- }
16
-
17
- @custom-variant data-horizontal (&:where([data-orientation="horizontal"]));
18
- @custom-variant data-vertical (&:where([data-orientation="vertical"]));
19
-
20
- @custom-variant data-side-top (&:where([data-side="top"]));
21
- @custom-variant data-side-right (&:where([data-side="right"]));
22
- @custom-variant data-side-bottom (&:where([data-side="bottom"]));
23
- @custom-variant data-side-left (&:where([data-side="left"]));
24
-
25
- @custom-variant data-open {
26
- &:where([data-state="open"]),
27
- &:where([data-open]:not([data-open="false"])) {
28
- @slot;
29
- }
30
- }
31
-
32
- @custom-variant data-closed {
33
- &:where([data-state="closed"]),
34
- &:where([data-closed]:not([data-closed="false"])) {
35
- @slot;
36
- }
37
- }
38
-
39
- @custom-variant data-checked {
40
- &:where([data-state="checked"]),
41
- &:where([data-checked]:not([data-checked="false"])) {
42
- @slot;
43
- }
44
- }
45
-
46
- @custom-variant data-unchecked {
47
- &:where([data-state="unchecked"]),
48
- &:where([data-unchecked]:not([data-unchecked="false"])) {
49
- @slot;
50
- }
51
- }
52
-
53
- @custom-variant data-selected {
54
- &:where([data-state="selected"]),
55
- &:where([data-selected="true"]) {
56
- @slot;
57
- }
58
- }
59
-
60
- @custom-variant data-active {
61
- &:where([data-state="active"]),
62
- &:where([data-active]:not([data-active="false"])) {
63
- @slot;
64
- }
65
- }
66
-
67
- @custom-variant data-disabled {
68
- &:where([data-disabled="true"]),
69
- &:where([data-disabled]:not([data-disabled="false"])) {
70
- @slot;
71
- }
72
- }
73
-
74
- @custom-variant data-focused {
75
- &:where([data-focused="true"]),
76
- &:where([data-focused]:not([data-focused="false"])) {
77
- @slot;
78
- }
79
- }
80
-
81
- @utility no-scrollbar {
82
- -ms-overflow-style: none;
83
- scrollbar-width: none;
84
-
85
- &::-webkit-scrollbar {
86
- display: none;
87
- }
88
- }
89
-
90
- :root {
91
- --radius: 0.375rem;
92
- }
93
-
94
- @theme inline {
95
- --color-background: var(--background);
96
- --color-foreground: var(--foreground);
97
-
98
- --color-primary: var(--primary);
99
- --color-primary-foreground: var(--primary-foreground);
100
-
101
- --color-secondary: var(--secondary);
102
- --color-secondary-foreground: var(--secondary-foreground);
103
-
104
- --color-destructive: var(--destructive);
105
-
106
- --color-muted: var(--muted);
107
- --color-muted-foreground: var(--muted-foreground);
108
-
109
- --color-accent: var(--accent);
110
- --color-accent-foreground: var(--accent-foreground);
111
-
112
- --color-popover: var(--popover);
113
- --color-popover-foreground: var(--popover-foreground);
114
-
115
- --color-card: var(--card);
116
- --color-card-foreground: var(--card-foreground);
117
-
118
- --color-border: var(--border);
119
- --color-input: var(--input);
120
- --color-ring: var(--ring);
121
-
122
- --color-sidebar: var(--sidebar);
123
- --color-sidebar-foreground: var(--sidebar-foreground);
124
- --color-sidebar-primary: var(--sidebar-primary);
125
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
126
- --color-sidebar-accent: var(--sidebar-accent);
127
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
128
- --color-sidebar-border: var(--sidebar-border);
129
- --color-sidebar-ring: var(--sidebar-ring);
130
-
131
- --color-chart-1: var(--chart-1);
132
- --color-chart-2: var(--chart-2);
133
- --color-chart-3: var(--chart-3);
134
- --color-chart-4: var(--chart-4);
135
- --color-chart-5: var(--chart-5);
136
-
137
- --radius-xs: calc(var(--radius) * 2 / 6);
138
- --radius-sm: calc(var(--radius) * 4 / 6);
139
- --radius-md: var(--radius);
140
- --radius-lg: calc(var(--radius) * 8 / 6);
141
- --radius-xl: calc(var(--radius) * 12 / 6);
142
- --radius-2xl: calc(var(--radius) * 16 / 6);
143
- --radius-3xl: calc(var(--radius) * 24 / 6);
144
- --radius-4xl: calc(var(--radius) * 32 / 6);
145
- }
146
-
147
- @theme {
148
- --ease-ui: cubic-bezier(0.32, 0.72, 0, 1);
149
- --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
150
- --ease-snappy: cubic-bezier(0.23, 1, 0.32, 1);
151
- --ease-gentle: cubic-bezier(0.4, 0, 0.2, 1);
152
-
153
- --animate-shimmer: shimmer 2.2s linear infinite;
154
-
155
- @keyframes shimmer {
156
- from {
157
- background-position: 200% center;
158
- }
159
- to {
160
- background-position: -200% center;
161
- }
162
- }
163
- }
164
-
165
- @layer base {
166
- *,
167
- ::after,
168
- ::before,
169
- ::backdrop,
170
- ::file-selector-button {
171
- border-color: var(--color-border);
172
- outline-color: --alpha(var(--color-ring) / 20%);
173
- }
174
-
175
- ::-webkit-scrollbar {
176
- @apply size-2;
177
- }
178
-
179
- ::-webkit-scrollbar-track {
180
- @apply bg-transparent;
181
- }
182
-
183
- ::-webkit-scrollbar-thumb {
184
- @apply rounded-full bg-border;
185
- }
186
-
187
- * {
188
- scrollbar-width: thin;
189
- scrollbar-color: var(--color-border) transparent;
190
- }
191
-
192
- html,
193
- body {
194
- background-color: var(--color-background);
195
- color: var(--color-foreground);
196
- }
197
-
198
- input {
199
- &::-webkit-search-cancel-button,
200
- &::-webkit-search-decoration {
201
- appearance: none;
202
- }
203
-
204
- &::-webkit-outer-spin-button,
205
- &::-webkit-inner-spin-button {
206
- -webkit-appearance: none;
207
- margin: 0;
208
- }
209
-
210
- &[type="number"] {
211
- -moz-appearance: textfield;
212
- }
213
- }
214
- }
1
+ @import "./foundation/source.css";
2
+ @import "./foundation/variants.css";
3
+ @import "./foundation/tokens.css";
4
+ @import "./foundation/motion.css";
5
+ @import "./foundation/base.css";
package/src/css/style.css CHANGED
@@ -1,3 +1,3 @@
1
1
  @import "tailwindcss";
2
- @import "./neutral.css";
2
+ @import "./themes/neutral.css";
3
3
  @import "./preset.css";
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  import { useEffect, useRef, useState } from "react";
4
2
 
5
3
  /**
@@ -21,11 +19,7 @@ import { useEffect, useRef, useState } from "react";
21
19
  *
22
20
  * @since 0.3.16-canary.0
23
21
  */
24
- export function useAnimatedValue(
25
- targetValue: null | number,
26
- duration: number,
27
- animate?: boolean,
28
- ): number {
22
+ export function useAnimatedValue(targetValue: null | number, duration: number, animate?: boolean): number {
29
23
  // Default to 0 when targetValue is null
30
24
  const actualTargetValue = targetValue ?? 0;
31
25
 
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  import { useState } from "react";
4
2
 
5
3
  /**
@@ -21,10 +19,7 @@ import { useState } from "react";
21
19
  *
22
20
  * @since 0.3.16-canary.0
23
21
  */
24
- export function useCopyToClipboard({
25
- onCopy,
26
- timeout = 2000,
27
- }: { onCopy?: () => void; timeout?: number } = {}): {
22
+ export function useCopyToClipboard({ onCopy, timeout = 2000 }: { onCopy?: () => void; timeout?: number } = {}): {
28
23
  copyToClipboard: (value: string) => Promise<void>;
29
24
  isCopied: boolean;
30
25
  } {
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  import { useMediaQuery } from "#/hooks/use-media-query";
4
2
 
5
3
  /**
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  import { useEffect, useState } from "react";
4
2
 
5
3
  /**
@@ -1,7 +1,4 @@
1
- "use client";
2
-
3
1
  import type { RefObject } from "react";
4
-
5
2
  import { useEffect } from "react";
6
3
 
7
4
  /**
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  import { useMemo } from "react";
4
2
 
5
3
  /**