gladvn 0.2.22 → 0.2.27

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 (463) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -58
  3. package/bin/cli.js +352 -150
  4. package/llms.txt +7 -5
  5. package/package.json +14 -26
  6. package/src/blocks/auth-card.tsx +104 -0
  7. package/src/blocks/auth-dialog.tsx +116 -0
  8. package/src/blocks/auth-recovery.tsx +61 -0
  9. package/src/blocks/auth-split.tsx +132 -0
  10. package/src/blocks/dashboard.tsx +182 -0
  11. package/src/blocks/settings.tsx +104 -0
  12. package/src/components/macro/accordion-preset.tsx +2 -1
  13. package/src/components/macro/alert-dialog-preset.tsx +3 -2
  14. package/src/components/macro/alert-preset.tsx +2 -1
  15. package/src/components/macro/avatar-preset.tsx +2 -1
  16. package/src/components/macro/breadcrumb-preset.tsx +2 -1
  17. package/src/components/macro/card-preset.tsx +2 -1
  18. package/src/components/macro/carousel-preset.tsx +2 -1
  19. package/src/components/macro/checkbox-preset.tsx +2 -1
  20. package/src/components/macro/combobox-preset.tsx +5 -3
  21. package/src/components/macro/command-preset.tsx +7 -4
  22. package/src/components/macro/date-picker.tsx +3 -2
  23. package/src/components/macro/dialog-preset.tsx +3 -2
  24. package/src/components/macro/empty-preset.tsx +2 -1
  25. package/src/components/macro/field-preset.tsx +2 -1
  26. package/src/components/macro/input-otp-preset.tsx +2 -1
  27. package/src/components/macro/input-preset.tsx +2 -1
  28. package/src/components/macro/pagination-preset.tsx +2 -1
  29. package/src/components/macro/progress-preset.tsx +2 -1
  30. package/src/components/macro/select-preset.tsx +3 -2
  31. package/src/components/macro/slider-preset.tsx +2 -1
  32. package/src/components/macro/switch-preset.tsx +2 -1
  33. package/src/components/macro/tabs-preset.tsx +2 -1
  34. package/src/components/micro/accordion.test.tsx +96 -0
  35. package/src/components/micro/alert-dialog.tsx +1 -1
  36. package/src/components/micro/alert.test.tsx +77 -0
  37. package/src/components/micro/avatar.tsx +1 -1
  38. package/src/components/micro/badge.test.tsx +57 -0
  39. package/src/components/micro/breadcrumb.tsx +1 -1
  40. package/src/components/micro/button.test.tsx +101 -4
  41. package/src/components/micro/card.test.tsx +54 -0
  42. package/src/components/micro/card.tsx +1 -1
  43. package/src/components/micro/carousel.tsx +1 -1
  44. package/src/components/micro/chart.tsx +1 -1
  45. package/src/components/micro/checkbox.test.tsx +92 -0
  46. package/src/components/micro/combobox.tsx +1 -1
  47. package/src/components/micro/command.tsx +1 -1
  48. package/src/components/micro/context-menu.tsx +1 -1
  49. package/src/components/micro/dialog.test.tsx +127 -0
  50. package/src/components/micro/dialog.tsx +1 -1
  51. package/src/components/micro/direction.tsx +1 -1
  52. package/src/components/micro/drawer.tsx +2 -2
  53. package/src/components/micro/dropdown-menu.test.tsx +132 -0
  54. package/src/components/micro/dropdown-menu.tsx +1 -1
  55. package/src/components/micro/empty.tsx +1 -1
  56. package/src/components/micro/field.tsx +1 -1
  57. package/src/components/micro/input-group.tsx +1 -1
  58. package/src/components/micro/input.test.tsx +95 -0
  59. package/src/components/micro/item.tsx +1 -1
  60. package/src/components/micro/menubar.tsx +1 -1
  61. package/src/components/micro/navigation-menu.tsx +1 -1
  62. package/src/components/micro/pagination.tsx +1 -1
  63. package/src/components/micro/popover.test.tsx +83 -0
  64. package/src/components/micro/popover.tsx +1 -1
  65. package/src/components/micro/progress.tsx +1 -1
  66. package/src/components/micro/select.test.tsx +122 -0
  67. package/src/components/micro/select.tsx +1 -1
  68. package/src/components/micro/sheet.test.tsx +122 -0
  69. package/src/components/micro/sheet.tsx +1 -1
  70. package/src/components/micro/sidebar.tsx +1 -1
  71. package/src/components/micro/switch.test.tsx +108 -0
  72. package/src/components/micro/table.tsx +1 -1
  73. package/src/components/micro/tabs.test.tsx +90 -0
  74. package/src/components/micro/tooltip.test.tsx +107 -0
  75. package/src/components/micro/tooltip.tsx +1 -1
  76. package/src/dev/data.ts +8 -0
  77. package/src/dev/main.tsx +4 -0
  78. package/src/dev/showcase/accordion.tsx +4 -2
  79. package/src/dev/showcase/alert-dialog.tsx +7 -4
  80. package/src/dev/showcase/alert.tsx +6 -3
  81. package/src/dev/showcase/aspect-ratio.tsx +2 -1
  82. package/src/dev/showcase/avatar.tsx +6 -3
  83. package/src/dev/showcase/badge.tsx +2 -1
  84. package/src/dev/showcase/breadcrumb.tsx +7 -4
  85. package/src/dev/showcase/button.tsx +2 -1
  86. package/src/dev/showcase/calendar.tsx +2 -1
  87. package/src/dev/showcase/card.tsx +4 -2
  88. package/src/dev/showcase/carousel.tsx +4 -2
  89. package/src/dev/showcase/chart.tsx +4 -2
  90. package/src/dev/showcase/checkbox.tsx +4 -2
  91. package/src/dev/showcase/collapsible.tsx +4 -2
  92. package/src/dev/showcase/combobox.tsx +9 -5
  93. package/src/dev/showcase/command.tsx +6 -3
  94. package/src/dev/showcase/context-menu.tsx +5 -3
  95. package/src/dev/showcase/dialog.tsx +5 -3
  96. package/src/dev/showcase/drawer.tsx +5 -3
  97. package/src/dev/showcase/dropdown-menu.tsx +7 -4
  98. package/src/dev/showcase/empty.tsx +6 -3
  99. package/src/dev/showcase/hover-card.tsx +7 -4
  100. package/src/dev/showcase/input-group.tsx +6 -3
  101. package/src/dev/showcase/input-otp.tsx +6 -3
  102. package/src/dev/showcase/input.tsx +6 -3
  103. package/src/dev/showcase/item.tsx +4 -2
  104. package/src/dev/showcase/kbd.tsx +10 -6
  105. package/src/dev/showcase/label.tsx +2 -1
  106. package/src/dev/showcase/menubar.tsx +5 -3
  107. package/src/dev/showcase/navigation-menu.tsx +5 -3
  108. package/src/dev/showcase/overview.tsx +9 -5
  109. package/src/dev/showcase/pagination.tsx +4 -2
  110. package/src/dev/showcase/popover.tsx +5 -3
  111. package/src/dev/showcase/progress.tsx +4 -2
  112. package/src/dev/showcase/radio-group.tsx +2 -1
  113. package/src/dev/showcase/resizable.tsx +4 -2
  114. package/src/dev/showcase/scroll-area.tsx +2 -1
  115. package/src/dev/showcase/select.tsx +7 -4
  116. package/src/dev/showcase/separator.tsx +2 -1
  117. package/src/dev/showcase/sheet.tsx +5 -3
  118. package/src/dev/showcase/sidebar.tsx +4 -2
  119. package/src/dev/showcase/skeleton.tsx +2 -1
  120. package/src/dev/showcase/slider.tsx +6 -3
  121. package/src/dev/showcase/sonner.tsx +2 -1
  122. package/src/dev/showcase/spinner.tsx +2 -1
  123. package/src/dev/showcase/switch.tsx +2 -1
  124. package/src/dev/showcase/table.tsx +4 -2
  125. package/src/dev/showcase/tabs.tsx +4 -2
  126. package/src/dev/showcase/textarea.tsx +6 -3
  127. package/src/dev/showcase/toast.tsx +2 -1
  128. package/src/dev/showcase/toggle-group.tsx +6 -3
  129. package/src/dev/showcase/toggle.tsx +2 -1
  130. package/src/dev/showcase/tooltip.tsx +5 -3
  131. package/src/dev/showcase/why.tsx +271 -0
  132. package/src/hooks/use-mobile.test.ts +72 -0
  133. package/src/lib/utils.test.ts +26 -10
  134. package/src/styles/gladvn.css +0 -1
  135. package/src/styles/tokens.css +4 -0
  136. package/dist/components/macro/accordion-preset.d.ts +0 -14
  137. package/dist/components/macro/accordion-preset.d.ts.map +0 -1
  138. package/dist/components/macro/alert-dialog-preset.d.ts +0 -26
  139. package/dist/components/macro/alert-dialog-preset.d.ts.map +0 -1
  140. package/dist/components/macro/alert-preset.d.ts +0 -14
  141. package/dist/components/macro/alert-preset.d.ts.map +0 -1
  142. package/dist/components/macro/avatar-preset.d.ts +0 -11
  143. package/dist/components/macro/avatar-preset.d.ts.map +0 -1
  144. package/dist/components/macro/breadcrumb-preset.d.ts +0 -12
  145. package/dist/components/macro/breadcrumb-preset.d.ts.map +0 -1
  146. package/dist/components/macro/card-preset.d.ts +0 -10
  147. package/dist/components/macro/card-preset.d.ts.map +0 -1
  148. package/dist/components/macro/carousel-preset.d.ts +0 -18
  149. package/dist/components/macro/carousel-preset.d.ts.map +0 -1
  150. package/dist/components/macro/checkbox-preset.d.ts +0 -14
  151. package/dist/components/macro/checkbox-preset.d.ts.map +0 -1
  152. package/dist/components/macro/combobox-preset.d.ts +0 -27
  153. package/dist/components/macro/combobox-preset.d.ts.map +0 -1
  154. package/dist/components/macro/command-preset.d.ts +0 -16
  155. package/dist/components/macro/command-preset.d.ts.map +0 -1
  156. package/dist/components/macro/date-picker.d.ts +0 -62
  157. package/dist/components/macro/date-picker.d.ts.map +0 -1
  158. package/dist/components/macro/dialog-preset.d.ts +0 -24
  159. package/dist/components/macro/dialog-preset.d.ts.map +0 -1
  160. package/dist/components/macro/empty-preset.d.ts +0 -15
  161. package/dist/components/macro/empty-preset.d.ts.map +0 -1
  162. package/dist/components/macro/field-preset.d.ts +0 -15
  163. package/dist/components/macro/field-preset.d.ts.map +0 -1
  164. package/dist/components/macro/index.d.ts +0 -22
  165. package/dist/components/macro/index.d.ts.map +0 -1
  166. package/dist/components/macro/input-otp-preset.d.ts +0 -19
  167. package/dist/components/macro/input-otp-preset.d.ts.map +0 -1
  168. package/dist/components/macro/input-preset.d.ts +0 -21
  169. package/dist/components/macro/input-preset.d.ts.map +0 -1
  170. package/dist/components/macro/pagination-preset.d.ts +0 -13
  171. package/dist/components/macro/pagination-preset.d.ts.map +0 -1
  172. package/dist/components/macro/progress-preset.d.ts +0 -10
  173. package/dist/components/macro/progress-preset.d.ts.map +0 -1
  174. package/dist/components/macro/radio-group-preset.d.ts +0 -22
  175. package/dist/components/macro/radio-group-preset.d.ts.map +0 -1
  176. package/dist/components/macro/select-preset.d.ts +0 -42
  177. package/dist/components/macro/select-preset.d.ts.map +0 -1
  178. package/dist/components/macro/slider-preset.d.ts +0 -12
  179. package/dist/components/macro/slider-preset.d.ts.map +0 -1
  180. package/dist/components/macro/switch-preset.d.ts +0 -12
  181. package/dist/components/macro/switch-preset.d.ts.map +0 -1
  182. package/dist/components/macro/tabs-preset.d.ts +0 -17
  183. package/dist/components/macro/tabs-preset.d.ts.map +0 -1
  184. package/dist/components/macro/textarea-preset.d.ts +0 -17
  185. package/dist/components/macro/textarea-preset.d.ts.map +0 -1
  186. package/dist/components/micro/accordion.d.ts +0 -15
  187. package/dist/components/micro/accordion.d.ts.map +0 -1
  188. package/dist/components/micro/alert-dialog.d.ts +0 -33
  189. package/dist/components/micro/alert-dialog.d.ts.map +0 -1
  190. package/dist/components/micro/alert.d.ts +0 -35
  191. package/dist/components/micro/alert.d.ts.map +0 -1
  192. package/dist/components/micro/aspect-ratio.d.ts +0 -20
  193. package/dist/components/micro/aspect-ratio.d.ts.map +0 -1
  194. package/dist/components/micro/avatar.d.ts +0 -23
  195. package/dist/components/micro/avatar.d.ts.map +0 -1
  196. package/dist/components/micro/badge.d.ts +0 -23
  197. package/dist/components/micro/badge.d.ts.map +0 -1
  198. package/dist/components/micro/breadcrumb.d.ts +0 -31
  199. package/dist/components/micro/breadcrumb.d.ts.map +0 -1
  200. package/dist/components/micro/button.d.ts +0 -46
  201. package/dist/components/micro/button.d.ts.map +0 -1
  202. package/dist/components/micro/calendar.d.ts +0 -28
  203. package/dist/components/micro/calendar.d.ts.map +0 -1
  204. package/dist/components/micro/card.d.ts +0 -28
  205. package/dist/components/micro/card.d.ts.map +0 -1
  206. package/dist/components/micro/carousel.d.ts +0 -29
  207. package/dist/components/micro/carousel.d.ts.map +0 -1
  208. package/dist/components/micro/chart.d.ts +0 -49
  209. package/dist/components/micro/chart.d.ts.map +0 -1
  210. package/dist/components/micro/checkbox.d.ts +0 -17
  211. package/dist/components/micro/checkbox.d.ts.map +0 -1
  212. package/dist/components/micro/collapsible.d.ts +0 -15
  213. package/dist/components/micro/collapsible.d.ts.map +0 -1
  214. package/dist/components/micro/combobox.d.ts +0 -34
  215. package/dist/components/micro/combobox.d.ts.map +0 -1
  216. package/dist/components/micro/command.d.ts +0 -79
  217. package/dist/components/micro/command.d.ts.map +0 -1
  218. package/dist/components/micro/context-menu.d.ts +0 -58
  219. package/dist/components/micro/context-menu.d.ts.map +0 -1
  220. package/dist/components/micro/dialog.d.ts +0 -15
  221. package/dist/components/micro/dialog.d.ts.map +0 -1
  222. package/dist/components/micro/direction.d.ts +0 -2
  223. package/dist/components/micro/direction.d.ts.map +0 -1
  224. package/dist/components/micro/drawer.d.ts +0 -18
  225. package/dist/components/micro/drawer.d.ts.map +0 -1
  226. package/dist/components/micro/dropdown-menu.d.ts +0 -40
  227. package/dist/components/micro/dropdown-menu.d.ts.map +0 -1
  228. package/dist/components/micro/empty.d.ts +0 -30
  229. package/dist/components/micro/empty.d.ts.map +0 -1
  230. package/dist/components/micro/field.d.ts +0 -29
  231. package/dist/components/micro/field.d.ts.map +0 -1
  232. package/dist/components/micro/hover-card.d.ts +0 -18
  233. package/dist/components/micro/hover-card.d.ts.map +0 -1
  234. package/dist/components/micro/input-group.d.ts +0 -17
  235. package/dist/components/micro/input-group.d.ts.map +0 -1
  236. package/dist/components/micro/input-otp.d.ts +0 -44
  237. package/dist/components/micro/input-otp.d.ts.map +0 -1
  238. package/dist/components/micro/input.d.ts +0 -29
  239. package/dist/components/micro/input.d.ts.map +0 -1
  240. package/dist/components/micro/item.d.ts +0 -31
  241. package/dist/components/micro/item.d.ts.map +0 -1
  242. package/dist/components/micro/kbd.d.ts +0 -9
  243. package/dist/components/micro/kbd.d.ts.map +0 -1
  244. package/dist/components/micro/label.d.ts +0 -15
  245. package/dist/components/micro/label.d.ts.map +0 -1
  246. package/dist/components/micro/menubar.d.ts +0 -40
  247. package/dist/components/micro/menubar.d.ts.map +0 -1
  248. package/dist/components/micro/navigation-menu.d.ts +0 -26
  249. package/dist/components/micro/navigation-menu.d.ts.map +0 -1
  250. package/dist/components/micro/pagination.d.ts +0 -33
  251. package/dist/components/micro/pagination.d.ts.map +0 -1
  252. package/dist/components/micro/popover.d.ts +0 -24
  253. package/dist/components/micro/popover.d.ts.map +0 -1
  254. package/dist/components/micro/progress.d.ts +0 -19
  255. package/dist/components/micro/progress.d.ts.map +0 -1
  256. package/dist/components/micro/radio-group.d.ts +0 -13
  257. package/dist/components/micro/radio-group.d.ts.map +0 -1
  258. package/dist/components/micro/resizable.d.ts +0 -12
  259. package/dist/components/micro/resizable.d.ts.map +0 -1
  260. package/dist/components/micro/scroll-area.d.ts +0 -12
  261. package/dist/components/micro/scroll-area.d.ts.map +0 -1
  262. package/dist/components/micro/select.d.ts +0 -22
  263. package/dist/components/micro/select.d.ts.map +0 -1
  264. package/dist/components/micro/separator.d.ts +0 -9
  265. package/dist/components/micro/separator.d.ts.map +0 -1
  266. package/dist/components/micro/sheet.d.ts +0 -17
  267. package/dist/components/micro/sheet.d.ts.map +0 -1
  268. package/dist/components/micro/sidebar.d.ts +0 -28
  269. package/dist/components/micro/sidebar.d.ts.map +0 -1
  270. package/dist/components/micro/skeleton.d.ts +0 -16
  271. package/dist/components/micro/skeleton.d.ts.map +0 -1
  272. package/dist/components/micro/slider.d.ts +0 -21
  273. package/dist/components/micro/slider.d.ts.map +0 -1
  274. package/dist/components/micro/sonner.d.ts +0 -5
  275. package/dist/components/micro/sonner.d.ts.map +0 -1
  276. package/dist/components/micro/spinner.d.ts +0 -21
  277. package/dist/components/micro/spinner.d.ts.map +0 -1
  278. package/dist/components/micro/switch.d.ts +0 -13
  279. package/dist/components/micro/switch.d.ts.map +0 -1
  280. package/dist/components/micro/table.d.ts +0 -17
  281. package/dist/components/micro/table.d.ts.map +0 -1
  282. package/dist/components/micro/tabs.d.ts +0 -13
  283. package/dist/components/micro/tabs.d.ts.map +0 -1
  284. package/dist/components/micro/textarea.d.ts +0 -24
  285. package/dist/components/micro/textarea.d.ts.map +0 -1
  286. package/dist/components/micro/theme-provider.d.ts +0 -76
  287. package/dist/components/micro/theme-provider.d.ts.map +0 -1
  288. package/dist/components/micro/toggle-group.d.ts +0 -22
  289. package/dist/components/micro/toggle-group.d.ts.map +0 -1
  290. package/dist/components/micro/toggle.d.ts +0 -16
  291. package/dist/components/micro/toggle.d.ts.map +0 -1
  292. package/dist/components/micro/tooltip.d.ts +0 -21
  293. package/dist/components/micro/tooltip.d.ts.map +0 -1
  294. package/dist/dev/App.d.ts +0 -3
  295. package/dist/dev/App.d.ts.map +0 -1
  296. package/dist/dev/components/GladvnLogo.d.ts +0 -10
  297. package/dist/dev/components/GladvnLogo.d.ts.map +0 -1
  298. package/dist/dev/components/code-highlighter.d.ts +0 -5
  299. package/dist/dev/components/code-highlighter.d.ts.map +0 -1
  300. package/dist/dev/components/dev-context.d.ts +0 -12
  301. package/dist/dev/components/dev-context.d.ts.map +0 -1
  302. package/dist/dev/components/showcase.d.ts +0 -72
  303. package/dist/dev/components/showcase.d.ts.map +0 -1
  304. package/dist/dev/data.d.ts +0 -68
  305. package/dist/dev/data.d.ts.map +0 -1
  306. package/dist/dev/main.d.ts +0 -1
  307. package/dist/dev/main.d.ts.map +0 -1
  308. package/dist/dev/sections/buttons.d.ts +0 -2
  309. package/dist/dev/sections/buttons.d.ts.map +0 -1
  310. package/dist/dev/sections/display.d.ts +0 -2
  311. package/dist/dev/sections/display.d.ts.map +0 -1
  312. package/dist/dev/sections/feedback.d.ts +0 -2
  313. package/dist/dev/sections/feedback.d.ts.map +0 -1
  314. package/dist/dev/sections/forms.d.ts +0 -2
  315. package/dist/dev/sections/forms.d.ts.map +0 -1
  316. package/dist/dev/sections/interactive.d.ts +0 -2
  317. package/dist/dev/sections/interactive.d.ts.map +0 -1
  318. package/dist/dev/sections/overview.d.ts +0 -2
  319. package/dist/dev/sections/overview.d.ts.map +0 -1
  320. package/dist/dev/showcase/accordion.d.ts +0 -2
  321. package/dist/dev/showcase/accordion.d.ts.map +0 -1
  322. package/dist/dev/showcase/alert-dialog.d.ts +0 -2
  323. package/dist/dev/showcase/alert-dialog.d.ts.map +0 -1
  324. package/dist/dev/showcase/alert.d.ts +0 -2
  325. package/dist/dev/showcase/alert.d.ts.map +0 -1
  326. package/dist/dev/showcase/aspect-ratio.d.ts +0 -2
  327. package/dist/dev/showcase/aspect-ratio.d.ts.map +0 -1
  328. package/dist/dev/showcase/avatar.d.ts +0 -2
  329. package/dist/dev/showcase/avatar.d.ts.map +0 -1
  330. package/dist/dev/showcase/badge.d.ts +0 -2
  331. package/dist/dev/showcase/badge.d.ts.map +0 -1
  332. package/dist/dev/showcase/breadcrumb.d.ts +0 -2
  333. package/dist/dev/showcase/breadcrumb.d.ts.map +0 -1
  334. package/dist/dev/showcase/button.d.ts +0 -2
  335. package/dist/dev/showcase/button.d.ts.map +0 -1
  336. package/dist/dev/showcase/calendar.d.ts +0 -2
  337. package/dist/dev/showcase/calendar.d.ts.map +0 -1
  338. package/dist/dev/showcase/card.d.ts +0 -2
  339. package/dist/dev/showcase/card.d.ts.map +0 -1
  340. package/dist/dev/showcase/carousel.d.ts +0 -2
  341. package/dist/dev/showcase/carousel.d.ts.map +0 -1
  342. package/dist/dev/showcase/chart.d.ts +0 -2
  343. package/dist/dev/showcase/chart.d.ts.map +0 -1
  344. package/dist/dev/showcase/checkbox.d.ts +0 -2
  345. package/dist/dev/showcase/checkbox.d.ts.map +0 -1
  346. package/dist/dev/showcase/collapsible.d.ts +0 -3
  347. package/dist/dev/showcase/collapsible.d.ts.map +0 -1
  348. package/dist/dev/showcase/combobox.d.ts +0 -2
  349. package/dist/dev/showcase/combobox.d.ts.map +0 -1
  350. package/dist/dev/showcase/command.d.ts +0 -2
  351. package/dist/dev/showcase/command.d.ts.map +0 -1
  352. package/dist/dev/showcase/context-menu.d.ts +0 -2
  353. package/dist/dev/showcase/context-menu.d.ts.map +0 -1
  354. package/dist/dev/showcase/dialog.d.ts +0 -2
  355. package/dist/dev/showcase/dialog.d.ts.map +0 -1
  356. package/dist/dev/showcase/drawer.d.ts +0 -2
  357. package/dist/dev/showcase/drawer.d.ts.map +0 -1
  358. package/dist/dev/showcase/dropdown-menu.d.ts +0 -2
  359. package/dist/dev/showcase/dropdown-menu.d.ts.map +0 -1
  360. package/dist/dev/showcase/empty.d.ts +0 -2
  361. package/dist/dev/showcase/empty.d.ts.map +0 -1
  362. package/dist/dev/showcase/hover-card.d.ts +0 -2
  363. package/dist/dev/showcase/hover-card.d.ts.map +0 -1
  364. package/dist/dev/showcase/input-group.d.ts +0 -2
  365. package/dist/dev/showcase/input-group.d.ts.map +0 -1
  366. package/dist/dev/showcase/input-otp.d.ts +0 -2
  367. package/dist/dev/showcase/input-otp.d.ts.map +0 -1
  368. package/dist/dev/showcase/input.d.ts +0 -2
  369. package/dist/dev/showcase/input.d.ts.map +0 -1
  370. package/dist/dev/showcase/item.d.ts +0 -2
  371. package/dist/dev/showcase/item.d.ts.map +0 -1
  372. package/dist/dev/showcase/kbd.d.ts +0 -2
  373. package/dist/dev/showcase/kbd.d.ts.map +0 -1
  374. package/dist/dev/showcase/label.d.ts +0 -2
  375. package/dist/dev/showcase/label.d.ts.map +0 -1
  376. package/dist/dev/showcase/menubar.d.ts +0 -2
  377. package/dist/dev/showcase/menubar.d.ts.map +0 -1
  378. package/dist/dev/showcase/navigation-menu.d.ts +0 -3
  379. package/dist/dev/showcase/navigation-menu.d.ts.map +0 -1
  380. package/dist/dev/showcase/overview.d.ts +0 -2
  381. package/dist/dev/showcase/overview.d.ts.map +0 -1
  382. package/dist/dev/showcase/pagination.d.ts +0 -2
  383. package/dist/dev/showcase/pagination.d.ts.map +0 -1
  384. package/dist/dev/showcase/popover.d.ts +0 -2
  385. package/dist/dev/showcase/popover.d.ts.map +0 -1
  386. package/dist/dev/showcase/progress.d.ts +0 -2
  387. package/dist/dev/showcase/progress.d.ts.map +0 -1
  388. package/dist/dev/showcase/radio-group.d.ts +0 -2
  389. package/dist/dev/showcase/radio-group.d.ts.map +0 -1
  390. package/dist/dev/showcase/resizable.d.ts +0 -2
  391. package/dist/dev/showcase/resizable.d.ts.map +0 -1
  392. package/dist/dev/showcase/scroll-area.d.ts +0 -2
  393. package/dist/dev/showcase/scroll-area.d.ts.map +0 -1
  394. package/dist/dev/showcase/select.d.ts +0 -2
  395. package/dist/dev/showcase/select.d.ts.map +0 -1
  396. package/dist/dev/showcase/separator.d.ts +0 -2
  397. package/dist/dev/showcase/separator.d.ts.map +0 -1
  398. package/dist/dev/showcase/sheet.d.ts +0 -2
  399. package/dist/dev/showcase/sheet.d.ts.map +0 -1
  400. package/dist/dev/showcase/sidebar.d.ts +0 -2
  401. package/dist/dev/showcase/sidebar.d.ts.map +0 -1
  402. package/dist/dev/showcase/skeleton.d.ts +0 -2
  403. package/dist/dev/showcase/skeleton.d.ts.map +0 -1
  404. package/dist/dev/showcase/slider.d.ts +0 -2
  405. package/dist/dev/showcase/slider.d.ts.map +0 -1
  406. package/dist/dev/showcase/sonner.d.ts +0 -2
  407. package/dist/dev/showcase/sonner.d.ts.map +0 -1
  408. package/dist/dev/showcase/spinner.d.ts +0 -2
  409. package/dist/dev/showcase/spinner.d.ts.map +0 -1
  410. package/dist/dev/showcase/switch.d.ts +0 -2
  411. package/dist/dev/showcase/switch.d.ts.map +0 -1
  412. package/dist/dev/showcase/table.d.ts +0 -2
  413. package/dist/dev/showcase/table.d.ts.map +0 -1
  414. package/dist/dev/showcase/tabs.d.ts +0 -2
  415. package/dist/dev/showcase/tabs.d.ts.map +0 -1
  416. package/dist/dev/showcase/textarea.d.ts +0 -2
  417. package/dist/dev/showcase/textarea.d.ts.map +0 -1
  418. package/dist/dev/showcase/toast.d.ts +0 -2
  419. package/dist/dev/showcase/toast.d.ts.map +0 -1
  420. package/dist/dev/showcase/toggle-group.d.ts +0 -2
  421. package/dist/dev/showcase/toggle-group.d.ts.map +0 -1
  422. package/dist/dev/showcase/toggle.d.ts +0 -2
  423. package/dist/dev/showcase/toggle.d.ts.map +0 -1
  424. package/dist/dev/showcase/tooltip.d.ts +0 -2
  425. package/dist/dev/showcase/tooltip.d.ts.map +0 -1
  426. package/dist/hooks/use-controllable-state.d.ts +0 -14
  427. package/dist/hooks/use-controllable-state.d.ts.map +0 -1
  428. package/dist/hooks/use-mobile.d.ts +0 -2
  429. package/dist/hooks/use-mobile.d.ts.map +0 -1
  430. package/dist/index.cjs +0 -5099
  431. package/dist/index.cjs.map +0 -1
  432. package/dist/index.d.ts +0 -58
  433. package/dist/index.d.ts.map +0 -1
  434. package/dist/index.js +0 -4753
  435. package/dist/index.js.map +0 -1
  436. package/dist/lib/types.d.ts +0 -4
  437. package/dist/lib/types.d.ts.map +0 -1
  438. package/dist/lib/utils.d.ts +0 -3
  439. package/dist/lib/utils.d.ts.map +0 -1
  440. package/dist/preset.d.ts +0 -18
  441. package/dist/preset.d.ts.map +0 -1
  442. package/dist/test/setup.d.ts +0 -1
  443. package/dist/test/setup.d.ts.map +0 -1
  444. package/scripts/add-icononly-prop.ts +0 -84
  445. package/scripts/audit-best-practices.ts +0 -114
  446. package/scripts/audit-showcase.ts +0 -262
  447. package/scripts/audit-showcases.ts +0 -83
  448. package/scripts/clean-imports.ts +0 -21
  449. package/scripts/count_missing.ts +0 -24
  450. package/scripts/find-css-vars.ts +0 -62
  451. package/scripts/fix-portals.ts +0 -90
  452. package/scripts/format-codestrings.ts +0 -87
  453. package/scripts/full-audit.ts +0 -89
  454. package/scripts/merge-components.cjs +0 -65
  455. package/scripts/merge-components.js +0 -64
  456. package/scripts/optimize-barrel.ts +0 -116
  457. package/scripts/organize-imports.ts +0 -21
  458. package/scripts/refactor_divs.ts +0 -39
  459. package/scripts/regex-format.cjs +0 -67
  460. package/scripts/remove_div_wrappers.ts +0 -17
  461. package/scripts/tmp.tsx +0 -25
  462. package/scripts/update-gaps.ts +0 -83
  463. package/scripts/update_showcase_codestrings.ts +0 -87
