@health-samurai/react-components 0.0.0-alpha.4 → 0.0.0-alpha.5

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 (239) hide show
  1. package/dist/bundle.css +687 -446
  2. package/dist/src/components/code-editor/http/grammar/http.d.ts +3 -0
  3. package/dist/src/components/code-editor/http/grammar/http.d.ts.map +1 -0
  4. package/dist/src/components/code-editor/http/grammar/http.grammar +74 -0
  5. package/dist/src/components/code-editor/http/grammar/http.js +38 -0
  6. package/dist/src/components/code-editor/http/grammar/http.js.map +1 -0
  7. package/dist/src/components/code-editor/http/grammar/http.terms.d.ts +2 -0
  8. package/dist/src/components/code-editor/http/grammar/http.terms.d.ts.map +1 -0
  9. package/dist/src/components/code-editor/http/grammar/http.terms.js +4 -0
  10. package/dist/src/components/code-editor/http/grammar/http.terms.js.map +1 -0
  11. package/dist/src/components/code-editor/http/grammar/http.test.d.ts +2 -0
  12. package/dist/src/components/code-editor/http/grammar/http.test.d.ts.map +1 -0
  13. package/dist/src/components/code-editor/http/grammar/http.test.js +80 -0
  14. package/dist/src/components/code-editor/http/grammar/http.test.js.map +1 -0
  15. package/dist/src/components/code-editor/http/index.d.ts +4 -0
  16. package/dist/src/components/code-editor/http/index.d.ts.map +1 -0
  17. package/dist/src/components/code-editor/http/index.js +66 -0
  18. package/dist/src/components/code-editor/http/index.js.map +1 -0
  19. package/dist/src/components/code-editor/index.d.ts +13 -2
  20. package/dist/src/components/code-editor/index.d.ts.map +1 -1
  21. package/dist/src/components/code-editor/index.js +161 -20
  22. package/dist/src/components/code-editor/index.js.map +1 -1
  23. package/dist/src/components/code-editor.stories.js +3 -1
  24. package/dist/src/components/code-editor.stories.js.map +1 -1
  25. package/dist/src/components/request-line-editor.d.ts +11 -35
  26. package/dist/src/components/request-line-editor.d.ts.map +1 -1
  27. package/dist/src/components/request-line-editor.js +51 -49
  28. package/dist/src/components/request-line-editor.js.map +1 -1
  29. package/dist/src/components/request-line-editor.stories.d.ts.map +1 -1
  30. package/dist/src/components/request-line-editor.stories.js +17 -53
  31. package/dist/src/components/request-line-editor.stories.js.map +1 -1
  32. package/dist/src/components/tree-view.d.ts +16 -0
  33. package/dist/src/components/tree-view.d.ts.map +1 -0
  34. package/dist/src/components/tree-view.js +67 -0
  35. package/dist/src/components/tree-view.js.map +1 -0
  36. package/dist/src/components/tree-view.stories.d.ts +13 -0
  37. package/dist/src/components/tree-view.stories.d.ts.map +1 -0
  38. package/dist/src/components/tree-view.stories.js +274 -0
  39. package/dist/src/components/tree-view.stories.js.map +1 -0
  40. package/dist/src/icons.d.ts +3 -0
  41. package/dist/src/icons.d.ts.map +1 -0
  42. package/dist/src/icons.js +47 -0
  43. package/dist/src/icons.js.map +1 -0
  44. package/dist/src/index.css +42 -3
  45. package/dist/src/index.d.ts +1 -1
  46. package/dist/src/index.d.ts.map +1 -1
  47. package/dist/src/index.js +1 -1
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/shadcn/components/ui/accordion.d.ts.map +1 -1
  50. package/dist/src/shadcn/components/ui/accordion.js +23 -5
  51. package/dist/src/shadcn/components/ui/accordion.js.map +1 -1
  52. package/dist/src/shadcn/components/ui/alert.d.ts.map +1 -1
  53. package/dist/src/shadcn/components/ui/alert.js +12 -5
  54. package/dist/src/shadcn/components/ui/alert.js.map +1 -1
  55. package/dist/src/shadcn/components/ui/avatar.d.ts.map +1 -1
  56. package/dist/src/shadcn/components/ui/avatar.js +4 -3
  57. package/dist/src/shadcn/components/ui/avatar.js.map +1 -1
  58. package/dist/src/shadcn/components/ui/badge.d.ts.map +1 -1
  59. package/dist/src/shadcn/components/ui/badge.js +16 -5
  60. package/dist/src/shadcn/components/ui/badge.js.map +1 -1
  61. package/dist/src/shadcn/components/ui/breadcrumb.d.ts.map +1 -1
  62. package/dist/src/shadcn/components/ui/breadcrumb.js +6 -6
  63. package/dist/src/shadcn/components/ui/breadcrumb.js.map +1 -1
  64. package/dist/src/shadcn/components/ui/button.d.ts.map +1 -1
  65. package/dist/src/shadcn/components/ui/button.js +19 -11
  66. package/dist/src/shadcn/components/ui/button.js.map +1 -1
  67. package/dist/src/shadcn/components/ui/card.d.ts.map +1 -1
  68. package/dist/src/shadcn/components/ui/card.js +14 -6
  69. package/dist/src/shadcn/components/ui/card.js.map +1 -1
  70. package/dist/src/shadcn/components/ui/checkbox.d.ts.map +1 -1
  71. package/dist/src/shadcn/components/ui/checkbox.js +20 -5
  72. package/dist/src/shadcn/components/ui/checkbox.js.map +1 -1
  73. package/dist/src/shadcn/components/ui/checkbox.stories.d.ts.map +1 -1
  74. package/dist/src/shadcn/components/ui/checkbox.stories.js +44 -35
  75. package/dist/src/shadcn/components/ui/checkbox.stories.js.map +1 -1
  76. package/dist/src/shadcn/components/ui/combobox.d.ts +18 -0
  77. package/dist/src/shadcn/components/ui/combobox.d.ts.map +1 -0
  78. package/dist/src/shadcn/components/ui/combobox.js +121 -0
  79. package/dist/src/shadcn/components/ui/combobox.js.map +1 -0
  80. package/dist/src/shadcn/components/ui/combobox.stories.d.ts +11 -0
  81. package/dist/src/shadcn/components/ui/combobox.stories.d.ts.map +1 -0
  82. package/dist/src/shadcn/components/ui/combobox.stories.js +16 -0
  83. package/dist/src/shadcn/components/ui/combobox.stories.js.map +1 -0
  84. package/dist/src/shadcn/components/ui/command.d.ts.map +1 -1
  85. package/dist/src/shadcn/components/ui/command.js +73 -12
  86. package/dist/src/shadcn/components/ui/command.js.map +1 -1
  87. package/dist/src/shadcn/components/ui/command.stories.js +0 -1
  88. package/dist/src/shadcn/components/ui/command.stories.js.map +1 -1
  89. package/dist/src/shadcn/components/ui/dialog.d.ts.map +1 -1
  90. package/dist/src/shadcn/components/ui/dialog.js +35 -7
  91. package/dist/src/shadcn/components/ui/dialog.js.map +1 -1
  92. package/dist/src/shadcn/components/ui/drawer.d.ts.map +1 -1
  93. package/dist/src/shadcn/components/ui/drawer.js +26 -5
  94. package/dist/src/shadcn/components/ui/drawer.js.map +1 -1
  95. package/dist/src/shadcn/components/ui/dropdown-menu.d.ts.map +1 -1
  96. package/dist/src/shadcn/components/ui/dropdown-menu.js +12 -1
  97. package/dist/src/shadcn/components/ui/dropdown-menu.js.map +1 -1
  98. package/dist/src/shadcn/components/ui/form.d.ts.map +1 -1
  99. package/dist/src/shadcn/components/ui/form.js +12 -4
  100. package/dist/src/shadcn/components/ui/form.js.map +1 -1
  101. package/dist/src/shadcn/components/ui/input.d.ts.map +1 -1
  102. package/dist/src/shadcn/components/ui/input.js +87 -16
  103. package/dist/src/shadcn/components/ui/input.js.map +1 -1
  104. package/dist/src/shadcn/components/ui/label.d.ts.map +1 -1
  105. package/dist/src/shadcn/components/ui/label.js +8 -1
  106. package/dist/src/shadcn/components/ui/label.js.map +1 -1
  107. package/dist/src/shadcn/components/ui/menubar.d.ts.map +1 -1
  108. package/dist/src/shadcn/components/ui/menubar.js +35 -13
  109. package/dist/src/shadcn/components/ui/menubar.js.map +1 -1
  110. package/dist/src/shadcn/components/ui/pagination.d.ts.map +1 -1
  111. package/dist/src/shadcn/components/ui/pagination.js +6 -6
  112. package/dist/src/shadcn/components/ui/pagination.js.map +1 -1
  113. package/dist/src/shadcn/components/ui/popover.d.ts.map +1 -1
  114. package/dist/src/shadcn/components/ui/popover.js +12 -1
  115. package/dist/src/shadcn/components/ui/popover.js.map +1 -1
  116. package/dist/src/shadcn/components/ui/progress.d.ts.map +1 -1
  117. package/dist/src/shadcn/components/ui/progress.js +6 -2
  118. package/dist/src/shadcn/components/ui/progress.js.map +1 -1
  119. package/dist/src/shadcn/components/ui/radio-group.d.ts.map +1 -1
  120. package/dist/src/shadcn/components/ui/radio-group.js +11 -6
  121. package/dist/src/shadcn/components/ui/radio-group.js.map +1 -1
  122. package/dist/src/shadcn/components/ui/radio-group.stories.d.ts.map +1 -1
  123. package/dist/src/shadcn/components/ui/radio-group.stories.js +57 -34
  124. package/dist/src/shadcn/components/ui/radio-group.stories.js.map +1 -1
  125. package/dist/src/shadcn/components/ui/scroll-area.d.ts.map +1 -1
  126. package/dist/src/shadcn/components/ui/scroll-area.js +9 -3
  127. package/dist/src/shadcn/components/ui/scroll-area.js.map +1 -1
  128. package/dist/src/shadcn/components/ui/select.d.ts.map +1 -1
  129. package/dist/src/shadcn/components/ui/select.js +49 -14
  130. package/dist/src/shadcn/components/ui/select.js.map +1 -1
  131. package/dist/src/shadcn/components/ui/select.stories.d.ts.map +1 -1
  132. package/dist/src/shadcn/components/ui/select.stories.js +1 -4
  133. package/dist/src/shadcn/components/ui/select.stories.js.map +1 -1
  134. package/dist/src/shadcn/components/ui/separator.d.ts.map +1 -1
  135. package/dist/src/shadcn/components/ui/separator.js +7 -1
  136. package/dist/src/shadcn/components/ui/separator.js.map +1 -1
  137. package/dist/src/shadcn/components/ui/sidebar.d.ts.map +1 -1
  138. package/dist/src/shadcn/components/ui/sidebar.js +20 -6
  139. package/dist/src/shadcn/components/ui/sidebar.js.map +1 -1
  140. package/dist/src/shadcn/components/ui/skeleton.d.ts.map +1 -1
  141. package/dist/src/shadcn/components/ui/skeleton.js +3 -1
  142. package/dist/src/shadcn/components/ui/skeleton.js.map +1 -1
  143. package/dist/src/shadcn/components/ui/slider.d.ts.map +1 -1
  144. package/dist/src/shadcn/components/ui/slider.js +34 -4
  145. package/dist/src/shadcn/components/ui/slider.js.map +1 -1
  146. package/dist/src/shadcn/components/ui/sonner.d.ts +16 -1
  147. package/dist/src/shadcn/components/ui/sonner.d.ts.map +1 -1
  148. package/dist/src/shadcn/components/ui/sonner.js +23 -3
  149. package/dist/src/shadcn/components/ui/sonner.js.map +1 -1
  150. package/dist/src/shadcn/components/ui/sonner.stories.d.ts.map +1 -1
  151. package/dist/src/shadcn/components/ui/sonner.stories.js +19 -11
  152. package/dist/src/shadcn/components/ui/sonner.stories.js.map +1 -1
  153. package/dist/src/shadcn/components/ui/switch.d.ts.map +1 -1
  154. package/dist/src/shadcn/components/ui/switch.js +18 -2
  155. package/dist/src/shadcn/components/ui/switch.js.map +1 -1
  156. package/dist/src/shadcn/components/ui/table.d.ts.map +1 -1
  157. package/dist/src/shadcn/components/ui/table.js +12 -8
  158. package/dist/src/shadcn/components/ui/table.js.map +1 -1
  159. package/dist/src/shadcn/components/ui/tabs.d.ts +21 -3
  160. package/dist/src/shadcn/components/ui/tabs.d.ts.map +1 -1
  161. package/dist/src/shadcn/components/ui/tabs.js +314 -9
  162. package/dist/src/shadcn/components/ui/tabs.js.map +1 -1
  163. package/dist/src/shadcn/components/ui/tabs.stories.d.ts.map +1 -1
  164. package/dist/src/shadcn/components/ui/tabs.stories.js +50 -1
  165. package/dist/src/shadcn/components/ui/tabs.stories.js.map +1 -1
  166. package/dist/src/shadcn/components/ui/textarea.d.ts.map +1 -1
  167. package/dist/src/shadcn/components/ui/textarea.js +15 -1
  168. package/dist/src/shadcn/components/ui/textarea.js.map +1 -1
  169. package/dist/src/shadcn/components/ui/toggle-group.d.ts.map +1 -1
  170. package/dist/src/shadcn/components/ui/toggle-group.js +6 -2
  171. package/dist/src/shadcn/components/ui/toggle-group.js.map +1 -1
  172. package/dist/src/shadcn/components/ui/toggle.d.ts.map +1 -1
  173. package/dist/src/shadcn/components/ui/toggle.js +18 -6
  174. package/dist/src/shadcn/components/ui/toggle.js.map +1 -1
  175. package/dist/src/shadcn/components/ui/tooltip.d.ts.map +1 -1
  176. package/dist/src/shadcn/components/ui/tooltip.js +11 -1
  177. package/dist/src/shadcn/components/ui/tooltip.js.map +1 -1
  178. package/dist/src/shadcn/components/ui/tree.d.ts +20 -0
  179. package/dist/src/shadcn/components/ui/tree.d.ts.map +1 -0
  180. package/dist/src/shadcn/components/ui/tree.js +111 -0
  181. package/dist/src/shadcn/components/ui/tree.js.map +1 -0
  182. package/package.json +9 -2
  183. package/src/components/code-editor/http/grammar/http.grammar +74 -0
  184. package/src/components/code-editor/http/grammar/http.terms.ts +9 -0
  185. package/src/components/code-editor/http/grammar/http.test.ts +110 -0
  186. package/src/components/code-editor/http/grammar/http.ts +21 -0
  187. package/src/components/code-editor/http/index.ts +87 -0
  188. package/src/components/code-editor/index.tsx +182 -21
  189. package/src/components/code-editor.stories.tsx +1 -1
  190. package/src/components/request-line-editor.stories.tsx +17 -27
  191. package/src/components/request-line-editor.tsx +72 -61
  192. package/src/components/tree-view.stories.tsx +260 -0
  193. package/src/components/tree-view.tsx +101 -0
  194. package/src/icons.tsx +45 -0
  195. package/src/index.css +42 -3
  196. package/src/index.tsx +1 -1
  197. package/src/shadcn/components/ui/accordion.tsx +66 -8
  198. package/src/shadcn/components/ui/alert.tsx +53 -15
  199. package/src/shadcn/components/ui/avatar.tsx +17 -6
  200. package/src/shadcn/components/ui/badge.tsx +67 -18
  201. package/src/shadcn/components/ui/breadcrumb.tsx +35 -7
  202. package/src/shadcn/components/ui/button.tsx +118 -57
  203. package/src/shadcn/components/ui/card.tsx +44 -13
  204. package/src/shadcn/components/ui/checkbox.stories.tsx +20 -24
  205. package/src/shadcn/components/ui/checkbox.tsx +45 -4
  206. package/src/shadcn/components/ui/combobox.stories.tsx +19 -0
  207. package/src/shadcn/components/ui/combobox.tsx +142 -0
  208. package/src/shadcn/components/ui/command.stories.tsx +1 -1
  209. package/src/shadcn/components/ui/command.tsx +192 -36
  210. package/src/shadcn/components/ui/dialog.tsx +101 -13
  211. package/src/shadcn/components/ui/drawer.tsx +93 -18
  212. package/src/shadcn/components/ui/dropdown-menu.tsx +38 -9
  213. package/src/shadcn/components/ui/form.tsx +16 -4
  214. package/src/shadcn/components/ui/input.tsx +281 -29
  215. package/src/shadcn/components/ui/label.tsx +21 -4
  216. package/src/shadcn/components/ui/menubar.tsx +188 -43
  217. package/src/shadcn/components/ui/pagination.tsx +12 -6
  218. package/src/shadcn/components/ui/popover.tsx +35 -4
  219. package/src/shadcn/components/ui/progress.tsx +21 -5
  220. package/src/shadcn/components/ui/radio-group.stories.tsx +22 -14
  221. package/src/shadcn/components/ui/radio-group.tsx +42 -5
  222. package/src/shadcn/components/ui/scroll-area.tsx +33 -5
  223. package/src/shadcn/components/ui/select.stories.tsx +0 -2
  224. package/src/shadcn/components/ui/select.tsx +184 -33
  225. package/src/shadcn/components/ui/separator.tsx +15 -5
  226. package/src/shadcn/components/ui/sidebar.tsx +68 -26
  227. package/src/shadcn/components/ui/skeleton.tsx +4 -1
  228. package/src/shadcn/components/ui/slider.tsx +82 -11
  229. package/src/shadcn/components/ui/sonner.stories.tsx +19 -15
  230. package/src/shadcn/components/ui/sonner.tsx +53 -3
  231. package/src/shadcn/components/ui/switch.tsx +53 -7
  232. package/src/shadcn/components/ui/table.tsx +38 -11
  233. package/src/shadcn/components/ui/tabs.stories.tsx +32 -0
  234. package/src/shadcn/components/ui/tabs.tsx +455 -17
  235. package/src/shadcn/components/ui/textarea.tsx +42 -4
  236. package/src/shadcn/components/ui/toggle-group.tsx +27 -5
  237. package/src/shadcn/components/ui/toggle.tsx +59 -18
  238. package/src/shadcn/components/ui/tooltip.tsx +33 -8
  239. package/src/shadcn/components/ui/tree.tsx +200 -0
