@etus/ui 0.1.0

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 (1075) hide show
  1. package/dist/chunk-HRNDJU7D.js +11 -0
  2. package/dist/chunk-HRNDJU7D.js.map +1 -0
  3. package/dist/index.d.ts +21250 -0
  4. package/dist/index.js +44886 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/utils.d.ts +5 -0
  7. package/dist/lib/utils.js +7 -0
  8. package/dist/lib/utils.js.map +1 -0
  9. package/package.json +145 -0
  10. package/src/components/CLAUDE.md +66 -0
  11. package/src/components/advanced/AssetManager/AssetManager.test.tsx +624 -0
  12. package/src/components/advanced/AssetManager/AssetManager.tsx +928 -0
  13. package/src/components/advanced/AssetManager/AssetManager.types.ts +248 -0
  14. package/src/components/advanced/AssetManager/AssetManager.variants.ts +284 -0
  15. package/src/components/advanced/AssetManager/README.md +246 -0
  16. package/src/components/advanced/AssetManager/index.ts +4 -0
  17. package/src/components/advanced/CLAUDE.md +77 -0
  18. package/src/components/advanced/Calendar/Calendar.test.tsx +718 -0
  19. package/src/components/advanced/Calendar/Calendar.tsx +264 -0
  20. package/src/components/advanced/Calendar/Calendar.types.ts +62 -0
  21. package/src/components/advanced/Calendar/Calendar.variants.ts +154 -0
  22. package/src/components/advanced/Calendar/README.md +389 -0
  23. package/src/components/advanced/Calendar/index.ts +3 -0
  24. package/src/components/advanced/Command/Command.test.tsx +1014 -0
  25. package/src/components/advanced/Command/Command.tsx +330 -0
  26. package/src/components/advanced/Command/Command.types.ts +238 -0
  27. package/src/components/advanced/Command/Command.variants.ts +300 -0
  28. package/src/components/advanced/Command/README.md +1259 -0
  29. package/src/components/advanced/Command/index.ts +45 -0
  30. package/src/components/advanced/DragAndDrop/DragAndDrop.test.tsx +573 -0
  31. package/src/components/advanced/DragAndDrop/DragAndDrop.tsx +495 -0
  32. package/src/components/advanced/DragAndDrop/DragAndDrop.types.ts +237 -0
  33. package/src/components/advanced/DragAndDrop/DragAndDrop.variants.ts +156 -0
  34. package/src/components/advanced/DragAndDrop/README.md +284 -0
  35. package/src/components/advanced/DragAndDrop/index.ts +4 -0
  36. package/src/components/advanced/ErrorBoundary/ErrorBoundary.test.tsx +372 -0
  37. package/src/components/advanced/ErrorBoundary/ErrorBoundary.tsx +184 -0
  38. package/src/components/advanced/ErrorBoundary/ErrorBoundary.types.ts +73 -0
  39. package/src/components/advanced/ErrorBoundary/ErrorBoundary.variants.ts +153 -0
  40. package/src/components/advanced/ErrorBoundary/README.md +296 -0
  41. package/src/components/advanced/ErrorBoundary/index.ts +18 -0
  42. package/src/components/advanced/EventCalendar/EventCalendar.test.tsx +535 -0
  43. package/src/components/advanced/EventCalendar/EventCalendar.tsx +1066 -0
  44. package/src/components/advanced/EventCalendar/EventCalendar.types.ts +232 -0
  45. package/src/components/advanced/EventCalendar/EventCalendar.variants.ts +222 -0
  46. package/src/components/advanced/EventCalendar/README.md +330 -0
  47. package/src/components/advanced/EventCalendar/index.ts +35 -0
  48. package/src/components/advanced/FileDropzone/FileDropzone.test.tsx +344 -0
  49. package/src/components/advanced/FileDropzone/FileDropzone.tsx +188 -0
  50. package/src/components/advanced/FileDropzone/FileDropzone.types.ts +47 -0
  51. package/src/components/advanced/FileDropzone/FileDropzone.variants.ts +46 -0
  52. package/src/components/advanced/FileDropzone/README.md +359 -0
  53. package/src/components/advanced/FileDropzone/index.ts +7 -0
  54. package/src/components/advanced/FilePreview/FilePreview.test.tsx +503 -0
  55. package/src/components/advanced/FilePreview/FilePreview.tsx +385 -0
  56. package/src/components/advanced/FilePreview/FilePreview.types.ts +90 -0
  57. package/src/components/advanced/FilePreview/FilePreview.variants.ts +234 -0
  58. package/src/components/advanced/FilePreview/README.md +318 -0
  59. package/src/components/advanced/FilePreview/index.ts +25 -0
  60. package/src/components/advanced/FileUpload/FileUpload.test.tsx +676 -0
  61. package/src/components/advanced/FileUpload/FileUpload.tsx +845 -0
  62. package/src/components/advanced/FileUpload/FileUpload.types.ts +270 -0
  63. package/src/components/advanced/FileUpload/FileUpload.variants.ts +216 -0
  64. package/src/components/advanced/FileUpload/README.md +380 -0
  65. package/src/components/advanced/FileUpload/index.ts +39 -0
  66. package/src/components/advanced/FilterBuilder/FilterBuilder.test.tsx +644 -0
  67. package/src/components/advanced/FilterBuilder/FilterBuilder.tsx +881 -0
  68. package/src/components/advanced/FilterBuilder/FilterBuilder.types.ts +249 -0
  69. package/src/components/advanced/FilterBuilder/FilterBuilder.variants.ts +307 -0
  70. package/src/components/advanced/FilterBuilder/README.md +383 -0
  71. package/src/components/advanced/FilterBuilder/index.ts +48 -0
  72. package/src/components/advanced/MarkdownEditor/MarkdownEditor.test.tsx +468 -0
  73. package/src/components/advanced/MarkdownEditor/MarkdownEditor.tsx +556 -0
  74. package/src/components/advanced/MarkdownEditor/MarkdownEditor.types.ts +108 -0
  75. package/src/components/advanced/MarkdownEditor/MarkdownEditor.variants.ts +62 -0
  76. package/src/components/advanced/MarkdownEditor/README.md +352 -0
  77. package/src/components/advanced/MarkdownEditor/index.ts +15 -0
  78. package/src/components/advanced/Portal/Portal.test.tsx +406 -0
  79. package/src/components/advanced/Portal/Portal.tsx +77 -0
  80. package/src/components/advanced/Portal/Portal.types.ts +28 -0
  81. package/src/components/advanced/Portal/Portal.variants.ts +95 -0
  82. package/src/components/advanced/Portal/README.md +326 -0
  83. package/src/components/advanced/Portal/index.ts +9 -0
  84. package/src/components/advanced/RichTextEditor/README.md +383 -0
  85. package/src/components/advanced/RichTextEditor/RichTextEditor.test.tsx +394 -0
  86. package/src/components/advanced/RichTextEditor/RichTextEditor.tsx +651 -0
  87. package/src/components/advanced/RichTextEditor/RichTextEditor.types.ts +77 -0
  88. package/src/components/advanced/RichTextEditor/RichTextEditor.variants.ts +151 -0
  89. package/src/components/advanced/RichTextEditor/index.ts +24 -0
  90. package/src/components/advanced/Search/README.md +391 -0
  91. package/src/components/advanced/Search/Search.test.tsx +567 -0
  92. package/src/components/advanced/Search/Search.tsx +829 -0
  93. package/src/components/advanced/Search/Search.types.ts +243 -0
  94. package/src/components/advanced/Search/Search.variants.ts +358 -0
  95. package/src/components/advanced/Search/index.ts +52 -0
  96. package/src/components/advanced/SortableList/README.md +448 -0
  97. package/src/components/advanced/SortableList/SortableList.test.tsx +317 -0
  98. package/src/components/advanced/SortableList/SortableList.tsx +392 -0
  99. package/src/components/advanced/SortableList/SortableList.types.ts +122 -0
  100. package/src/components/advanced/SortableList/SortableList.variants.ts +141 -0
  101. package/src/components/advanced/SortableList/index.ts +33 -0
  102. package/src/components/advanced/VersionControl/README.md +440 -0
  103. package/src/components/advanced/VersionControl/VersionControl.test.tsx +517 -0
  104. package/src/components/advanced/VersionControl/VersionControl.tsx +758 -0
  105. package/src/components/advanced/VersionControl/VersionControl.types.ts +176 -0
  106. package/src/components/advanced/VersionControl/VersionControl.variants.ts +203 -0
  107. package/src/components/advanced/VersionControl/index.ts +33 -0
  108. package/src/components/advanced/index.ts +17 -0
  109. package/src/components/data-display/Accordion/Accordion.test.tsx +519 -0
  110. package/src/components/data-display/Accordion/Accordion.tsx +164 -0
  111. package/src/components/data-display/Accordion/Accordion.types.ts +37 -0
  112. package/src/components/data-display/Accordion/Accordion.variants.ts +112 -0
  113. package/src/components/data-display/Accordion/README.md +976 -0
  114. package/src/components/data-display/Accordion/index.ts +31 -0
  115. package/src/components/data-display/AreaChart/AreaChart.test.tsx +529 -0
  116. package/src/components/data-display/AreaChart/AreaChart.tsx +318 -0
  117. package/src/components/data-display/AreaChart/AreaChart.types.ts +169 -0
  118. package/src/components/data-display/AreaChart/AreaChart.variants.ts +45 -0
  119. package/src/components/data-display/AreaChart/README.md +229 -0
  120. package/src/components/data-display/AreaChart/index.ts +2 -0
  121. package/src/components/data-display/Banner/Banner.test.tsx +648 -0
  122. package/src/components/data-display/Banner/Banner.tsx +111 -0
  123. package/src/components/data-display/Banner/Banner.types.ts +51 -0
  124. package/src/components/data-display/Banner/Banner.variants.ts +37 -0
  125. package/src/components/data-display/Banner/README.md +351 -0
  126. package/src/components/data-display/Banner/index.ts +2 -0
  127. package/src/components/data-display/BarChart/BarChart.test.tsx +536 -0
  128. package/src/components/data-display/BarChart/BarChart.tsx +305 -0
  129. package/src/components/data-display/BarChart/BarChart.types.ts +145 -0
  130. package/src/components/data-display/BarChart/BarChart.variants.ts +61 -0
  131. package/src/components/data-display/BarChart/README.md +205 -0
  132. package/src/components/data-display/BarChart/index.ts +2 -0
  133. package/src/components/data-display/BarList/BarList.tsx +172 -0
  134. package/src/components/data-display/BarList/BarList.types.ts +69 -0
  135. package/src/components/data-display/BarList/BarList.variants.ts +63 -0
  136. package/src/components/data-display/BarList/index.ts +2 -0
  137. package/src/components/data-display/CLAUDE.md +90 -0
  138. package/src/components/data-display/Callout/Callout.test.tsx +516 -0
  139. package/src/components/data-display/Callout/Callout.tsx +112 -0
  140. package/src/components/data-display/Callout/Callout.types.ts +37 -0
  141. package/src/components/data-display/Callout/Callout.variants.ts +48 -0
  142. package/src/components/data-display/Callout/README.md +341 -0
  143. package/src/components/data-display/Callout/index.ts +2 -0
  144. package/src/components/data-display/Carousel/Carousel.test.tsx +386 -0
  145. package/src/components/data-display/Carousel/Carousel.tsx +241 -0
  146. package/src/components/data-display/Carousel/Carousel.types.ts +20 -0
  147. package/src/components/data-display/Carousel/Carousel.variants.ts +125 -0
  148. package/src/components/data-display/Carousel/README.md +711 -0
  149. package/src/components/data-display/Carousel/index.ts +1 -0
  150. package/src/components/data-display/CategoryBar/CategoryBar.tsx +220 -0
  151. package/src/components/data-display/CategoryBar/CategoryBar.types.ts +80 -0
  152. package/src/components/data-display/CategoryBar/CategoryBar.variants.ts +85 -0
  153. package/src/components/data-display/CategoryBar/index.ts +2 -0
  154. package/src/components/data-display/Chart/Chart.test.tsx +432 -0
  155. package/src/components/data-display/Chart/Chart.tsx +476 -0
  156. package/src/components/data-display/Chart/Chart.types.ts +24 -0
  157. package/src/components/data-display/Chart/Chart.variants.ts +106 -0
  158. package/src/components/data-display/Chart/README.md +674 -0
  159. package/src/components/data-display/Chart/index.ts +1 -0
  160. package/src/components/data-display/ChartCard/ChartCard.test.tsx +327 -0
  161. package/src/components/data-display/ChartCard/ChartCard.tsx +201 -0
  162. package/src/components/data-display/ChartCard/ChartCard.types.ts +68 -0
  163. package/src/components/data-display/ChartCard/ChartCard.variants.ts +63 -0
  164. package/src/components/data-display/ChartCard/index.ts +17 -0
  165. package/src/components/data-display/ChartLegend/ChartLegend.test.tsx +165 -0
  166. package/src/components/data-display/ChartLegend/ChartLegend.types.ts +88 -0
  167. package/src/components/data-display/ChartLegend/README.md +317 -0
  168. package/src/components/data-display/ChartLegend/index.ts +22 -0
  169. package/src/components/data-display/ComboChart/ComboChart.tsx +380 -0
  170. package/src/components/data-display/ComboChart/ComboChart.types.ts +224 -0
  171. package/src/components/data-display/ComboChart/index.ts +2 -0
  172. package/src/components/data-display/DashboardCard/DashboardCard.test.tsx +289 -0
  173. package/src/components/data-display/DashboardCard/DashboardCard.tsx +285 -0
  174. package/src/components/data-display/DashboardCard/DashboardCard.types.ts +74 -0
  175. package/src/components/data-display/DashboardCard/DashboardCard.variants.ts +67 -0
  176. package/src/components/data-display/DashboardCard/index.ts +25 -0
  177. package/src/components/data-display/DashboardFilterbar/DashboardFilterbar.tsx +151 -0
  178. package/src/components/data-display/DashboardFilterbar/DashboardFilterbar.types.ts +39 -0
  179. package/src/components/data-display/DashboardFilterbar/DashboardFilterbar.variants.ts +30 -0
  180. package/src/components/data-display/DashboardFilterbar/index.ts +10 -0
  181. package/src/components/data-display/DataTable/DataTable.test.tsx +654 -0
  182. package/src/components/data-display/DataTable/DataTable.tsx +529 -0
  183. package/src/components/data-display/DataTable/DataTable.types.ts +190 -0
  184. package/src/components/data-display/DataTable/DataTable.variants.ts +79 -0
  185. package/src/components/data-display/DataTable/README.md +447 -0
  186. package/src/components/data-display/DataTable/index.ts +2 -0
  187. package/src/components/data-display/DeltaBar/DeltaBar.tsx +100 -0
  188. package/src/components/data-display/DeltaBar/DeltaBar.types.ts +57 -0
  189. package/src/components/data-display/DeltaBar/DeltaBar.variants.ts +40 -0
  190. package/src/components/data-display/DeltaBar/index.ts +2 -0
  191. package/src/components/data-display/EmptyState/EmptyState.test.tsx +368 -0
  192. package/src/components/data-display/EmptyState/EmptyState.tsx +91 -0
  193. package/src/components/data-display/EmptyState/EmptyState.types.ts +9 -0
  194. package/src/components/data-display/EmptyState/EmptyState.variants.ts +28 -0
  195. package/src/components/data-display/EmptyState/README.md +746 -0
  196. package/src/components/data-display/EmptyState/index.ts +1 -0
  197. package/src/components/data-display/Feed/Feed.test.tsx +668 -0
  198. package/src/components/data-display/Feed/Feed.tsx +290 -0
  199. package/src/components/data-display/Feed/Feed.types.ts +104 -0
  200. package/src/components/data-display/Feed/Feed.variants.ts +64 -0
  201. package/src/components/data-display/Feed/README.md +326 -0
  202. package/src/components/data-display/Feed/index.ts +17 -0
  203. package/src/components/data-display/FunnelChart/FunnelChart.tsx +177 -0
  204. package/src/components/data-display/FunnelChart/FunnelChart.types.ts +145 -0
  205. package/src/components/data-display/FunnelChart/index.ts +2 -0
  206. package/src/components/data-display/GaugeChart/GaugeChart.test.tsx +129 -0
  207. package/src/components/data-display/GaugeChart/GaugeChart.tsx +332 -0
  208. package/src/components/data-display/GaugeChart/GaugeChart.types.ts +53 -0
  209. package/src/components/data-display/GaugeChart/GaugeChart.variants.ts +56 -0
  210. package/src/components/data-display/GaugeChart/README.md +305 -0
  211. package/src/components/data-display/GaugeChart/index.ts +3 -0
  212. package/src/components/data-display/Heatmap/Heatmap.test.tsx +630 -0
  213. package/src/components/data-display/Heatmap/Heatmap.tsx +569 -0
  214. package/src/components/data-display/Heatmap/Heatmap.types.ts +120 -0
  215. package/src/components/data-display/Heatmap/Heatmap.variants.ts +72 -0
  216. package/src/components/data-display/Heatmap/README.md +321 -0
  217. package/src/components/data-display/Heatmap/index.ts +2 -0
  218. package/src/components/data-display/HoverCard/HoverCard.test.tsx +314 -0
  219. package/src/components/data-display/HoverCard/HoverCard.tsx +40 -0
  220. package/src/components/data-display/HoverCard/HoverCard.types.ts +21 -0
  221. package/src/components/data-display/HoverCard/HoverCard.variants.ts +29 -0
  222. package/src/components/data-display/HoverCard/README.md +624 -0
  223. package/src/components/data-display/HoverCard/index.ts +1 -0
  224. package/src/components/data-display/ImageGallery/ImageGallery.test.tsx +519 -0
  225. package/src/components/data-display/ImageGallery/ImageGallery.tsx +733 -0
  226. package/src/components/data-display/ImageGallery/ImageGallery.types.ts +109 -0
  227. package/src/components/data-display/ImageGallery/ImageGallery.variants.ts +58 -0
  228. package/src/components/data-display/ImageGallery/README.md +352 -0
  229. package/src/components/data-display/ImageGallery/index.ts +9 -0
  230. package/src/components/data-display/Item/Item.test.tsx +476 -0
  231. package/src/components/data-display/Item/Item.tsx +195 -0
  232. package/src/components/data-display/Item/Item.types.ts +23 -0
  233. package/src/components/data-display/Item/Item.variants.ts +51 -0
  234. package/src/components/data-display/Item/README.md +759 -0
  235. package/src/components/data-display/Item/index.ts +1 -0
  236. package/src/components/data-display/KPICard/KPICard.test.tsx +445 -0
  237. package/src/components/data-display/KPICard/KPICard.tsx +203 -0
  238. package/src/components/data-display/KPICard/KPICard.types.ts +32 -0
  239. package/src/components/data-display/KPICard/KPICard.variants.ts +64 -0
  240. package/src/components/data-display/KPICard/README.md +380 -0
  241. package/src/components/data-display/KPICard/index.ts +7 -0
  242. package/src/components/data-display/Lightbox/Lightbox.test.tsx +574 -0
  243. package/src/components/data-display/Lightbox/Lightbox.tsx +466 -0
  244. package/src/components/data-display/Lightbox/Lightbox.types.ts +53 -0
  245. package/src/components/data-display/Lightbox/Lightbox.variants.ts +99 -0
  246. package/src/components/data-display/Lightbox/README.md +397 -0
  247. package/src/components/data-display/Lightbox/index.ts +2 -0
  248. package/src/components/data-display/LineChart/LineChart.test.tsx +654 -0
  249. package/src/components/data-display/LineChart/LineChart.tsx +295 -0
  250. package/src/components/data-display/LineChart/LineChart.types.ts +168 -0
  251. package/src/components/data-display/LineChart/LineChart.variants.ts +52 -0
  252. package/src/components/data-display/LineChart/README.md +242 -0
  253. package/src/components/data-display/LineChart/index.ts +8 -0
  254. package/src/components/data-display/List/List.test.tsx +756 -0
  255. package/src/components/data-display/List/List.tsx +455 -0
  256. package/src/components/data-display/List/List.types.ts +67 -0
  257. package/src/components/data-display/List/List.variants.ts +69 -0
  258. package/src/components/data-display/List/README.md +374 -0
  259. package/src/components/data-display/List/index.ts +9 -0
  260. package/src/components/data-display/MarkerBar/MarkerBar.tsx +130 -0
  261. package/src/components/data-display/MarkerBar/MarkerBar.types.ts +67 -0
  262. package/src/components/data-display/MarkerBar/MarkerBar.variants.ts +75 -0
  263. package/src/components/data-display/MarkerBar/index.ts +3 -0
  264. package/src/components/data-display/PieChart/PieChart.test.tsx +655 -0
  265. package/src/components/data-display/PieChart/PieChart.tsx +327 -0
  266. package/src/components/data-display/PieChart/PieChart.types.ts +134 -0
  267. package/src/components/data-display/PieChart/PieChart.variants.ts +49 -0
  268. package/src/components/data-display/PieChart/README.md +261 -0
  269. package/src/components/data-display/PieChart/index.ts +2 -0
  270. package/src/components/data-display/ScatterChart/ScatterChart.tsx +310 -0
  271. package/src/components/data-display/ScatterChart/ScatterChart.types.ts +272 -0
  272. package/src/components/data-display/ScatterChart/index.ts +2 -0
  273. package/src/components/data-display/SingleStat/README.md +363 -0
  274. package/src/components/data-display/SingleStat/SingleStat.test.tsx +223 -0
  275. package/src/components/data-display/SingleStat/SingleStat.tsx +251 -0
  276. package/src/components/data-display/SingleStat/SingleStat.types.ts +71 -0
  277. package/src/components/data-display/SingleStat/SingleStat.variants.ts +51 -0
  278. package/src/components/data-display/SingleStat/index.ts +6 -0
  279. package/src/components/data-display/Sparkline/README.md +321 -0
  280. package/src/components/data-display/Sparkline/Sparkline.test.tsx +276 -0
  281. package/src/components/data-display/Sparkline/Sparkline.tsx +971 -0
  282. package/src/components/data-display/Sparkline/Sparkline.types.ts +147 -0
  283. package/src/components/data-display/Sparkline/Sparkline.variants.ts +52 -0
  284. package/src/components/data-display/Sparkline/index.ts +9 -0
  285. package/src/components/data-display/Table/README.md +821 -0
  286. package/src/components/data-display/Table/Table.test.tsx +732 -0
  287. package/src/components/data-display/Table/Table.tsx +123 -0
  288. package/src/components/data-display/Table/Table.types.ts +20 -0
  289. package/src/components/data-display/Table/Table.variants.ts +123 -0
  290. package/src/components/data-display/Table/index.ts +1 -0
  291. package/src/components/data-display/Timeline/README.md +366 -0
  292. package/src/components/data-display/Timeline/Timeline.test.tsx +701 -0
  293. package/src/components/data-display/Timeline/Timeline.tsx +328 -0
  294. package/src/components/data-display/Timeline/Timeline.types.ts +59 -0
  295. package/src/components/data-display/Timeline/Timeline.variants.ts +152 -0
  296. package/src/components/data-display/Timeline/index.ts +15 -0
  297. package/src/components/data-display/Tracker/Tracker.tsx +105 -0
  298. package/src/components/data-display/Tracker/Tracker.types.ts +45 -0
  299. package/src/components/data-display/Tracker/Tracker.variants.ts +24 -0
  300. package/src/components/data-display/Tracker/index.ts +2 -0
  301. package/src/components/data-display/VirtualTable/README.md +383 -0
  302. package/src/components/data-display/VirtualTable/VirtualTable.test.tsx +295 -0
  303. package/src/components/data-display/VirtualTable/VirtualTable.tsx +354 -0
  304. package/src/components/data-display/VirtualTable/VirtualTable.types.ts +62 -0
  305. package/src/components/data-display/VirtualTable/VirtualTable.variants.ts +61 -0
  306. package/src/components/data-display/VirtualTable/index.ts +2 -0
  307. package/src/components/data-display/index.ts +35 -0
  308. package/src/components/feedback/Alert/Alert.test.tsx +614 -0
  309. package/src/components/feedback/Alert/Alert.tsx +48 -0
  310. package/src/components/feedback/Alert/Alert.types.ts +42 -0
  311. package/src/components/feedback/Alert/Alert.variants.ts +20 -0
  312. package/src/components/feedback/Alert/README.md +522 -0
  313. package/src/components/feedback/Alert/index.ts +3 -0
  314. package/src/components/feedback/AlertDialog/AlertDialog.test.tsx +1237 -0
  315. package/src/components/feedback/AlertDialog/AlertDialog.tsx +160 -0
  316. package/src/components/feedback/AlertDialog/AlertDialog.types.ts +139 -0
  317. package/src/components/feedback/AlertDialog/README.md +723 -0
  318. package/src/components/feedback/AlertDialog/index.ts +2 -0
  319. package/src/components/feedback/CLAUDE.md +87 -0
  320. package/src/components/feedback/ConfirmModal/ConfirmModal.test.tsx +404 -0
  321. package/src/components/feedback/ConfirmModal/ConfirmModal.tsx +139 -0
  322. package/src/components/feedback/ConfirmModal/ConfirmModal.types.ts +117 -0
  323. package/src/components/feedback/ConfirmModal/README.md +546 -0
  324. package/src/components/feedback/ConfirmModal/index.ts +2 -0
  325. package/src/components/feedback/Dialog/Dialog.test.tsx +1070 -0
  326. package/src/components/feedback/Dialog/Dialog.tsx +137 -0
  327. package/src/components/feedback/Dialog/Dialog.types.ts +119 -0
  328. package/src/components/feedback/Dialog/README.md +770 -0
  329. package/src/components/feedback/Dialog/index.ts +2 -0
  330. package/src/components/feedback/ErrorPage/ErrorPage.test.tsx +338 -0
  331. package/src/components/feedback/ErrorPage/ErrorPage.tsx +232 -0
  332. package/src/components/feedback/ErrorPage/ErrorPage.types.ts +95 -0
  333. package/src/components/feedback/ErrorPage/README.md +573 -0
  334. package/src/components/feedback/ErrorPage/index.ts +6 -0
  335. package/src/components/feedback/FocusTrap/FocusTrap.test.tsx +378 -0
  336. package/src/components/feedback/FocusTrap/FocusTrap.tsx +115 -0
  337. package/src/components/feedback/FocusTrap/FocusTrap.types.ts +119 -0
  338. package/src/components/feedback/FocusTrap/README.md +571 -0
  339. package/src/components/feedback/FocusTrap/index.ts +2 -0
  340. package/src/components/feedback/Message/Message.test.tsx +143 -0
  341. package/src/components/feedback/Message/Message.tsx +66 -0
  342. package/src/components/feedback/Message/Message.types.ts +44 -0
  343. package/src/components/feedback/Message/Message.variants.ts +24 -0
  344. package/src/components/feedback/Message/README.md +522 -0
  345. package/src/components/feedback/Message/index.ts +2 -0
  346. package/src/components/feedback/Modal/Modal.test.tsx +475 -0
  347. package/src/components/feedback/Modal/Modal.tsx +168 -0
  348. package/src/components/feedback/Modal/Modal.types.ts +91 -0
  349. package/src/components/feedback/Modal/README.md +517 -0
  350. package/src/components/feedback/Modal/index.ts +2 -0
  351. package/src/components/feedback/Notification/Notification.test.tsx +908 -0
  352. package/src/components/feedback/Notification/Notification.tsx +222 -0
  353. package/src/components/feedback/Notification/Notification.types.ts +90 -0
  354. package/src/components/feedback/Notification/Notification.variants.ts +54 -0
  355. package/src/components/feedback/Notification/README.md +602 -0
  356. package/src/components/feedback/Notification/index.ts +11 -0
  357. package/src/components/feedback/Popover/Popover.test.tsx +901 -0
  358. package/src/components/feedback/Popover/Popover.tsx +60 -0
  359. package/src/components/feedback/Popover/Popover.types.ts +158 -0
  360. package/src/components/feedback/Popover/Popover.variants.ts +27 -0
  361. package/src/components/feedback/Popover/README.md +700 -0
  362. package/src/components/feedback/Popover/index.ts +2 -0
  363. package/src/components/feedback/Toast/README.md +613 -0
  364. package/src/components/feedback/Toast/Toast.test.tsx +1116 -0
  365. package/src/components/feedback/Toast/Toast.tsx +44 -0
  366. package/src/components/feedback/Toast/Toast.types.ts +156 -0
  367. package/src/components/feedback/Toast/index.ts +1 -0
  368. package/src/components/feedback/Tooltip/README.md +671 -0
  369. package/src/components/feedback/Tooltip/Tooltip.test.tsx +413 -0
  370. package/src/components/feedback/Tooltip/Tooltip.tsx +110 -0
  371. package/src/components/feedback/Tooltip/Tooltip.types.ts +138 -0
  372. package/src/components/feedback/Tooltip/Tooltip.variants.ts +54 -0
  373. package/src/components/feedback/Tooltip/index.ts +3 -0
  374. package/src/components/feedback/index.ts +13 -0
  375. package/src/components/forms/Autocomplete/Autocomplete.test.tsx +2351 -0
  376. package/src/components/forms/Autocomplete/Autocomplete.tsx +696 -0
  377. package/src/components/forms/Autocomplete/Autocomplete.types.ts +211 -0
  378. package/src/components/forms/Autocomplete/Autocomplete.variants.ts +154 -0
  379. package/src/components/forms/Autocomplete/README.md +919 -0
  380. package/src/components/forms/Autocomplete/index.ts +7 -0
  381. package/src/components/forms/CLAUDE.md +124 -0
  382. package/src/components/forms/Checkbox/Checkbox.test.tsx +475 -0
  383. package/src/components/forms/Checkbox/Checkbox.tsx +35 -0
  384. package/src/components/forms/Checkbox/Checkbox.types.ts +24 -0
  385. package/src/components/forms/Checkbox/Checkbox.variants.ts +46 -0
  386. package/src/components/forms/Checkbox/README.md +861 -0
  387. package/src/components/forms/Checkbox/index.ts +3 -0
  388. package/src/components/forms/CheckboxGroup/CheckboxGroup.test.tsx +338 -0
  389. package/src/components/forms/CheckboxGroup/CheckboxGroup.tsx +212 -0
  390. package/src/components/forms/CheckboxGroup/CheckboxGroup.types.ts +150 -0
  391. package/src/components/forms/CheckboxGroup/CheckboxGroup.variants.ts +85 -0
  392. package/src/components/forms/CheckboxGroup/README.md +124 -0
  393. package/src/components/forms/CheckboxGroup/index.ts +21 -0
  394. package/src/components/forms/ColorPicker/ColorPicker.test.tsx +916 -0
  395. package/src/components/forms/ColorPicker/ColorPicker.tsx +282 -0
  396. package/src/components/forms/ColorPicker/ColorPicker.types.ts +99 -0
  397. package/src/components/forms/ColorPicker/ColorPicker.variants.ts +84 -0
  398. package/src/components/forms/ColorPicker/README.md +809 -0
  399. package/src/components/forms/ColorPicker/index.ts +14 -0
  400. package/src/components/forms/Combobox/Combobox.test.tsx +975 -0
  401. package/src/components/forms/Combobox/Combobox.tsx +194 -0
  402. package/src/components/forms/Combobox/Combobox.types.ts +113 -0
  403. package/src/components/forms/Combobox/Combobox.variants.ts +108 -0
  404. package/src/components/forms/Combobox/README.md +923 -0
  405. package/src/components/forms/Combobox/index.ts +7 -0
  406. package/src/components/forms/DatePicker/DatePicker.test.tsx +1181 -0
  407. package/src/components/forms/DatePicker/DatePicker.tsx +503 -0
  408. package/src/components/forms/DatePicker/DatePicker.types.ts +196 -0
  409. package/src/components/forms/DatePicker/DatePicker.variants.ts +38 -0
  410. package/src/components/forms/DatePicker/README.md +821 -0
  411. package/src/components/forms/DatePicker/index.ts +8 -0
  412. package/src/components/forms/DateRangePicker/DateRangeInput.tsx +139 -0
  413. package/src/components/forms/DateRangePicker/DateRangePicker.test.tsx +1684 -0
  414. package/src/components/forms/DateRangePicker/DateRangePicker.tsx +375 -0
  415. package/src/components/forms/DateRangePicker/DateRangePicker.types.ts +145 -0
  416. package/src/components/forms/DateRangePicker/DateRangePicker.variants.ts +133 -0
  417. package/src/components/forms/DateRangePicker/DateRangePresets.tsx +44 -0
  418. package/src/components/forms/DateRangePicker/index.ts +25 -0
  419. package/src/components/forms/DateRangePicker/presets.ts +104 -0
  420. package/src/components/forms/EmailInput/EmailInput.test.tsx +562 -0
  421. package/src/components/forms/EmailInput/EmailInput.tsx +59 -0
  422. package/src/components/forms/EmailInput/EmailInput.types.ts +46 -0
  423. package/src/components/forms/EmailInput/EmailInput.variants.ts +30 -0
  424. package/src/components/forms/EmailInput/README.md +708 -0
  425. package/src/components/forms/EmailInput/index.ts +6 -0
  426. package/src/components/forms/ErrorMessage/ErrorMessage.test.tsx +457 -0
  427. package/src/components/forms/ErrorMessage/ErrorMessage.tsx +128 -0
  428. package/src/components/forms/ErrorMessage/ErrorMessage.types.ts +54 -0
  429. package/src/components/forms/ErrorMessage/ErrorMessage.variants.ts +78 -0
  430. package/src/components/forms/ErrorMessage/README.md +855 -0
  431. package/src/components/forms/ErrorMessage/index.ts +4 -0
  432. package/src/components/forms/Field/Field.test.tsx +811 -0
  433. package/src/components/forms/Field/Field.tsx +195 -0
  434. package/src/components/forms/Field/Field.types.ts +94 -0
  435. package/src/components/forms/Field/Field.variants.ts +114 -0
  436. package/src/components/forms/Field/README.md +931 -0
  437. package/src/components/forms/Field/index.ts +3 -0
  438. package/src/components/forms/FloatLabel/FloatLabel.test.tsx +248 -0
  439. package/src/components/forms/FloatLabel/FloatLabel.tsx +110 -0
  440. package/src/components/forms/FloatLabel/FloatLabel.types.ts +37 -0
  441. package/src/components/forms/FloatLabel/index.ts +2 -0
  442. package/src/components/forms/Form/Form.test.tsx +1167 -0
  443. package/src/components/forms/Form/Form.tsx +170 -0
  444. package/src/components/forms/Form/Form.types.ts +126 -0
  445. package/src/components/forms/Form/Form.variants.ts +81 -0
  446. package/src/components/forms/Form/README.md +787 -0
  447. package/src/components/forms/Form/index.ts +3 -0
  448. package/src/components/forms/FormValidation/FormValidation.test.tsx +376 -0
  449. package/src/components/forms/FormValidation/FormValidation.tsx +99 -0
  450. package/src/components/forms/FormValidation/FormValidation.types.ts +37 -0
  451. package/src/components/forms/FormValidation/FormValidation.variants.ts +24 -0
  452. package/src/components/forms/FormValidation/README.md +592 -0
  453. package/src/components/forms/FormValidation/index.ts +4 -0
  454. package/src/components/forms/HelpText/HelpText.test.tsx +558 -0
  455. package/src/components/forms/HelpText/HelpText.tsx +111 -0
  456. package/src/components/forms/HelpText/HelpText.types.ts +51 -0
  457. package/src/components/forms/HelpText/HelpText.variants.ts +54 -0
  458. package/src/components/forms/HelpText/README.md +739 -0
  459. package/src/components/forms/HelpText/index.ts +4 -0
  460. package/src/components/forms/IftaLabel/IftaLabel.test.tsx +193 -0
  461. package/src/components/forms/IftaLabel/IftaLabel.tsx +72 -0
  462. package/src/components/forms/IftaLabel/IftaLabel.types.ts +18 -0
  463. package/src/components/forms/IftaLabel/index.ts +2 -0
  464. package/src/components/forms/InputGroup/InputGroup.test.tsx +782 -0
  465. package/src/components/forms/InputGroup/InputGroup.tsx +128 -0
  466. package/src/components/forms/InputGroup/InputGroup.types.ts +66 -0
  467. package/src/components/forms/InputGroup/InputGroup.variants.ts +102 -0
  468. package/src/components/forms/InputGroup/README.md +845 -0
  469. package/src/components/forms/InputGroup/index.ts +24 -0
  470. package/src/components/forms/InputOTP/InputOTP.test.tsx +793 -0
  471. package/src/components/forms/InputOTP/InputOTP.tsx +90 -0
  472. package/src/components/forms/InputOTP/InputOTP.types.ts +74 -0
  473. package/src/components/forms/InputOTP/InputOTP.variants.ts +64 -0
  474. package/src/components/forms/InputOTP/README.md +1149 -0
  475. package/src/components/forms/InputOTP/index.ts +18 -0
  476. package/src/components/forms/InputOTPField/InputOTPField.test.tsx +220 -0
  477. package/src/components/forms/InputOTPField/InputOTPField.tsx +148 -0
  478. package/src/components/forms/InputOTPField/InputOTPField.types.ts +91 -0
  479. package/src/components/forms/InputOTPField/InputOTPField.variants.ts +83 -0
  480. package/src/components/forms/InputOTPField/README.md +195 -0
  481. package/src/components/forms/InputOTPField/index.ts +12 -0
  482. package/src/components/forms/MultiSelect/MultiSelect.test.tsx +1036 -0
  483. package/src/components/forms/MultiSelect/MultiSelect.tsx +291 -0
  484. package/src/components/forms/MultiSelect/MultiSelect.types.ts +147 -0
  485. package/src/components/forms/MultiSelect/MultiSelect.variants.ts +132 -0
  486. package/src/components/forms/MultiSelect/README.md +897 -0
  487. package/src/components/forms/MultiSelect/index.ts +7 -0
  488. package/src/components/forms/NativeSelect/NativeSelect.test.tsx +856 -0
  489. package/src/components/forms/NativeSelect/NativeSelect.tsx +75 -0
  490. package/src/components/forms/NativeSelect/NativeSelect.types.ts +17 -0
  491. package/src/components/forms/NativeSelect/NativeSelect.variants.ts +106 -0
  492. package/src/components/forms/NativeSelect/README.md +1033 -0
  493. package/src/components/forms/NativeSelect/index.ts +3 -0
  494. package/src/components/forms/NumberInput/NumberInput.test.tsx +636 -0
  495. package/src/components/forms/NumberInput/NumberInput.tsx +131 -0
  496. package/src/components/forms/NumberInput/NumberInput.types.ts +45 -0
  497. package/src/components/forms/NumberInput/NumberInput.variants.ts +85 -0
  498. package/src/components/forms/NumberInput/README.md +766 -0
  499. package/src/components/forms/NumberInput/index.ts +9 -0
  500. package/src/components/forms/PasswordInput/PasswordInput.test.tsx +525 -0
  501. package/src/components/forms/PasswordInput/PasswordInput.tsx +67 -0
  502. package/src/components/forms/PasswordInput/PasswordInput.types.ts +35 -0
  503. package/src/components/forms/PasswordInput/PasswordInput.variants.ts +34 -0
  504. package/src/components/forms/PasswordInput/README.md +698 -0
  505. package/src/components/forms/PasswordInput/index.ts +6 -0
  506. package/src/components/forms/PaymentInput/PaymentInput.test.tsx +252 -0
  507. package/src/components/forms/PaymentInput/PaymentInput.tsx +178 -0
  508. package/src/components/forms/PaymentInput/PaymentInput.types.ts +69 -0
  509. package/src/components/forms/PaymentInput/PaymentInput.variants.ts +81 -0
  510. package/src/components/forms/PaymentInput/README.md +263 -0
  511. package/src/components/forms/PaymentInput/card-utils.ts +219 -0
  512. package/src/components/forms/PaymentInput/index.ts +23 -0
  513. package/src/components/forms/PhoneInput/PhoneInput.test.tsx +270 -0
  514. package/src/components/forms/PhoneInput/PhoneInput.tsx +215 -0
  515. package/src/components/forms/PhoneInput/PhoneInput.types.ts +74 -0
  516. package/src/components/forms/PhoneInput/PhoneInput.variants.ts +103 -0
  517. package/src/components/forms/PhoneInput/README.md +258 -0
  518. package/src/components/forms/PhoneInput/countries.ts +134 -0
  519. package/src/components/forms/PhoneInput/index.ts +22 -0
  520. package/src/components/forms/RadioButton/README.md +832 -0
  521. package/src/components/forms/RadioButton/RadioButton.test.tsx +583 -0
  522. package/src/components/forms/RadioButton/RadioButton.tsx +82 -0
  523. package/src/components/forms/RadioButton/RadioButton.types.ts +23 -0
  524. package/src/components/forms/RadioButton/RadioButton.variants.ts +80 -0
  525. package/src/components/forms/RadioButton/index.ts +15 -0
  526. package/src/components/forms/RadioCardGroup/RadioCardGroup.tsx +130 -0
  527. package/src/components/forms/RadioCardGroup/RadioCardGroup.types.ts +66 -0
  528. package/src/components/forms/RadioCardGroup/RadioCardGroup.variants.ts +131 -0
  529. package/src/components/forms/RadioCardGroup/index.ts +3 -0
  530. package/src/components/forms/RadioGroup/README.md +908 -0
  531. package/src/components/forms/RadioGroup/RadioGroup.test.tsx +764 -0
  532. package/src/components/forms/RadioGroup/RadioGroup.tsx +75 -0
  533. package/src/components/forms/RadioGroup/RadioGroup.types.ts +36 -0
  534. package/src/components/forms/RadioGroup/RadioGroup.variants.ts +58 -0
  535. package/src/components/forms/RadioGroup/index.ts +15 -0
  536. package/src/components/forms/Rating/README.md +729 -0
  537. package/src/components/forms/Rating/Rating.test.tsx +729 -0
  538. package/src/components/forms/Rating/Rating.tsx +258 -0
  539. package/src/components/forms/Rating/Rating.types.ts +89 -0
  540. package/src/components/forms/Rating/Rating.variants.ts +56 -0
  541. package/src/components/forms/Rating/index.ts +8 -0
  542. package/src/components/forms/SearchInput/README.md +729 -0
  543. package/src/components/forms/SearchInput/SearchInput.test.tsx +579 -0
  544. package/src/components/forms/SearchInput/SearchInput.tsx +103 -0
  545. package/src/components/forms/SearchInput/SearchInput.types.ts +40 -0
  546. package/src/components/forms/SearchInput/SearchInput.variants.ts +51 -0
  547. package/src/components/forms/SearchInput/index.ts +8 -0
  548. package/src/components/forms/Select/README.md +1286 -0
  549. package/src/components/forms/Select/Select.test.tsx +1136 -0
  550. package/src/components/forms/Select/Select.tsx +170 -0
  551. package/src/components/forms/Select/Select.types.ts +75 -0
  552. package/src/components/forms/Select/Select.variants.ts +133 -0
  553. package/src/components/forms/Select/index.ts +3 -0
  554. package/src/components/forms/Slider/README.md +1246 -0
  555. package/src/components/forms/Slider/Slider.test.tsx +731 -0
  556. package/src/components/forms/Slider/Slider.tsx +235 -0
  557. package/src/components/forms/Slider/Slider.types.ts +90 -0
  558. package/src/components/forms/Slider/Slider.variants.ts +239 -0
  559. package/src/components/forms/Slider/index.ts +34 -0
  560. package/src/components/forms/SuccessMessage/README.md +534 -0
  561. package/src/components/forms/SuccessMessage/SuccessMessage.test.tsx +257 -0
  562. package/src/components/forms/SuccessMessage/SuccessMessage.tsx +43 -0
  563. package/src/components/forms/SuccessMessage/SuccessMessage.types.ts +11 -0
  564. package/src/components/forms/SuccessMessage/SuccessMessage.variants.ts +15 -0
  565. package/src/components/forms/SuccessMessage/index.ts +4 -0
  566. package/src/components/forms/Switch/README.md +785 -0
  567. package/src/components/forms/Switch/Switch.test.tsx +636 -0
  568. package/src/components/forms/Switch/Switch.tsx +28 -0
  569. package/src/components/forms/Switch/Switch.types.ts +24 -0
  570. package/src/components/forms/Switch/Switch.variants.ts +49 -0
  571. package/src/components/forms/Switch/index.ts +3 -0
  572. package/src/components/forms/TagsInput/README.md +216 -0
  573. package/src/components/forms/TagsInput/TagsInput.test.tsx +308 -0
  574. package/src/components/forms/TagsInput/TagsInput.tsx +189 -0
  575. package/src/components/forms/TagsInput/TagsInput.types.ts +85 -0
  576. package/src/components/forms/TagsInput/TagsInput.variants.ts +58 -0
  577. package/src/components/forms/TagsInput/index.ts +12 -0
  578. package/src/components/forms/TextInput/README.md +871 -0
  579. package/src/components/forms/TextInput/TextInput.test.tsx +484 -0
  580. package/src/components/forms/TextInput/TextInput.tsx +76 -0
  581. package/src/components/forms/TextInput/TextInput.types.ts +61 -0
  582. package/src/components/forms/TextInput/TextInput.variants.ts +117 -0
  583. package/src/components/forms/TextInput/index.ts +14 -0
  584. package/src/components/forms/Textarea/README.md +905 -0
  585. package/src/components/forms/Textarea/Textarea.test.tsx +482 -0
  586. package/src/components/forms/Textarea/Textarea.tsx +24 -0
  587. package/src/components/forms/Textarea/Textarea.types.ts +39 -0
  588. package/src/components/forms/Textarea/Textarea.variants.ts +48 -0
  589. package/src/components/forms/Textarea/index.ts +3 -0
  590. package/src/components/forms/TextareaField/README.md +172 -0
  591. package/src/components/forms/TextareaField/TextareaField.test.tsx +260 -0
  592. package/src/components/forms/TextareaField/TextareaField.tsx +73 -0
  593. package/src/components/forms/TextareaField/TextareaField.types.ts +37 -0
  594. package/src/components/forms/TextareaField/TextareaField.variants.ts +83 -0
  595. package/src/components/forms/TextareaField/index.ts +12 -0
  596. package/src/components/forms/TimePicker/README.md +750 -0
  597. package/src/components/forms/TimePicker/TimePicker.test.tsx +780 -0
  598. package/src/components/forms/TimePicker/TimePicker.tsx +383 -0
  599. package/src/components/forms/TimePicker/TimePicker.types.ts +94 -0
  600. package/src/components/forms/TimePicker/TimePicker.variants.ts +83 -0
  601. package/src/components/forms/TimePicker/index.ts +14 -0
  602. package/src/components/forms/ToggleGroup/README.md +870 -0
  603. package/src/components/forms/ToggleGroup/ToggleGroup.test.tsx +941 -0
  604. package/src/components/forms/ToggleGroup/ToggleGroup.tsx +5 -0
  605. package/src/components/forms/ToggleGroup/ToggleGroup.types.ts +17 -0
  606. package/src/components/forms/ToggleGroup/ToggleGroup.variants.ts +42 -0
  607. package/src/components/forms/ToggleGroup/index.ts +9 -0
  608. package/src/components/forms/URLInput/README.md +701 -0
  609. package/src/components/forms/URLInput/URLInput.test.tsx +602 -0
  610. package/src/components/forms/URLInput/URLInput.tsx +71 -0
  611. package/src/components/forms/URLInput/URLInput.types.ts +51 -0
  612. package/src/components/forms/URLInput/URLInput.variants.ts +52 -0
  613. package/src/components/forms/URLInput/index.ts +8 -0
  614. package/src/components/forms/index.ts +44 -0
  615. package/src/components/index.ts +26 -0
  616. package/src/components/layout/AppContent/AppContent.test.tsx +34 -0
  617. package/src/components/layout/AppContent/AppContent.tsx +23 -0
  618. package/src/components/layout/AppContent/AppContent.variants.ts +23 -0
  619. package/src/components/layout/AppContent/index.ts +2 -0
  620. package/src/components/layout/AppHeader/AppHeader.test.tsx +26 -0
  621. package/src/components/layout/AppHeader/AppHeader.tsx +17 -0
  622. package/src/components/layout/AppHeader/AppHeader.variants.ts +21 -0
  623. package/src/components/layout/AppHeader/AppHeaderActions.tsx +13 -0
  624. package/src/components/layout/AppHeader/AppHeaderNav.tsx +13 -0
  625. package/src/components/layout/AppHeader/AppHeaderTitle.tsx +13 -0
  626. package/src/components/layout/AppHeader/index.ts +5 -0
  627. package/src/components/layout/AppRail/AppRail.test.tsx +50 -0
  628. package/src/components/layout/AppRail/AppRail.tsx +24 -0
  629. package/src/components/layout/AppRail/AppRail.variants.ts +31 -0
  630. package/src/components/layout/AppRail/AppRailFooter.tsx +13 -0
  631. package/src/components/layout/AppRail/AppRailGroup.tsx +13 -0
  632. package/src/components/layout/AppRail/AppRailHeader.tsx +13 -0
  633. package/src/components/layout/AppRail/AppRailItem.tsx +57 -0
  634. package/src/components/layout/AppRail/index.ts +5 -0
  635. package/src/components/layout/AppShell/AppShell.context.tsx +34 -0
  636. package/src/components/layout/AppShell/AppShell.test.tsx +61 -0
  637. package/src/components/layout/AppShell/AppShell.tsx +91 -0
  638. package/src/components/layout/AppShell/AppShell.variants.ts +21 -0
  639. package/src/components/layout/AppShell/index.ts +2 -0
  640. package/src/components/layout/AppSidebar/AppSidebar.test.tsx +69 -0
  641. package/src/components/layout/AppSidebar/AppSidebar.tsx +58 -0
  642. package/src/components/layout/AppSidebar/AppSidebar.variants.ts +41 -0
  643. package/src/components/layout/AppSidebar/AppSidebarContent.tsx +18 -0
  644. package/src/components/layout/AppSidebar/AppSidebarFooter.tsx +13 -0
  645. package/src/components/layout/AppSidebar/AppSidebarGroup.tsx +22 -0
  646. package/src/components/layout/AppSidebar/AppSidebarHeader.tsx +13 -0
  647. package/src/components/layout/AppSidebar/AppSidebarItem.tsx +54 -0
  648. package/src/components/layout/AppSidebar/AppSidebarTrigger.tsx +25 -0
  649. package/src/components/layout/AppSidebar/index.ts +7 -0
  650. package/src/components/layout/CLAUDE.md +112 -0
  651. package/src/components/layout/Card/Card.test.tsx +339 -0
  652. package/src/components/layout/Card/Card.tsx +102 -0
  653. package/src/components/layout/Card/Card.types.ts +52 -0
  654. package/src/components/layout/Card/Card.variants.ts +85 -0
  655. package/src/components/layout/Card/README.md +994 -0
  656. package/src/components/layout/Card/index.ts +3 -0
  657. package/src/components/layout/Collapsible/Collapsible.test.tsx +491 -0
  658. package/src/components/layout/Collapsible/Collapsible.tsx +50 -0
  659. package/src/components/layout/Collapsible/Collapsible.types.ts +26 -0
  660. package/src/components/layout/Collapsible/Collapsible.variants.ts +52 -0
  661. package/src/components/layout/Collapsible/README.md +885 -0
  662. package/src/components/layout/Collapsible/index.ts +3 -0
  663. package/src/components/layout/Container/Container.test.tsx +283 -0
  664. package/src/components/layout/Container/Container.tsx +25 -0
  665. package/src/components/layout/Container/Container.types.ts +36 -0
  666. package/src/components/layout/Container/Container.variants.ts +59 -0
  667. package/src/components/layout/Container/README.md +700 -0
  668. package/src/components/layout/Container/index.ts +3 -0
  669. package/src/components/layout/Flex/Flex.test.tsx +545 -0
  670. package/src/components/layout/Flex/Flex.tsx +52 -0
  671. package/src/components/layout/Flex/Flex.types.ts +61 -0
  672. package/src/components/layout/Flex/Flex.variants.ts +98 -0
  673. package/src/components/layout/Flex/README.md +812 -0
  674. package/src/components/layout/Flex/index.ts +3 -0
  675. package/src/components/layout/Grid/Grid.test.tsx +601 -0
  676. package/src/components/layout/Grid/Grid.tsx +61 -0
  677. package/src/components/layout/Grid/Grid.types.ts +47 -0
  678. package/src/components/layout/Grid/Grid.variants.ts +100 -0
  679. package/src/components/layout/Grid/README.md +762 -0
  680. package/src/components/layout/Grid/index.ts +3 -0
  681. package/src/components/layout/PageContent/PageContent.tsx +13 -0
  682. package/src/components/layout/PageContent/index.ts +1 -0
  683. package/src/components/layout/PageHeader/PageHeader.tsx +43 -0
  684. package/src/components/layout/PageHeader/index.ts +1 -0
  685. package/src/components/layout/PageSection/PageSection.tsx +28 -0
  686. package/src/components/layout/PageSection/index.ts +1 -0
  687. package/src/components/layout/Panel/Panel.test.tsx +427 -0
  688. package/src/components/layout/Panel/Panel.tsx +75 -0
  689. package/src/components/layout/Panel/Panel.types.ts +59 -0
  690. package/src/components/layout/Panel/Panel.variants.ts +94 -0
  691. package/src/components/layout/Panel/README.md +861 -0
  692. package/src/components/layout/Panel/index.ts +3 -0
  693. package/src/components/layout/ResizablePanels/README.md +369 -0
  694. package/src/components/layout/ResizablePanels/ResizablePanels.test.tsx +506 -0
  695. package/src/components/layout/ResizablePanels/ResizablePanels.tsx +64 -0
  696. package/src/components/layout/ResizablePanels/ResizablePanels.types.ts +41 -0
  697. package/src/components/layout/ResizablePanels/ResizablePanels.variants.ts +67 -0
  698. package/src/components/layout/ResizablePanels/index.ts +3 -0
  699. package/src/components/layout/ResponsiveContainer/README.md +267 -0
  700. package/src/components/layout/ResponsiveContainer/ResponsiveContainer.test.tsx +386 -0
  701. package/src/components/layout/ResponsiveContainer/ResponsiveContainer.tsx +54 -0
  702. package/src/components/layout/ResponsiveContainer/ResponsiveContainer.types.ts +43 -0
  703. package/src/components/layout/ResponsiveContainer/ResponsiveContainer.variants.ts +106 -0
  704. package/src/components/layout/ResponsiveContainer/index.ts +3 -0
  705. package/src/components/layout/ScrollArea/README.md +278 -0
  706. package/src/components/layout/ScrollArea/ScrollArea.test.tsx +352 -0
  707. package/src/components/layout/ScrollArea/ScrollArea.tsx +61 -0
  708. package/src/components/layout/ScrollArea/ScrollArea.types.ts +36 -0
  709. package/src/components/layout/ScrollArea/ScrollArea.variants.ts +85 -0
  710. package/src/components/layout/ScrollArea/index.ts +3 -0
  711. package/src/components/layout/Section/README.md +315 -0
  712. package/src/components/layout/Section/Section.test.tsx +293 -0
  713. package/src/components/layout/Section/Section.tsx +60 -0
  714. package/src/components/layout/Section/Section.types.ts +38 -0
  715. package/src/components/layout/Section/Section.variants.ts +45 -0
  716. package/src/components/layout/Section/index.ts +3 -0
  717. package/src/components/layout/Sheet/README.md +533 -0
  718. package/src/components/layout/Sheet/Sheet.test.tsx +702 -0
  719. package/src/components/layout/Sheet/Sheet.tsx +142 -0
  720. package/src/components/layout/Sheet/Sheet.types.ts +92 -0
  721. package/src/components/layout/Sheet/Sheet.variants.ts +98 -0
  722. package/src/components/layout/Sheet/index.ts +3 -0
  723. package/src/components/layout/Stack/README.md +346 -0
  724. package/src/components/layout/Stack/Stack.test.tsx +492 -0
  725. package/src/components/layout/Stack/Stack.tsx +58 -0
  726. package/src/components/layout/Stack/Stack.types.ts +58 -0
  727. package/src/components/layout/Stack/Stack.variants.ts +77 -0
  728. package/src/components/layout/Stack/index.ts +3 -0
  729. package/src/components/layout/index.ts +21 -0
  730. package/src/components/navigation/Breadcrumb/Breadcrumb.test.tsx +875 -0
  731. package/src/components/navigation/Breadcrumb/Breadcrumb.tsx +183 -0
  732. package/src/components/navigation/Breadcrumb/Breadcrumb.types.ts +49 -0
  733. package/src/components/navigation/Breadcrumb/Breadcrumb.variants.ts +63 -0
  734. package/src/components/navigation/Breadcrumb/README.md +608 -0
  735. package/src/components/navigation/Breadcrumb/index.ts +24 -0
  736. package/src/components/navigation/CLAUDE.md +118 -0
  737. package/src/components/navigation/ContextMenu/ContextMenu.test.tsx +881 -0
  738. package/src/components/navigation/ContextMenu/ContextMenu.tsx +304 -0
  739. package/src/components/navigation/ContextMenu/ContextMenu.types.ts +119 -0
  740. package/src/components/navigation/ContextMenu/ContextMenu.variants.ts +167 -0
  741. package/src/components/navigation/ContextMenu/README.md +660 -0
  742. package/src/components/navigation/ContextMenu/index.ts +34 -0
  743. package/src/components/navigation/Drawer/Drawer.test.tsx +721 -0
  744. package/src/components/navigation/Drawer/Drawer.tsx +178 -0
  745. package/src/components/navigation/Drawer/Drawer.types.ts +66 -0
  746. package/src/components/navigation/Drawer/Drawer.variants.ts +121 -0
  747. package/src/components/navigation/Drawer/README.md +723 -0
  748. package/src/components/navigation/Drawer/index.ts +24 -0
  749. package/src/components/navigation/DropdownMenu/DropdownMenu.test.tsx +881 -0
  750. package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +305 -0
  751. package/src/components/navigation/DropdownMenu/DropdownMenu.types.ts +98 -0
  752. package/src/components/navigation/DropdownMenu/DropdownMenu.variants.ts +168 -0
  753. package/src/components/navigation/DropdownMenu/README.md +676 -0
  754. package/src/components/navigation/DropdownMenu/index.ts +33 -0
  755. package/src/components/navigation/Header/Header.test.tsx +418 -0
  756. package/src/components/navigation/Header/Header.tsx +133 -0
  757. package/src/components/navigation/Header/Header.types.ts +41 -0
  758. package/src/components/navigation/Header/Header.variants.ts +91 -0
  759. package/src/components/navigation/Header/README.md +567 -0
  760. package/src/components/navigation/Header/index.ts +14 -0
  761. package/src/components/navigation/Menu/Menu.test.tsx +658 -0
  762. package/src/components/navigation/Menu/Menu.tsx +247 -0
  763. package/src/components/navigation/Menu/Menu.types.ts +51 -0
  764. package/src/components/navigation/Menu/Menu.variants.ts +105 -0
  765. package/src/components/navigation/Menu/README.md +599 -0
  766. package/src/components/navigation/Menu/index.ts +17 -0
  767. package/src/components/navigation/Menubar/Menubar.test.tsx +1028 -0
  768. package/src/components/navigation/Menubar/Menubar.tsx +308 -0
  769. package/src/components/navigation/Menubar/Menubar.types.ts +104 -0
  770. package/src/components/navigation/Menubar/Menubar.variants.ts +182 -0
  771. package/src/components/navigation/Menubar/README.md +641 -0
  772. package/src/components/navigation/Menubar/index.ts +36 -0
  773. package/src/components/navigation/MobileSidebar/MobileSidebar.test.tsx +255 -0
  774. package/src/components/navigation/MobileSidebar/MobileSidebar.tsx +187 -0
  775. package/src/components/navigation/MobileSidebar/MobileSidebar.types.ts +62 -0
  776. package/src/components/navigation/MobileSidebar/MobileSidebar.variants.ts +79 -0
  777. package/src/components/navigation/MobileSidebar/index.ts +17 -0
  778. package/src/components/navigation/Navbar/Navbar.test.tsx +621 -0
  779. package/src/components/navigation/Navbar/Navbar.tsx +238 -0
  780. package/src/components/navigation/Navbar/Navbar.types.ts +69 -0
  781. package/src/components/navigation/Navbar/Navbar.variants.ts +176 -0
  782. package/src/components/navigation/Navbar/README.md +670 -0
  783. package/src/components/navigation/Navbar/index.ts +20 -0
  784. package/src/components/navigation/NavigationMenu/NavigationMenu.test.tsx +701 -0
  785. package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +211 -0
  786. package/src/components/navigation/NavigationMenu/NavigationMenu.types.ts +52 -0
  787. package/src/components/navigation/NavigationMenu/NavigationMenu.variants.ts +122 -0
  788. package/src/components/navigation/NavigationMenu/README.md +697 -0
  789. package/src/components/navigation/NavigationMenu/index.ts +23 -0
  790. package/src/components/navigation/Pagination/Pagination.test.tsx +619 -0
  791. package/src/components/navigation/Pagination/Pagination.tsx +185 -0
  792. package/src/components/navigation/Pagination/Pagination.types.ts +42 -0
  793. package/src/components/navigation/Pagination/Pagination.variants.ts +36 -0
  794. package/src/components/navigation/Pagination/README.md +635 -0
  795. package/src/components/navigation/Pagination/index.ts +17 -0
  796. package/src/components/navigation/Sidebar/README.md +628 -0
  797. package/src/components/navigation/Sidebar/Sidebar.test.tsx +1169 -0
  798. package/src/components/navigation/Sidebar/Sidebar.tsx +761 -0
  799. package/src/components/navigation/Sidebar/Sidebar.types.ts +168 -0
  800. package/src/components/navigation/Sidebar/Sidebar.variants.ts +302 -0
  801. package/src/components/navigation/Sidebar/index.ts +59 -0
  802. package/src/components/navigation/SkipLinks/README.md +512 -0
  803. package/src/components/navigation/SkipLinks/SkipLinks.test.tsx +445 -0
  804. package/src/components/navigation/SkipLinks/SkipLinks.tsx +103 -0
  805. package/src/components/navigation/SkipLinks/SkipLinks.types.ts +39 -0
  806. package/src/components/navigation/SkipLinks/SkipLinks.variants.ts +102 -0
  807. package/src/components/navigation/SkipLinks/index.ts +12 -0
  808. package/src/components/navigation/TabNavigation/TabNavigation.tsx +196 -0
  809. package/src/components/navigation/TabNavigation/TabNavigation.types.ts +85 -0
  810. package/src/components/navigation/TabNavigation/TabNavigation.variants.ts +95 -0
  811. package/src/components/navigation/TabNavigation/index.ts +10 -0
  812. package/src/components/navigation/TabPanel/README.md +437 -0
  813. package/src/components/navigation/TabPanel/TabPanel.test.tsx +566 -0
  814. package/src/components/navigation/TabPanel/TabPanel.tsx +95 -0
  815. package/src/components/navigation/TabPanel/TabPanel.types.ts +29 -0
  816. package/src/components/navigation/TabPanel/TabPanel.variants.ts +61 -0
  817. package/src/components/navigation/TabPanel/index.ts +13 -0
  818. package/src/components/navigation/Tabs/README.md +669 -0
  819. package/src/components/navigation/Tabs/Tabs.test.tsx +500 -0
  820. package/src/components/navigation/Tabs/Tabs.tsx +112 -0
  821. package/src/components/navigation/Tabs/Tabs.types.ts +38 -0
  822. package/src/components/navigation/Tabs/Tabs.variants.ts +80 -0
  823. package/src/components/navigation/Tabs/index.ts +14 -0
  824. package/src/components/navigation/Toolbar/README.md +650 -0
  825. package/src/components/navigation/Toolbar/Toolbar.test.tsx +620 -0
  826. package/src/components/navigation/Toolbar/Toolbar.tsx +133 -0
  827. package/src/components/navigation/Toolbar/Toolbar.types.ts +42 -0
  828. package/src/components/navigation/Toolbar/Toolbar.variants.ts +95 -0
  829. package/src/components/navigation/Toolbar/index.ts +17 -0
  830. package/src/components/navigation/UserProfileDropdown/UserProfileDropdown.test.tsx +257 -0
  831. package/src/components/navigation/UserProfileDropdown/UserProfileDropdown.tsx +267 -0
  832. package/src/components/navigation/UserProfileDropdown/UserProfileDropdown.types.ts +84 -0
  833. package/src/components/navigation/UserProfileDropdown/UserProfileDropdown.variants.ts +77 -0
  834. package/src/components/navigation/UserProfileDropdown/index.ts +17 -0
  835. package/src/components/navigation/WorkspaceDropdown/WorkspaceDropdown.tsx +190 -0
  836. package/src/components/navigation/WorkspaceDropdown/WorkspaceDropdown.types.ts +56 -0
  837. package/src/components/navigation/WorkspaceDropdown/WorkspaceDropdown.variants.ts +82 -0
  838. package/src/components/navigation/WorkspaceDropdown/index.ts +20 -0
  839. package/src/components/navigation/index.ts +17 -0
  840. package/src/components/primitives/ArrowAnimated/ArrowAnimated.test.tsx +240 -0
  841. package/src/components/primitives/ArrowAnimated/ArrowAnimated.tsx +96 -0
  842. package/src/components/primitives/ArrowAnimated/ArrowAnimated.types.ts +16 -0
  843. package/src/components/primitives/ArrowAnimated/ArrowAnimated.variants.ts +43 -0
  844. package/src/components/primitives/ArrowAnimated/index.ts +9 -0
  845. package/src/components/primitives/AspectRatio/AspectRatio.test.tsx +306 -0
  846. package/src/components/primitives/AspectRatio/AspectRatio.tsx +11 -0
  847. package/src/components/primitives/AspectRatio/AspectRatio.types.ts +57 -0
  848. package/src/components/primitives/AspectRatio/AspectRatio.variants.ts +110 -0
  849. package/src/components/primitives/AspectRatio/README.md +914 -0
  850. package/src/components/primitives/AspectRatio/index.ts +7 -0
  851. package/src/components/primitives/Avatar/Avatar.test.tsx +1311 -0
  852. package/src/components/primitives/Avatar/Avatar.tsx +159 -0
  853. package/src/components/primitives/Avatar/Avatar.types.ts +70 -0
  854. package/src/components/primitives/Avatar/AvatarAddButton.tsx +59 -0
  855. package/src/components/primitives/Avatar/AvatarBadge.tsx +84 -0
  856. package/src/components/primitives/Avatar/AvatarGroup.test.tsx +1377 -0
  857. package/src/components/primitives/Avatar/AvatarGroup.tsx +101 -0
  858. package/src/components/primitives/Avatar/AvatarLabelGroup.tsx +160 -0
  859. package/src/components/primitives/Avatar/AvatarSkeleton.tsx +76 -0
  860. package/src/components/primitives/Avatar/AvatarStatus.tsx +71 -0
  861. package/src/components/primitives/Avatar/README.md +1174 -0
  862. package/src/components/primitives/Avatar/index.ts +8 -0
  863. package/src/components/primitives/Badge/Badge.test.tsx +1146 -0
  864. package/src/components/primitives/Badge/Badge.tsx +389 -0
  865. package/src/components/primitives/Badge/Badge.types.ts +102 -0
  866. package/src/components/primitives/Badge/README.md +814 -0
  867. package/src/components/primitives/Badge/index.ts +2 -0
  868. package/src/components/primitives/Button/Button.test.tsx +626 -0
  869. package/src/components/primitives/Button/Button.tsx +299 -0
  870. package/src/components/primitives/Button/Button.types.ts +137 -0
  871. package/src/components/primitives/Button/README.md +1112 -0
  872. package/src/components/primitives/Button/index.ts +8 -0
  873. package/src/components/primitives/ButtonGroup/ButtonGroup.test.tsx +945 -0
  874. package/src/components/primitives/ButtonGroup/ButtonGroup.tsx +224 -0
  875. package/src/components/primitives/ButtonGroup/ButtonGroup.types.ts +133 -0
  876. package/src/components/primitives/ButtonGroup/README.md +945 -0
  877. package/src/components/primitives/ButtonGroup/index.ts +12 -0
  878. package/src/components/primitives/CLAUDE.md +108 -0
  879. package/src/components/primitives/ConfirmButton/ConfirmButton.test.tsx +929 -0
  880. package/src/components/primitives/ConfirmButton/ConfirmButton.tsx +298 -0
  881. package/src/components/primitives/ConfirmButton/ConfirmButton.types.ts +116 -0
  882. package/src/components/primitives/ConfirmButton/README.md +1059 -0
  883. package/src/components/primitives/ConfirmButton/index.ts +6 -0
  884. package/src/components/primitives/Divider/Divider.test.tsx +304 -0
  885. package/src/components/primitives/Divider/Divider.tsx +209 -0
  886. package/src/components/primitives/Divider/Divider.types.ts +74 -0
  887. package/src/components/primitives/Divider/README.md +839 -0
  888. package/src/components/primitives/Divider/index.ts +8 -0
  889. package/src/components/primitives/Heading/Heading.test.tsx +611 -0
  890. package/src/components/primitives/Heading/Heading.tsx +120 -0
  891. package/src/components/primitives/Heading/Heading.types.ts +61 -0
  892. package/src/components/primitives/Heading/README.md +820 -0
  893. package/src/components/primitives/Heading/index.ts +2 -0
  894. package/src/components/primitives/Icon/Icon.test.tsx +466 -0
  895. package/src/components/primitives/Icon/Icon.tsx +74 -0
  896. package/src/components/primitives/Icon/Icon.types.ts +61 -0
  897. package/src/components/primitives/Icon/README.md +759 -0
  898. package/src/components/primitives/Icon/index.ts +8 -0
  899. package/src/components/primitives/Image/Image.test.tsx +734 -0
  900. package/src/components/primitives/Image/Image.tsx +239 -0
  901. package/src/components/primitives/Image/Image.types.ts +75 -0
  902. package/src/components/primitives/Image/README.md +863 -0
  903. package/src/components/primitives/Image/index.ts +8 -0
  904. package/src/components/primitives/Kbd/Kbd.test.tsx +432 -0
  905. package/src/components/primitives/Kbd/Kbd.tsx +53 -0
  906. package/src/components/primitives/Kbd/Kbd.types.ts +55 -0
  907. package/src/components/primitives/Kbd/Kbd.variants.ts +33 -0
  908. package/src/components/primitives/Kbd/README.md +659 -0
  909. package/src/components/primitives/Kbd/index.ts +3 -0
  910. package/src/components/primitives/Label/Label.test.tsx +311 -0
  911. package/src/components/primitives/Label/Label.tsx +46 -0
  912. package/src/components/primitives/Label/Label.types.ts +28 -0
  913. package/src/components/primitives/Label/README.md +816 -0
  914. package/src/components/primitives/Label/index.ts +2 -0
  915. package/src/components/primitives/Link/Link.test.tsx +764 -0
  916. package/src/components/primitives/Link/Link.tsx +143 -0
  917. package/src/components/primitives/Link/Link.types.ts +85 -0
  918. package/src/components/primitives/Link/README.md +954 -0
  919. package/src/components/primitives/Link/index.ts +8 -0
  920. package/src/components/primitives/Paragraph/Paragraph.test.tsx +463 -0
  921. package/src/components/primitives/Paragraph/Paragraph.tsx +119 -0
  922. package/src/components/primitives/Paragraph/Paragraph.types.ts +81 -0
  923. package/src/components/primitives/Paragraph/README.md +812 -0
  924. package/src/components/primitives/Paragraph/index.ts +2 -0
  925. package/src/components/primitives/ProgressBar/ProgressBar.test.tsx +598 -0
  926. package/src/components/primitives/ProgressBar/ProgressBar.tsx +268 -0
  927. package/src/components/primitives/ProgressBar/ProgressBar.types.ts +127 -0
  928. package/src/components/primitives/ProgressBar/ProgressBar.variants.ts +111 -0
  929. package/src/components/primitives/ProgressBar/README.md +772 -0
  930. package/src/components/primitives/ProgressBar/index.ts +3 -0
  931. package/src/components/primitives/ProgressCircle/ProgressCircle.test.tsx +219 -0
  932. package/src/components/primitives/ProgressCircle/ProgressCircle.tsx +264 -0
  933. package/src/components/primitives/ProgressCircle/ProgressCircle.types.ts +152 -0
  934. package/src/components/primitives/ProgressCircle/ProgressCircle.variants.ts +140 -0
  935. package/src/components/primitives/ProgressCircle/README.md +763 -0
  936. package/src/components/primitives/ProgressCircle/index.ts +3 -0
  937. package/src/components/primitives/SkeletonLoader/README.md +792 -0
  938. package/src/components/primitives/SkeletonLoader/SkeletonLoader.test.tsx +382 -0
  939. package/src/components/primitives/SkeletonLoader/SkeletonLoader.tsx +45 -0
  940. package/src/components/primitives/SkeletonLoader/SkeletonLoader.types.ts +56 -0
  941. package/src/components/primitives/SkeletonLoader/SkeletonLoader.variants.ts +87 -0
  942. package/src/components/primitives/SkeletonLoader/index.ts +3 -0
  943. package/src/components/primitives/Spacer/README.md +804 -0
  944. package/src/components/primitives/Spacer/Spacer.test.tsx +363 -0
  945. package/src/components/primitives/Spacer/Spacer.tsx +147 -0
  946. package/src/components/primitives/Spacer/Spacer.types.ts +72 -0
  947. package/src/components/primitives/Spacer/index.ts +9 -0
  948. package/src/components/primitives/Spinner/README.md +767 -0
  949. package/src/components/primitives/Spinner/Spinner.test.tsx +289 -0
  950. package/src/components/primitives/Spinner/Spinner.tsx +101 -0
  951. package/src/components/primitives/Spinner/Spinner.types.ts +62 -0
  952. package/src/components/primitives/Spinner/Spinner.variants.ts +50 -0
  953. package/src/components/primitives/Spinner/index.ts +3 -0
  954. package/src/components/primitives/SplitButton/README.md +1142 -0
  955. package/src/components/primitives/SplitButton/SplitButton.test.tsx +1020 -0
  956. package/src/components/primitives/SplitButton/SplitButton.tsx +215 -0
  957. package/src/components/primitives/SplitButton/SplitButton.types.ts +114 -0
  958. package/src/components/primitives/SplitButton/index.ts +8 -0
  959. package/src/components/primitives/StatusIndicator/README.md +730 -0
  960. package/src/components/primitives/StatusIndicator/StatusIndicator.test.tsx +446 -0
  961. package/src/components/primitives/StatusIndicator/StatusIndicator.tsx +100 -0
  962. package/src/components/primitives/StatusIndicator/StatusIndicator.types.ts +39 -0
  963. package/src/components/primitives/StatusIndicator/index.ts +2 -0
  964. package/src/components/primitives/Tag/README.md +793 -0
  965. package/src/components/primitives/Tag/Tag.test.tsx +410 -0
  966. package/src/components/primitives/Tag/Tag.tsx +302 -0
  967. package/src/components/primitives/Tag/Tag.types.ts +112 -0
  968. package/src/components/primitives/Tag/Tag.variants.ts +144 -0
  969. package/src/components/primitives/Tag/TagGroup.tsx +89 -0
  970. package/src/components/primitives/Tag/index.ts +15 -0
  971. package/src/components/primitives/Text/README.md +849 -0
  972. package/src/components/primitives/Text/Text.test.tsx +371 -0
  973. package/src/components/primitives/Text/Text.tsx +89 -0
  974. package/src/components/primitives/Text/Text.types.ts +21 -0
  975. package/src/components/primitives/Text/index.ts +2 -0
  976. package/src/components/primitives/Thumbnail/README.md +800 -0
  977. package/src/components/primitives/Thumbnail/Thumbnail.test.tsx +657 -0
  978. package/src/components/primitives/Thumbnail/Thumbnail.tsx +141 -0
  979. package/src/components/primitives/Thumbnail/Thumbnail.types.ts +102 -0
  980. package/src/components/primitives/Thumbnail/index.ts +9 -0
  981. package/src/components/primitives/Toggle/README.md +232 -0
  982. package/src/components/primitives/Toggle/Toggle.test.tsx +630 -0
  983. package/src/components/primitives/Toggle/Toggle.tsx +174 -0
  984. package/src/components/primitives/Toggle/Toggle.types.ts +161 -0
  985. package/src/components/primitives/Toggle/index.ts +2 -0
  986. package/src/components/primitives/index.ts +26 -0
  987. package/src/components/workflow/ApprovalFlow/ApprovalFlow.test.tsx +607 -0
  988. package/src/components/workflow/ApprovalFlow/ApprovalFlow.tsx +522 -0
  989. package/src/components/workflow/ApprovalFlow/ApprovalFlow.types.ts +233 -0
  990. package/src/components/workflow/ApprovalFlow/ApprovalFlow.variants.ts +207 -0
  991. package/src/components/workflow/ApprovalFlow/README.md +450 -0
  992. package/src/components/workflow/ApprovalFlow/index.ts +38 -0
  993. package/src/components/workflow/ApprovalStatus/ApprovalStatus.test.tsx +316 -0
  994. package/src/components/workflow/ApprovalStatus/ApprovalStatus.tsx +342 -0
  995. package/src/components/workflow/ApprovalStatus/ApprovalStatus.types.ts +68 -0
  996. package/src/components/workflow/ApprovalStatus/ApprovalStatus.variants.ts +60 -0
  997. package/src/components/workflow/ApprovalStatus/README.md +359 -0
  998. package/src/components/workflow/ApprovalStatus/index.ts +7 -0
  999. package/src/components/workflow/CLAUDE.md +118 -0
  1000. package/src/components/workflow/CommentSystem/CommentSystem.test.tsx +901 -0
  1001. package/src/components/workflow/CommentSystem/CommentSystem.tsx +1014 -0
  1002. package/src/components/workflow/CommentSystem/CommentSystem.types.ts +290 -0
  1003. package/src/components/workflow/CommentSystem/CommentSystem.variants.ts +307 -0
  1004. package/src/components/workflow/CommentSystem/README.md +478 -0
  1005. package/src/components/workflow/CommentSystem/index.ts +37 -0
  1006. package/src/components/workflow/Dashboard/Dashboard.test.tsx +586 -0
  1007. package/src/components/workflow/Dashboard/Dashboard.tsx +447 -0
  1008. package/src/components/workflow/Dashboard/Dashboard.types.ts +232 -0
  1009. package/src/components/workflow/Dashboard/Dashboard.variants.ts +241 -0
  1010. package/src/components/workflow/Dashboard/README.md +445 -0
  1011. package/src/components/workflow/Dashboard/index.ts +39 -0
  1012. package/src/components/workflow/DashboardBuilder/DashboardBuilder.test.tsx +460 -0
  1013. package/src/components/workflow/DashboardBuilder/DashboardBuilder.tsx +944 -0
  1014. package/src/components/workflow/DashboardBuilder/DashboardBuilder.types.ts +389 -0
  1015. package/src/components/workflow/DashboardBuilder/DashboardBuilder.variants.ts +264 -0
  1016. package/src/components/workflow/DashboardBuilder/README.md +489 -0
  1017. package/src/components/workflow/DashboardBuilder/index.ts +61 -0
  1018. package/src/components/workflow/KanbanBoard/KanbanBoard.test.tsx +445 -0
  1019. package/src/components/workflow/KanbanBoard/KanbanBoard.tsx +806 -0
  1020. package/src/components/workflow/KanbanBoard/KanbanBoard.types.ts +183 -0
  1021. package/src/components/workflow/KanbanBoard/KanbanBoard.variants.ts +311 -0
  1022. package/src/components/workflow/KanbanBoard/README.md +495 -0
  1023. package/src/components/workflow/KanbanBoard/index.ts +40 -0
  1024. package/src/components/workflow/ProgressSteps/ProgressSteps.test.tsx +318 -0
  1025. package/src/components/workflow/ProgressSteps/ProgressSteps.tsx +350 -0
  1026. package/src/components/workflow/ProgressSteps/ProgressSteps.types.ts +84 -0
  1027. package/src/components/workflow/ProgressSteps/ProgressSteps.variants.ts +315 -0
  1028. package/src/components/workflow/ProgressSteps/README.md +412 -0
  1029. package/src/components/workflow/ProgressSteps/index.ts +20 -0
  1030. package/src/components/workflow/ReportGenerator/README.md +530 -0
  1031. package/src/components/workflow/ReportGenerator/ReportGenerator.test.tsx +723 -0
  1032. package/src/components/workflow/ReportGenerator/ReportGenerator.tsx +889 -0
  1033. package/src/components/workflow/ReportGenerator/ReportGenerator.types.ts +321 -0
  1034. package/src/components/workflow/ReportGenerator/ReportGenerator.variants.ts +378 -0
  1035. package/src/components/workflow/ReportGenerator/index.ts +44 -0
  1036. package/src/components/workflow/Stepper/README.md +390 -0
  1037. package/src/components/workflow/Stepper/Stepper.test.tsx +376 -0
  1038. package/src/components/workflow/Stepper/Stepper.tsx +301 -0
  1039. package/src/components/workflow/Stepper/Stepper.types.ts +73 -0
  1040. package/src/components/workflow/Stepper/Stepper.variants.ts +194 -0
  1041. package/src/components/workflow/Stepper/index.ts +16 -0
  1042. package/src/components/workflow/TaskCard/README.md +343 -0
  1043. package/src/components/workflow/TaskCard/TaskCard.test.tsx +375 -0
  1044. package/src/components/workflow/TaskCard/TaskCard.tsx +312 -0
  1045. package/src/components/workflow/TaskCard/TaskCard.types.ts +55 -0
  1046. package/src/components/workflow/TaskCard/TaskCard.variants.ts +64 -0
  1047. package/src/components/workflow/TaskCard/index.ts +14 -0
  1048. package/src/components/workflow/TaskList/README.md +317 -0
  1049. package/src/components/workflow/TaskList/TaskList.test.tsx +318 -0
  1050. package/src/components/workflow/TaskList/TaskList.tsx +556 -0
  1051. package/src/components/workflow/TaskList/TaskList.types.ts +78 -0
  1052. package/src/components/workflow/TaskList/TaskList.variants.ts +143 -0
  1053. package/src/components/workflow/TaskList/index.ts +19 -0
  1054. package/src/components/workflow/TaskStatus/README.md +358 -0
  1055. package/src/components/workflow/TaskStatus/TaskStatus.test.tsx +299 -0
  1056. package/src/components/workflow/TaskStatus/TaskStatus.tsx +246 -0
  1057. package/src/components/workflow/TaskStatus/TaskStatus.types.ts +65 -0
  1058. package/src/components/workflow/TaskStatus/TaskStatus.variants.ts +145 -0
  1059. package/src/components/workflow/TaskStatus/index.ts +24 -0
  1060. package/src/components/workflow/Wizard/README.md +440 -0
  1061. package/src/components/workflow/Wizard/Wizard.test.tsx +432 -0
  1062. package/src/components/workflow/Wizard/Wizard.tsx +279 -0
  1063. package/src/components/workflow/Wizard/Wizard.types.ts +61 -0
  1064. package/src/components/workflow/Wizard/Wizard.variants.ts +105 -0
  1065. package/src/components/workflow/Wizard/index.ts +9 -0
  1066. package/src/components/workflow/index.ts +14 -0
  1067. package/src/hooks/index.ts +4 -0
  1068. package/src/hooks/use-media-query.ts +24 -0
  1069. package/src/hooks/use-mobile.ts +30 -0
  1070. package/src/hooks/use-on-window-resize.ts +27 -0
  1071. package/src/index.ts +22 -0
  1072. package/src/lib/chart-colors.ts +195 -0
  1073. package/src/lib/utils.ts +6 -0
  1074. package/src/test/setup.ts +125 -0
  1075. package/src/test/vitest.d.ts +13 -0
