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

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 (304) hide show
  1. package/dist/bundle.css +1375 -484
  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 +14 -2
  20. package/dist/src/components/code-editor/index.d.ts.map +1 -1
  21. package/dist/src/components/code-editor/index.js +309 -20
  22. package/dist/src/components/code-editor/index.js.map +1 -1
  23. package/dist/src/components/code-editor.stories.d.ts +1 -0
  24. package/dist/src/components/code-editor.stories.d.ts.map +1 -1
  25. package/dist/src/components/code-editor.stories.js +255 -2
  26. package/dist/src/components/code-editor.stories.js.map +1 -1
  27. package/dist/src/components/copy-icon.d.ts +5 -1
  28. package/dist/src/components/copy-icon.d.ts.map +1 -1
  29. package/dist/src/components/copy-icon.js +41 -3
  30. package/dist/src/components/copy-icon.js.map +1 -1
  31. package/dist/src/components/data-table.d.ts +8 -0
  32. package/dist/src/components/data-table.d.ts.map +1 -0
  33. package/dist/src/components/data-table.js +65 -0
  34. package/dist/src/components/data-table.js.map +1 -0
  35. package/dist/src/components/data-table.stories.d.ts +7 -0
  36. package/dist/src/components/data-table.stories.d.ts.map +1 -0
  37. package/dist/src/components/data-table.stories.js +44 -0
  38. package/dist/src/components/data-table.stories.js.map +1 -0
  39. package/dist/src/components/fhir-structure-view.d.ts +34 -0
  40. package/dist/src/components/fhir-structure-view.d.ts.map +1 -0
  41. package/dist/src/components/fhir-structure-view.js +229 -0
  42. package/dist/src/components/fhir-structure-view.js.map +1 -0
  43. package/dist/src/components/fhir-structure-view.stories.d.ts +7 -0
  44. package/dist/src/components/fhir-structure-view.stories.d.ts.map +1 -0
  45. package/dist/src/components/fhir-structure-view.stories.js +447 -0
  46. package/dist/src/components/fhir-structure-view.stories.js.map +1 -0
  47. package/dist/src/components/patient-table.d.ts +73 -0
  48. package/dist/src/components/patient-table.d.ts.map +1 -0
  49. package/dist/src/components/patient-table.js +921 -0
  50. package/dist/src/components/patient-table.js.map +1 -0
  51. package/dist/src/components/patient-table.stories.d.ts +111 -0
  52. package/dist/src/components/patient-table.stories.d.ts.map +1 -0
  53. package/dist/src/components/patient-table.stories.js +172 -0
  54. package/dist/src/components/patient-table.stories.js.map +1 -0
  55. package/dist/src/components/request-line-editor.d.ts +13 -35
  56. package/dist/src/components/request-line-editor.d.ts.map +1 -1
  57. package/dist/src/components/request-line-editor.js +72 -49
  58. package/dist/src/components/request-line-editor.js.map +1 -1
  59. package/dist/src/components/request-line-editor.stories.d.ts.map +1 -1
  60. package/dist/src/components/request-line-editor.stories.js +17 -53
  61. package/dist/src/components/request-line-editor.stories.js.map +1 -1
  62. package/dist/src/components/segment-control.d.ts +16 -0
  63. package/dist/src/components/segment-control.d.ts.map +1 -0
  64. package/dist/src/components/segment-control.js +48 -0
  65. package/dist/src/components/segment-control.js.map +1 -0
  66. package/dist/src/components/segment-control.stories.d.ts +15 -0
  67. package/dist/src/components/segment-control.stories.d.ts.map +1 -0
  68. package/dist/src/components/segment-control.stories.js +33 -0
  69. package/dist/src/components/segment-control.stories.js.map +1 -0
  70. package/dist/src/components/split-button.d.ts +5 -0
  71. package/dist/src/components/split-button.d.ts.map +1 -0
  72. package/dist/src/components/split-button.js +12 -0
  73. package/dist/src/components/split-button.js.map +1 -0
  74. package/dist/src/components/split-button.stories.d.ts +7 -0
  75. package/dist/src/components/split-button.stories.d.ts.map +1 -0
  76. package/dist/src/components/split-button.stories.js +57 -0
  77. package/dist/src/components/split-button.stories.js.map +1 -0
  78. package/dist/src/components/tree-view.d.ts +22 -0
  79. package/dist/src/components/tree-view.d.ts.map +1 -0
  80. package/dist/src/components/tree-view.js +101 -0
  81. package/dist/src/components/tree-view.js.map +1 -0
  82. package/dist/src/components/tree-view.stories.d.ts +13 -0
  83. package/dist/src/components/tree-view.stories.d.ts.map +1 -0
  84. package/dist/src/components/tree-view.stories.js +274 -0
  85. package/dist/src/components/tree-view.stories.js.map +1 -0
  86. package/dist/src/icons.d.ts +9 -0
  87. package/dist/src/icons.d.ts.map +1 -0
  88. package/dist/src/icons.js +279 -0
  89. package/dist/src/icons.js.map +1 -0
  90. package/dist/src/index.css +42 -3
  91. package/dist/src/index.d.ts +9 -1
  92. package/dist/src/index.d.ts.map +1 -1
  93. package/dist/src/index.js +9 -1
  94. package/dist/src/index.js.map +1 -1
  95. package/dist/src/shadcn/components/ui/accordion.d.ts.map +1 -1
  96. package/dist/src/shadcn/components/ui/accordion.js +23 -5
  97. package/dist/src/shadcn/components/ui/accordion.js.map +1 -1
  98. package/dist/src/shadcn/components/ui/alert-dialog.d.ts +3 -1
  99. package/dist/src/shadcn/components/ui/alert-dialog.d.ts.map +1 -1
  100. package/dist/src/shadcn/components/ui/alert-dialog.js +5 -2
  101. package/dist/src/shadcn/components/ui/alert-dialog.js.map +1 -1
  102. package/dist/src/shadcn/components/ui/alert.d.ts.map +1 -1
  103. package/dist/src/shadcn/components/ui/alert.js +12 -5
  104. package/dist/src/shadcn/components/ui/alert.js.map +1 -1
  105. package/dist/src/shadcn/components/ui/avatar.d.ts.map +1 -1
  106. package/dist/src/shadcn/components/ui/avatar.js +4 -3
  107. package/dist/src/shadcn/components/ui/avatar.js.map +1 -1
  108. package/dist/src/shadcn/components/ui/badge.d.ts.map +1 -1
  109. package/dist/src/shadcn/components/ui/badge.js +16 -5
  110. package/dist/src/shadcn/components/ui/badge.js.map +1 -1
  111. package/dist/src/shadcn/components/ui/breadcrumb.d.ts.map +1 -1
  112. package/dist/src/shadcn/components/ui/breadcrumb.js +6 -6
  113. package/dist/src/shadcn/components/ui/breadcrumb.js.map +1 -1
  114. package/dist/src/shadcn/components/ui/button.d.ts.map +1 -1
  115. package/dist/src/shadcn/components/ui/button.js +19 -11
  116. package/dist/src/shadcn/components/ui/button.js.map +1 -1
  117. package/dist/src/shadcn/components/ui/card.d.ts.map +1 -1
  118. package/dist/src/shadcn/components/ui/card.js +14 -6
  119. package/dist/src/shadcn/components/ui/card.js.map +1 -1
  120. package/dist/src/shadcn/components/ui/checkbox.d.ts.map +1 -1
  121. package/dist/src/shadcn/components/ui/checkbox.js +20 -5
  122. package/dist/src/shadcn/components/ui/checkbox.js.map +1 -1
  123. package/dist/src/shadcn/components/ui/checkbox.stories.d.ts.map +1 -1
  124. package/dist/src/shadcn/components/ui/checkbox.stories.js +44 -35
  125. package/dist/src/shadcn/components/ui/checkbox.stories.js.map +1 -1
  126. package/dist/src/shadcn/components/ui/combobox.d.ts +18 -0
  127. package/dist/src/shadcn/components/ui/combobox.d.ts.map +1 -0
  128. package/dist/src/shadcn/components/ui/combobox.js +121 -0
  129. package/dist/src/shadcn/components/ui/combobox.js.map +1 -0
  130. package/dist/src/shadcn/components/ui/combobox.stories.d.ts +11 -0
  131. package/dist/src/shadcn/components/ui/combobox.stories.d.ts.map +1 -0
  132. package/dist/src/shadcn/components/ui/combobox.stories.js +16 -0
  133. package/dist/src/shadcn/components/ui/combobox.stories.js.map +1 -0
  134. package/dist/src/shadcn/components/ui/command.d.ts.map +1 -1
  135. package/dist/src/shadcn/components/ui/command.js +73 -12
  136. package/dist/src/shadcn/components/ui/command.js.map +1 -1
  137. package/dist/src/shadcn/components/ui/command.stories.js +0 -1
  138. package/dist/src/shadcn/components/ui/command.stories.js.map +1 -1
  139. package/dist/src/shadcn/components/ui/dialog.d.ts.map +1 -1
  140. package/dist/src/shadcn/components/ui/dialog.js +35 -7
  141. package/dist/src/shadcn/components/ui/dialog.js.map +1 -1
  142. package/dist/src/shadcn/components/ui/drawer.d.ts.map +1 -1
  143. package/dist/src/shadcn/components/ui/drawer.js +26 -5
  144. package/dist/src/shadcn/components/ui/drawer.js.map +1 -1
  145. package/dist/src/shadcn/components/ui/dropdown-menu.d.ts.map +1 -1
  146. package/dist/src/shadcn/components/ui/dropdown-menu.js +12 -1
  147. package/dist/src/shadcn/components/ui/dropdown-menu.js.map +1 -1
  148. package/dist/src/shadcn/components/ui/form.d.ts.map +1 -1
  149. package/dist/src/shadcn/components/ui/form.js +12 -4
  150. package/dist/src/shadcn/components/ui/form.js.map +1 -1
  151. package/dist/src/shadcn/components/ui/input.d.ts +3 -1
  152. package/dist/src/shadcn/components/ui/input.d.ts.map +1 -1
  153. package/dist/src/shadcn/components/ui/input.js +126 -17
  154. package/dist/src/shadcn/components/ui/input.js.map +1 -1
  155. package/dist/src/shadcn/components/ui/label.d.ts.map +1 -1
  156. package/dist/src/shadcn/components/ui/label.js +8 -1
  157. package/dist/src/shadcn/components/ui/label.js.map +1 -1
  158. package/dist/src/shadcn/components/ui/menubar.d.ts.map +1 -1
  159. package/dist/src/shadcn/components/ui/menubar.js +35 -13
  160. package/dist/src/shadcn/components/ui/menubar.js.map +1 -1
  161. package/dist/src/shadcn/components/ui/pagination.d.ts.map +1 -1
  162. package/dist/src/shadcn/components/ui/pagination.js +6 -6
  163. package/dist/src/shadcn/components/ui/pagination.js.map +1 -1
  164. package/dist/src/shadcn/components/ui/popover.d.ts.map +1 -1
  165. package/dist/src/shadcn/components/ui/popover.js +12 -1
  166. package/dist/src/shadcn/components/ui/popover.js.map +1 -1
  167. package/dist/src/shadcn/components/ui/progress.d.ts.map +1 -1
  168. package/dist/src/shadcn/components/ui/progress.js +6 -2
  169. package/dist/src/shadcn/components/ui/progress.js.map +1 -1
  170. package/dist/src/shadcn/components/ui/radio-group.d.ts.map +1 -1
  171. package/dist/src/shadcn/components/ui/radio-group.js +11 -6
  172. package/dist/src/shadcn/components/ui/radio-group.js.map +1 -1
  173. package/dist/src/shadcn/components/ui/radio-group.stories.d.ts.map +1 -1
  174. package/dist/src/shadcn/components/ui/radio-group.stories.js +57 -34
  175. package/dist/src/shadcn/components/ui/radio-group.stories.js.map +1 -1
  176. package/dist/src/shadcn/components/ui/scroll-area.d.ts.map +1 -1
  177. package/dist/src/shadcn/components/ui/scroll-area.js +9 -3
  178. package/dist/src/shadcn/components/ui/scroll-area.js.map +1 -1
  179. package/dist/src/shadcn/components/ui/select.d.ts.map +1 -1
  180. package/dist/src/shadcn/components/ui/select.js +49 -14
  181. package/dist/src/shadcn/components/ui/select.js.map +1 -1
  182. package/dist/src/shadcn/components/ui/select.stories.d.ts.map +1 -1
  183. package/dist/src/shadcn/components/ui/select.stories.js +1 -4
  184. package/dist/src/shadcn/components/ui/select.stories.js.map +1 -1
  185. package/dist/src/shadcn/components/ui/separator.d.ts.map +1 -1
  186. package/dist/src/shadcn/components/ui/separator.js +7 -1
  187. package/dist/src/shadcn/components/ui/separator.js.map +1 -1
  188. package/dist/src/shadcn/components/ui/sidebar.d.ts.map +1 -1
  189. package/dist/src/shadcn/components/ui/sidebar.js +20 -6
  190. package/dist/src/shadcn/components/ui/sidebar.js.map +1 -1
  191. package/dist/src/shadcn/components/ui/skeleton.d.ts.map +1 -1
  192. package/dist/src/shadcn/components/ui/skeleton.js +3 -1
  193. package/dist/src/shadcn/components/ui/skeleton.js.map +1 -1
  194. package/dist/src/shadcn/components/ui/slider.d.ts.map +1 -1
  195. package/dist/src/shadcn/components/ui/slider.js +34 -4
  196. package/dist/src/shadcn/components/ui/slider.js.map +1 -1
  197. package/dist/src/shadcn/components/ui/sonner.d.ts +16 -1
  198. package/dist/src/shadcn/components/ui/sonner.d.ts.map +1 -1
  199. package/dist/src/shadcn/components/ui/sonner.js +23 -3
  200. package/dist/src/shadcn/components/ui/sonner.js.map +1 -1
  201. package/dist/src/shadcn/components/ui/sonner.stories.d.ts.map +1 -1
  202. package/dist/src/shadcn/components/ui/sonner.stories.js +19 -11
  203. package/dist/src/shadcn/components/ui/sonner.stories.js.map +1 -1
  204. package/dist/src/shadcn/components/ui/switch.d.ts.map +1 -1
  205. package/dist/src/shadcn/components/ui/switch.js +18 -2
  206. package/dist/src/shadcn/components/ui/switch.js.map +1 -1
  207. package/dist/src/shadcn/components/ui/table.d.ts.map +1 -1
  208. package/dist/src/shadcn/components/ui/table.js +12 -8
  209. package/dist/src/shadcn/components/ui/table.js.map +1 -1
  210. package/dist/src/shadcn/components/ui/tabs.d.ts +21 -3
  211. package/dist/src/shadcn/components/ui/tabs.d.ts.map +1 -1
  212. package/dist/src/shadcn/components/ui/tabs.js +315 -9
  213. package/dist/src/shadcn/components/ui/tabs.js.map +1 -1
  214. package/dist/src/shadcn/components/ui/tabs.stories.d.ts.map +1 -1
  215. package/dist/src/shadcn/components/ui/tabs.stories.js +50 -1
  216. package/dist/src/shadcn/components/ui/tabs.stories.js.map +1 -1
  217. package/dist/src/shadcn/components/ui/textarea.d.ts.map +1 -1
  218. package/dist/src/shadcn/components/ui/textarea.js +15 -1
  219. package/dist/src/shadcn/components/ui/textarea.js.map +1 -1
  220. package/dist/src/shadcn/components/ui/toggle-group.d.ts.map +1 -1
  221. package/dist/src/shadcn/components/ui/toggle-group.js +6 -2
  222. package/dist/src/shadcn/components/ui/toggle-group.js.map +1 -1
  223. package/dist/src/shadcn/components/ui/toggle.d.ts.map +1 -1
  224. package/dist/src/shadcn/components/ui/toggle.js +18 -6
  225. package/dist/src/shadcn/components/ui/toggle.js.map +1 -1
  226. package/dist/src/shadcn/components/ui/tooltip.d.ts.map +1 -1
  227. package/dist/src/shadcn/components/ui/tooltip.js +11 -1
  228. package/dist/src/shadcn/components/ui/tooltip.js.map +1 -1
  229. package/dist/src/shadcn/components/ui/tree.d.ts +28 -0
  230. package/dist/src/shadcn/components/ui/tree.d.ts.map +1 -0
  231. package/dist/src/shadcn/components/ui/tree.js +122 -0
  232. package/dist/src/shadcn/components/ui/tree.js.map +1 -0
  233. package/dist/src/typography.css +12 -0
  234. package/package.json +13 -2
  235. package/src/components/code-editor/http/grammar/http.grammar +74 -0
  236. package/src/components/code-editor/http/grammar/http.terms.ts +9 -0
  237. package/src/components/code-editor/http/grammar/http.test.ts +110 -0
  238. package/src/components/code-editor/http/grammar/http.ts +21 -0
  239. package/src/components/code-editor/http/index.ts +87 -0
  240. package/src/components/code-editor/index.tsx +307 -21
  241. package/src/components/code-editor.stories.tsx +295 -1
  242. package/src/components/copy-icon.tsx +57 -3
  243. package/src/components/data-table.stories.tsx +38 -0
  244. package/src/components/data-table.tsx +117 -0
  245. package/src/components/fhir-structure-view.stories.tsx +439 -0
  246. package/src/components/fhir-structure-view.tsx +231 -0
  247. package/src/components/patient-table.stories.tsx +111 -0
  248. package/src/components/patient-table.tsx +1301 -0
  249. package/src/components/request-line-editor.stories.tsx +17 -27
  250. package/src/components/request-line-editor.tsx +98 -61
  251. package/src/components/segment-control.stories.tsx +29 -0
  252. package/src/components/segment-control.tsx +80 -0
  253. package/src/components/split-button.stories.tsx +49 -0
  254. package/src/components/split-button.tsx +17 -0
  255. package/src/components/tree-view.stories.tsx +259 -0
  256. package/src/components/tree-view.tsx +172 -0
  257. package/src/icons.tsx +287 -0
  258. package/src/index.css +42 -3
  259. package/src/index.tsx +9 -2
  260. package/src/shadcn/components/ui/accordion.tsx +66 -8
  261. package/src/shadcn/components/ui/alert-dialog.tsx +6 -2
  262. package/src/shadcn/components/ui/alert.tsx +53 -15
  263. package/src/shadcn/components/ui/avatar.tsx +17 -6
  264. package/src/shadcn/components/ui/badge.tsx +67 -18
  265. package/src/shadcn/components/ui/breadcrumb.tsx +35 -7
  266. package/src/shadcn/components/ui/button.tsx +118 -57
  267. package/src/shadcn/components/ui/card.tsx +44 -13
  268. package/src/shadcn/components/ui/checkbox.stories.tsx +20 -24
  269. package/src/shadcn/components/ui/checkbox.tsx +45 -4
  270. package/src/shadcn/components/ui/combobox.stories.tsx +19 -0
  271. package/src/shadcn/components/ui/combobox.tsx +142 -0
  272. package/src/shadcn/components/ui/command.stories.tsx +1 -1
  273. package/src/shadcn/components/ui/command.tsx +192 -36
  274. package/src/shadcn/components/ui/dialog.tsx +101 -13
  275. package/src/shadcn/components/ui/drawer.tsx +93 -18
  276. package/src/shadcn/components/ui/dropdown-menu.tsx +37 -9
  277. package/src/shadcn/components/ui/form.tsx +16 -4
  278. package/src/shadcn/components/ui/input.tsx +400 -29
  279. package/src/shadcn/components/ui/label.tsx +21 -4
  280. package/src/shadcn/components/ui/menubar.tsx +188 -43
  281. package/src/shadcn/components/ui/pagination.tsx +12 -6
  282. package/src/shadcn/components/ui/popover.tsx +35 -4
  283. package/src/shadcn/components/ui/progress.tsx +21 -5
  284. package/src/shadcn/components/ui/radio-group.stories.tsx +22 -14
  285. package/src/shadcn/components/ui/radio-group.tsx +42 -5
  286. package/src/shadcn/components/ui/scroll-area.tsx +33 -5
  287. package/src/shadcn/components/ui/select.stories.tsx +0 -2
  288. package/src/shadcn/components/ui/select.tsx +184 -33
  289. package/src/shadcn/components/ui/separator.tsx +15 -5
  290. package/src/shadcn/components/ui/sidebar.tsx +68 -26
  291. package/src/shadcn/components/ui/skeleton.tsx +4 -1
  292. package/src/shadcn/components/ui/slider.tsx +82 -11
  293. package/src/shadcn/components/ui/sonner.stories.tsx +19 -15
  294. package/src/shadcn/components/ui/sonner.tsx +53 -3
  295. package/src/shadcn/components/ui/switch.tsx +53 -7
  296. package/src/shadcn/components/ui/table.tsx +38 -11
  297. package/src/shadcn/components/ui/tabs.stories.tsx +32 -0
  298. package/src/shadcn/components/ui/tabs.tsx +456 -17
  299. package/src/shadcn/components/ui/textarea.tsx +42 -4
  300. package/src/shadcn/components/ui/toggle-group.tsx +27 -5
  301. package/src/shadcn/components/ui/toggle.tsx +59 -18
  302. package/src/shadcn/components/ui/tooltip.tsx +33 -8
  303. package/src/shadcn/components/ui/tree.tsx +233 -0
  304. package/src/typography.css +12 -0