@@ -0,0 +1,96 @@
1
+
2
+ import { render, screen, waitFor } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ import {
7
+ Accordion,
8
+ AccordionContent,
9
+ AccordionItem,
10
+ AccordionTrigger,
11
+ } from "./accordion";
12
+
13
+ describe("Accordion", () => {
14
+ it("[3C.13-01] [P1] renders correctly and is closed by default", () => {
15
+ // Given
16
+ render(
17
+ <Accordion>
18
+ <AccordionItem value="item-1">
19
+ <AccordionTrigger>Section 1</AccordionTrigger>
20
+ <AccordionContent>Content 1</AccordionContent>
21
+ </AccordionItem>
22
+ </Accordion>,
23
+ );
24
+
25
+ const trigger = screen.getByRole("button", { name: "Section 1" });
26
+ // Then
27
+ expect(trigger).toBeInTheDocument();
28
+ expect(trigger).toHaveAttribute("aria-expanded", "false");
29
+
30
+ // Content is either not in document or hidden based on Base UI implementation
31
+ const content = screen.queryByText("Content 1");
32
+ if (content) {
33
+ expect(content).not.toBeVisible();
34
+ }
35
+ });
36
+
37
+ it("[3C.13-02] [P1] expands the content when trigger is clicked", async () => {
38
+ // Given
39
+ const user = userEvent.setup();
40
+ render(
41
+ <Accordion>
42
+ <AccordionItem value="item-1">
43
+ <AccordionTrigger>Section 1</AccordionTrigger>
44
+ <AccordionContent>Content 1</AccordionContent>
45
+ </AccordionItem>
46
+ </Accordion>,
47
+ );
48
+
49
+ const trigger = screen.getByRole("button", { name: "Section 1" });
50
+ // When
51
+ await user.click(trigger);
52
+
53
+ // Then
54
+ await waitFor(() => {
55
+ expect(trigger).toHaveAttribute("aria-expanded", "true");
56
+ expect(screen.getByText("Content 1")).toBeVisible();
57
+ });
58
+ });
59
+
60
+ it("[3C.13-03] [P1] supports keyboard navigation", async () => {
61
+ // Given
62
+ const user = userEvent.setup();
63
+ render(
64
+ <Accordion>
65
+ <AccordionItem value="item-1">
66
+ <AccordionTrigger>Section 1</AccordionTrigger>
67
+ <AccordionContent>Content 1</AccordionContent>
68
+ </AccordionItem>
69
+ <AccordionItem value="item-2">
70
+ <AccordionTrigger>Section 2</AccordionTrigger>
71
+ <AccordionContent>Content 2</AccordionContent>
72
+ </AccordionItem>
73
+ </Accordion>,
74
+ );
75
+
76
+ const trigger1 = screen.getByRole("button", { name: "Section 1" });
77
+ const trigger2 = screen.getByRole("button", { name: "Section 2" });
78
+
79
+ // Focus first
80
+ // When
81
+ await user.tab();
82
+ // Then
83
+ expect(trigger1).toHaveFocus();
84
+
85
+ // Tab to move to next item
86
+ await user.tab();
87
+ expect(trigger2).toHaveFocus();
88
+
89
+ // Enter to expand
90
+ await user.keyboard("[Enter]");
91
+ await waitFor(() => {
92
+ expect(trigger2).toHaveAttribute("aria-expanded", "true");
93
+ expect(screen.getByText("Content 2")).toBeVisible();
94
+ });
95
+ });
96
+ });
@@ -212,5 +212,5 @@ export {
212
212
  AlertDialogMedia,
213
213
  AlertDialogOverlay,
214
214
  AlertDialogTitle,
215
- AlertDialogTrigger,
215
+ AlertDialogTrigger
216
216
  };