@@ -0,0 +1,1181 @@
1
+ import { render, screen, waitFor } from "@testing-library/react"
2
+ import userEvent from "@testing-library/user-event"
3
+ import { axe, toHaveNoViolations } from "jest-axe"
4
+ // DatePicker/DatePicker.test.tsx
5
+ import * as React from "react"
6
+ import { beforeAll, describe, expect, it, vi } from "vitest"
7
+
8
+ import { DatePicker } from "./DatePicker"
9
+
10
+ expect.extend(toHaveNoViolations)
11
+
12
+ // Mock pointer capture methods for JSDOM (Radix Popover uses them)
13
+ beforeAll(() => {
14
+ Element.prototype.hasPointerCapture = vi.fn(() => false)
15
+ Element.prototype.setPointerCapture = vi.fn()
16
+ Element.prototype.releasePointerCapture = vi.fn()
17
+ })
18
+
19
+ // Helper to open the date picker using keyboard
20
+ async function openDatePicker(user: ReturnType<typeof userEvent.setup>) {
21
+ const trigger = screen.getByRole("combobox")
22
+ await user.click(trigger)
23
+ }
24
+
25
+ // Helper to find a day button in the calendar
26
+ function findDayButton(container: HTMLElement, day: number): HTMLElement | null {
27
+ const buttons = container.querySelectorAll('button[data-day]')
28
+ for (const button of buttons) {
29
+ const dateStr = button.getAttribute('data-day')
30
+ if (dateStr && new Date(dateStr).getDate() === day) {
31
+ return button as HTMLElement
32
+ }
33
+ }
34
+ return null
35
+ }
36
+
37
+ // Test dates
38
+ const testDate = new Date(2024, 0, 15) // January 15, 2024
39
+ const minDate = new Date(2024, 0, 10) // January 10, 2024
40
+ const maxDate = new Date(2024, 0, 20) // January 20, 2024
41
+
42
+ // ============================================
43
+ // RENDERING TESTS
44
+ // ============================================
45
+ describe("DatePicker", () => {
46
+ describe("Rendering", () => {
47
+ it("renders correctly", () => {
48
+ render(<DatePicker aria-label="Select date" />)
49
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
50
+ })
51
+
52
+ it("renders with custom className", () => {
53
+ render(<DatePicker aria-label="Select date" className="custom-class" />)
54
+ const wrapper = screen.getByRole("combobox").closest('[data-slot="date-picker"]')
55
+ expect(wrapper).toHaveClass("custom-class")
56
+ })
57
+
58
+ it("renders with placeholder", () => {
59
+ render(<DatePicker aria-label="Select date" placeholder="Pick a date" />)
60
+ expect(screen.getByText("Pick a date")).toBeInTheDocument()
61
+ })
62
+
63
+ it("renders with default value", () => {
64
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
65
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
66
+ })
67
+
68
+ it("renders with controlled value", () => {
69
+ render(<DatePicker aria-label="Select date" value={testDate} onChange={() => {}} />)
70
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
71
+ })
72
+
73
+ it("has data-slot attribute on wrapper", () => {
74
+ render(<DatePicker aria-label="Select date" />)
75
+ const wrapper = screen.getByRole("combobox").closest('[data-slot="date-picker"]')
76
+ expect(wrapper).toHaveAttribute("data-slot", "date-picker")
77
+ })
78
+
79
+ it("has data-slot attribute on trigger", () => {
80
+ render(<DatePicker aria-label="Select date" />)
81
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-slot", "date-picker-trigger")
82
+ })
83
+
84
+ it("renders calendar icon", () => {
85
+ render(<DatePicker aria-label="Select date" />)
86
+ const trigger = screen.getByRole("combobox")
87
+ expect(trigger.querySelector("svg")).toBeInTheDocument()
88
+ })
89
+
90
+ it("renders with custom format", () => {
91
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} format="MM/dd/yyyy" />)
92
+ expect(screen.getByRole("combobox")).toHaveTextContent("01/15/2024")
93
+ })
94
+ })
95
+
96
+ // ============================================
97
+ // STATE TESTS
98
+ // ============================================
99
+ describe("States", () => {
100
+ it("handles disabled state", () => {
101
+ render(<DatePicker disabled aria-label="Select date" />)
102
+ expect(screen.getByRole("combobox")).toBeDisabled()
103
+ })
104
+
105
+ it("applies disabled styling", () => {
106
+ render(<DatePicker disabled aria-label="Select date" />)
107
+ expect(screen.getByRole("combobox")).toHaveClass("disabled:opacity-50")
108
+ })
109
+
110
+ it("handles aria-invalid state", () => {
111
+ render(<DatePicker invalid aria-label="Select date" />)
112
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-invalid", "true")
113
+ })
114
+
115
+ it("handles required state", () => {
116
+ render(<DatePicker required aria-label="Select date" />)
117
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-required", "true")
118
+ })
119
+
120
+ it("shows placeholder when no value selected", () => {
121
+ render(<DatePicker aria-label="Select date" placeholder="Choose date" />)
122
+ expect(screen.getByText("Choose date")).toBeInTheDocument()
123
+ })
124
+
125
+ it("shows selected date instead of placeholder", () => {
126
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} placeholder="Choose date" />)
127
+ expect(screen.queryByText("Choose date")).not.toBeInTheDocument()
128
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
129
+ })
130
+
131
+ it("applies muted color when no date selected", () => {
132
+ render(<DatePicker aria-label="Select date" />)
133
+ expect(screen.getByRole("combobox")).toHaveClass("text-muted-foreground")
134
+ })
135
+
136
+ it("removes muted color when date is selected", () => {
137
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
138
+ expect(screen.getByRole("combobox")).not.toHaveClass("text-muted-foreground")
139
+ })
140
+ })
141
+
142
+ // ============================================
143
+ // SELECTION TESTS
144
+ // ============================================
145
+ describe("Selection", () => {
146
+ it("opens calendar when trigger is clicked", async () => {
147
+ const user = userEvent.setup()
148
+ render(<DatePicker aria-label="Select date" />)
149
+
150
+ await openDatePicker(user)
151
+
152
+ await waitFor(() => {
153
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
154
+ })
155
+ })
156
+
157
+ it("shows calendar when opened", async () => {
158
+ const user = userEvent.setup()
159
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
160
+
161
+ await openDatePicker(user)
162
+
163
+ await waitFor(() => {
164
+ const dialog = screen.getByRole("dialog")
165
+ expect(dialog.querySelector('[data-slot="calendar"]')).toBeInTheDocument()
166
+ })
167
+ })
168
+
169
+ it("closes calendar after date selection", async () => {
170
+ const user = userEvent.setup()
171
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
172
+
173
+ await openDatePicker(user)
174
+
175
+ await waitFor(() => {
176
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
177
+ })
178
+
179
+ // Find and click day 20
180
+ const dialog = screen.getByRole("dialog")
181
+ const day20Button = findDayButton(dialog, 20)
182
+ expect(day20Button).toBeInTheDocument()
183
+ await user.click(day20Button as Element)
184
+
185
+ await waitFor(() => {
186
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
187
+ })
188
+ })
189
+ })
190
+
191
+ // ============================================
192
+ // EVENT TESTS
193
+ // ============================================
194
+ describe("Events", () => {
195
+ it("calls onChange when date is selected", async () => {
196
+ const user = userEvent.setup()
197
+ const handleChange = vi.fn()
198
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} onChange={handleChange} />)
199
+
200
+ await openDatePicker(user)
201
+
202
+ await waitFor(() => {
203
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
204
+ })
205
+
206
+ const dialog = screen.getByRole("dialog")
207
+ const day20Button = findDayButton(dialog, 20)
208
+ expect(day20Button).not.toBeNull()
209
+ await user.click(day20Button as Element)
210
+
211
+ expect(handleChange).toHaveBeenCalled()
212
+ expect(handleChange.mock.calls[0]?.[0]).toBeInstanceOf(Date)
213
+ })
214
+
215
+ it("calls onOpenChange when calendar opens", async () => {
216
+ const user = userEvent.setup()
217
+ const handleOpenChange = vi.fn()
218
+ render(<DatePicker aria-label="Select date" onOpenChange={handleOpenChange} />)
219
+
220
+ await openDatePicker(user)
221
+
222
+ await waitFor(() => {
223
+ expect(handleOpenChange).toHaveBeenCalledWith(true)
224
+ })
225
+ })
226
+
227
+ it("calls onOpenChange when calendar closes", async () => {
228
+ const user = userEvent.setup()
229
+ const handleOpenChange = vi.fn()
230
+ render(<DatePicker aria-label="Select date" onOpenChange={handleOpenChange} />)
231
+
232
+ await openDatePicker(user)
233
+
234
+ await waitFor(() => {
235
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
236
+ })
237
+
238
+ await user.keyboard("{Escape}")
239
+
240
+ await waitFor(() => {
241
+ expect(handleOpenChange).toHaveBeenCalledWith(false)
242
+ })
243
+ })
244
+
245
+ it("does not open when disabled", async () => {
246
+ const user = userEvent.setup()
247
+ render(<DatePicker disabled aria-label="Select date" />)
248
+
249
+ const trigger = screen.getByRole("combobox")
250
+ await user.click(trigger)
251
+
252
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
253
+ })
254
+ })
255
+
256
+ // ============================================
257
+ // SIZE VARIANTS
258
+ // ============================================
259
+ describe("Size Variants", () => {
260
+ it("applies default size (md)", () => {
261
+ render(<DatePicker aria-label="Select date" />)
262
+ expect(screen.getByRole("combobox")).toHaveClass("h-[var(--date-picker-trigger-height-md)]")
263
+ })
264
+
265
+ it("applies sm size", () => {
266
+ render(<DatePicker aria-label="Select date" size="sm" />)
267
+ expect(screen.getByRole("combobox")).toHaveClass("h-[var(--date-picker-trigger-height-sm)]")
268
+ })
269
+
270
+ it("applies md size", () => {
271
+ render(<DatePicker aria-label="Select date" size="md" />)
272
+ expect(screen.getByRole("combobox")).toHaveClass("h-[var(--date-picker-trigger-height-md)]")
273
+ })
274
+
275
+ it("applies lg size", () => {
276
+ render(<DatePicker aria-label="Select date" size="lg" />)
277
+ expect(screen.getByRole("combobox")).toHaveClass("h-[var(--date-picker-trigger-height-lg)]")
278
+ })
279
+
280
+ it("has data-size attribute for sm", () => {
281
+ render(<DatePicker aria-label="Select date" size="sm" />)
282
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-size", "sm")
283
+ })
284
+
285
+ it("has data-size attribute for md", () => {
286
+ render(<DatePicker aria-label="Select date" size="md" />)
287
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-size", "md")
288
+ })
289
+
290
+ it("has data-size attribute for lg", () => {
291
+ render(<DatePicker aria-label="Select date" size="lg" />)
292
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-size", "lg")
293
+ })
294
+ })
295
+
296
+ // ============================================
297
+ // VISUAL VARIANT TESTS
298
+ // ============================================
299
+ describe("Visual Variants", () => {
300
+ it("applies default variant", () => {
301
+ render(<DatePicker aria-label="Select date" />)
302
+ expect(screen.getByRole("combobox")).toHaveClass("border-input")
303
+ })
304
+
305
+ it("applies filled variant", () => {
306
+ render(<DatePicker aria-label="Select date" variant="filled" />)
307
+ expect(screen.getByRole("combobox")).toHaveClass("bg-muted")
308
+ })
309
+
310
+ it("applies flushed variant", () => {
311
+ render(<DatePicker aria-label="Select date" variant="flushed" />)
312
+ expect(screen.getByRole("combobox")).toHaveClass("rounded-none")
313
+ expect(screen.getByRole("combobox")).toHaveClass("border-x-0")
314
+ })
315
+
316
+ it("has data-variant attribute for default", () => {
317
+ render(<DatePicker aria-label="Select date" variant="default" />)
318
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-variant", "default")
319
+ })
320
+
321
+ it("has data-variant attribute for filled", () => {
322
+ render(<DatePicker aria-label="Select date" variant="filled" />)
323
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-variant", "filled")
324
+ })
325
+
326
+ it("has data-variant attribute for flushed", () => {
327
+ render(<DatePicker aria-label="Select date" variant="flushed" />)
328
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-variant", "flushed")
329
+ })
330
+ })
331
+
332
+ // ============================================
333
+ // MIN/MAX DATE TESTS
334
+ // ============================================
335
+ describe("Min/Max Date Constraints", () => {
336
+ it("disables dates before minDate", async () => {
337
+ const user = userEvent.setup()
338
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} minDate={minDate} />)
339
+
340
+ await openDatePicker(user)
341
+
342
+ await waitFor(() => {
343
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
344
+ })
345
+
346
+ // Day 5 should be disabled (before minDate Jan 10)
347
+ const dialog = screen.getByRole("dialog")
348
+ const day5Button = findDayButton(dialog, 5)
349
+ expect(day5Button).toBeDisabled()
350
+ })
351
+
352
+ it("disables dates after maxDate", async () => {
353
+ const user = userEvent.setup()
354
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} maxDate={maxDate} />)
355
+
356
+ await openDatePicker(user)
357
+
358
+ await waitFor(() => {
359
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
360
+ })
361
+
362
+ // Day 25 should be disabled (after maxDate Jan 20)
363
+ const dialog = screen.getByRole("dialog")
364
+ const day25Button = findDayButton(dialog, 25)
365
+ expect(day25Button).toBeDisabled()
366
+ })
367
+
368
+ it("allows dates within range", async () => {
369
+ const user = userEvent.setup()
370
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} maxDate={maxDate} minDate={minDate} />)
371
+
372
+ await openDatePicker(user)
373
+
374
+ await waitFor(() => {
375
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
376
+ })
377
+
378
+ // Day 15 should be enabled (within range)
379
+ const dialog = screen.getByRole("dialog")
380
+ const day15Button = findDayButton(dialog, 15)
381
+ expect(day15Button).not.toBeDisabled()
382
+ })
383
+ })
384
+
385
+ // ============================================
386
+ // KEYBOARD NAVIGATION TESTS
387
+ // ============================================
388
+ describe("Keyboard Navigation", () => {
389
+ it("opens calendar with Enter key", async () => {
390
+ const user = userEvent.setup()
391
+ render(<DatePicker aria-label="Select date" />)
392
+
393
+ screen.getByRole("combobox").focus()
394
+ await user.keyboard("{Enter}")
395
+
396
+ await waitFor(() => {
397
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
398
+ })
399
+ })
400
+
401
+ it("opens calendar with Space key", async () => {
402
+ const user = userEvent.setup()
403
+ render(<DatePicker aria-label="Select date" />)
404
+
405
+ screen.getByRole("combobox").focus()
406
+ await user.keyboard(" ")
407
+
408
+ await waitFor(() => {
409
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
410
+ })
411
+ })
412
+
413
+ it("closes calendar with Escape key", async () => {
414
+ const user = userEvent.setup()
415
+ render(<DatePicker aria-label="Select date" />)
416
+
417
+ await openDatePicker(user)
418
+
419
+ await waitFor(() => {
420
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
421
+ })
422
+
423
+ await user.keyboard("{Escape}")
424
+
425
+ await waitFor(() => {
426
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
427
+ })
428
+ })
429
+ })
430
+
431
+ // ============================================
432
+ // CONTROLLED STATE TESTS
433
+ // ============================================
434
+ describe("Controlled State", () => {
435
+ it("respects controlled value", () => {
436
+ const { rerender } = render(
437
+ <DatePicker aria-label="Select date" value={testDate} onChange={() => {}} />
438
+ )
439
+
440
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
441
+
442
+ const newDate = new Date(2024, 1, 20) // February 20, 2024
443
+ rerender(<DatePicker aria-label="Select date" value={newDate} onChange={() => {}} />)
444
+ expect(screen.getByRole("combobox")).toHaveTextContent("February 20")
445
+ })
446
+
447
+ it("reports new value via onChange", async () => {
448
+ const user = userEvent.setup()
449
+ const handleChange = vi.fn()
450
+ render(<DatePicker aria-label="Select date" value={testDate} onChange={handleChange} />)
451
+
452
+ await openDatePicker(user)
453
+
454
+ await waitFor(() => {
455
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
456
+ })
457
+
458
+ const dialog = screen.getByRole("dialog")
459
+ const day20Button = findDayButton(dialog, 20)
460
+ expect(day20Button).not.toBeNull()
461
+ await user.click(day20Button as Element)
462
+
463
+ expect(handleChange).toHaveBeenCalled()
464
+ const selectedDate = handleChange.mock.calls[0]?.[0] as Date
465
+ expect(selectedDate.getDate()).toBe(20)
466
+ })
467
+
468
+ it("maintains controlled state across renders", () => {
469
+ const { rerender } = render(
470
+ <DatePicker aria-label="Select date" value={testDate} onChange={() => {}} />
471
+ )
472
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
473
+
474
+ rerender(<DatePicker aria-label="Select date" value={testDate} onChange={() => {}} />)
475
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
476
+ })
477
+ })
478
+
479
+ // ============================================
480
+ // FOCUS TESTS
481
+ // ============================================
482
+ describe("Focus", () => {
483
+ it("trigger is focusable", () => {
484
+ render(<DatePicker aria-label="Select date" />)
485
+ const trigger = screen.getByRole("combobox")
486
+ trigger.focus()
487
+ expect(trigger).toHaveFocus()
488
+ })
489
+
490
+ it("trigger is not focusable when disabled", () => {
491
+ render(<DatePicker disabled aria-label="Select date" />)
492
+ const trigger = screen.getByRole("combobox")
493
+ trigger.focus()
494
+ expect(trigger).not.toHaveFocus()
495
+ })
496
+
497
+ it("can be focused via Tab", async () => {
498
+ const user = userEvent.setup()
499
+ render(
500
+ <div>
501
+ <button>Before</button>
502
+ <DatePicker aria-label="Select date" />
503
+ </div>
504
+ )
505
+
506
+ await user.tab()
507
+ await user.tab()
508
+ expect(screen.getByRole("combobox")).toHaveFocus()
509
+ })
510
+ })
511
+
512
+ // ============================================
513
+ // ACCESSIBILITY TESTS
514
+ // ============================================
515
+ describe("Accessibility", () => {
516
+ it("has no accessibility violations with aria-label", async () => {
517
+ const { container } = render(
518
+ <label>
519
+ Date of birth
520
+ <DatePicker id="dob" />
521
+ </label>
522
+ )
523
+ const results = await axe(container)
524
+ expect(results).toHaveNoViolations()
525
+ })
526
+
527
+ it("trigger has combobox role", () => {
528
+ render(<DatePicker aria-label="Select date" />)
529
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
530
+ })
531
+
532
+ it("trigger has aria-haspopup", () => {
533
+ render(<DatePicker aria-label="Select date" />)
534
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-haspopup", "dialog")
535
+ })
536
+
537
+ it("trigger has aria-expanded", () => {
538
+ render(<DatePicker aria-label="Select date" />)
539
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-expanded", "false")
540
+ })
541
+
542
+ it("trigger has aria-expanded=true when open", async () => {
543
+ const user = userEvent.setup()
544
+ render(<DatePicker aria-label="Select date" />)
545
+
546
+ await openDatePicker(user)
547
+
548
+ await waitFor(() => {
549
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-expanded", "true")
550
+ })
551
+ })
552
+
553
+ it("supports aria-label prop", () => {
554
+ render(<DatePicker aria-label="Select your birthday" />)
555
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-label")
556
+ })
557
+
558
+ it("supports aria-labelledby", () => {
559
+ render(
560
+ <>
561
+ <span id="my-label">Pick a date</span>
562
+ <DatePicker aria-labelledby="my-label" />
563
+ </>
564
+ )
565
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-labelledby", "my-label")
566
+ })
567
+ })
568
+
569
+ // ============================================
570
+ // DATA ATTRIBUTE TESTS
571
+ // ============================================
572
+ describe("Data Attributes", () => {
573
+ it("has data-slot on wrapper", () => {
574
+ render(<DatePicker aria-label="Select date" />)
575
+ const wrapper = screen.getByRole("combobox").closest('[data-slot="date-picker"]')
576
+ expect(wrapper).toBeInTheDocument()
577
+ })
578
+
579
+ it("has data-slot on trigger", () => {
580
+ render(<DatePicker aria-label="Select date" />)
581
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-slot", "date-picker-trigger")
582
+ })
583
+
584
+ it("has data-slot on calendar content when opened", async () => {
585
+ const user = userEvent.setup()
586
+ render(<DatePicker aria-label="Select date" />)
587
+
588
+ await openDatePicker(user)
589
+
590
+ await waitFor(() => {
591
+ const popoverContent = document.querySelector('[data-slot="date-picker-calendar"]')
592
+ expect(popoverContent).toBeInTheDocument()
593
+ })
594
+ })
595
+
596
+ it("has data-state on trigger", () => {
597
+ render(<DatePicker aria-label="Select date" />)
598
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-state", "closed")
599
+ })
600
+
601
+ it("has data-state=open when opened", async () => {
602
+ const user = userEvent.setup()
603
+ render(<DatePicker aria-label="Select date" />)
604
+
605
+ await openDatePicker(user)
606
+
607
+ await waitFor(() => {
608
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-state", "open")
609
+ })
610
+ })
611
+ })
612
+
613
+ // ============================================
614
+ // FORM INTEGRATION TESTS
615
+ // ============================================
616
+ describe("Form Integration", () => {
617
+ it("renders hidden input with name", () => {
618
+ const { container } = render(<DatePicker aria-label="Select date" name="birthdate" />)
619
+ const hiddenInput = container.querySelector('input[type="hidden"][name="birthdate"]')
620
+ expect(hiddenInput).toBeInTheDocument()
621
+ })
622
+
623
+ it("hidden input has ISO date value", () => {
624
+ const { container } = render(<DatePicker aria-label="Select date" defaultValue={testDate} name="birthdate" />)
625
+ const hiddenInput = container.querySelector('input[type="hidden"]')
626
+ expect(hiddenInput).toBeDefined()
627
+ expect((hiddenInput as HTMLInputElement).value).toBe(testDate.toISOString())
628
+ })
629
+
630
+ it("hidden input is empty when no date selected", () => {
631
+ const { container } = render(<DatePicker aria-label="Select date" name="birthdate" />)
632
+ const hiddenInput = container.querySelector('input[type="hidden"]')
633
+ expect(hiddenInput).toBeDefined()
634
+ expect((hiddenInput as HTMLInputElement).value).toBe("")
635
+ })
636
+
637
+ it("supports id for label association", () => {
638
+ render(<DatePicker aria-label="Select date" id="birthdate-input" />)
639
+ expect(screen.getByRole("combobox")).toHaveAttribute("id", "birthdate-input")
640
+ })
641
+ })
642
+
643
+ // ============================================
644
+ // EDGE CASES TESTS
645
+ // ============================================
646
+ describe("Edge Cases", () => {
647
+ it("handles empty className", () => {
648
+ render(<DatePicker aria-label="Select date" className="" />)
649
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
650
+ })
651
+
652
+ it("handles whitespace-only className", () => {
653
+ render(<DatePicker aria-label="Select date" className=" " />)
654
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
655
+ })
656
+
657
+ it("handles rapid open/close correctly", async () => {
658
+ const user = userEvent.setup()
659
+ render(<DatePicker aria-label="Select date" />)
660
+
661
+ const trigger = screen.getByRole("combobox")
662
+ await user.click(trigger)
663
+ await user.keyboard("{Escape}")
664
+ await user.click(trigger)
665
+ await user.keyboard("{Escape}")
666
+ await user.click(trigger)
667
+
668
+ await waitFor(() => {
669
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
670
+ })
671
+ })
672
+
673
+ it("maintains state through re-renders", () => {
674
+ const { rerender } = render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
675
+
676
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
677
+
678
+ rerender(<DatePicker aria-label="Select date" defaultValue={testDate} />)
679
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
680
+ })
681
+ })
682
+
683
+ // ============================================
684
+ // TYPE SAFETY TESTS
685
+ // ============================================
686
+ describe("Type Safety", () => {
687
+ it("accepts valid size prop values", () => {
688
+ const sizes = ["sm", "md", "lg"] as const
689
+ sizes.forEach((size) => {
690
+ const { unmount } = render(<DatePicker aria-label="Select date" size={size} />)
691
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
692
+ unmount()
693
+ })
694
+ })
695
+
696
+ it("accepts valid variant prop values", () => {
697
+ const variants = ["default", "filled", "flushed"] as const
698
+ variants.forEach((variant) => {
699
+ const { unmount } = render(<DatePicker aria-label="Select date" variant={variant} />)
700
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
701
+ unmount()
702
+ })
703
+ })
704
+ })
705
+
706
+ // ============================================
707
+ // REF FORWARDING TESTS
708
+ // ============================================
709
+ describe("Ref Forwarding", () => {
710
+ it("forwards ref to trigger button", () => {
711
+ const ref = React.createRef<HTMLButtonElement>()
712
+ render(<DatePicker ref={ref} aria-label="Select date" />)
713
+
714
+ expect(ref.current).toBeInstanceOf(HTMLButtonElement)
715
+ expect(ref.current).toBe(screen.getByRole("combobox"))
716
+ })
717
+
718
+ it("allows programmatic focus via ref", () => {
719
+ const ref = React.createRef<HTMLButtonElement>()
720
+ render(<DatePicker ref={ref} aria-label="Select date" />)
721
+
722
+ ref.current?.focus()
723
+ expect(screen.getByRole("combobox")).toHaveFocus()
724
+ })
725
+ })
726
+
727
+ // ============================================
728
+ // CLEARABLE TESTS
729
+ // ============================================
730
+ describe("Clearable", () => {
731
+ it("does not show clear button by default", () => {
732
+ render(<DatePicker aria-label="Select date" defaultValue={testDate} />)
733
+ expect(screen.queryByLabelText("Clear date")).not.toBeInTheDocument()
734
+ })
735
+
736
+ it("shows clear button when clearable and has value", () => {
737
+ render(<DatePicker clearable aria-label="Select date" defaultValue={testDate} />)
738
+ expect(screen.getByLabelText("Clear date")).toBeInTheDocument()
739
+ })
740
+
741
+ it("does not show clear button when clearable but no value", () => {
742
+ render(<DatePicker clearable aria-label="Select date" />)
743
+ expect(screen.queryByLabelText("Clear date")).not.toBeInTheDocument()
744
+ })
745
+
746
+ it("does not show clear button when disabled", () => {
747
+ render(<DatePicker clearable disabled aria-label="Select date" defaultValue={testDate} />)
748
+ expect(screen.queryByLabelText("Clear date")).not.toBeInTheDocument()
749
+ })
750
+
751
+ it("does not show clear button when readOnly", () => {
752
+ render(<DatePicker clearable readOnly aria-label="Select date" defaultValue={testDate} />)
753
+ expect(screen.queryByLabelText("Clear date")).not.toBeInTheDocument()
754
+ })
755
+
756
+ it("clears date when clear button is clicked", async () => {
757
+ const user = userEvent.setup()
758
+ const handleChange = vi.fn()
759
+ render(<DatePicker clearable aria-label="Select date" defaultValue={testDate} onChange={handleChange} />)
760
+
761
+ await user.click(screen.getByLabelText("Clear date"))
762
+
763
+ expect(handleChange).toHaveBeenCalled()
764
+ })
765
+
766
+ it("calls onClear callback when cleared", async () => {
767
+ const user = userEvent.setup()
768
+ const handleClear = vi.fn()
769
+ render(<DatePicker clearable aria-label="Select date" defaultValue={testDate} onClear={handleClear} />)
770
+
771
+ await user.click(screen.getByLabelText("Clear date"))
772
+
773
+ expect(handleClear).toHaveBeenCalled()
774
+ })
775
+
776
+ it("clears date with keyboard (Enter)", async () => {
777
+ const handleChange = vi.fn()
778
+ const user = userEvent.setup()
779
+ render(<DatePicker clearable value={new Date()} onChange={handleChange} />)
780
+
781
+ screen.getByLabelText("Clear date").focus()
782
+ await user.keyboard("{Enter}")
783
+
784
+ expect(handleChange).toHaveBeenCalled()
785
+ })
786
+
787
+ it("clears date with keyboard (Space)", async () => {
788
+ const handleChange = vi.fn()
789
+ const user = userEvent.setup()
790
+ render(<DatePicker clearable value={new Date()} onChange={handleChange} />)
791
+
792
+ screen.getByLabelText("Clear date").focus()
793
+ await user.keyboard(" ")
794
+
795
+ expect(handleChange).toHaveBeenCalled()
796
+ })
797
+
798
+ it("has data-slot on clear button", () => {
799
+ render(<DatePicker clearable aria-label="Select date" defaultValue={testDate} />)
800
+ expect(screen.getByLabelText("Clear date")).toHaveAttribute("data-slot", "date-picker-clear")
801
+ })
802
+ })
803
+
804
+ // ============================================
805
+ // READ-ONLY TESTS
806
+ // ============================================
807
+ describe("ReadOnly", () => {
808
+ it("applies aria-readonly when readOnly", () => {
809
+ render(<DatePicker readOnly aria-label="Select date" />)
810
+ expect(screen.getByRole("combobox")).toHaveAttribute("aria-readonly", "true")
811
+ })
812
+
813
+ it("applies data-readonly when readOnly", () => {
814
+ render(<DatePicker readOnly aria-label="Select date" />)
815
+ expect(screen.getByRole("combobox")).toHaveAttribute("data-readonly")
816
+ })
817
+
818
+ it("does not open calendar when readOnly", async () => {
819
+ const user = userEvent.setup()
820
+ render(<DatePicker readOnly aria-label="Select date" />)
821
+
822
+ await user.click(screen.getByRole("combobox"))
823
+
824
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
825
+ })
826
+
827
+ it("is still focusable when readOnly", () => {
828
+ render(<DatePicker readOnly aria-label="Select date" />)
829
+ const trigger = screen.getByRole("combobox")
830
+ trigger.focus()
831
+ expect(trigger).toHaveFocus()
832
+ })
833
+
834
+ it("displays value when readOnly", () => {
835
+ render(<DatePicker readOnly aria-label="Select date" defaultValue={testDate} />)
836
+ expect(screen.getByRole("combobox")).toHaveTextContent("January 15")
837
+ })
838
+
839
+ it("does not call onOpenChange when readOnly and clicked", async () => {
840
+ const user = userEvent.setup()
841
+ const handleOpenChange = vi.fn()
842
+ render(<DatePicker readOnly aria-label="Select date" onOpenChange={handleOpenChange} />)
843
+
844
+ await user.click(screen.getByRole("combobox"))
845
+
846
+ expect(handleOpenChange).not.toHaveBeenCalled()
847
+ })
848
+ })
849
+
850
+ // ============================================
851
+ // LOCALE TESTS
852
+ // ============================================
853
+ describe("Locale", () => {
854
+ it("accepts locale prop without error", () => {
855
+ // Just verify it renders without error - actual locale testing would need date-fns locales
856
+ render(<DatePicker aria-label="Select date" locale={undefined} />)
857
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
858
+ })
859
+ })
860
+
861
+ // ============================================
862
+ // CALENDAR PROPS PASSTHROUGH TESTS
863
+ // ============================================
864
+ describe("Calendar Props Passthrough", () => {
865
+ it("passes calendarProps to Calendar", async () => {
866
+ const user = userEvent.setup()
867
+ render(
868
+ <DatePicker
869
+ calendarProps={{
870
+ className: "custom-calendar-class"
871
+ }}
872
+ aria-label="Select date"
873
+ />
874
+ )
875
+
876
+ await openDatePicker(user)
877
+
878
+ await waitFor(() => {
879
+ const calendar = document.querySelector('[data-slot="calendar"]')
880
+ expect(calendar).toHaveClass("custom-calendar-class")
881
+ })
882
+ })
883
+
884
+ it("passes numberOfMonths to Calendar", async () => {
885
+ const user = userEvent.setup()
886
+ render(
887
+ <DatePicker
888
+ calendarProps={{
889
+ numberOfMonths: 2
890
+ }}
891
+ aria-label="Select date"
892
+ />
893
+ )
894
+
895
+ await openDatePicker(user)
896
+
897
+ await waitFor(() => {
898
+ // With 2 months, the calendar should have data-multiple-months="true"
899
+ const calendar = document.querySelector('[data-slot="calendar"]')
900
+ expect(calendar).toHaveAttribute("data-multiple-months", "true")
901
+ })
902
+ })
903
+ })
904
+
905
+ // ============================================
906
+ // DISABLED DATES FUNCTION TESTS
907
+ // ============================================
908
+ describe("Disabled Dates Function", () => {
909
+ it("accepts disabledDates function prop", () => {
910
+ render(
911
+ <DatePicker
912
+ aria-label="Select date"
913
+ disabledDates={(date) => date.getDay() === 0 || date.getDay() === 6}
914
+ />
915
+ )
916
+ expect(screen.getByRole("combobox")).toBeInTheDocument()
917
+ })
918
+
919
+ it("disables dates based on disabledDates function", async () => {
920
+ const user = userEvent.setup()
921
+ // January 2024: Jan 13 (Sat) and Jan 14 (Sun) are weekend days
922
+ const jan15 = new Date(2024, 0, 15)
923
+
924
+ render(
925
+ <DatePicker
926
+ aria-label="Select date"
927
+ defaultValue={jan15}
928
+ disabledDates={(date) => date.getDay() === 0 || date.getDay() === 6}
929
+ />
930
+ )
931
+
932
+ await openDatePicker(user)
933
+
934
+ await waitFor(() => {
935
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
936
+ })
937
+
938
+ const dialog = screen.getByRole("dialog")
939
+ // Jan 13, 2024 is Saturday
940
+ const saturdayButton = findDayButton(dialog, 13)
941
+ expect(saturdayButton).toBeDisabled()
942
+
943
+ // Jan 14, 2024 is Sunday
944
+ const sundayButton = findDayButton(dialog, 14)
945
+ expect(sundayButton).toBeDisabled()
946
+ })
947
+
948
+ it("allows dates not matching disabledDates function", async () => {
949
+ const user = userEvent.setup()
950
+ const jan15 = new Date(2024, 0, 15)
951
+
952
+ render(
953
+ <DatePicker
954
+ aria-label="Select date"
955
+ defaultValue={jan15}
956
+ disabledDates={(date) => date.getDay() === 0 || date.getDay() === 6}
957
+ />
958
+ )
959
+
960
+ await openDatePicker(user)
961
+
962
+ await waitFor(() => {
963
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
964
+ })
965
+
966
+ const dialog = screen.getByRole("dialog")
967
+ // Jan 15, 2024 is Monday - should be enabled
968
+ const mondayButton = findDayButton(dialog, 15)
969
+ expect(mondayButton).not.toBeDisabled()
970
+ })
971
+
972
+ it("combines disabledDates with minDate/maxDate", async () => {
973
+ const user = userEvent.setup()
974
+ const jan15 = new Date(2024, 0, 15)
975
+ const minDate = new Date(2024, 0, 10)
976
+ const maxDate = new Date(2024, 0, 20)
977
+
978
+ render(
979
+ <DatePicker
980
+ aria-label="Select date"
981
+ defaultValue={jan15}
982
+ disabledDates={(date) => date.getDate() === 16}
983
+ maxDate={maxDate}
984
+ minDate={minDate}
985
+ />
986
+ )
987
+
988
+ await openDatePicker(user)
989
+
990
+ await waitFor(() => {
991
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
992
+ })
993
+
994
+ const dialog = screen.getByRole("dialog")
995
+
996
+ // Jan 5 should be disabled (before minDate)
997
+ const day5Button = findDayButton(dialog, 5)
998
+ expect(day5Button).toBeDisabled()
999
+
1000
+ // Jan 16 should be disabled (by disabledDates)
1001
+ const day16Button = findDayButton(dialog, 16)
1002
+ expect(day16Button).toBeDisabled()
1003
+
1004
+ // Jan 25 should be disabled (after maxDate)
1005
+ const day25Button = findDayButton(dialog, 25)
1006
+ expect(day25Button).toBeDisabled()
1007
+
1008
+ // Jan 15 should be enabled
1009
+ const day15Button = findDayButton(dialog, 15)
1010
+ expect(day15Button).not.toBeDisabled()
1011
+ })
1012
+ })
1013
+
1014
+ // ============================================
1015
+ // SHOW TODAY BUTTON TESTS
1016
+ // ============================================
1017
+ describe("Show Today Button", () => {
1018
+ it("does not show Today button by default", async () => {
1019
+ const user = userEvent.setup()
1020
+ render(<DatePicker aria-label="Select date" />)
1021
+
1022
+ await openDatePicker(user)
1023
+
1024
+ await waitFor(() => {
1025
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1026
+ })
1027
+
1028
+ expect(screen.queryByRole("button", { name: "Today" })).not.toBeInTheDocument()
1029
+ })
1030
+
1031
+ it("shows Today button when showToday is true", async () => {
1032
+ const user = userEvent.setup()
1033
+ render(<DatePicker showToday aria-label="Select date" />)
1034
+
1035
+ await openDatePicker(user)
1036
+
1037
+ await waitFor(() => {
1038
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1039
+ })
1040
+
1041
+ expect(screen.getByRole("button", { name: "Today" })).toBeInTheDocument()
1042
+ })
1043
+
1044
+ it("uses custom todayLabel", async () => {
1045
+ const user = userEvent.setup()
1046
+ render(<DatePicker showToday aria-label="Select date" todayLabel="Hoje" />)
1047
+
1048
+ await openDatePicker(user)
1049
+
1050
+ await waitFor(() => {
1051
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1052
+ })
1053
+
1054
+ expect(screen.getByRole("button", { name: "Hoje" })).toBeInTheDocument()
1055
+ })
1056
+
1057
+ it("selects today when Today button is clicked", async () => {
1058
+ const user = userEvent.setup()
1059
+ const handleChange = vi.fn()
1060
+ render(<DatePicker showToday aria-label="Select date" onChange={handleChange} />)
1061
+
1062
+ await openDatePicker(user)
1063
+
1064
+ await waitFor(() => {
1065
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1066
+ })
1067
+
1068
+ await user.click(screen.getByRole("button", { name: "Today" }))
1069
+
1070
+ expect(handleChange).toHaveBeenCalled()
1071
+ const selectedDate = handleChange.mock.calls[0]?.[0] as Date
1072
+ const today = new Date()
1073
+ expect(selectedDate.getDate()).toBe(today.getDate())
1074
+ expect(selectedDate.getMonth()).toBe(today.getMonth())
1075
+ expect(selectedDate.getFullYear()).toBe(today.getFullYear())
1076
+ })
1077
+
1078
+ it("closes calendar after clicking Today", async () => {
1079
+ const user = userEvent.setup()
1080
+ render(<DatePicker showToday aria-label="Select date" />)
1081
+
1082
+ await openDatePicker(user)
1083
+
1084
+ await waitFor(() => {
1085
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1086
+ })
1087
+
1088
+ await user.click(screen.getByRole("button", { name: "Today" }))
1089
+
1090
+ await waitFor(() => {
1091
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument()
1092
+ })
1093
+ })
1094
+
1095
+ it("disables Today button when today is before minDate", async () => {
1096
+ const user = userEvent.setup()
1097
+ const tomorrow = new Date()
1098
+ tomorrow.setDate(tomorrow.getDate() + 1)
1099
+
1100
+ render(<DatePicker showToday aria-label="Select date" minDate={tomorrow} />)
1101
+
1102
+ await openDatePicker(user)
1103
+
1104
+ await waitFor(() => {
1105
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1106
+ })
1107
+
1108
+ expect(screen.getByRole("button", { name: "Today" })).toBeDisabled()
1109
+ })
1110
+
1111
+ it("disables Today button when today is after maxDate", async () => {
1112
+ const user = userEvent.setup()
1113
+ const yesterday = new Date()
1114
+ yesterday.setDate(yesterday.getDate() - 1)
1115
+
1116
+ render(<DatePicker showToday aria-label="Select date" maxDate={yesterday} />)
1117
+
1118
+ await openDatePicker(user)
1119
+
1120
+ await waitFor(() => {
1121
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1122
+ })
1123
+
1124
+ expect(screen.getByRole("button", { name: "Today" })).toBeDisabled()
1125
+ })
1126
+
1127
+ it("disables Today button when today is disabled by disabledDates", async () => {
1128
+ const user = userEvent.setup()
1129
+ const today = new Date()
1130
+
1131
+ render(
1132
+ <DatePicker
1133
+ showToday
1134
+ aria-label="Select date"
1135
+ disabledDates={(date) => date.getDate() === today.getDate()}
1136
+ />
1137
+ )
1138
+
1139
+ await openDatePicker(user)
1140
+
1141
+ await waitFor(() => {
1142
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1143
+ })
1144
+
1145
+ expect(screen.getByRole("button", { name: "Today" })).toBeDisabled()
1146
+ })
1147
+
1148
+ it("has data-slot on footer", async () => {
1149
+ const user = userEvent.setup()
1150
+ render(<DatePicker showToday aria-label="Select date" />)
1151
+
1152
+ await openDatePicker(user)
1153
+
1154
+ await waitFor(() => {
1155
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1156
+ })
1157
+
1158
+ const footer = document.querySelector('[data-slot="date-picker-footer"]')
1159
+ expect(footer).toBeInTheDocument()
1160
+ })
1161
+
1162
+ it("does not call onChange when Today is disabled", async () => {
1163
+ const user = userEvent.setup()
1164
+ const handleChange = vi.fn()
1165
+ const yesterday = new Date()
1166
+ yesterday.setDate(yesterday.getDate() - 1)
1167
+
1168
+ render(<DatePicker showToday aria-label="Select date" maxDate={yesterday} onChange={handleChange} />)
1169
+
1170
+ await openDatePicker(user)
1171
+
1172
+ await waitFor(() => {
1173
+ expect(screen.getByRole("dialog")).toBeInTheDocument()
1174
+ })
1175
+
1176
+ const todayButton = screen.getByRole("button", { name: "Today" })
1177
+ // Disabled buttons can't be clicked
1178
+ expect(todayButton).toBeDisabled()
1179
+ })
1180
+ })
1181
+ })