@k3-universe/react-kit 0.0.27 → 0.0.29

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 (422) hide show
  1. package/.storybook/main.ts +1 -1
  2. package/.storybook/preview.ts +18 -10
  3. package/biome.json +10 -0
  4. package/dist/index.js +2319 -1227
  5. package/dist/kit/builder/auth/AuthProvider.d.ts +36 -0
  6. package/dist/kit/builder/auth/AuthProvider.d.ts.map +1 -0
  7. package/dist/kit/builder/auth/adapter.d.ts +14 -0
  8. package/dist/kit/builder/auth/adapter.d.ts.map +1 -0
  9. package/dist/kit/builder/auth/client-adapters.d.ts +149 -0
  10. package/dist/kit/builder/auth/client-adapters.d.ts.map +1 -0
  11. package/dist/kit/builder/auth/components.d.ts +119 -0
  12. package/dist/kit/builder/auth/components.d.ts.map +1 -0
  13. package/dist/kit/builder/auth/hooks.d.ts +158 -0
  14. package/dist/kit/builder/auth/hooks.d.ts.map +1 -0
  15. package/dist/kit/builder/auth/index.d.ts +11 -0
  16. package/dist/kit/builder/auth/index.d.ts.map +1 -0
  17. package/dist/kit/builder/auth/permission-checker.d.ts +31 -0
  18. package/dist/kit/builder/auth/permission-checker.d.ts.map +1 -0
  19. package/dist/kit/builder/auth/storage.d.ts +17 -0
  20. package/dist/kit/builder/auth/storage.d.ts.map +1 -0
  21. package/dist/kit/builder/auth/token-manager.d.ts +9 -0
  22. package/dist/kit/builder/auth/token-manager.d.ts.map +1 -0
  23. package/dist/kit/builder/auth/types.d.ts +183 -0
  24. package/dist/kit/builder/auth/types.d.ts.map +1 -0
  25. package/dist/kit/builder/data-table/components/DataTable.d.ts +2 -1
  26. package/dist/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
  27. package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts +2 -2
  28. package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts.map +1 -1
  29. package/dist/kit/builder/data-table/components/DataTablePagination.d.ts +2 -1
  30. package/dist/kit/builder/data-table/components/DataTablePagination.d.ts.map +1 -1
  31. package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts +1 -1
  32. package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts.map +1 -1
  33. package/dist/kit/builder/data-table/types.d.ts.map +1 -1
  34. package/dist/kit/builder/dialog/index.d.ts +1 -1
  35. package/dist/kit/builder/dialog/index.d.ts.map +1 -1
  36. package/dist/kit/builder/dialog/provider.d.ts +0 -1
  37. package/dist/kit/builder/dialog/provider.d.ts.map +1 -1
  38. package/dist/kit/builder/form/components/FormBuilder.d.ts.map +1 -1
  39. package/dist/kit/builder/form/components/FormBuilderActions.d.ts.map +1 -1
  40. package/dist/kit/builder/form/components/FormBuilderContext.d.ts.map +1 -1
  41. package/dist/kit/builder/form/components/FormBuilderField.d.ts +1 -1
  42. package/dist/kit/builder/form/components/FormBuilderField.d.ts.map +1 -1
  43. package/dist/kit/builder/form/components/fields/ArrayField.d.ts +1 -1
  44. package/dist/kit/builder/form/components/fields/ArrayField.d.ts.map +1 -1
  45. package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts +1 -1
  46. package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts.map +1 -1
  47. package/dist/kit/builder/form/components/fields/CheckboxField.d.ts +1 -1
  48. package/dist/kit/builder/form/components/fields/CheckboxField.d.ts.map +1 -1
  49. package/dist/kit/builder/form/components/fields/DateField.d.ts +1 -1
  50. package/dist/kit/builder/form/components/fields/DateField.d.ts.map +1 -1
  51. package/dist/kit/builder/form/components/fields/DatePickerField.d.ts +1 -1
  52. package/dist/kit/builder/form/components/fields/DatePickerField.d.ts.map +1 -1
  53. package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts +1 -1
  54. package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts.map +1 -1
  55. package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts +1 -1
  56. package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts.map +1 -1
  57. package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts +1 -1
  58. package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts.map +1 -1
  59. package/dist/kit/builder/form/components/fields/FileField.d.ts +1 -1
  60. package/dist/kit/builder/form/components/fields/FileField.d.ts.map +1 -1
  61. package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts +1 -1
  62. package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts.map +1 -1
  63. package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts +1 -1
  64. package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts.map +1 -1
  65. package/dist/kit/builder/form/components/fields/NumberField.d.ts +1 -1
  66. package/dist/kit/builder/form/components/fields/NumberField.d.ts.map +1 -1
  67. package/dist/kit/builder/form/components/fields/ObjectField.d.ts.map +1 -1
  68. package/dist/kit/builder/form/components/fields/RadioField.d.ts +1 -1
  69. package/dist/kit/builder/form/components/fields/RadioField.d.ts.map +1 -1
  70. package/dist/kit/builder/form/components/fields/SelectField.d.ts +1 -1
  71. package/dist/kit/builder/form/components/fields/SelectField.d.ts.map +1 -1
  72. package/dist/kit/builder/form/components/fields/SwitchField.d.ts +1 -1
  73. package/dist/kit/builder/form/components/fields/SwitchField.d.ts.map +1 -1
  74. package/dist/kit/builder/form/components/fields/TextField.d.ts +1 -1
  75. package/dist/kit/builder/form/components/fields/TextField.d.ts.map +1 -1
  76. package/dist/kit/builder/form/components/fields/TextareaField.d.ts +1 -1
  77. package/dist/kit/builder/form/components/fields/TextareaField.d.ts.map +1 -1
  78. package/dist/kit/builder/form/components/fields/TimePickerField.d.ts +1 -1
  79. package/dist/kit/builder/form/components/fields/TimePickerField.d.ts.map +1 -1
  80. package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts +1 -1
  81. package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts.map +1 -1
  82. package/dist/kit/builder/form/components/fields/index.d.ts.map +1 -1
  83. package/dist/kit/builder/form/components/fields/types.d.ts.map +1 -1
  84. package/dist/kit/builder/form/components/sectionNodes.d.ts.map +1 -1
  85. package/dist/kit/builder/form/hooks/useFormBuilder.d.ts.map +1 -1
  86. package/dist/kit/builder/form/types.d.ts.map +1 -1
  87. package/dist/kit/builder/form/utils/section-factories.d.ts.map +1 -1
  88. package/dist/kit/builder/page/Page.d.ts.map +1 -1
  89. package/dist/kit/builder/page/index.d.ts.map +1 -1
  90. package/dist/kit/builder/section/SectionBuilder.d.ts +1 -1
  91. package/dist/kit/builder/section/SectionBuilder.d.ts.map +1 -1
  92. package/dist/kit/builder/section/SectionContainer.d.ts +14 -0
  93. package/dist/kit/builder/section/SectionContainer.d.ts.map +1 -0
  94. package/dist/kit/builder/stack-dialog/context.d.ts.map +1 -1
  95. package/dist/kit/builder/stack-dialog/hooks.d.ts.map +1 -1
  96. package/dist/kit/builder/stack-dialog/index.d.ts +3 -3
  97. package/dist/kit/builder/stack-dialog/index.d.ts.map +1 -1
  98. package/dist/kit/builder/stack-dialog/provider.d.ts.map +1 -1
  99. package/dist/kit/builder/stack-dialog/renderer.d.ts.map +1 -1
  100. package/dist/kit/builder/stack-dialog/types.d.ts +1 -1
  101. package/dist/kit/builder/stack-dialog/types.d.ts.map +1 -1
  102. package/dist/kit/components/autocomplete/Autocomplete.d.ts +1 -1
  103. package/dist/kit/components/autocomplete/Autocomplete.d.ts.map +1 -1
  104. package/dist/kit/components/autocomplete/types.d.ts.map +1 -1
  105. package/dist/kit/components/datepicker/DatePicker.d.ts.map +1 -1
  106. package/dist/kit/components/datepicker/DateRangePicker.d.ts.map +1 -1
  107. package/dist/kit/components/datetimepicker/DateTimePicker.d.ts.map +1 -1
  108. package/dist/kit/components/datetimepicker/DateTimeRangePicker.d.ts.map +1 -1
  109. package/dist/kit/components/datetimepicker/index.d.ts.map +1 -1
  110. package/dist/kit/components/fileuploader/FileUploader.d.ts.map +1 -1
  111. package/dist/kit/components/fileuploader/types.d.ts +2 -2
  112. package/dist/kit/components/forminfo/FormInfoError.d.ts.map +1 -1
  113. package/dist/kit/components/login/Login.d.ts +1 -1
  114. package/dist/kit/components/login/Login.d.ts.map +1 -1
  115. package/dist/kit/components/monthpicker/MonthInput.d.ts.map +1 -1
  116. package/dist/kit/components/monthpicker/MonthPicker.d.ts.map +1 -1
  117. package/dist/kit/components/monthpicker/MonthRangeInput.d.ts.map +1 -1
  118. package/dist/kit/components/monthpicker/MonthRangePicker.d.ts.map +1 -1
  119. package/dist/kit/components/timepicker/TimePicker.d.ts.map +1 -1
  120. package/dist/kit/components/timepicker/TimeRangePicker.d.ts.map +1 -1
  121. package/dist/kit/components/timepicker/index.d.ts.map +1 -1
  122. package/dist/kit/layouts/admin/components/AdminLayout.d.ts.map +1 -1
  123. package/dist/kit/layouts/admin/components/ThemeToggle.d.ts.map +1 -1
  124. package/dist/kit/layouts/admin/hooks/menu.d.ts.map +1 -1
  125. package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts +1 -1
  126. package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts.map +1 -1
  127. package/dist/shadcn/hooks/use-mobile.d.ts.map +1 -1
  128. package/dist/shadcn/ui/accordion.d.ts +2 -2
  129. package/dist/shadcn/ui/accordion.d.ts.map +1 -1
  130. package/dist/shadcn/ui/alert-dialog.d.ts +4 -4
  131. package/dist/shadcn/ui/alert-dialog.d.ts.map +1 -1
  132. package/dist/shadcn/ui/alert.d.ts +4 -4
  133. package/dist/shadcn/ui/alert.d.ts.map +1 -1
  134. package/dist/shadcn/ui/aspect-ratio.d.ts +1 -1
  135. package/dist/shadcn/ui/aspect-ratio.d.ts.map +1 -1
  136. package/dist/shadcn/ui/avatar.d.ts +2 -2
  137. package/dist/shadcn/ui/avatar.d.ts.map +1 -1
  138. package/dist/shadcn/ui/badge.d.ts +2 -2
  139. package/dist/shadcn/ui/badge.d.ts.map +1 -1
  140. package/dist/shadcn/ui/breadcrumb.d.ts +8 -8
  141. package/dist/shadcn/ui/breadcrumb.d.ts.map +1 -1
  142. package/dist/shadcn/ui/button.d.ts +2 -2
  143. package/dist/shadcn/ui/button.d.ts.map +1 -1
  144. package/dist/shadcn/ui/calendar.d.ts +2 -2
  145. package/dist/shadcn/ui/calendar.d.ts.map +1 -1
  146. package/dist/shadcn/ui/card.d.ts +8 -8
  147. package/dist/shadcn/ui/card.d.ts.map +1 -1
  148. package/dist/shadcn/ui/carousel.d.ts +5 -5
  149. package/dist/shadcn/ui/carousel.d.ts.map +1 -1
  150. package/dist/shadcn/ui/chart.d.ts +7 -7
  151. package/dist/shadcn/ui/chart.d.ts.map +1 -1
  152. package/dist/shadcn/ui/checkbox.d.ts +2 -2
  153. package/dist/shadcn/ui/checkbox.d.ts.map +1 -1
  154. package/dist/shadcn/ui/collapsible.d.ts +1 -1
  155. package/dist/shadcn/ui/collapsible.d.ts.map +1 -1
  156. package/dist/shadcn/ui/command.d.ts +2 -2
  157. package/dist/shadcn/ui/command.d.ts.map +1 -1
  158. package/dist/shadcn/ui/context-menu.d.ts +4 -4
  159. package/dist/shadcn/ui/context-menu.d.ts.map +1 -1
  160. package/dist/shadcn/ui/dialog.d.ts +4 -4
  161. package/dist/shadcn/ui/dialog.d.ts.map +1 -1
  162. package/dist/shadcn/ui/drawer.d.ts +3 -3
  163. package/dist/shadcn/ui/drawer.d.ts.map +1 -1
  164. package/dist/shadcn/ui/dropdown-menu.d.ts +4 -4
  165. package/dist/shadcn/ui/dropdown-menu.d.ts.map +1 -1
  166. package/dist/shadcn/ui/form.d.ts +5 -5
  167. package/dist/shadcn/ui/form.d.ts.map +1 -1
  168. package/dist/shadcn/ui/hover-card.d.ts +2 -2
  169. package/dist/shadcn/ui/hover-card.d.ts.map +1 -1
  170. package/dist/shadcn/ui/input-otp.d.ts +4 -4
  171. package/dist/shadcn/ui/input-otp.d.ts.map +1 -1
  172. package/dist/shadcn/ui/input.d.ts +2 -2
  173. package/dist/shadcn/ui/input.d.ts.map +1 -1
  174. package/dist/shadcn/ui/label.d.ts +2 -2
  175. package/dist/shadcn/ui/label.d.ts.map +1 -1
  176. package/dist/shadcn/ui/menubar.d.ts +4 -4
  177. package/dist/shadcn/ui/menubar.d.ts.map +1 -1
  178. package/dist/shadcn/ui/navigation-menu.d.ts +2 -2
  179. package/dist/shadcn/ui/navigation-menu.d.ts.map +1 -1
  180. package/dist/shadcn/ui/pagination.d.ts +6 -6
  181. package/dist/shadcn/ui/pagination.d.ts.map +1 -1
  182. package/dist/shadcn/ui/popover.d.ts +2 -2
  183. package/dist/shadcn/ui/popover.d.ts.map +1 -1
  184. package/dist/shadcn/ui/progress.d.ts +2 -2
  185. package/dist/shadcn/ui/progress.d.ts.map +1 -1
  186. package/dist/shadcn/ui/radio-group.d.ts +2 -2
  187. package/dist/shadcn/ui/radio-group.d.ts.map +1 -1
  188. package/dist/shadcn/ui/resizable.d.ts +2 -2
  189. package/dist/shadcn/ui/resizable.d.ts.map +1 -1
  190. package/dist/shadcn/ui/scroll-area.d.ts +2 -2
  191. package/dist/shadcn/ui/scroll-area.d.ts.map +1 -1
  192. package/dist/shadcn/ui/select.d.ts +3 -3
  193. package/dist/shadcn/ui/select.d.ts.map +1 -1
  194. package/dist/shadcn/ui/separator.d.ts +2 -2
  195. package/dist/shadcn/ui/separator.d.ts.map +1 -1
  196. package/dist/shadcn/ui/sheet.d.ts +5 -5
  197. package/dist/shadcn/ui/sheet.d.ts.map +1 -1
  198. package/dist/shadcn/ui/sidebar.d.ts +26 -26
  199. package/dist/shadcn/ui/sidebar.d.ts.map +1 -1
  200. package/dist/shadcn/ui/skeleton.d.ts +1 -1
  201. package/dist/shadcn/ui/skeleton.d.ts.map +1 -1
  202. package/dist/shadcn/ui/slider.d.ts +2 -2
  203. package/dist/shadcn/ui/slider.d.ts.map +1 -1
  204. package/dist/shadcn/ui/sonner.d.ts.map +1 -1
  205. package/dist/shadcn/ui/switch.d.ts +2 -2
  206. package/dist/shadcn/ui/switch.d.ts.map +1 -1
  207. package/dist/shadcn/ui/table.d.ts +9 -9
  208. package/dist/shadcn/ui/table.d.ts.map +1 -1
  209. package/dist/shadcn/ui/tabs.d.ts +2 -2
  210. package/dist/shadcn/ui/tabs.d.ts.map +1 -1
  211. package/dist/shadcn/ui/textarea.d.ts +2 -2
  212. package/dist/shadcn/ui/textarea.d.ts.map +1 -1
  213. package/dist/shadcn/ui/toggle-group.d.ts +2 -2
  214. package/dist/shadcn/ui/toggle-group.d.ts.map +1 -1
  215. package/dist/shadcn/ui/toggle.d.ts +2 -2
  216. package/dist/shadcn/ui/toggle.d.ts.map +1 -1
  217. package/dist/shadcn/ui/tooltip.d.ts +2 -2
  218. package/dist/shadcn/ui/tooltip.d.ts.map +1 -1
  219. package/package.json +2 -2
  220. package/src/index.ts +1 -1
  221. package/src/kit/builder/auth/AuthProvider.tsx +131 -0
  222. package/src/kit/builder/auth/adapter.ts +436 -0
  223. package/src/kit/builder/auth/client-adapters.ts +398 -0
  224. package/src/kit/builder/auth/components.tsx +221 -0
  225. package/src/kit/builder/auth/hooks.ts +237 -0
  226. package/src/kit/builder/auth/index.ts +134 -0
  227. package/src/kit/builder/auth/permission-checker.ts +150 -0
  228. package/src/kit/builder/auth/storage.ts +366 -0
  229. package/src/kit/builder/auth/token-manager.ts +55 -0
  230. package/src/kit/builder/auth/types.ts +393 -0
  231. package/src/kit/builder/data-table/components/DataTable.tsx +216 -82
  232. package/src/kit/builder/data-table/components/DataTableColumnHeader.tsx +9 -5
  233. package/src/kit/builder/data-table/components/DataTablePagination.tsx +49 -27
  234. package/src/kit/builder/data-table/components/DataTableViewOptions.tsx +13 -4
  235. package/src/kit/builder/data-table/types.ts +18 -3
  236. package/src/kit/builder/dialog/index.ts +5 -1
  237. package/src/kit/builder/dialog/provider.tsx +56 -27
  238. package/src/kit/builder/form/components/FormBuilder.tsx +10 -14
  239. package/src/kit/builder/form/components/FormBuilderActions.tsx +1 -1
  240. package/src/kit/builder/form/components/FormBuilderContext.tsx +13 -6
  241. package/src/kit/builder/form/components/FormBuilderField.tsx +70 -20
  242. package/src/kit/builder/form/components/fields/ArrayField.tsx +148 -62
  243. package/src/kit/builder/form/components/fields/AutocompleteField.tsx +53 -18
  244. package/src/kit/builder/form/components/fields/CheckboxField.tsx +20 -11
  245. package/src/kit/builder/form/components/fields/DateField.tsx +17 -6
  246. package/src/kit/builder/form/components/fields/DatePickerField.tsx +15 -10
  247. package/src/kit/builder/form/components/fields/DateRangePickerField.tsx +20 -15
  248. package/src/kit/builder/form/components/fields/DateTimePickerField.tsx +16 -11
  249. package/src/kit/builder/form/components/fields/DateTimeRangePickerField.tsx +23 -17
  250. package/src/kit/builder/form/components/fields/FileField.tsx +10 -5
  251. package/src/kit/builder/form/components/fields/MonthPickerField.tsx +18 -11
  252. package/src/kit/builder/form/components/fields/MonthRangePickerField.tsx +23 -17
  253. package/src/kit/builder/form/components/fields/NumberField.tsx +9 -4
  254. package/src/kit/builder/form/components/fields/ObjectField.tsx +12 -7
  255. package/src/kit/builder/form/components/fields/RadioField.tsx +32 -14
  256. package/src/kit/builder/form/components/fields/SelectField.tsx +26 -11
  257. package/src/kit/builder/form/components/fields/SwitchField.tsx +20 -11
  258. package/src/kit/builder/form/components/fields/TextField.tsx +11 -5
  259. package/src/kit/builder/form/components/fields/TextareaField.tsx +9 -4
  260. package/src/kit/builder/form/components/fields/TimePickerField.tsx +16 -11
  261. package/src/kit/builder/form/components/fields/TimeRangePickerField.tsx +23 -17
  262. package/src/kit/builder/form/components/fields/index.ts +21 -21
  263. package/src/kit/builder/form/components/fields/types.ts +15 -11
  264. package/src/kit/builder/form/components/sectionNodes.tsx +63 -40
  265. package/src/kit/builder/form/hooks/useFormBuilder.ts +83 -34
  266. package/src/kit/builder/form/types.ts +173 -148
  267. package/src/kit/builder/form/utils/section-factories.ts +4 -1
  268. package/src/kit/builder/form/utils/transformers.ts +4 -4
  269. package/src/kit/builder/form/utils/validations.ts +1 -1
  270. package/src/kit/builder/page/Page.tsx +26 -6
  271. package/src/kit/builder/page/index.ts +1 -1
  272. package/src/kit/builder/section/SectionBuilder.tsx +252 -127
  273. package/src/kit/builder/section/SectionContainer.tsx +85 -0
  274. package/src/kit/builder/stack-dialog/context.ts +10 -4
  275. package/src/kit/builder/stack-dialog/hooks.ts +4 -3
  276. package/src/kit/builder/stack-dialog/index.ts +5 -11
  277. package/src/kit/builder/stack-dialog/provider.tsx +11 -11
  278. package/src/kit/builder/stack-dialog/renderer.tsx +23 -26
  279. package/src/kit/builder/stack-dialog/types.ts +18 -18
  280. package/src/kit/components/autocomplete/Autocomplete.tsx +631 -549
  281. package/src/kit/components/autocomplete/types.ts +17 -17
  282. package/src/kit/components/datepicker/DatePicker.tsx +33 -9
  283. package/src/kit/components/datepicker/DateRangePicker.tsx +159 -87
  284. package/src/kit/components/datetimepicker/DateTimePicker.tsx +136 -30
  285. package/src/kit/components/datetimepicker/DateTimeRangePicker.tsx +257 -67
  286. package/src/kit/components/datetimepicker/index.ts +3 -3
  287. package/src/kit/components/fileuploader/FileUploader.tsx +315 -180
  288. package/src/kit/components/fileuploader/index.ts +3 -3
  289. package/src/kit/components/fileuploader/types.ts +3 -3
  290. package/src/kit/components/forminfo/FormInfoError.tsx +26 -11
  291. package/src/kit/components/login/Login.tsx +13 -4
  292. package/src/kit/components/monthpicker/MonthInput.tsx +13 -4
  293. package/src/kit/components/monthpicker/MonthPicker.tsx +12 -11
  294. package/src/kit/components/monthpicker/MonthRangeInput.tsx +29 -8
  295. package/src/kit/components/monthpicker/MonthRangePicker.tsx +23 -21
  296. package/src/kit/components/timepicker/TimePicker.tsx +19 -11
  297. package/src/kit/components/timepicker/TimeRangePicker.tsx +106 -29
  298. package/src/kit/components/timepicker/index.ts +3 -3
  299. package/src/kit/layouts/admin/components/AdminLayout.tsx +53 -24
  300. package/src/kit/layouts/admin/components/ThemeToggle.tsx +3 -9
  301. package/src/kit/layouts/admin/hooks/menu.ts +11 -5
  302. package/src/kit/layouts/admin/providers/AdminMenuProvider.tsx +59 -39
  303. package/src/kit/layouts/admin/types/index.ts +1 -1
  304. package/src/kit/themes/base.css +1 -1
  305. package/src/kit/themes/clean-slate.css +40 -32
  306. package/src/kit/themes/default.css +34 -24
  307. package/src/kit/themes/minimal-modern.css +37 -29
  308. package/src/kit/themes/spotify.css +56 -39
  309. package/src/shadcn/hooks/use-mobile.ts +13 -11
  310. package/src/shadcn/lib/utils.ts +2 -2
  311. package/src/shadcn/ui/accordion.tsx +14 -14
  312. package/src/shadcn/ui/alert-dialog.tsx +29 -29
  313. package/src/shadcn/ui/alert.tsx +20 -20
  314. package/src/shadcn/ui/aspect-ratio.tsx +4 -4
  315. package/src/shadcn/ui/avatar.tsx +13 -13
  316. package/src/shadcn/ui/badge.tsx +16 -16
  317. package/src/shadcn/ui/breadcrumb.tsx +28 -28
  318. package/src/shadcn/ui/button.tsx +23 -23
  319. package/src/shadcn/ui/calendar.tsx +82 -78
  320. package/src/shadcn/ui/card.tsx +27 -27
  321. package/src/shadcn/ui/carousel.tsx +93 -93
  322. package/src/shadcn/ui/chart.tsx +103 -103
  323. package/src/shadcn/ui/checkbox.tsx +9 -9
  324. package/src/shadcn/ui/collapsible.tsx +6 -6
  325. package/src/shadcn/ui/command.tsx +36 -36
  326. package/src/shadcn/ui/context-menu.tsx +40 -40
  327. package/src/shadcn/ui/dialog.tsx +28 -28
  328. package/src/shadcn/ui/drawer.tsx +30 -30
  329. package/src/shadcn/ui/dropdown-menu.tsx +41 -41
  330. package/src/shadcn/ui/form.tsx +48 -47
  331. package/src/shadcn/ui/hover-card.tsx +11 -11
  332. package/src/shadcn/ui/input-otp.tsx +23 -23
  333. package/src/shadcn/ui/input.tsx +9 -9
  334. package/src/shadcn/ui/label.tsx +8 -8
  335. package/src/shadcn/ui/menubar.tsx +47 -47
  336. package/src/shadcn/ui/navigation-menu.tsx +33 -33
  337. package/src/shadcn/ui/pagination.tsx +28 -28
  338. package/src/shadcn/ui/popover.tsx +12 -12
  339. package/src/shadcn/ui/progress.tsx +8 -8
  340. package/src/shadcn/ui/radio-group.tsx +11 -11
  341. package/src/shadcn/ui/resizable.tsx +14 -14
  342. package/src/shadcn/ui/scroll-area.tsx +15 -15
  343. package/src/shadcn/ui/select.tsx +34 -34
  344. package/src/shadcn/ui/separator.tsx +9 -9
  345. package/src/shadcn/ui/sheet.tsx +36 -36
  346. package/src/shadcn/ui/sidebar.tsx +227 -227
  347. package/src/shadcn/ui/skeleton.tsx +5 -5
  348. package/src/shadcn/ui/slider.tsx +12 -12
  349. package/src/shadcn/ui/sonner.tsx +11 -11
  350. package/src/shadcn/ui/switch.tsx +9 -9
  351. package/src/shadcn/ui/table.tsx +32 -32
  352. package/src/shadcn/ui/tabs.tsx +14 -14
  353. package/src/shadcn/ui/textarea.tsx +7 -7
  354. package/src/shadcn/ui/toggle-group.tsx +17 -17
  355. package/src/shadcn/ui/toggle.tsx +16 -16
  356. package/src/shadcn/ui/tooltip.tsx +11 -11
  357. package/src/stories/FileUploader.stories.tsx +23 -4
  358. package/src/stories/kit/builder/DataTable.Basic.stories.tsx +14 -4
  359. package/src/stories/kit/builder/DataTable.Filters.stories.tsx +36 -14
  360. package/src/stories/kit/builder/DataTable.Pagination.stories.tsx +3 -2
  361. package/src/stories/kit/builder/DataTable.SelectionAndActions.stories.tsx +18 -4
  362. package/src/stories/kit/builder/DataTable.Sorting.stories.tsx +18 -7
  363. package/src/stories/kit/builder/Dialog.stories.tsx +19 -13
  364. package/src/stories/kit/builder/Form.ArrayLayouts.stories.tsx +40 -16
  365. package/src/stories/kit/builder/Form.Autocomplete.stories.tsx +34 -22
  366. package/src/stories/kit/builder/Form.Basic.stories.tsx +38 -6
  367. package/src/stories/kit/builder/Form.Complex.stories.tsx +356 -111
  368. package/src/stories/kit/builder/Form.DateTime.stories.tsx +12 -8
  369. package/src/stories/kit/builder/Form.Dynamic.stories.tsx +695 -132
  370. package/src/stories/kit/builder/Form.Files.stories.tsx +37 -26
  371. package/src/stories/kit/builder/Form.MultipleFormBuilder.stories.tsx +46 -42
  372. package/src/stories/kit/builder/Form.Pickers.stories.tsx +12 -8
  373. package/src/stories/kit/builder/Form.Simple.stories.tsx +15 -6
  374. package/src/stories/kit/builder/Form.Time.stories.tsx +12 -8
  375. package/src/stories/kit/builder/Page.stories.tsx +32 -6
  376. package/src/stories/kit/builder/Section.stories.tsx +58 -11
  377. package/src/stories/kit/components/Autocomplete.stories.tsx +55 -22
  378. package/src/stories/kit/components/DatePicker.stories.tsx +80 -13
  379. package/src/stories/kit/components/DateRangePicker.stories.tsx +52 -11
  380. package/src/stories/kit/components/Login.stories.tsx +8 -2
  381. package/src/stories/kit/components/MonthPicker.stories.tsx +26 -6
  382. package/src/stories/kit/components/MonthRangePicker.stories.tsx +24 -5
  383. package/src/stories/kit/components/TimePicker.stories.tsx +18 -16
  384. package/src/stories/kit/components/TimeRangePicker.stories.tsx +18 -12
  385. package/src/stories/kit/layouts/admin/AdminLayout.Basic.stories.tsx +29 -6
  386. package/src/stories/kit/layouts/admin/AdminLayout.Collapsible.stories.tsx +26 -5
  387. package/src/stories/kit/layouts/admin/AdminLayout.Complex.stories.tsx +101 -18
  388. package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarHeaderComponent.stories.tsx +18 -4
  389. package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarTitleAndIcon.stories.tsx +17 -4
  390. package/src/stories/kit/layouts/admin/AdminLayout.HeaderSlots.stories.tsx +28 -6
  391. package/src/stories/shadcn/ui/Accordion.stories.tsx +33 -10
  392. package/src/stories/shadcn/ui/AlertDialog.stories.tsx +3 -1
  393. package/src/stories/shadcn/ui/Button.stories.tsx +3 -1
  394. package/src/stories/shadcn/ui/Calendar.stories.tsx +6 -1
  395. package/src/stories/shadcn/ui/Card.stories.tsx +11 -2
  396. package/src/stories/shadcn/ui/Checkbox.stories.tsx +11 -3
  397. package/src/stories/shadcn/ui/Collapsible.stories.tsx +12 -5
  398. package/src/stories/shadcn/ui/ContextMenu.stories.tsx +12 -4
  399. package/src/stories/shadcn/ui/Dialog.stories.tsx +15 -3
  400. package/src/stories/shadcn/ui/Drawer.stories.tsx +5 -2
  401. package/src/stories/shadcn/ui/DropdownMenu.stories.tsx +15 -5
  402. package/src/stories/shadcn/ui/Form.stories.tsx +5 -2
  403. package/src/stories/shadcn/ui/HoverCard.stories.tsx +8 -2
  404. package/src/stories/shadcn/ui/Input.stories.tsx +3 -1
  405. package/src/stories/shadcn/ui/InputOtp.stories.tsx +9 -2
  406. package/src/stories/shadcn/ui/Menubar.stories.tsx +21 -7
  407. package/src/stories/shadcn/ui/NavigationMenu.stories.tsx +30 -5
  408. package/src/stories/shadcn/ui/Popover.stories.tsx +8 -2
  409. package/src/stories/shadcn/ui/Resizable.stories.tsx +17 -5
  410. package/src/stories/shadcn/ui/ScrollArea.stories.tsx +54 -2
  411. package/src/stories/shadcn/ui/Select.stories.tsx +7 -1
  412. package/src/stories/shadcn/ui/Sheet.stories.tsx +2 -1
  413. package/src/stories/shadcn/ui/Sidebar.stories.tsx +13 -2
  414. package/src/stories/shadcn/ui/Sonner.stories.tsx +12 -2
  415. package/src/stories/shadcn/ui/Table.stories.tsx +86 -27
  416. package/src/stories/shadcn/ui/Tabs.stories.tsx +9 -2
  417. package/src/stories/shadcn/ui/Textarea.stories.tsx +3 -1
  418. package/src/stories/shadcn/ui/Toggle.stories.tsx +10 -2
  419. package/src/stories/shadcn/ui/Tooltip.stories.tsx +6 -1
  420. package/tsconfig.json +1 -5
  421. package/tsconfig.tsbuildinfo +1 -0
  422. package/eslint.config.mjs +0 -19