@@ -0,0 +1,77 @@
1
+
2
+ import { render, screen } from "@testing-library/react";
3
+ import { InfoIcon } from "lucide-react";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ import {
7
+ Alert,
8
+ AlertAction,
9
+ AlertDescription,
10
+ AlertIcon,
11
+ AlertTitle,
12
+ } from "./alert";
13
+
14
+ describe("Alert", () => {
15
+ it("[3C.12-01] [P1] renders all alert parts correctly", () => {
16
+ // Given
17
+ render(
18
+ <Alert data-testid="alert">
19
+ <AlertIcon render={<InfoIcon />} data-testid="alert-icon" />
20
+ <AlertTitle>Alert Title</AlertTitle>
21
+ <AlertDescription>Alert Description</AlertDescription>
22
+ <AlertAction data-testid="alert-action">Action</AlertAction>
23
+ </Alert>,
24
+ );
25
+
26
+ // Then
27
+ expect(screen.getByTestId("alert")).toBeInTheDocument();
28
+ expect(screen.getByTestId("alert-icon")).toBeInTheDocument();
29
+ expect(screen.getByText("Alert Title")).toBeInTheDocument();
30
+ expect(screen.getByText("Alert Description")).toBeInTheDocument();
31
+ expect(screen.getByTestId("alert-action")).toHaveTextContent("Action");
32
+ });
33
+
34
+ it("[3C.12-02] [P1] applies the color variants correctly", () => {
35
+ // Given
36
+ const { rerender } = render(
37
+ <Alert color="destructive" data-testid="alert-destructive">
38
+ Error
39
+ </Alert>,
40
+ );
41
+ // Then
42
+ expect(screen.getByTestId("alert-destructive")).toHaveAttribute(
43
+ "data-color",
44
+ "destructive",
45
+ );
46
+
47
+ // When
48
+ rerender(
49
+ <Alert color="success" data-testid="alert-success">
50
+ Success
51
+ </Alert>,
52
+ );
53
+ expect(screen.getByTestId("alert-success")).toHaveAttribute(
54
+ "data-color",
55
+ "success",
56
+ );
57
+ });
58
+
59
+ it("[3C.12-03] [P1] applies the size variants correctly", () => {
60
+ // Given
61
+ const { rerender } = render(
62
+ <Alert size="sm" data-testid="alert-sm">
63
+ Small
64
+ </Alert>,
65
+ );
66
+ // Then
67
+ expect(screen.getByTestId("alert-sm")).toHaveAttribute("data-size", "sm");
68
+
69
+ // When
70
+ rerender(
71
+ <Alert size="lg" data-testid="alert-lg">
72
+ Large
73
+ </Alert>,
74
+ );
75
+ expect(screen.getByTestId("alert-lg")).toHaveAttribute("data-size", "lg");
76
+ });
77
+ });
@@ -140,5 +140,5 @@ export {
140
140
  AvatarFallback,
141
141
  AvatarGroup,
142
142
  AvatarGroupCount,
143
- AvatarImage,
143
+ AvatarImage
144
144
  };