@@ -15,7 +15,7 @@ function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
15
15
  role="navigation"
16
16
  aria-label="pagination"
17
17
  data-slot="pagination"
18
- className={cn("mx-auto flex w-full justify-center", className)}
18
+ className={cn("mx-auto", "flex", "w-full", "justify-center", className)}
19
19
  {...props}
20
20
  />
21
21
  );
@@ -28,7 +28,7 @@ function PaginationContent({
28
28
  return (
29
29
  <ul
30
30
  data-slot="pagination-content"
31
- className={cn("flex flex-row items-center gap-1", className)}
31
+ className={cn("flex", "flex-row", "items-center", "gap-1", className)}
32
32
  {...props}
33
33
  />
34
34
  );
@@ -37,7 +37,7 @@ function PaginationContent({
37
37
  function PaginationItem({ ...props }: React.ComponentProps<"li">) {
38
38
  return (
39
39
  <li
40
- className="hover:bg-accent rounded-md"
40
+ className={cn("hover:bg-bg-secondary", "rounded-md")}
41
41
  data-slot="pagination-item"
42
42
  {...props}
43
43
  />
@@ -80,7 +80,7 @@ function PaginationPrevious({
80
80
  <PaginationLink
81
81
  aria-label="Go to previous page"
82
82
  size="small"
83
- className={cn("gap-1 px-2.5 sm:pl-2.5", className)}
83
+ className={cn("gap-1", "px-2.5", "sm:pl-2.5", className)}
84
84
  {...props}
85
85
  >
86
86
  <ChevronLeftIcon />
@@ -97,7 +97,7 @@ function PaginationNext({
97
97
  <PaginationLink
98
98
  aria-label="Go to next page"
99
99
  size="regular"
100
- className={cn("gap-1 px-2.5 sm:pr-2.5", className)}
100
+ className={cn("gap-1", "px-2.5", "sm:pr-2.5", className)}
101
101
  {...props}
102
102
  >
103
103
  <span className="hidden sm:block">Next</span>
@@ -114,7 +114,13 @@ function PaginationEllipsis({
114
114
  <span
115
115
  aria-hidden
116
116
  data-slot="pagination-ellipsis"
117
- className={cn("flex size-9 items-center justify-center", className)}
117
+ className={cn(
118
+ "flex",
119
+ "size-9",
120
+ "items-center",
121
+ "justify-center",
122
+ className,
123
+ )}
118
124
  {...props}
119
125
  >
120
126
  <MoreHorizontalIcon className="size-4" />
@@ -4,6 +4,40 @@ import type * as React from "react";
4
4
 
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
+ // Popover content styles
8
+ const popoverContentStyles = cn(
9
+ // Layout
10
+ "z-50",
11
+ "w-72",
12
+ "origin-(--radix-popover-content-transform-origin)",
13
+ "outline-hidden",
14
+ // Shape
15
+ "rounded-md",
16
+ // Borders
17
+ "border",
18
+ "border-border-primary",
19
+ // Background & Colors
20
+ "bg-bg-primary",
21
+ "text-text-primary",
22
+ // Spacing
23
+ "p-4",
24
+ // Shadow
25
+ "shadow-md",
26
+ // Animations - open
27
+ "data-[state=open]:animate-in",
28
+ "data-[state=open]:fade-in-0",
29
+ "data-[state=open]:zoom-in-95",
30
+ // Animations - closed
31
+ "data-[state=closed]:animate-out",
32
+ "data-[state=closed]:fade-out-0",
33
+ "data-[state=closed]:zoom-out-95",
34
+ // Slide animations
35
+ "data-[side=bottom]:slide-in-from-top-2",
36
+ "data-[side=left]:slide-in-from-right-2",
37
+ "data-[side=right]:slide-in-from-left-2",
38
+ "data-[side=top]:slide-in-from-bottom-2",
39
+ );
40
+
7
41
  function Popover({
8
42
  ...props
9
43
  }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
@@ -28,10 +62,7 @@ function PopoverContent({
28
62
  data-slot="popover-content"
29
63
  align={align}
30
64
  sideOffset={sideOffset}
31
- className={cn(
32
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
33
- className,
34
- )}
65
+ className={cn(popoverContentStyles, className)}
35
66
  {...props}
36
67
  />
37
68
  </PopoverPrimitive.Portal>
@@ -3,6 +3,25 @@ import type * as React from "react";
3
3
 
4
4
  import { cn } from "#shadcn/lib/utils";
5
5
 
6
+ // Progress root styles
7
+ const progressRootStyles = cn(
8
+ "relative",
9
+ "h-2",
10
+ "w-full",
11
+ "overflow-hidden",
12
+ "rounded-full",
13
+ "bg-bg-quaternary",
14
+ );
15
+
16
+ // Progress indicator styles
17
+ const progressIndicatorStyles = cn(
18
+ "bg-bg-link",
19
+ "h-full",
20
+ "w-full",
21
+ "flex-1",
22
+ "transition-all",
23
+ );
24
+
6
25
  function Progress({
7
26
  className,
8
27
  value,
@@ -11,15 +30,12 @@ function Progress({
11
30
  return (
12
31
  <ProgressPrimitive.Root
13
32
  data-slot="progress"
14
- className={cn(
15
- "bg-primary/20 relative h-2 w-full overflow-hidden rounded-full",
16
- className,
17
- )}
33
+ className={cn(progressRootStyles, className)}
18
34
  {...props}
19
35
  >
20
36
  <ProgressPrimitive.Indicator
21
37
  data-slot="progress-indicator"
22
- className="bg-primary h-full w-full flex-1 transition-all"
38
+ className={progressIndicatorStyles}
23
39
  style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
24
40
  />
25
41
  </ProgressPrimitive.Root>
@@ -11,19 +11,27 @@ type Story = StoryObj<typeof meta>;
11
11
 
12
12
  export const Demo = {
13
13
  render: () => (
14
- <RadioGroup defaultValue="comfortable">
15
- <div className="flex items-center gap-3">
16
- <RadioGroupItem value="default" id="r1" />
17
- <Label htmlFor="r1">Default</Label>
18
- </div>
19
- <div className="flex items-center gap-3">
20
- <RadioGroupItem value="comfortable" id="r2" />
21
- <Label htmlFor="r2">Comfortable</Label>
22
- </div>
23
- <div className="flex items-center gap-3">
24
- <RadioGroupItem value="compact" id="r3" />
25
- <Label htmlFor="r3">Compact</Label>
26
- </div>
27
- </RadioGroup>
14
+ <div className="space-y-6">
15
+ <RadioGroup defaultValue="checked">
16
+ <div className="flex items-center gap-3">
17
+ <RadioGroupItem value="default" id="r1" />
18
+ <Label htmlFor="r1">Default</Label>
19
+ </div>
20
+ <div className="flex items-center gap-3">
21
+ <RadioGroupItem value="checked" id="r2" />
22
+ <Label htmlFor="r2">Checked</Label>
23
+ </div>
24
+ <div className="flex items-center gap-3">
25
+ <RadioGroupItem value="disabled" id="r3" disabled />
26
+ <Label htmlFor="r3">Disabled</Label>
27
+ </div>
28
+ </RadioGroup>
29
+ <RadioGroup defaultValue="disabled-checked">
30
+ <div className="flex items-center gap-3">
31
+ <RadioGroupItem value="disabled-checked" id="r4" disabled />
32
+ <Label htmlFor="r4">Disabled Checked</Label>
33
+ </div>
34
+ </RadioGroup>
35
+ </div>
28
36
  ),
29
37
  } satisfies Story;
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
  import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
3
- import { CircleIcon } from "lucide-react";
4
3
  import type * as React from "react";
5
4
 
6
5
  import { cn } from "#shadcn/lib/utils";
@@ -12,7 +11,7 @@ function RadioGroup({
12
11
  return (
13
12
  <RadioGroupPrimitive.Root
14
13
  data-slot="radio-group"
15
- className={cn("grid gap-3", className)}
14
+ className={cn("grid", "gap-3", className)}
16
15
  {...props}
17
16
  />
18
17
  );
@@ -26,16 +25,54 @@ function RadioGroupItem({
26
25
  <RadioGroupPrimitive.Item
27
26
  data-slot="radio-group-item"
28
27
  className={cn(
29
- "border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
28
+ // Base styles
29
+ "aspect-square",
30
+ "size-4",
31
+ "shrink-0",
32
+ "rounded-full",
33
+ "overflow-hidden",
34
+ "relative",
35
+ "outline-none",
36
+ "cursor-pointer",
37
+ // Animations
38
+ "transition-all",
39
+ "duration-200",
40
+ "active:scale-90",
41
+ "active:duration-75",
42
+ // Default state:
43
+ "bg-white",
44
+ "border-[1.6px]",
45
+ "border-solid",
46
+ "border-border-primary",
47
+ // Checked state:
48
+ "data-[state=checked]:bg-bg-link",
49
+ "data-[state=checked]:border-bg-link",
50
+ // Disabled states
51
+ "disabled:cursor-not-allowed",
52
+ "disabled:active:scale-100",
53
+ "disabled:bg-white",
54
+ "disabled:border-border-secondary",
55
+ "disabled:data-[state=checked]:bg-border-secondary",
56
+ "disabled:data-[state=checked]:border-border-secondary",
57
+ // Focus styles
58
+ "focus-visible:ring-2",
59
+ "focus-visible:ring-bg-link",
60
+ "focus-visible:ring-offset-2",
30
61
  className,
31
62
  )}
32
63
  {...props}
33
64
  >
34
65
  <RadioGroupPrimitive.Indicator
35
66
  data-slot="radio-group-indicator"
36
- className="relative flex items-center justify-center"
67
+ className={cn(
68
+ "absolute",
69
+ "inset-0",
70
+ "flex",
71
+ "items-center",
72
+ "justify-center",
73
+ )}
37
74
  >
38
- <CircleIcon className="fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" />
75
+ <div className={cn("size-1.5", "rounded-full", "bg-white")} />
39
76
  </RadioGroupPrimitive.Indicator>
40
77
  </RadioGroupPrimitive.Item>
41
78
  );
@@ -4,6 +4,34 @@ import type * as React from "react";
4
4
 
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
+ // Scroll area viewport styles
8
+ const scrollAreaViewportStyles = cn(
9
+ "size-full",
10
+ "rounded-[inherit]",
11
+ "transition-[color,box-shadow]",
12
+ "outline-none",
13
+ "focus-visible:ring-2",
14
+ "focus-visible:ring-utility-blue/70",
15
+ "focus-visible:outline-1",
16
+ );
17
+
18
+ // Scroll bar base styles
19
+ const scrollBarBaseStyles = cn(
20
+ "flex",
21
+ "touch-none",
22
+ "p-px",
23
+ "transition-colors",
24
+ "select-none",
25
+ );
26
+
27
+ // Scroll bar thumb styles
28
+ const scrollBarThumbStyles = cn(
29
+ "bg-border-primary",
30
+ "relative",
31
+ "flex-1",
32
+ "rounded-full",
33
+ );
34
+
7
35
  function ScrollArea({
8
36
  className,
9
37
  children,
@@ -17,7 +45,7 @@ function ScrollArea({
17
45
  >
18
46
  <ScrollAreaPrimitive.Viewport
19
47
  data-slot="scroll-area-viewport"
20
- className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
48
+ className={scrollAreaViewportStyles}
21
49
  >
22
50
  {children}
23
51
  </ScrollAreaPrimitive.Viewport>
@@ -37,18 +65,18 @@ function ScrollBar({
37
65
  data-slot="scroll-area-scrollbar"
38
66
  orientation={orientation}
39
67
  className={cn(
40
- "flex touch-none p-px transition-colors select-none",
68
+ scrollBarBaseStyles,
41
69
  orientation === "vertical" &&
42
- "h-full w-2.5 border-l border-l-transparent",
70
+ cn("h-full", "w-2.5", "border-l", "border-l-transparent"),
43
71
  orientation === "horizontal" &&
44
- "h-2.5 flex-col border-t border-t-transparent",
72
+ cn("h-2.5", "flex-col", "border-t", "border-t-transparent"),
45
73
  className,
46
74
  )}
47
75
  {...props}
48
76
  >
49
77
  <ScrollAreaPrimitive.ScrollAreaThumb
50
78
  data-slot="scroll-area-thumb"
51
- className="bg-border relative flex-1 rounded-full"
79
+ className={scrollBarThumbStyles}
52
80
  />
53
81
  </ScrollAreaPrimitive.ScrollAreaScrollbar>
54
82
  );
@@ -5,7 +5,6 @@ import {
5
5
  SelectContent,
6
6
  SelectGroup,
7
7
  SelectItem,
8
- SelectLabel,
9
8
  SelectTrigger,
10
9
  SelectValue,
11
10
  } from "#shadcn/components/ui/select";
@@ -25,7 +24,6 @@ export const Demo = {
25
24
  </SelectTrigger>
26
25
  <SelectContent>
27
26
  <SelectGroup>
28
- <SelectLabel>Fruits</SelectLabel>
29
27
  <SelectItem value="apple">Apple</SelectItem>
30
28
  <SelectItem value="banana">Banana</SelectItem>
31
29
  <SelectItem value="blueberry">Blueberry</SelectItem>
@@ -4,34 +4,79 @@ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
4
4
  import type * as React from "react";
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
- const selectTriggerVariants = cva(
8
- cn(
9
- "border-border-primary hover:border-border-primary_hover data-[placeholder]:text-text-quternary selection:bg-bg-primary",
10
- "selection:text-text-primary-foreground [&_svg:not([class*='text-'])]:text-text-quternary flex w-fit items-center justify-between",
11
- "gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none",
12
- "disabled:pointer-events-none disabled:cursor-not-allowed disabled:text-text-disabled focus-visible:ring-2 focus-visible:ring-border-link",
13
- "data-[state=open]:ring-2 data-[state=open]:ring-border-link disabled:bg-bg-disabled aria-invalid:ring-destructive",
14
- "aria-invalid:text-text-error-primary aria-invalid:border-border-error-primary *:data-[slot=select-value]:line-clamp-1",
15
- "*:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2",
16
- "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
17
- ),
18
- {
19
- variants: {
20
- size: {
21
- regular: "h-9",
22
- small: "h-8",
23
- },
24
- variant: {
25
- default: "",
26
- compound: "border-r-0 typo-label",
27
- },
7
+ // Base select trigger styles
8
+ const baseSelectTriggerStyles = cn(
9
+ // Layout
10
+ "flex",
11
+ "w-full",
12
+ "items-center",
13
+ "justify-between",
14
+ "gap-2",
15
+ "whitespace-nowrap",
16
+ // Shape
17
+ "rounded-md",
18
+ // Borders
19
+ "border",
20
+ "border-border-primary",
21
+ // Background & Colors
22
+ "bg-transparent",
23
+ "text-sm",
24
+ // Spacing
25
+ "px-3",
26
+ "py-2",
27
+ // Transitions
28
+ "transition-colors",
29
+ "duration-300",
30
+ "outline-none",
31
+ // Hover
32
+ "hover:border-border-primary_hover",
33
+ // Focus
34
+ "focus-visible:ring-2",
35
+ "focus-visible:ring-utility-blue/70",
36
+ // Placeholder
37
+ "data-[placeholder]:text-text-tertiary",
38
+ // Selection
39
+ "selection:bg-selection",
40
+ "selection:text-text-primary",
41
+ // SVG icons
42
+ "[&_svg:not([class*='text-'])]:text-text-tertiary",
43
+ "[&_svg]:pointer-events-none",
44
+ "[&_svg]:shrink-0",
45
+ "[&_svg:not([class*='size-'])]:size-4",
46
+ // Value styles
47
+ "*:data-[slot=select-value]:line-clamp-1",
48
+ "*:data-[slot=select-value]:flex",
49
+ "*:data-[slot=select-value]:items-center",
50
+ "*:data-[slot=select-value]:gap-2",
51
+ // Disabled
52
+ "disabled:pointer-events-none",
53
+ "disabled:cursor-not-allowed",
54
+ "disabled:text-text-disabled",
55
+ "disabled:bg-bg-disabled",
56
+ "disabled:border-border-disabled",
57
+ // Invalid
58
+ "aria-invalid:text-text-error-primary",
59
+ "aria-invalid:border-border-error",
60
+ "aria-invalid:ring-2",
61
+ "aria-invalid:ring-utility-red/70",
62
+ );
63
+
64
+ const selectTriggerVariants = cva(baseSelectTriggerStyles, {
65
+ variants: {
66
+ size: {
67
+ regular: cn("h-9"),
68
+ small: cn("h-8"),
28
69
  },
29
- defaultVariants: {
30
- size: "regular",
31
- variant: "default",
70
+ variant: {
71
+ default: cn(""),
72
+ compound: cn("border-r-0", "typo-label"),
32
73
  },
33
74
  },
34
- );
75
+ defaultVariants: {
76
+ size: "regular",
77
+ variant: "default",
78
+ },
79
+ });
35
80
 
36
81
  function Select({
37
82
  ...props
@@ -67,7 +112,7 @@ function SelectTrigger({
67
112
  >
68
113
  {children}
69
114
  <SelectPrimitive.Icon asChild>
70
- <ChevronDownIcon className="size-4 opacity-50" />
115
+ <ChevronDownIcon />
71
116
  </SelectPrimitive.Icon>
72
117
  </SelectPrimitive.Trigger>
73
118
  );
@@ -84,9 +129,47 @@ function SelectContent({
84
129
  <SelectPrimitive.Content
85
130
  data-slot="select-content"
86
131
  className={cn(
87
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
132
+ // Layout
133
+ "relative",
134
+ "z-50",
135
+ "group",
136
+ "min-w-[8rem]",
137
+ "max-h-(--radix-select-content-available-height)",
138
+ "origin-(--radix-select-content-transform-origin)",
139
+ "overflow-x-hidden",
140
+ "overflow-y-auto",
141
+ // Shape
142
+ "rounded-md",
143
+ // Borders
144
+ "border",
145
+ "border-border-primary",
146
+ // Background & Colors
147
+ "bg-bg-primary",
148
+ "text-text-primary",
149
+ // Spacing
150
+ "py-1",
151
+ // Shadow
152
+ "shadow-lg",
153
+ // Animations - open
154
+ "data-[state=open]:animate-in",
155
+ "data-[state=open]:fade-in-0",
156
+ "data-[state=open]:zoom-in-95",
157
+ // Animations - closed
158
+ "data-[state=closed]:animate-out",
159
+ "data-[state=closed]:fade-out-0",
160
+ "data-[state=closed]:zoom-out-95",
161
+ // Slide animations
162
+ "data-[side=bottom]:slide-in-from-top-2",
163
+ "data-[side=left]:slide-in-from-right-2",
164
+ "data-[side=right]:slide-in-from-left-2",
165
+ "data-[side=top]:slide-in-from-bottom-2",
88
166
  position === "popper" &&
89
- "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
167
+ cn(
168
+ "data-[side=bottom]:translate-y-1",
169
+ "data-[side=left]:-translate-x-1",
170
+ "data-[side=right]:translate-x-1",
171
+ "data-[side=top]:-translate-y-1",
172
+ ),
90
173
  className,
91
174
  )}
92
175
  position={position}
@@ -97,7 +180,12 @@ function SelectContent({
97
180
  className={cn(
98
181
  "p-1",
99
182
  position === "popper" &&
100
- "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1",
183
+ cn(
184
+ "h-[var(--radix-select-trigger-height)]",
185
+ "w-full",
186
+ "min-w-[var(--radix-select-trigger-width)]",
187
+ "scroll-my-1",
188
+ ),
101
189
  )}
102
190
  >
103
191
  {children}
@@ -115,7 +203,13 @@ function SelectLabel({
115
203
  return (
116
204
  <SelectPrimitive.Label
117
205
  data-slot="select-label"
118
- className={cn("text-muted-foreground px-2 py-1.5 text-xs", className)}
206
+ className={cn(
207
+ "text-text-tertiary",
208
+ "px-2",
209
+ "py-1.5",
210
+ "typo-label",
211
+ className,
212
+ )}
119
213
  {...props}
120
214
  />
121
215
  );
@@ -130,12 +224,62 @@ function SelectItem({
130
224
  <SelectPrimitive.Item
131
225
  data-slot="select-item"
132
226
  className={cn(
133
- "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
227
+ // Layout
228
+ "relative",
229
+ "flex",
230
+ "w-full",
231
+ "items-center",
232
+ "cursor-default",
233
+ "select-none",
234
+ // Shape
235
+ "rounded-md",
236
+ // Spacing
237
+ "py-1.5",
238
+ "pl-3",
239
+ "pr-8",
240
+ "mb-0.5",
241
+ "last:mb-0",
242
+ // Typography
243
+ "text-sm",
244
+ "text-text-primary",
245
+ // Interaction
246
+ "outline-hidden",
247
+ // Hover
248
+ "hover:bg-bg-tertiary",
249
+ // Active
250
+ "active:text-text-primary",
251
+ // Focus
252
+ "focus-visible:bg-bg-tertiary",
253
+ // Checked state
254
+ "data-[state=checked]:bg-bg-tertiary",
255
+ "data-[state=checked]:text-text-primary",
256
+ "group-hover:data-[state=checked]:bg-transparent",
257
+ // Disabled
258
+ "data-[disabled]:pointer-events-none",
259
+ "data-[disabled]:opacity-50",
260
+ // SVG icons
261
+ "[&_svg:not([class*='text-'])]:text-text-tertiary",
262
+ "[&_svg]:pointer-events-none",
263
+ "[&_svg]:shrink-0",
264
+ "[&_svg:not([class*='size-'])]:size-4",
265
+ // Span styles
266
+ "*:[span]:last:flex",
267
+ "*:[span]:last:items-center",
268
+ "*:[span]:last:gap-2",
134
269
  className,
135
270
  )}
136
271
  {...props}
137
272
  >
138
- <span className="absolute right-2 flex size-3.5 items-center justify-center">
273
+ <span
274
+ className={cn(
275
+ "absolute",
276
+ "right-2",
277
+ "flex",
278
+ "size-3.5",
279
+ "items-center",
280
+ "justify-center",
281
+ )}
282
+ >
139
283
  <SelectPrimitive.ItemIndicator>
140
284
  <CheckIcon className="size-4" />
141
285
  </SelectPrimitive.ItemIndicator>
@@ -152,7 +296,14 @@ function SelectSeparator({
152
296
  return (
153
297
  <SelectPrimitive.Separator
154
298
  data-slot="select-separator"
155
- className={cn("bg-border pointer-events-none -mx-1 my-1 h-px", className)}
299
+ className={cn(
300
+ "bg-border-separator",
301
+ "pointer-events-none",
302
+ "-mx-1",
303
+ "my-1",
304
+ "h-px",
305
+ className,
306
+ )}
156
307
  {...props}
157
308
  />
158
309
  );
@@ -4,6 +4,20 @@ import type * as React from "react";
4
4
 
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
+ // Separator styles
8
+ const separatorStyles = cn(
9
+ // Background
10
+ "bg-border-separator",
11
+ // Layout
12
+ "shrink-0",
13
+ // Horizontal orientation
14
+ "data-[orientation=horizontal]:h-px",
15
+ "data-[orientation=horizontal]:w-full",
16
+ // Vertical orientation
17
+ "data-[orientation=vertical]:h-full",
18
+ "data-[orientation=vertical]:w-px",
19
+ );
20
+
7
21
  function Separator({
8
22
  className,
9
23
  orientation = "horizontal",
@@ -15,11 +29,7 @@ function Separator({
15
29
  data-slot="separator"
16
30
  decorative={decorative}
17
31
  orientation={orientation}
18
- className={cn(
19
- "bg-bg-quaternary shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full",
20
- "data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
21
- className,
22
- )}
32
+ className={cn(separatorStyles, className)}
23
33
  {...props}
24
34
  />
25
35
  );