@@ -4,26 +4,75 @@ import type * as React from "react";
4
4
 
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
- const badgeVariants = cva(
8
- "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
9
- {
10
- variants: {
11
- variant: {
12
- default:
13
- "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
14
- secondary:
15
- "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
16
- destructive:
17
- "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
18
- outline:
19
- "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
20
- },
21
- },
22
- defaultVariants: {
23
- variant: "default",
7
+ // Base badge styles
8
+ const baseBadgeStyles = cn(
9
+ // Layout
10
+ "inline-flex",
11
+ "items-center",
12
+ "justify-center",
13
+ "w-fit",
14
+ "whitespace-nowrap",
15
+ "shrink-0",
16
+ "gap-1",
17
+ "overflow-hidden",
18
+ // Shape
19
+ "rounded-md",
20
+ // Borders
21
+ "border",
22
+ // Spacing
23
+ "px-2",
24
+ "py-0.5",
25
+ // Typography
26
+ "text-xs",
27
+ "font-medium",
28
+ // SVG
29
+ "[&>svg]:size-3",
30
+ "[&>svg]:pointer-events-none",
31
+ // Transitions
32
+ "transition-[color,box-shadow]",
33
+ // Focus
34
+ "focus-visible:ring-2",
35
+ "focus-visible:ring-utility-blue/70",
36
+ // Invalid
37
+ "aria-invalid:ring-2",
38
+ "aria-invalid:ring-utility-red/70",
39
+ "aria-invalid:border-border-error",
40
+ );
41
+
42
+ const badgeVariants = cva(baseBadgeStyles, {
43
+ variants: {
44
+ variant: {
45
+ default: cn(
46
+ "border-transparent",
47
+ "bg-bg-link",
48
+ "text-text-primary_on-brand",
49
+ "[a&]:hover:bg-bg-link_hover",
50
+ ),
51
+ secondary: cn(
52
+ "border-transparent",
53
+ "bg-bg-secondary",
54
+ "text-text-secondary",
55
+ "[a&]:hover:bg-bg-tertiary",
56
+ ),
57
+ destructive: cn(
58
+ "border-transparent",
59
+ "bg-bg-error-primary_inverse",
60
+ "text-text-primary_on-brand",
61
+ "[a&]:hover:bg-bg-error-primary_inverse_hover",
62
+ "focus-visible:ring-utility-red/70",
63
+ ),
64
+ outline: cn(
65
+ "text-text-primary",
66
+ "border-border-primary",
67
+ "[a&]:hover:bg-bg-secondary",
68
+ "[a&]:hover:text-text-primary",
69
+ ),
24
70
  },
25
71
  },
26
- );
72
+ defaultVariants: {
73
+ variant: "default",
74
+ },
75
+ });
27
76
 
28
77
  function Badge({
29
78
  className,
@@ -13,7 +13,13 @@ function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
13
13
  <ol
14
14
  data-slot="breadcrumb-list"
15
15
  className={cn(
16
- "text-text-tertiary typo-body flex flex-wrap items-center break-words gap-2",
16
+ "text-text-tertiary",
17
+ "typo-body",
18
+ "flex",
19
+ "flex-wrap",
20
+ "items-center",
21
+ "break-words",
22
+ "gap-2",
17
23
  className,
18
24
  )}
19
25
  {...props}
@@ -25,7 +31,7 @@ function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
25
31
  return (
26
32
  <li
27
33
  data-slot="breadcrumb-item"
28
- className={cn("inline-flex items-center", className)}
34
+ className={cn("inline-flex", "items-center", className)}
29
35
  {...props}
30
36
  />
31
37
  );
@@ -44,9 +50,17 @@ function BreadcrumbLink({
44
50
  <Comp
45
51
  data-slot="breadcrumb-link"
46
52
  className={cn(
47
- "typo-body bg-bg-tertiary text-text-tertiary rounded-md px-2 py-1 transition-colors",
53
+ "typo-body",
54
+ "bg-bg-tertiary",
55
+ "text-text-tertiary",
56
+ "rounded-md",
57
+ "px-2",
58
+ "py-1",
59
+ "transition-colors",
48
60
  "hover:text-text-secondary",
49
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
61
+ "focus-visible:outline-none",
62
+ "focus-visible:ring-2",
63
+ "focus-visible:ring-utility-blue/70",
50
64
  className,
51
65
  )}
52
66
  {...props}
@@ -64,7 +78,10 @@ function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
64
78
  aria-disabled="true"
65
79
  aria-current="page"
66
80
  className={cn(
67
- "typo-page-header text-text-primary px-0 py-0.5",
81
+ "typo-page-header",
82
+ "text-text-primary",
83
+ "px-0",
84
+ "py-0.5",
68
85
  className,
69
86
  )}
70
87
  {...props}
@@ -82,7 +99,12 @@ function BreadcrumbSeparator({
82
99
  data-slot="breadcrumb-separator"
83
100
  role="presentation"
84
101
  aria-hidden="true"
85
- className={cn("[&>svg]:size-3.5 text-text-quternary text-xs", className)}
102
+ className={cn(
103
+ "[&>svg]:size-3.5",
104
+ "text-text-tertiary",
105
+ "text-xs",
106
+ className,
107
+ )}
86
108
  {...props}
87
109
  >
88
110
  {children ?? "/"}
@@ -99,7 +121,13 @@ function BreadcrumbEllipsis({
99
121
  data-slot="breadcrumb-ellipsis"
100
122
  role="presentation"
101
123
  aria-hidden="true"
102
- className={cn("flex size-9 items-center justify-center", className)}
124
+ className={cn(
125
+ "flex",
126
+ "size-9",
127
+ "items-center",
128
+ "justify-center",
129
+ className,
130
+ )}
103
131
  {...props}
104
132
  >
105
133
  <MoreHorizontal className="size-4" />
@@ -4,67 +4,128 @@ import type * as React from "react";
4
4
 
5
5
  import { cn } from "#shadcn/lib/utils";
6
6
 
7
- const buttonVariants = cva(
8
- cn(
9
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg transition-all ",
10
- "outline-none cursor-pointer",
11
- "disabled:cursor-not-allowed",
12
- "[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0",
13
- "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
14
- "aria-invalid:ring-destructive/20",
15
- ),
16
- {
17
- variants: {
18
- variant: {
19
- primary:
20
- "bg-bg-link text-text-primary_on-brand shadow-xs hover:bg-bg-link_hover active:bg-bg-link disabled:bg-bg-disabled",
21
- secondary:
22
- "border border-border-primary bg-bg-primary text-text-tertiary shadow-xs hover:text-fg-primary disabled:text-fg-disabled disabled:border-border-disabled hover:bg-bg-secondary active:bg-bg-primary active:text-text-tertiary disabled:hover:bg-bg-primary",
23
- link: "text-text-secondary hover:text-text-primary disabled:text-text-disabled rounded-none",
24
- ghost:
25
- "text-text-secondary hover:text-text-primary disabled:text-text-disabled hover:bg-bg-secondary active:bg-bg-tertiary disabled:hover:bg-bg-primary",
26
- },
27
- size: {
28
- regular: "h-9 px-4 typo-label",
29
- small: "h-6 px-2 typo-button-label-xs gap-1 rounded-md",
30
- },
31
- danger: {
32
- true: "",
33
- false: "",
34
- },
7
+ const baseButtonStyles = cn(
8
+ // Layout
9
+ "inline-flex",
10
+ "items-center",
11
+ "justify-center",
12
+ "gap-2",
13
+ "whitespace-nowrap",
14
+ "shrink-0",
15
+ // Shape
16
+ "rounded-lg",
17
+ // Interaction
18
+ "transition-all",
19
+ "outline-none",
20
+ "cursor-pointer",
21
+ // Disabled states
22
+ "disabled:cursor-not-allowed",
23
+ // Icon styles
24
+ "[&_svg]:pointer-events-none",
25
+ "[&_svg:not([class*='size-'])]:size-4",
26
+ "[&_svg]:shrink-0",
27
+ // Focus states
28
+ "focus-visible:ring-2",
29
+ "focus-visible:ring-utility-blue/70",
30
+ // Invalid states
31
+ "aria-invalid:ring-2",
32
+ "aria-invalid:ring-utility-red/70",
33
+ );
34
+
35
+ const buttonVariants = cva(baseButtonStyles, {
36
+ variants: {
37
+ variant: {
38
+ primary: cn(
39
+ "bg-bg-link",
40
+ "text-text-primary_on-brand",
41
+ "hover:bg-bg-link_hover",
42
+ "active:bg-bg-link",
43
+ "disabled:bg-bg-disabled",
44
+ "disabled:text-text-disabled",
45
+ ),
46
+ secondary: cn(
47
+ "border",
48
+ "border-border-primary",
49
+ "bg-bg-primary",
50
+ "text-text-secondary",
51
+ "hover:text-text-primary",
52
+ "hover:bg-bg-secondary",
53
+ "active:bg-bg-primary",
54
+ "active:text-text-tertiary",
55
+ "disabled:text-text-disabled",
56
+ "disabled:border-border-disabled",
57
+ "disabled:hover:bg-bg-primary",
58
+ ),
59
+ link: cn(
60
+ "text-text-secondary",
61
+ "hover:text-text-primary",
62
+ "disabled:text-text-disabled",
63
+ "rounded-none",
64
+ ),
65
+ ghost: cn(
66
+ "text-text-secondary",
67
+ "hover:text-text-primary",
68
+ "hover:bg-bg-secondary",
69
+ "active:bg-bg-tertiary",
70
+ "disabled:text-text-disabled",
71
+ "disabled:hover:bg-bg-primary",
72
+ ),
73
+ },
74
+ size: {
75
+ regular: cn("h-9", "px-4", "typo-label"),
76
+ small: cn("h-6", "px-2", "gap-1", "typo-button-label-xs"),
35
77
  },
36
- compoundVariants: [
37
- {
38
- variant: "primary",
39
- danger: true,
40
- class:
41
- "bg-bg-error-primary_inverse text-text-primary_on-brand hover:bg-bg-error-primary_inverse_hover active:bg-bg-error-primary_inverse disabled:bg-bg-disabled",
42
- },
43
- {
44
- variant: "secondary",
45
- danger: true,
46
- class:
47
- "border-border-error text-text-error-primary hover:text-text-error-primary_hover hover:bg-bg-error-secondary active:bg-bg-primary active:text-text-error-primary_on-brand",
48
- },
49
- {
50
- variant: "link",
51
- danger: true,
52
- class: "text-text-error-secondary hover:text-text-error-primary",
53
- },
54
- {
55
- variant: "ghost",
56
- danger: true,
57
- class:
58
- "text-text-error-secondary hover:text-text-error-primary hover:bg-bg-error-secondary active:bg-bg-error-tertiary",
59
- },
60
- ],
61
- defaultVariants: {
78
+ danger: {
79
+ true: "",
80
+ false: "",
81
+ },
82
+ },
83
+ compoundVariants: [
84
+ {
62
85
  variant: "primary",
63
- size: "regular",
64
- danger: false,
86
+ danger: true,
87
+ class: cn(
88
+ "bg-bg-error-primary_inverse",
89
+ "text-text-primary_on-brand",
90
+ "hover:bg-bg-error-primary_inverse_hover",
91
+ "active:bg-bg-error-primary_inverse",
92
+ "disabled:bg-bg-disabled",
93
+ ),
65
94
  },
95
+ {
96
+ variant: "secondary",
97
+ danger: true,
98
+ class: cn(
99
+ "border-border-error",
100
+ "text-text-error-primary",
101
+ "hover:text-text-error-primary",
102
+ "hover:bg-bg-error-secondary",
103
+ "active:bg-bg-primary",
104
+ "active:text-text-error-primary",
105
+ ),
106
+ },
107
+ {
108
+ variant: "link",
109
+ danger: true,
110
+ class: cn("text-text-error-secondary", "hover:text-text-error-primary"),
111
+ },
112
+ {
113
+ variant: "ghost",
114
+ danger: true,
115
+ class: cn(
116
+ "text-text-error-secondary",
117
+ "hover:text-text-error-primary",
118
+ "hover:bg-bg-error-secondary",
119
+ "active:bg-bg-error-tertiary",
120
+ ),
121
+ },
122
+ ],
123
+ defaultVariants: {
124
+ variant: "primary",
125
+ size: "regular",
126
+ danger: false,
66
127
  },
67
- );
128
+ });
68
129
 
69
130
  function Button({
70
131
  className,
@@ -2,16 +2,29 @@ import type * as React from "react";
2
2
 
3
3
  import { cn } from "#shadcn/lib/utils";
4
4
 
5
+ // Card styles
6
+ const cardStyles = cn(
7
+ // Layout
8
+ "flex",
9
+ "flex-col",
10
+ "gap-6",
11
+ // Shape
12
+ "rounded-xl",
13
+ // Borders
14
+ "border",
15
+ "border-border-primary",
16
+ // Background & Colors
17
+ "bg-bg-primary",
18
+ "text-text-primary",
19
+ // Spacing
20
+ "py-6",
21
+ // Shadow
22
+ "shadow-sm",
23
+ );
24
+
5
25
  function Card({ className, ...props }: React.ComponentProps<"div">) {
6
26
  return (
7
- <div
8
- data-slot="card"
9
- className={cn(
10
- "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
11
- className,
12
- )}
13
- {...props}
14
- />
27
+ <div data-slot="card" className={cn(cardStyles, className)} {...props} />
15
28
  );
16
29
  }
17
30
 
@@ -20,7 +33,15 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
20
33
  <div
21
34
  data-slot="card-header"
22
35
  className={cn(
23
- "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
36
+ "@container/card-header",
37
+ "grid",
38
+ "auto-rows-min",
39
+ "grid-rows-[auto_auto]",
40
+ "items-start",
41
+ "gap-1.5",
42
+ "px-6",
43
+ "has-data-[slot=card-action]:grid-cols-[1fr_auto]",
44
+ "[.border-b]:pb-6",
24
45
  className,
25
46
  )}
26
47
  {...props}
@@ -32,7 +53,7 @@ function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
32
53
  return (
33
54
  <div
34
55
  data-slot="card-title"
35
- className={cn("leading-none font-semibold", className)}
56
+ className={cn("leading-none", "font-semibold", className)}
36
57
  {...props}
37
58
  />
38
59
  );
@@ -42,7 +63,7 @@ function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
42
63
  return (
43
64
  <div
44
65
  data-slot="card-description"
45
- className={cn("text-muted-foreground text-sm", className)}
66
+ className={cn("text-text-secondary", "text-sm", className)}
46
67
  {...props}
47
68
  />
48
69
  );
@@ -53,7 +74,11 @@ function CardAction({ className, ...props }: React.ComponentProps<"div">) {
53
74
  <div
54
75
  data-slot="card-action"
55
76
  className={cn(
56
- "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
77
+ "col-start-2",
78
+ "row-span-2",
79
+ "row-start-1",
80
+ "self-start",
81
+ "justify-self-end",
57
82
  className,
58
83
  )}
59
84
  {...props}
@@ -75,7 +100,13 @@ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
75
100
  return (
76
101
  <div
77
102
  data-slot="card-footer"
78
- className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
103
+ className={cn(
104
+ "flex",
105
+ "items-center",
106
+ "px-6",
107
+ "[.border-t]:pt-6",
108
+ className,
109
+ )}
79
110
  {...props}
80
111
  />
81
112
  );
@@ -14,36 +14,32 @@ export const Demo = {
14
14
  <div className="flex flex-col gap-6">
15
15
  <div className="flex items-center gap-3">
16
16
  <Checkbox id="terms" />
17
- <Label htmlFor="terms">Accept terms and conditions</Label>
17
+ <Label htmlFor="terms">Unchecked</Label>
18
18
  </div>
19
- <div className="flex items-start gap-3">
19
+ <div className="flex items-center gap-3">
20
20
  <Checkbox id="terms-2" defaultChecked />
21
- <div className="grid gap-2">
22
- <Label htmlFor="terms-2">Accept terms and conditions</Label>
23
- <p className="text-muted-foreground text-sm">
24
- By clicking this checkbox, you agree to the terms and conditions.
25
- </p>
26
- </div>
21
+ <Label htmlFor="terms-2">Checked</Label>
22
+ </div>
23
+ <div className="flex items-center gap-3">
24
+ <Checkbox id="indeterminate" checked="indeterminate" />
25
+ <Label htmlFor="indeterminate">Indeterminate</Label>
26
+ </div>
27
+ <div className="flex items-center gap-3">
28
+ <Checkbox id="disabled" disabled />
29
+ <Label htmlFor="disabled">Disabled unchecked</Label>
27
30
  </div>
28
- <div className="flex items-start gap-3">
29
- <Checkbox id="toggle" disabled />
30
- <Label htmlFor="toggle">Enable notifications</Label>
31
+ <div className="flex items-center gap-3">
32
+ <Checkbox id="disabled-checked" disabled defaultChecked />
33
+ <Label htmlFor="disabled-checked">Disabled checked</Label>
31
34
  </div>
32
- <Label className="hover:bg-accent/50 flex items-start gap-3 rounded-lg border p-3 has-[[aria-checked=true]]:border-blue-600 has-[[aria-checked=true]]:bg-blue-50 dark:has-[[aria-checked=true]]:border-blue-900 dark:has-[[aria-checked=true]]:bg-blue-950">
35
+ <div className="flex items-center gap-3">
33
36
  <Checkbox
34
- id="toggle-2"
35
- defaultChecked
36
- className="data-[state=checked]:border-blue-600 data-[state=checked]:bg-blue-600 data-[state=checked]:text-white dark:data-[state=checked]:border-blue-700 dark:data-[state=checked]:bg-blue-700"
37
+ id="disabled-indeterminate"
38
+ disabled
39
+ checked="indeterminate"
37
40
  />
38
- <div className="grid gap-1.5 font-normal">
39
- <p className="text-sm leading-none font-medium">
40
- Enable notifications
41
- </p>
42
- <p className="text-muted-foreground text-sm">
43
- You can enable or disable notifications at any time.
44
- </p>
45
- </div>
46
- </Label>
41
+ <Label htmlFor="disabled-indeterminate">Disabled indeterminate</Label>
42
+ </div>
47
43
  </div>
48
44
  ),
49
45
  } satisfies Story;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
3
- import { CheckIcon } from "lucide-react";
3
+ import { CheckIcon, MinusIcon } from "lucide-react";
4
4
  import type * as React from "react";
5
5
 
6
6
  import { cn } from "#shadcn/lib/utils";
@@ -13,16 +13,57 @@ function Checkbox({
13
13
  <CheckboxPrimitive.Root
14
14
  data-slot="checkbox"
15
15
  className={cn(
16
- "peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-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 size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
16
+ // Base styles
17
+ "peer",
18
+ "size-5",
19
+ "shrink-0",
20
+ "rounded-md",
21
+ "border-[1.5px]",
22
+ "transition-all",
23
+ "duration-200",
24
+ "outline-none",
25
+ "cursor-pointer",
26
+ "text-white",
27
+ // Click animation
28
+ "active:scale-90",
29
+ "active:duration-75",
30
+ // Default state
31
+ "border-border-primary",
32
+ "bg-transparent",
33
+ "hover:bg-bg-tertiary",
34
+ // Checked state
35
+ "data-[state=checked]:bg-bg-link",
36
+ "data-[state=checked]:border-border-link",
37
+ "data-[state=checked]:text-white",
38
+ // Indeterminate state
39
+ "data-[state=indeterminate]:bg-fg-link",
40
+ "data-[state=indeterminate]:border-fg-link",
41
+ "data-[state=indeterminate]:text-white",
42
+ // Disabled states
43
+ "disabled:cursor-not-allowed",
44
+ "disabled:active:scale-100",
45
+ "disabled:border-border-secondary",
46
+ "disabled:bg-transparent",
47
+ "disabled:data-[state=checked]:bg-fg-tertiary",
48
+ "disabled:data-[state=checked]:border-fg-tertiary",
49
+ "disabled:data-[state=indeterminate]:bg-fg-tertiary",
50
+ "disabled:data-[state=indeterminate]:border-fg-tertiary",
51
+ // Focus state
52
+ "focus-visible:ring-2",
53
+ "focus-visible:ring-utility-blue/70",
17
54
  className,
18
55
  )}
19
56
  {...props}
20
57
  >
21
58
  <CheckboxPrimitive.Indicator
22
59
  data-slot="checkbox-indicator"
23
- className="flex items-center justify-center text-current transition-none"
60
+ className="flex items-center justify-center text-white"
24
61
  >
25
- <CheckIcon className="size-3.5" />
62
+ {props.checked === "indeterminate" ? (
63
+ <MinusIcon className="size-3.5" style={{ strokeWidth: 3 }} />
64
+ ) : (
65
+ <CheckIcon className="size-3.5" style={{ strokeWidth: 3 }} />
66
+ )}
26
67
  </CheckboxPrimitive.Indicator>
27
68
  </CheckboxPrimitive.Root>
28
69
  );
@@ -0,0 +1,19 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { ComboboxDemo } from "./combobox";
3
+
4
+ const meta = {
5
+ title: "Component/Combobox",
6
+ component: ComboboxDemo,
7
+ argTypes: {},
8
+ } satisfies Meta;
9
+ export default meta;
10
+
11
+ type Story = StoryObj<typeof meta>;
12
+
13
+ export const Default = {
14
+ render: () => (
15
+ <div className="w-[560px]">
16
+ <ComboboxDemo />
17
+ </div>
18
+ ),
19
+ } satisfies Story;