@@ -0,0 +1,57 @@
1
+
2
+ import { render, screen } from "@testing-library/react";
3
+ import { describe, expect, it } from "vitest";
4
+
5
+ import { Badge } from "./badge";
6
+
7
+ describe("Badge", () => {
8
+ it("[3C.10-01] [P1] renders correctly with default styles", () => {
9
+ // Given
10
+ render(<Badge data-testid="badge">Hello</Badge>);
11
+ const badge = screen.getByTestId("badge");
12
+
13
+ // Then
14
+ expect(badge).toBeInTheDocument();
15
+ expect(badge).toHaveTextContent("Hello");
16
+ });
17
+
18
+ it("[3C.10-02] [P1] applies variant and color correctly", () => {
19
+ // Given
20
+ const { rerender } = render(
21
+ <Badge
22
+ variant="outline"
23
+ color="destructive"
24
+ data-testid="badge-outline-destructive"
25
+ >
26
+ Error
27
+ </Badge>,
28
+ );
29
+ const outlineBadge = screen.getByTestId("badge-outline-destructive");
30
+ // Then
31
+ expect(outlineBadge).toHaveClass("border-destructive", "text-destructive");
32
+
33
+ // When
34
+ rerender(
35
+ <Badge variant="soft" color="success" data-testid="badge-soft-success">
36
+ Success
37
+ </Badge>,
38
+ );
39
+ const softBadge = screen.getByTestId("badge-soft-success");
40
+ expect(softBadge).toHaveClass("bg-success/15", "text-success");
41
+ });
42
+
43
+ it("[3C.10-03] [P1] supports polymorphism via render prop", () => {
44
+ // Given
45
+ render(
46
+ <Badge render={<a href="/test" data-testid="badge-link" />}>
47
+ Link Badge
48
+ </Badge>,
49
+ );
50
+
51
+ const link = screen.getByTestId("badge-link");
52
+ // Then
53
+ expect(link.tagName).toBe("A");
54
+ expect(link).toHaveAttribute("href", "/test");
55
+ expect(link).toHaveTextContent("Link Badge");
56
+ });
57
+ });
@@ -159,5 +159,5 @@ export {
159
159
  BreadcrumbLink,
160
160
  BreadcrumbList,
161
161
  BreadcrumbPage,
162
- BreadcrumbSeparator,
162
+ BreadcrumbSeparator
163
163
  };