@@ -1,3 +1,3 @@
1
- export * from "./types";
2
- export { default as FileUploader } from "./FileUploader";
3
- export { FileUploader as default } from "./FileUploader";
1
+ export * from './types';
2
+ export { default as FileUploader } from './FileUploader';
3
+ export { FileUploader as default } from './FileUploader';
@@ -1,6 +1,6 @@
1
- import type { Accept } from "react-dropzone";
1
+ import type { Accept } from 'react-dropzone';
2
2
 
3
- export type FileUploadStatus = "idle" | "uploading" | "success" | "error";
3
+ export type FileUploadStatus = 'idle' | 'uploading' | 'success' | 'error';
4
4
 
5
5
  export type FileRecord = {
6
6
  id?: string | number;
@@ -22,7 +22,7 @@ export type FileRecord = {
22
22
  meta?: Record<string, unknown>;
23
23
  };
24
24
 
25
- export type FileUploaderLayout = "grid" | "list";
25
+ export type FileUploaderLayout = 'grid' | 'list';
26
26
 
27
27
  export type FileUploaderProps = {
28
28
  /** Controlled value of files */
@@ -22,7 +22,7 @@ const ignoredKeys = new Set(['message', 'type', 'types', 'ref']);
22
22
 
23
23
  function collectMessages(
24
24
  errors: FieldErrors<FieldValues> | undefined,
25
- parentPath: string[] = []
25
+ parentPath: string[] = [],
26
26
  ): ErrorMessage[] {
27
27
  if (!errors) return [];
28
28
 
@@ -35,9 +35,10 @@ function collectMessages(
35
35
  for (const [key, value] of entries) {
36
36
  if (!value) continue;
37
37
 
38
- const currentPath = typeof key === 'string' && key === 'root'
39
- ? parentPath
40
- : [...parentPath, String(key)];
38
+ const currentPath =
39
+ typeof key === 'string' && key === 'root'
40
+ ? parentPath
41
+ : [...parentPath, String(key)];
41
42
 
42
43
  if (typeof value === 'object') {
43
44
  if ('message' in value && value.message) {
@@ -63,12 +64,15 @@ function collectMessages(
63
64
  : Object.entries(value);
64
65
 
65
66
  const nestedEntries = source.filter(
66
- ([nestedKey]) => !ignoredKeys.has(nestedKey)
67
+ ([nestedKey]) => !ignoredKeys.has(nestedKey),
67
68
  );
68
69
 
69
70
  if (nestedEntries.length > 0) {
70
- const nested: Record<string, unknown> = Object.fromEntries(nestedEntries);
71
- messages.push(...collectMessages(nested as FieldErrors<FieldValues>, currentPath));
71
+ const nested: Record<string, unknown> =
72
+ Object.fromEntries(nestedEntries);
73
+ messages.push(
74
+ ...collectMessages(nested as FieldErrors<FieldValues>, currentPath),
75
+ );
72
76
  }
73
77
  }
74
78
  }
@@ -84,12 +88,22 @@ export function FormInfoError<TFieldValues extends FieldValues = FieldValues>({
84
88
  className,
85
89
  showFieldPath = true,
86
90
  }: FormInfoErrorProps<TFieldValues>) {
87
- const messages = collectMessages(errors as FieldErrors<FieldValues> | undefined);
91
+ const messages = collectMessages(
92
+ errors as FieldErrors<FieldValues> | undefined,
93
+ );
88
94
 
89
95
  if (messages.length === 0) {
90
96
  return null;
91
97
  }
92
98
 
99
+ const keyOccurrences = new Map<string, number>();
100
+ const getMessageKey = (path: string, message: string) => {
101
+ const baseKey = [path, message].filter(Boolean).join(':') || message;
102
+ const occurrence = keyOccurrences.get(baseKey) ?? 0;
103
+ keyOccurrences.set(baseKey, occurrence + 1);
104
+ return occurrence === 0 ? baseKey : `${baseKey}:${occurrence}`;
105
+ };
106
+
93
107
  return (
94
108
  <Alert variant="destructive" className={cn('gap-2', className)}>
95
109
  <AlertCircle className="mt-1" />
@@ -99,12 +113,13 @@ export function FormInfoError<TFieldValues extends FieldValues = FieldValues>({
99
113
  {title ?? 'Please review the following issues'}
100
114
  </AlertTitle>
101
115
  <AlertDescription>
102
- {description ?? 'Some fields need your attention before continuing.'}
116
+ {description ??
117
+ 'Some fields need your attention before continuing.'}
103
118
  </AlertDescription>
104
119
  </div>
105
120
  <ul className="grid gap-1 text-sm text-destructive">
106
- {messages.map(({ path, message }, index) => (
107
- <li key={`${path}-${index}`} className="leading-snug">
121
+ {messages.map(({ path, message }) => (
122
+ <li key={getMessageKey(path, message)} className="leading-snug">
108
123
  {showFieldPath && path ? (
109
124
  <span className="font-medium">{path}: </span>
110
125
  ) : null}
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import type * as React from 'react';
2
2
 
3
3
  export type LoginProps = {
4
4
  // Application title shown above the form (e.g., "Acme Inc")
@@ -50,13 +50,19 @@ export function Login({
50
50
  children,
51
51
  }: LoginProps) {
52
52
  return (
53
- <div className={['grid min-h-dvh grid-cols-1 md:grid-cols-2', className].filter(Boolean).join(' ')}>
53
+ <div
54
+ className={['grid min-h-dvh grid-cols-1 md:grid-cols-2', className]
55
+ .filter(Boolean)
56
+ .join(' ')}
57
+ >
54
58
  {/* Left column: form section */}
55
59
  <div className="flex items-center justify-center p-6 md:p-10">
56
60
  <div className="w-full max-w-md">
57
61
  {/* Title */}
58
62
  <div className="mb-6 text-center">
59
- <h1 className="text-2xl font-bold leading-tight tracking-tight">{appTitle}</h1>
63
+ <h1 className="text-2xl font-bold leading-tight tracking-tight">
64
+ {appTitle}
65
+ </h1>
60
66
  {subtitle ? (
61
67
  <p className="text-muted-foreground mt-1 text-sm">{subtitle}</p>
62
68
  ) : null}
@@ -70,7 +76,10 @@ export function Login({
70
76
  {forgotPasswordHref ? (
71
77
  <div className="text-center text-sm">
72
78
  {forgotPasswordLabel}{' '}
73
- <a href={forgotPasswordHref} className="underline underline-offset-4">
79
+ <a
80
+ href={forgotPasswordHref}
81
+ className="underline underline-offset-4"
82
+ >
74
83
  {forgotPasswordLinkLabel}
75
84
  </a>
76
85
  </div>
@@ -4,10 +4,15 @@ import * as React from 'react';
4
4
  import { Calendar as CalendarIcon } from 'lucide-react';
5
5
  import { cn } from '../../../shadcn/lib/utils';
6
6
  import { Button } from '../../../shadcn/ui/button';
7
- import { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/ui/popover';
7
+ import {
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ } from '../../../shadcn/ui/popover';
8
12
  import { MonthPicker } from './MonthPicker';
9
13
 
10
- export interface MonthInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
14
+ export interface MonthInputProps
15
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
11
16
  value?: Date | null;
12
17
  onChange?: (date: Date | null) => void;
13
18
  placeholder?: string;
@@ -42,7 +47,8 @@ export function MonthInput({
42
47
  }: MonthInputProps) {
43
48
  const [internalOpen, setInternalOpen] = React.useState(false);
44
49
  const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
45
- const setOpen = (o: boolean) => (props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o));
50
+ const setOpen = (o: boolean) =>
51
+ props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
46
52
  const [draft, setDraft] = React.useState<Date | null>(value ?? null);
47
53
 
48
54
  React.useEffect(() => {
@@ -66,7 +72,10 @@ export function MonthInput({
66
72
  type="button"
67
73
  disabled={disabled}
68
74
  variant={buttonVariant}
69
- className={cn('w-[240px] justify-start text-left font-normal', !value && 'text-muted-foreground')}
75
+ className={cn(
76
+ 'w-[240px] justify-start text-left font-normal',
77
+ !value && 'text-muted-foreground',
78
+ )}
70
79
  >
71
80
  <CalendarIcon className="mr-2 h-4 w-4" />
72
81
  {label}
@@ -107,10 +107,10 @@ function MonthCal({
107
107
  onYearForward,
108
108
  }: MonthCalProps) {
109
109
  const [year, setYear] = React.useState<number>(
110
- selectedMonth?.getFullYear() ?? new Date().getFullYear()
110
+ selectedMonth?.getFullYear() ?? new Date().getFullYear(),
111
111
  );
112
112
  const [month, setMonth] = React.useState<number>(
113
- selectedMonth?.getMonth() ?? new Date().getMonth()
113
+ selectedMonth?.getMonth() ?? new Date().getMonth(),
114
114
  );
115
115
  const [menuYear, setMenuYear] = React.useState<number>(year);
116
116
 
@@ -135,7 +135,7 @@ function MonthCal({
135
135
  }}
136
136
  className={cn(
137
137
  buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
138
- 'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1'
138
+ 'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1',
139
139
  )}
140
140
  >
141
141
  <ChevronLeft className="opacity-50 h-4 w-4" />
@@ -148,7 +148,7 @@ function MonthCal({
148
148
  }}
149
149
  className={cn(
150
150
  buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
151
- 'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1'
151
+ 'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1',
152
152
  )}
153
153
  >
154
154
  <ChevronRight className="opacity-50 h-4 w-4" />
@@ -157,10 +157,10 @@ function MonthCal({
157
157
  </div>
158
158
  <table className="w-full border-collapse space-y-1">
159
159
  <tbody>
160
- {MONTHS.map((monthRow, a) => {
160
+ {MONTHS.map((monthRow) => {
161
+ const rowKey = monthRow.map((month) => month.number).join('-');
161
162
  return (
162
- // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
163
- <tr key={`row-${a}`} className="flex w-full mt-2">
163
+ <tr key={rowKey} className="flex w-full mt-2">
164
164
  {monthRow.map((m) => {
165
165
  return (
166
166
  <td
@@ -188,7 +188,8 @@ function MonthCal({
188
188
  : false) ||
189
189
  (disabledDatesMapped
190
190
  ? disabledDatesMapped?.some(
191
- (d) => d.year === menuYear && d.month === m.number
191
+ (d) =>
192
+ d.year === menuYear && d.month === m.number,
192
193
  )
193
194
  : false)
194
195
  }
@@ -196,10 +197,10 @@ function MonthCal({
196
197
  buttonVariants({
197
198
  variant:
198
199
  month === m.number && menuYear === year
199
- ? variant?.calendar?.selected ?? 'default'
200
- : variant?.calendar?.main ?? 'ghost',
200
+ ? (variant?.calendar?.selected ?? 'default')
201
+ : (variant?.calendar?.main ?? 'ghost'),
201
202
  }),
202
- 'h-full w-full p-0 font-normal aria-selected:opacity-100'
203
+ 'h-full w-full p-0 font-normal aria-selected:opacity-100',
203
204
  )}
204
205
  >
205
206
  {callbacks?.monthLabel
@@ -4,10 +4,15 @@ import * as React from 'react';
4
4
  import { Calendar as CalendarIcon } from 'lucide-react';
5
5
  import { cn } from '../../../shadcn/lib/utils';
6
6
  import { Button } from '../../../shadcn/ui/button';
7
- import { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/ui/popover';
7
+ import {
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ } from '../../../shadcn/ui/popover';
8
12
  import { MonthRangePicker } from './MonthRangePicker';
9
13
 
10
- export interface MonthRangeInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
14
+ export interface MonthRangeInputProps
15
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
11
16
  value?: { start?: Date | null; end?: Date | null } | null;
12
17
  onChange?: (range: { start?: Date | null; end?: Date | null } | null) => void;
13
18
  placeholder?: string;
@@ -44,8 +49,12 @@ export function MonthRangeInput({
44
49
  }: MonthRangeInputProps) {
45
50
  const [internalOpen, setInternalOpen] = React.useState(false);
46
51
  const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
47
- const setOpen = (o: boolean) => (props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o));
48
- const [draft, setDraft] = React.useState<{ start?: Date | null; end?: Date | null } | null>(value ?? null);
52
+ const setOpen = (o: boolean) =>
53
+ props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
54
+ const [draft, setDraft] = React.useState<{
55
+ start?: Date | null;
56
+ end?: Date | null;
57
+ } | null>(value ?? null);
49
58
 
50
59
  React.useEffect(() => {
51
60
  if (isOpen) {
@@ -58,7 +67,8 @@ export function MonthRangeInput({
58
67
  const e = value?.end ?? null;
59
68
  if (format) return format(s, e);
60
69
  if (s && e) {
61
- const fmt = (d: Date) => d.toLocaleDateString(undefined, { year: 'numeric', month: 'short' });
70
+ const fmt = (d: Date) =>
71
+ d.toLocaleDateString(undefined, { year: 'numeric', month: 'short' });
62
72
  return `${fmt(s)} – ${fmt(e)}`;
63
73
  }
64
74
  return placeholder;
@@ -72,15 +82,26 @@ export function MonthRangeInput({
72
82
  type="button"
73
83
  disabled={disabled}
74
84
  variant={buttonVariant}
75
- className={cn('w-[280px] justify-start text-left font-normal', !value && 'text-muted-foreground')}
85
+ className={cn(
86
+ 'w-[280px] justify-start text-left font-normal',
87
+ !value && 'text-muted-foreground',
88
+ )}
76
89
  >
77
90
  <CalendarIcon className="mr-2 h-4 w-4" />
78
91
  {label}
79
92
  </Button>
80
93
  </PopoverTrigger>
81
- <PopoverContent className="p-2 w-auto max-w-none" align="start" side={popoverSide}>
94
+ <PopoverContent
95
+ className="p-2 w-auto max-w-none"
96
+ align="start"
97
+ side={popoverSide}
98
+ >
82
99
  <MonthRangePicker
83
- selectedMonthRange={draft?.start && draft?.end ? { start: draft.start, end: draft.end } : undefined}
100
+ selectedMonthRange={
101
+ draft?.start && draft?.end
102
+ ? { start: draft.start, end: draft.end }
103
+ : undefined
104
+ }
84
105
  onStartMonthSelect={(d) => {
85
106
  if (disabled) return;
86
107
  setDraft({ start: d, end: d });
@@ -11,8 +11,8 @@ const addMonths = (input: Date, months: number) => {
11
11
  date.setDate(
12
12
  Math.min(
13
13
  input.getDate(),
14
- getDaysInMonth(date.getFullYear(), date.getMonth() + 1)
15
- )
14
+ getDaysInMonth(date.getFullYear(), date.getMonth() + 1),
15
+ ),
16
16
  );
17
17
  return date;
18
18
  };
@@ -174,16 +174,16 @@ function MonthRangeCal({
174
174
  onYearForward,
175
175
  }: MonthRangeCalProps) {
176
176
  const [startYear, setStartYear] = React.useState<number>(
177
- selectedMonthRange?.start.getFullYear() ?? new Date().getFullYear()
177
+ selectedMonthRange?.start.getFullYear() ?? new Date().getFullYear(),
178
178
  );
179
179
  const [startMonth, setStartMonth] = React.useState<number>(
180
- selectedMonthRange?.start?.getMonth() ?? new Date().getMonth()
180
+ selectedMonthRange?.start?.getMonth() ?? new Date().getMonth(),
181
181
  );
182
182
  const [endYear, setEndYear] = React.useState<number>(
183
- selectedMonthRange?.end?.getFullYear() ?? new Date().getFullYear() + 1
183
+ selectedMonthRange?.end?.getFullYear() ?? new Date().getFullYear() + 1,
184
184
  );
185
185
  const [endMonth, setEndMonth] = React.useState<number>(
186
- selectedMonthRange?.end?.getMonth() ?? new Date().getMonth()
186
+ selectedMonthRange?.end?.getMonth() ?? new Date().getMonth(),
187
187
  );
188
188
  const [rangePending, setRangePending] = React.useState<boolean>(false);
189
189
  const [endLocked, setEndLocked] = React.useState<boolean>(true);
@@ -207,7 +207,7 @@ function MonthRangeCal({
207
207
  }}
208
208
  className={cn(
209
209
  buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
210
- 'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1'
210
+ 'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1',
211
211
  )}
212
212
  >
213
213
  <ChevronLeft className="opacity-50 h-4 w-4" />
@@ -220,7 +220,7 @@ function MonthRangeCal({
220
220
  }}
221
221
  className={cn(
222
222
  buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
223
- 'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1'
223
+ 'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1',
224
224
  )}
225
225
  >
226
226
  <ChevronRight className="opacity-50 h-4 w-4" />
@@ -234,10 +234,12 @@ function MonthRangeCal({
234
234
  </div>
235
235
  <table className="w-full border-collapse space-y-1">
236
236
  <tbody>
237
- {MONTHS.map((monthRow, a) => {
237
+ {MONTHS.map((monthRow) => {
238
+ const rowKey = monthRow
239
+ .map((month) => `${month.yearOffset}-${month.number}`)
240
+ .join('-');
238
241
  return (
239
- // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
240
- <tr key={`row-${a}`} className="flex w-full mt-2">
242
+ <tr key={rowKey} className="flex w-full mt-2">
241
243
  {monthRow.map((m, i) => {
242
244
  return (
243
245
  <td
@@ -255,13 +257,13 @@ function MonthRangeCal({
255
257
  m.number < endMonth)) &&
256
258
  (rangePending || endLocked)
257
259
  ? 'text-accent-foreground bg-accent'
258
- : ''
260
+ : '',
259
261
  ),
260
262
  menuYear + m.yearOffset === startYear &&
261
263
  m.number === startMonth &&
262
264
  (rangePending || endLocked)
263
265
  ? 'text-accent-foreground bg-accent rounded-l-md'
264
- : ''
266
+ : '',
265
267
  ),
266
268
  menuYear + m.yearOffset === endYear &&
267
269
  m.number === endMonth &&
@@ -269,9 +271,9 @@ function MonthRangeCal({
269
271
  menuYear + m.yearOffset >= startYear &&
270
272
  m.number >= startMonth
271
273
  ? 'text-accent-foreground bg-accent rounded-r-md'
272
- : ''
274
+ : '',
273
275
  ),
274
- i === 3 ? 'mr-2' : i === 4 ? 'ml-2' : ''
276
+ i === 3 ? 'mr-2' : i === 4 ? 'ml-2' : '',
275
277
  )}
276
278
  onMouseEnter={() => {
277
279
  if (rangePending && !endLocked) {
@@ -297,7 +299,7 @@ function MonthRangeCal({
297
299
  setEndMonth(m.number);
298
300
  if (onStartMonthSelect)
299
301
  onStartMonthSelect(
300
- new Date(menuYear + m.yearOffset, m.number)
302
+ new Date(menuYear + m.yearOffset, m.number),
301
303
  );
302
304
  } else {
303
305
  setRangePending(false);
@@ -309,7 +311,7 @@ function MonthRangeCal({
309
311
  start: new Date(startYear, startMonth),
310
312
  end: new Date(
311
313
  menuYear + m.yearOffset,
312
- m.number
314
+ m.number,
313
315
  ),
314
316
  });
315
317
  }
@@ -322,7 +324,7 @@ function MonthRangeCal({
322
324
  setEndMonth(m.number);
323
325
  if (onStartMonthSelect)
324
326
  onStartMonthSelect(
325
- new Date(menuYear + m.yearOffset, m.number)
327
+ new Date(menuYear + m.yearOffset, m.number),
326
328
  );
327
329
  }
328
330
  }}
@@ -350,10 +352,10 @@ function MonthRangeCal({
350
352
  (endMonth === m.number &&
351
353
  menuYear + m.yearOffset === endYear &&
352
354
  !rangePending)
353
- ? variant?.calendar?.selected ?? 'default'
354
- : variant?.calendar?.main ?? 'ghost',
355
+ ? (variant?.calendar?.selected ?? 'default')
356
+ : (variant?.calendar?.main ?? 'ghost'),
355
357
  }),
356
- 'h-full w-full p-0 font-normal aria-selected:opacity-100'
358
+ 'h-full w-full p-0 font-normal aria-selected:opacity-100',
357
359
  )}
358
360
  >
359
361
  {callbacks?.monthLabel
@@ -85,7 +85,7 @@ export function TimePicker({
85
85
 
86
86
  const setDraftPart = (
87
87
  part: 'hour' | 'minute' | 'second' | 'period',
88
- val: number | 'AM' | 'PM'
88
+ val: number | 'AM' | 'PM',
89
89
  ) => {
90
90
  setDraft((prev) => {
91
91
  const base = prev
@@ -99,7 +99,7 @@ export function TimePicker({
99
99
  0,
100
100
  0,
101
101
  0,
102
- 0
102
+ 0,
103
103
  );
104
104
  })();
105
105
  if (part === 'hour') {
@@ -135,17 +135,17 @@ export function TimePicker({
135
135
  () =>
136
136
  Array.from(
137
137
  { length: Math.ceil(60 / minuteStep) },
138
- (_, i) => i * minuteStep
138
+ (_, i) => i * minuteStep,
139
139
  ),
140
- [minuteStep]
140
+ [minuteStep],
141
141
  );
142
142
  const seconds = React.useMemo(
143
143
  () =>
144
144
  Array.from(
145
145
  { length: Math.ceil(60 / secondStep) },
146
- (_, i) => i * secondStep
146
+ (_, i) => i * secondStep,
147
147
  ),
148
- [secondStep]
148
+ [secondStep],
149
149
  );
150
150
 
151
151
  const selectedHour = React.useMemo(() => {
@@ -170,7 +170,7 @@ export function TimePicker({
170
170
  variant={buttonVariant}
171
171
  className={cn(
172
172
  'w-[240px] justify-start text-left font-normal',
173
- !value && 'text-muted-foreground'
173
+ !value && 'text-muted-foreground',
174
174
  )}
175
175
  >
176
176
  <Clock className="mr-2 h-4 w-4" />
@@ -180,7 +180,9 @@ export function TimePicker({
180
180
  <PopoverContent className="p-3 w-auto" align="start">
181
181
  <div className="flex items-end gap-2">
182
182
  <div className="w-24">
183
- <div className="mb-1 block text-xs text-muted-foreground">Hour</div>
183
+ <div className="mb-1 block text-xs text-muted-foreground">
184
+ Hour
185
+ </div>
184
186
  <Select
185
187
  disabled={disabled}
186
188
  value={String(selectedHour)}
@@ -201,7 +203,9 @@ export function TimePicker({
201
203
 
202
204
  {(precision === 'minute' || precision === 'second') && (
203
205
  <div className="w-24">
204
- <div className="mb-1 block text-xs text-muted-foreground">Minute</div>
206
+ <div className="mb-1 block text-xs text-muted-foreground">
207
+ Minute
208
+ </div>
205
209
  <Select
206
210
  disabled={disabled}
207
211
  value={String(selectedMinute - (selectedMinute % minuteStep))}
@@ -223,7 +227,9 @@ export function TimePicker({
223
227
 
224
228
  {precision === 'second' && (
225
229
  <div className="w-24">
226
- <div className="mb-1 block text-xs text-muted-foreground">Second</div>
230
+ <div className="mb-1 block text-xs text-muted-foreground">
231
+ Second
232
+ </div>
227
233
  <Select
228
234
  disabled={disabled}
229
235
  value={String(selectedSecond - (selectedSecond % secondStep))}
@@ -245,7 +251,9 @@ export function TimePicker({
245
251
 
246
252
  {hourCycle === 12 && (
247
253
  <div className="w-24">
248
- <div className="mb-1 block text-xs text-muted-foreground">Period</div>
254
+ <div className="mb-1 block text-xs text-muted-foreground">
255
+ Period
256
+ </div>
249
257
  <Select
250
258
  disabled={disabled}
251
259
  value={selectedPeriod}