@@ -1,26 +1,123 @@
1
+ import * as React from "react";
2
+
1
3
  import { render, screen } from "@testing-library/react";
2
- import { describe, expect, it } from "vitest";
4
+ import userEvent from "@testing-library/user-event";
5
+ import { describe, expect, it, vi } from "vitest";
3
6
 
4
7
  import { Button } from "./button";
5
8
 
6
9
  describe("Button", () => {
7
- it("renders correctly with default props", () => {
10
+ // 1. Rendering & Attributes (API Surface)
11
+ it("[3C.1-01] [P1] renders correctly with default props", () => {
12
+ // Given
8
13
  render(<Button>Click me</Button>);
9
14
  const button = screen.getByRole("button", { name: "Click me" });
15
+ // Then
10
16
  expect(button).toBeInTheDocument();
11
- // Default variant is "solid" and color is "primary"
12
17
  expect(button).toHaveAttribute("data-variant", "solid");
13
18
  expect(button).toHaveAttribute("data-color", "primary");
14
19
  });
15
20
 
16
- it("applies custom variants and colors", () => {
21
+ it("[3C.1-02] [P1] applies custom variants and colors", () => {
22
+ // Given
17
23
  render(
18
24
  <Button variant="outline" color="destructive">
19
25
  Delete
20
26
  </Button>,
21
27
  );
22
28
  const button = screen.getByRole("button", { name: "Delete" });
29
+ // Then
23
30
  expect(button).toHaveAttribute("data-variant", "outline");
24
31
  expect(button).toHaveAttribute("data-color", "destructive");
25
32
  });
33
+
34
+ it("[3C.1-03] [P1] merges custom classNames properly", () => {
35
+ // Given
36
+ render(<Button className="custom-test-class">Classy Button</Button>);
37
+ const button = screen.getByRole("button", { name: "Classy Button" });
38
+ // Then
39
+ expect(button).toHaveClass("custom-test-class");
40
+ });
41
+
42
+ it("[3C.1-04] [P1] supports iconOnly attribute to render as square", () => {
43
+ // Given
44
+ render(<Button iconOnly>Icon</Button>);
45
+ const button = screen.getByRole("button", { name: "Icon" });
46
+ // Then
47
+ expect(button).toHaveAttribute("data-icon", "true");
48
+ });
49
+
50
+ // 2. Behaviors (Interaction & Events)
51
+ it("[3C.1-05] [P1] fires onClick event when clicked", async () => {
52
+ // Given
53
+ const user = userEvent.setup();
54
+ const handleClick = vi.fn();
55
+ render(<Button onClick={handleClick}>Click</Button>);
56
+
57
+ const button = screen.getByRole("button", { name: "Click" });
58
+ // When
59
+ await user.click(button);
60
+
61
+ // Then
62
+ expect(handleClick).toHaveBeenCalledTimes(1);
63
+ });
64
+
65
+ it("[3C.1-06] [P1] can be focused and activated via keyboard", async () => {
66
+ // Given
67
+ const user = userEvent.setup();
68
+ const handleClick = vi.fn();
69
+ render(<Button onClick={handleClick}>Submit</Button>);
70
+
71
+ const button = screen.getByRole("button", { name: "Submit" });
72
+
73
+ // Test focus
74
+ // When
75
+ await user.tab();
76
+ // Then
77
+ expect(button).toHaveFocus();
78
+
79
+ // Test keyboard activation (Enter)
80
+ await user.keyboard("{Enter}");
81
+ expect(handleClick).toHaveBeenCalledTimes(1);
82
+ });
83
+
84
+ it("[3C.1-07] [P1] handles disabled state correctly and blocks clicks", async () => {
85
+ // Given
86
+ const user = userEvent.setup();
87
+ const handleClick = vi.fn();
88
+ render(
89
+ <Button disabled onClick={handleClick}>
90
+ Disabled Button
91
+ </Button>,
92
+ );
93
+
94
+ const button = screen.getByRole("button", { name: "Disabled Button" });
95
+ // Then
96
+ expect(button).toBeDisabled();
97
+
98
+ // When
99
+ await user.click(button);
100
+ expect(handleClick).not.toHaveBeenCalled();
101
+ });
102
+
103
+ // 3. Architecture & Integration
104
+ it("[3C.1-08] [P1] forwards the ref to the underlying DOM element", () => {
105
+ // Given
106
+ const ref = React.createRef<HTMLButtonElement>();
107
+ render(<Button ref={ref}>Ref Button</Button>);
108
+ // Then
109
+ expect(ref.current).toBeInstanceOf(HTMLButtonElement);
110
+ expect(ref.current?.textContent).toBe("Ref Button");
111
+ });
112
+
113
+ it("[3C.1-09] [P1] supports polymorphism via render prop (Base UI 'render' pattern)", () => {
114
+ // Given
115
+ render(<Button render={<a href="/home" />}>Link Button</Button>);
116
+ const link = screen.getByText("Link Button");
117
+ // Then
118
+ expect(link).toBeInTheDocument();
119
+ expect(link.tagName).toBe("A");
120
+ expect(link).toHaveAttribute("href", "/home");
121
+ expect(link).toHaveAttribute("data-variant", "solid");
122
+ });
26
123
  });
@@ -0,0 +1,54 @@
1
+
2
+ import { render, screen } from "@testing-library/react";
3
+ import { describe, expect, it } from "vitest";
4
+
5
+ import {
6
+ Card,
7
+ CardContent,
8
+ CardDescription,
9
+ CardFooter,
10
+ CardHeader,
11
+ CardTitle,
12
+ } from "./card";
13
+
14
+ describe("Card", () => {
15
+ it("[3C.11-01] [P1] renders all card parts correctly", () => {
16
+ // Given
17
+ render(
18
+ <Card data-testid="card">
19
+ <CardHeader>
20
+ <CardTitle>Card Title</CardTitle>
21
+ <CardDescription>Card Description</CardDescription>
22
+ </CardHeader>
23
+ <CardContent>Card Content</CardContent>
24
+ <CardFooter>Card Footer</CardFooter>
25
+ </Card>,
26
+ );
27
+
28
+ // Then
29
+ expect(screen.getByTestId("card")).toBeInTheDocument();
30
+ expect(screen.getByText("Card Title")).toBeInTheDocument();
31
+ expect(screen.getByText("Card Description")).toBeInTheDocument();
32
+ expect(screen.getByText("Card Content")).toBeInTheDocument();
33
+ expect(screen.getByText("Card Footer")).toBeInTheDocument();
34
+ });
35
+
36
+ it("[3C.11-02] [P1] applies the size variants correctly", () => {
37
+ // Given
38
+ const { rerender } = render(
39
+ <Card size="sm" data-testid="card-sm">
40
+ Content
41
+ </Card>,
42
+ );
43
+ // Then
44
+ expect(screen.getByTestId("card-sm")).toHaveAttribute("data-size", "sm");
45
+
46
+ // When
47
+ rerender(
48
+ <Card size="lg" data-testid="card-lg">
49
+ Content
50
+ </Card>,
51
+ );
52
+ expect(screen.getByTestId("card-lg")).toHaveAttribute("data-size", "lg");
53
+ });
54
+ });
@@ -108,5 +108,5 @@ export {
108
108
  CardDescription,
109
109
  CardFooter,
110
110
  CardHeader,
111
- CardTitle,
111
+ CardTitle
112
112
  };
@@ -338,5 +338,5 @@ export {
338
338
  CarouselNext,
339
339
  CarouselPrevious,
340
340
  useCarousel,
341
- type CarouselApi,
341
+ type CarouselApi
342
342
  };
@@ -389,5 +389,5 @@ export {
389
389
  ChartLegendContent,
390
390
  ChartStyle,
391
391
  ChartTooltip,
392
- ChartTooltipContent,
392
+ ChartTooltipContent
393
393
  };
@@ -0,0 +1,92 @@
1
+ import * as React from "react";
2
+
3
+ import { render, screen } from "@testing-library/react";
4
+ import userEvent from "@testing-library/user-event";
5
+ import { describe, expect, it, vi } from "vitest";
6
+
7
+ import { Checkbox } from "./checkbox";
8
+
9
+ describe("Checkbox", () => {
10
+ it("[3C.6-01] [P1] renders correctly", () => {
11
+ // Given
12
+ render(<Checkbox aria-label="Accept terms" />);
13
+ const checkbox = screen.getByRole("checkbox", { name: "Accept terms" });
14
+ // Then
15
+ expect(checkbox).toBeInTheDocument();
16
+ expect(checkbox).toHaveAttribute("data-slot", "checkbox");
17
+ });
18
+
19
+ it("[3C.6-02] [P1] handles user click to toggle state", async () => {
20
+ // Given
21
+ const user = userEvent.setup();
22
+ const handleCheckedChange = vi.fn();
23
+ render(
24
+ <Checkbox aria-label="Toggle" onCheckedChange={handleCheckedChange} />,
25
+ );
26
+
27
+ const checkbox = screen.getByRole("checkbox", { name: "Toggle" });
28
+
29
+ // Initially unchecked
30
+ // Then
31
+ expect(checkbox).not.toBeChecked();
32
+
33
+ // Click to check
34
+ // When
35
+ await user.click(checkbox);
36
+ expect(checkbox).toBeChecked();
37
+ expect(handleCheckedChange).toHaveBeenCalledWith(true, expect.anything());
38
+
39
+ // Click to uncheck
40
+ await user.click(checkbox);
41
+ expect(checkbox).not.toBeChecked();
42
+ expect(handleCheckedChange).toHaveBeenCalledWith(false, expect.anything());
43
+ });
44
+
45
+ it("[3C.6-03] [P1] can be focused and toggled via keyboard (Space)", async () => {
46
+ // Given
47
+ const user = userEvent.setup();
48
+ render(<Checkbox aria-label="Keyboard toggle" />);
49
+
50
+ const checkbox = screen.getByRole("checkbox", { name: "Keyboard toggle" });
51
+
52
+ // Test focus
53
+ // When
54
+ await user.tab();
55
+ // Then
56
+ expect(checkbox).toHaveFocus();
57
+
58
+ // Test keyboard activation (Space for checkbox)
59
+ await user.keyboard("[Space]");
60
+ expect(checkbox).toBeChecked();
61
+ });
62
+
63
+ it("[3C.6-04] [P1] handles disabled state correctly and blocks clicks", async () => {
64
+ // Given
65
+ const user = userEvent.setup();
66
+ const handleCheckedChange = vi.fn();
67
+ render(
68
+ <Checkbox
69
+ disabled
70
+ aria-label="Disabled"
71
+ onCheckedChange={handleCheckedChange}
72
+ />,
73
+ );
74
+
75
+ const checkbox = screen.getByRole("checkbox", { name: "Disabled" });
76
+ // Then
77
+ expect(checkbox).toHaveAttribute("aria-disabled", "true");
78
+
79
+ // When
80
+ await user.click(checkbox);
81
+ expect(handleCheckedChange).not.toHaveBeenCalled();
82
+ expect(checkbox).not.toBeChecked();
83
+ });
84
+
85
+ it("[3C.6-05] [P1] forwards the ref to the underlying DOM element", () => {
86
+ // Given
87
+ const ref = React.createRef<HTMLSpanElement>();
88
+ render(<Checkbox ref={ref} aria-label="Ref checkbox" />);
89
+ // Then
90
+ expect(ref.current).toBeInstanceOf(HTMLSpanElement);
91
+ });
92
+ });
@@ -369,5 +369,5 @@ export {
369
369
  ComboboxSeparator,
370
370
  ComboboxTrigger,
371
371
  ComboboxValue,
372
- useComboboxContext,
372
+ useComboboxContext
373
373
  };
@@ -241,5 +241,5 @@ export {
241
241
  CommandItem,
242
242
  CommandList,
243
243
  CommandSeparator,
244
- CommandShortcut,
244
+ CommandShortcut
245
245
  };
@@ -298,5 +298,5 @@ export {
298
298
  ContextMenuSub,
299
299
  ContextMenuSubContent,
300
300
  ContextMenuSubTrigger,
301
- ContextMenuTrigger,
301
+ ContextMenuTrigger
302
302
  };