@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
@@ -4,7 +4,11 @@ import * as React from 'react';
4
4
  import { Clock } 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 {
9
13
  Select,
10
14
  SelectContent,
@@ -20,7 +24,8 @@ export interface TimeRangePickerValue {
20
24
  to?: Date | null;
21
25
  }
22
26
 
23
- export interface TimeRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
27
+ export interface TimeRangePickerProps
28
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
24
29
  value?: TimeRangePickerValue | null;
25
30
  onChange?: (range: TimeRangePickerValue | null) => void;
26
31
  placeholder?: string;
@@ -60,9 +65,29 @@ function TimeUnitSelector({
60
65
  value: Date | null | undefined;
61
66
  onChange: (next: Date | null) => void;
62
67
  }) {
63
- const hours = React.useMemo(() => (hourCycle === 12 ? Array.from({ length: 12 }, (_, i) => i + 1) : Array.from({ length: 24 }, (_, i) => i)), [hourCycle]);
64
- const minutes = React.useMemo(() => Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => i * minuteStep), [minuteStep]);
65
- const seconds = React.useMemo(() => Array.from({ length: Math.ceil(60 / secondStep) }, (_, i) => i * secondStep), [secondStep]);
68
+ const hours = React.useMemo(
69
+ () =>
70
+ hourCycle === 12
71
+ ? Array.from({ length: 12 }, (_, i) => i + 1)
72
+ : Array.from({ length: 24 }, (_, i) => i),
73
+ [hourCycle],
74
+ );
75
+ const minutes = React.useMemo(
76
+ () =>
77
+ Array.from(
78
+ { length: Math.ceil(60 / minuteStep) },
79
+ (_, i) => i * minuteStep,
80
+ ),
81
+ [minuteStep],
82
+ );
83
+ const seconds = React.useMemo(
84
+ () =>
85
+ Array.from(
86
+ { length: Math.ceil(60 / secondStep) },
87
+ (_, i) => i * secondStep,
88
+ ),
89
+ [secondStep],
90
+ );
66
91
  const selectedHour = React.useMemo(() => {
67
92
  if (!value) return hourCycle === 12 ? 12 : 0;
68
93
  const h = value.getHours();
@@ -70,21 +95,33 @@ function TimeUnitSelector({
70
95
  }, [value, hourCycle]);
71
96
  const selectedMinute = value?.getMinutes() ?? 0;
72
97
  const selectedSecond = value?.getSeconds() ?? 0;
73
- const selectedPeriod: 'AM' | 'PM' = value && value.getHours() >= 12 ? 'PM' : 'AM';
98
+ const selectedPeriod: 'AM' | 'PM' =
99
+ value && value.getHours() >= 12 ? 'PM' : 'AM';
74
100
 
75
- const setPart = (part: 'hour' | 'minute' | 'second' | 'period', v: number | 'AM' | 'PM') => {
101
+ const setPart = (
102
+ part: 'hour' | 'minute' | 'second' | 'period',
103
+ v: number | 'AM' | 'PM',
104
+ ) => {
76
105
  const base = value
77
106
  ? new Date(value)
78
107
  : (() => {
79
108
  const n = new Date();
80
- return new Date(n.getFullYear(), n.getMonth(), n.getDate(), 0, 0, 0, 0);
109
+ return new Date(
110
+ n.getFullYear(),
111
+ n.getMonth(),
112
+ n.getDate(),
113
+ 0,
114
+ 0,
115
+ 0,
116
+ 0,
117
+ );
81
118
  })();
82
119
  if (part === 'hour') {
83
120
  let h = Number(v);
84
121
  if (hourCycle === 12) {
85
122
  const isPM = base.getHours() >= 12;
86
123
  h = h % 12;
87
- base.setHours(isPM ? (h === 12 ? 12 : h + 12) : (h === 12 ? 0 : h));
124
+ base.setHours(isPM ? (h === 12 ? 12 : h + 12) : h === 12 ? 0 : h);
88
125
  } else {
89
126
  base.setHours(h);
90
127
  }
@@ -108,13 +145,19 @@ function TimeUnitSelector({
108
145
  <div className="flex items-end gap-2">
109
146
  <div className="w-24">
110
147
  <div className="mb-1 block text-xs text-muted-foreground">Hour</div>
111
- <Select disabled={disabled} value={String(selectedHour)} onValueChange={(v) => setPart('hour', Number(v))}>
148
+ <Select
149
+ disabled={disabled}
150
+ value={String(selectedHour)}
151
+ onValueChange={(v) => setPart('hour', Number(v))}
152
+ >
112
153
  <SelectTrigger aria-label={`${label} hour`}>
113
154
  <SelectValue />
114
155
  </SelectTrigger>
115
156
  <SelectContent>
116
157
  {hours.map((h) => (
117
- <SelectItem key={h} value={String(h)}>{hourCycle === 12 ? h : pad2(h)}</SelectItem>
158
+ <SelectItem key={h} value={String(h)}>
159
+ {hourCycle === 12 ? h : pad2(h)}
160
+ </SelectItem>
118
161
  ))}
119
162
  </SelectContent>
120
163
  </Select>
@@ -122,14 +165,22 @@ function TimeUnitSelector({
122
165
 
123
166
  {(precision === 'minute' || precision === 'second') && (
124
167
  <div className="w-24">
125
- <div className="mb-1 block text-xs text-muted-foreground">Minute</div>
126
- <Select disabled={disabled} value={String(selectedMinute - (selectedMinute % minuteStep))} onValueChange={(v) => setPart('minute', Number(v))}>
168
+ <div className="mb-1 block text-xs text-muted-foreground">
169
+ Minute
170
+ </div>
171
+ <Select
172
+ disabled={disabled}
173
+ value={String(selectedMinute - (selectedMinute % minuteStep))}
174
+ onValueChange={(v) => setPart('minute', Number(v))}
175
+ >
127
176
  <SelectTrigger aria-label={`${label} minute`}>
128
177
  <SelectValue />
129
178
  </SelectTrigger>
130
179
  <SelectContent>
131
180
  {minutes.map((m) => (
132
- <SelectItem key={m} value={String(m)}>{pad2(m)}</SelectItem>
181
+ <SelectItem key={m} value={String(m)}>
182
+ {pad2(m)}
183
+ </SelectItem>
133
184
  ))}
134
185
  </SelectContent>
135
186
  </Select>
@@ -138,14 +189,22 @@ function TimeUnitSelector({
138
189
 
139
190
  {precision === 'second' && (
140
191
  <div className="w-24">
141
- <div className="mb-1 block text-xs text-muted-foreground">Second</div>
142
- <Select disabled={disabled} value={String(selectedSecond - (selectedSecond % secondStep))} onValueChange={(v) => setPart('second', Number(v))}>
192
+ <div className="mb-1 block text-xs text-muted-foreground">
193
+ Second
194
+ </div>
195
+ <Select
196
+ disabled={disabled}
197
+ value={String(selectedSecond - (selectedSecond % secondStep))}
198
+ onValueChange={(v) => setPart('second', Number(v))}
199
+ >
143
200
  <SelectTrigger aria-label={`${label} second`}>
144
201
  <SelectValue />
145
202
  </SelectTrigger>
146
203
  <SelectContent>
147
204
  {seconds.map((s) => (
148
- <SelectItem key={s} value={String(s)}>{pad2(s)}</SelectItem>
205
+ <SelectItem key={s} value={String(s)}>
206
+ {pad2(s)}
207
+ </SelectItem>
149
208
  ))}
150
209
  </SelectContent>
151
210
  </Select>
@@ -154,8 +213,14 @@ function TimeUnitSelector({
154
213
 
155
214
  {hourCycle === 12 && (
156
215
  <div className="w-24">
157
- <div className="mb-1 block text-xs text-muted-foreground">Period</div>
158
- <Select disabled={disabled} value={selectedPeriod} onValueChange={(v) => setPart('period', v as 'AM' | 'PM')}>
216
+ <div className="mb-1 block text-xs text-muted-foreground">
217
+ Period
218
+ </div>
219
+ <Select
220
+ disabled={disabled}
221
+ value={selectedPeriod}
222
+ onValueChange={(v) => setPart('period', v as 'AM' | 'PM')}
223
+ >
159
224
  <SelectTrigger aria-label={`${label} period`}>
160
225
  <SelectValue />
161
226
  </SelectTrigger>
@@ -187,8 +252,11 @@ export function TimeRangePicker({
187
252
  }: TimeRangePickerProps) {
188
253
  const [internalOpen, setInternalOpen] = React.useState(false);
189
254
  const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
190
- const setOpen = (o: boolean) => (props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o));
191
- const [draft, setDraft] = React.useState<TimeRangePickerValue | null>(value ?? null);
255
+ const setOpen = (o: boolean) =>
256
+ props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
257
+ const [draft, setDraft] = React.useState<TimeRangePickerValue | null>(
258
+ value ?? null,
259
+ );
192
260
 
193
261
  React.useEffect(() => {
194
262
  if (isOpen) setDraft(value ?? null);
@@ -198,12 +266,16 @@ export function TimeRangePicker({
198
266
  const f = draft?.from ?? value?.from ?? null;
199
267
  const t = draft?.to ?? value?.to ?? null;
200
268
  if (format) return format(f ?? null, t ?? null);
201
- const fs = f ? (hourCycle === 12
202
- ? `${((f.getHours() % 12) || 12)}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''} ${f.getHours() >= 12 ? 'PM' : 'AM'}`
203
- : `${pad2(f.getHours())}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''}`) : null;
204
- const ts = t ? (hourCycle === 12
205
- ? `${((t.getHours() % 12) || 12)}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''} ${t.getHours() >= 12 ? 'PM' : 'AM'}`
206
- : `${pad2(t.getHours())}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''}`) : null;
269
+ const fs = f
270
+ ? hourCycle === 12
271
+ ? `${f.getHours() % 12 || 12}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''} ${f.getHours() >= 12 ? 'PM' : 'AM'}`
272
+ : `${pad2(f.getHours())}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''}`
273
+ : null;
274
+ const ts = t
275
+ ? hourCycle === 12
276
+ ? `${t.getHours() % 12 || 12}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''} ${t.getHours() >= 12 ? 'PM' : 'AM'}`
277
+ : `${pad2(t.getHours())}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''}`
278
+ : null;
207
279
  return fs && ts ? `${fs} – ${ts}` : placeholder;
208
280
  }, [draft, value, format, hourCycle, precision, placeholder]);
209
281
 
@@ -215,7 +287,10 @@ export function TimeRangePicker({
215
287
  type="button"
216
288
  disabled={disabled}
217
289
  variant={buttonVariant}
218
- className={cn('w-[280px] justify-start text-left font-normal', !value && 'text-muted-foreground')}
290
+ className={cn(
291
+ 'w-[280px] justify-start text-left font-normal',
292
+ !value && 'text-muted-foreground',
293
+ )}
219
294
  >
220
295
  <Clock className="mr-2 h-4 w-4" />
221
296
  {label}
@@ -226,7 +301,9 @@ export function TimeRangePicker({
226
301
  <TimeUnitSelector
227
302
  label="From"
228
303
  value={draft?.from ?? null}
229
- onChange={(d) => setDraft((prev) => ({ ...(prev ?? {}), from: d }))}
304
+ onChange={(d) =>
305
+ setDraft((prev) => ({ ...(prev ?? {}), from: d }))
306
+ }
230
307
  hourCycle={hourCycle}
231
308
  precision={precision}
232
309
  minuteStep={minuteStep}
@@ -1,3 +1,3 @@
1
- export { TimePicker } from './TimePicker'
2
- export { TimeRangePicker } from './TimeRangePicker'
3
- export default void 0
1
+ export { TimePicker } from './TimePicker';
2
+ export { TimeRangePicker } from './TimeRangePicker';
3
+ export default void 0;
@@ -63,7 +63,10 @@ function AdminLayoutContent({
63
63
  // Function to check if menu item is active
64
64
  const isMenuItemActive = (itemUrl: string | undefined) => {
65
65
  if (!itemUrl) return false;
66
- return location.pathname === itemUrl || location.pathname.startsWith(itemUrl + '/');
66
+ return (
67
+ location.pathname === itemUrl ||
68
+ location.pathname.startsWith(`${itemUrl}/`)
69
+ );
67
70
  };
68
71
 
69
72
  const setOpen = useCallback((id: string, val?: boolean) => {
@@ -72,19 +75,26 @@ function AdminLayoutContent({
72
75
 
73
76
  const hasActiveDescendant = (item: AdminMenuItem): boolean => {
74
77
  if (!item.children || item.children.length === 0) return false;
75
- return item.children.some((c) => isMenuItemActive(c.url) || hasActiveDescendant(c));
78
+ return item.children.some(
79
+ (c) => isMenuItemActive(c.url) || hasActiveDescendant(c),
80
+ );
76
81
  };
77
82
 
78
83
  const renderItem = (item: AdminMenuItem, level = 0) => {
79
- const hasChildren = Array.isArray(item.children) && item.children.length > 0;
84
+ const hasChildren =
85
+ Array.isArray(item.children) && item.children.length > 0;
80
86
  const isActive = isMenuItemActive(item.url);
81
- const isOpen = openMap[item.id] ?? (hasChildren && hasActiveDescendant(item));
87
+ const isOpen =
88
+ openMap[item.id] ?? (hasChildren && hasActiveDescendant(item));
82
89
 
83
- const indentClassMap = ['','pl-6','pl-10','pl-14'] as const;
90
+ const indentClassMap = ['', 'pl-6', 'pl-10', 'pl-14'] as const;
84
91
  const indent = indentClassMap[Math.min(level, 3)];
85
92
 
86
93
  const content = (
87
- <SidebarMenuItem key={item.id} className={`mb-1 ${level > 0 ? 'ml-1' : ''}`}>
94
+ <SidebarMenuItem
95
+ key={item.id}
96
+ className={`mb-1 ${level > 0 ? 'ml-1' : ''}`}
97
+ >
88
98
  <SidebarMenuButton
89
99
  asChild={!!item.url && !hasChildren}
90
100
  isActive={isActive}
@@ -102,7 +112,11 @@ function AdminLayoutContent({
102
112
  className={`h-4 w-4 transition-colors ${isActive ? 'text-primary-foreground' : 'text-sidebar-foreground group-hover:text-sidebar-accent-foreground'}`}
103
113
  />
104
114
  )}
105
- <span className={`font-medium transition-colors ${isActive ? 'text-primary-foreground' : 'text-sidebar-foreground group-hover:text-sidebar-accent-foreground'}`}>{item.title}</span>
115
+ <span
116
+ className={`font-medium transition-colors ${isActive ? 'text-primary-foreground' : 'text-sidebar-foreground group-hover:text-sidebar-accent-foreground'}`}
117
+ >
118
+ {item.title}
119
+ </span>
106
120
  {item.badge && (
107
121
  <span className="ml-auto text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">
108
122
  {item.badge}
@@ -111,13 +125,12 @@ function AdminLayoutContent({
111
125
  </Link>
112
126
  ) : (
113
127
  <div className="flex items-center gap-3 px-3 py-2.5 w-full">
114
- {hasChildren && (
115
- isOpen ? (
128
+ {hasChildren &&
129
+ (isOpen ? (
116
130
  <ChevronDown className="h-3.5 w-3.5 text-muted-foreground" />
117
131
  ) : (
118
132
  <ChevronRight className="h-3.5 w-3.5 text-muted-foreground" />
119
- )
120
- )}
133
+ ))}
121
134
  {item.icon ? (
122
135
  <item.icon className="h-4 w-4 text-sidebar-foreground group-hover:text-sidebar-accent-foreground" />
123
136
  ) : (
@@ -125,10 +138,14 @@ function AdminLayoutContent({
125
138
  )}
126
139
  {item.url ? (
127
140
  <Link to={item.url} className="flex-1 text-left">
128
- <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground">{item.title}</span>
141
+ <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground">
142
+ {item.title}
143
+ </span>
129
144
  </Link>
130
145
  ) : (
131
- <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground flex-1">{item.title}</span>
146
+ <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground flex-1">
147
+ {item.title}
148
+ </span>
132
149
  )}
133
150
  {item.badge && (
134
151
  <span className="ml-auto text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">
@@ -140,7 +157,9 @@ function AdminLayoutContent({
140
157
  </SidebarMenuButton>
141
158
  {hasChildren && isOpen && (
142
159
  <div className="mt-1 flex flex-col">
143
- {(item.children ?? []).map((child: AdminMenuItem) => renderItem(child, Math.min(level + 1, 3)))}
160
+ {(item.children ?? []).map((child: AdminMenuItem) =>
161
+ renderItem(child, Math.min(level + 1, 3)),
162
+ )}
144
163
  </div>
145
164
  )}
146
165
  </SidebarMenuItem>
@@ -150,8 +169,11 @@ function AdminLayoutContent({
150
169
  };
151
170
 
152
171
  return (
153
- <div className="flex min-h-dvh w-full">
154
- <Sidebar className="bg-sidebar border-r border-sidebar-border" collapsible={sidebarCollapsible ? "icon" : "none"}>
172
+ <div className="flex min-h-dvh w-full">
173
+ <Sidebar
174
+ className="bg-sidebar border-r border-sidebar-border"
175
+ collapsible={sidebarCollapsible ? 'icon' : 'none'}
176
+ >
155
177
  <SidebarHeader className="bg-sidebar border-b border-sidebar-border">
156
178
  {sidebarHeader ? (
157
179
  sidebarHeader
@@ -161,7 +183,9 @@ function AdminLayoutContent({
161
183
  <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground">
162
184
  <SidebarHeaderIcon className="h-4 w-4" />
163
185
  </div>
164
- <span className="font-semibold text-sidebar-foreground">{sidebarTitle}</span>
186
+ <span className="font-semibold text-sidebar-foreground">
187
+ {sidebarTitle}
188
+ </span>
165
189
  </div>
166
190
  </div>
167
191
  )}
@@ -170,7 +194,9 @@ function AdminLayoutContent({
170
194
  {sidebarGroups.map((group, idx) => (
171
195
  <Fragment key={group.id}>
172
196
  <SidebarGroup>
173
- <SidebarGroupLabel className="text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 mb-2 group-data-[collapsible=icon]:hidden">{group.label}</SidebarGroupLabel>
197
+ <SidebarGroupLabel className="text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 mb-2 group-data-[collapsible=icon]:hidden">
198
+ {group.label}
199
+ </SidebarGroupLabel>
174
200
  <SidebarGroupContent>
175
201
  <SidebarMenu className="group-data-[collapsible=icon]:items-center">
176
202
  {group.items.map((item) => renderItem(item, 0))}
@@ -178,7 +204,10 @@ function AdminLayoutContent({
178
204
  </SidebarGroupContent>
179
205
  </SidebarGroup>
180
206
  {idx < sidebarGroups.length - 1 && (
181
- <Separator orientation="horizontal" className="bg-sidebar-border group-data-[collapsible=icon]:hidden" />
207
+ <Separator
208
+ orientation="horizontal"
209
+ className="bg-sidebar-border group-data-[collapsible=icon]:hidden"
210
+ />
182
211
  )}
183
212
  </Fragment>
184
213
  ))}
@@ -192,7 +221,9 @@ function AdminLayoutContent({
192
221
  >
193
222
  <div className="flex items-center gap-3 px-3 py-2.5 group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:!justify-center group-data-[collapsible=icon]:!gap-0 group-data-[collapsible=icon]:!px-0">
194
223
  <LogOut className="h-4 w-4 text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:mx-auto group-data-[collapsible=icon]:mr-0" />
195
- <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden">Logout</span>
224
+ <span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden">
225
+ Logout
226
+ </span>
196
227
  </div>
197
228
  </SidebarMenuButton>
198
229
  </SidebarMenuItem>
@@ -212,11 +243,9 @@ function AdminLayoutContent({
212
243
  {headerAfterTheme}
213
244
  </div>
214
245
  </header>
215
- <main className="flex flex-1 flex-col gap-4 p-4">
216
- {children}
217
- </main>
246
+ <main className="flex flex-1 flex-col gap-4 p-4">{children}</main>
218
247
  </SidebarInset>
219
- </div>
248
+ </div>
220
249
  );
221
250
  }
222
251
 
@@ -40,19 +40,13 @@ export default function ThemeToggle({ className }: ThemeToggleProps) {
40
40
  <DropdownMenuLabel>Theme</DropdownMenuLabel>
41
41
  <DropdownMenuSeparator />
42
42
  <DropdownMenuItem onClick={() => setTheme('light')}>
43
- <Sun className="mr-2 h-4 w-4" />
44
- {' '}
45
- Light
43
+ <Sun className="mr-2 h-4 w-4" /> Light
46
44
  </DropdownMenuItem>
47
45
  <DropdownMenuItem onClick={() => setTheme('dark')}>
48
- <Moon className="mr-2 h-4 w-4" />
49
- {' '}
50
- Dark
46
+ <Moon className="mr-2 h-4 w-4" /> Dark
51
47
  </DropdownMenuItem>
52
48
  <DropdownMenuItem onClick={() => setTheme('system')}>
53
- <Laptop className="mr-2 h-4 w-4" />
54
- {' '}
55
- System
49
+ <Laptop className="mr-2 h-4 w-4" /> System
56
50
  </DropdownMenuItem>
57
51
  </DropdownMenuContent>
58
52
  </DropdownMenu>
@@ -1,7 +1,10 @@
1
- import React, { createContext, useContext } from 'react';
2
- import { AdminMenuContextValue, AdminMenuGroup } from '../types';
1
+ import type React from 'react';
2
+ import { createContext, useContext } from 'react';
3
+ import type { AdminMenuContextValue, AdminMenuGroup } from '../types';
3
4
 
4
- export const AdminMenuContext = createContext<AdminMenuContextValue | null>(null);
5
+ export const AdminMenuContext = createContext<AdminMenuContextValue | null>(
6
+ null,
7
+ );
5
8
 
6
9
  export function useAdminSidebarMenu() {
7
10
  const ctx = useContext(AdminMenuContext);
@@ -11,7 +14,9 @@ export function useAdminSidebarMenu() {
11
14
  const noop = () => {};
12
15
  return {
13
16
  groups: [] as AdminMenuGroup[],
14
- setGroups: noop as unknown as React.Dispatch<React.SetStateAction<AdminMenuGroup[]>>,
17
+ setGroups: noop as unknown as React.Dispatch<
18
+ React.SetStateAction<AdminMenuGroup[]>
19
+ >,
15
20
  registerGroup: noop as AdminMenuContextValue['registerGroup'],
16
21
  registerItem: noop as AdminMenuContextValue['registerItem'],
17
22
  clear: noop,
@@ -21,6 +26,7 @@ export function useAdminSidebarMenu() {
21
26
  }
22
27
 
23
28
  export function useAdminSidebarMenuRegistration() {
24
- const { setGroups, registerGroup, registerItem, clear } = useAdminSidebarMenu();
29
+ const { setGroups, registerGroup, registerItem, clear } =
30
+ useAdminSidebarMenu();
25
31
  return { setGroups, registerGroup, registerItem, clear };
26
32
  }
@@ -1,48 +1,61 @@
1
- import { useState, useCallback, useMemo } from "react";
2
- import { AdminMenuGroup, AdminMenuContextValue } from "../types";
3
- import { AdminMenuContext } from "../hooks/menu";
1
+ import { useState, useCallback, useMemo } from 'react';
2
+ import type { AdminMenuGroup, AdminMenuContextValue } from '../types';
3
+ import { AdminMenuContext } from '../hooks/menu';
4
4
 
5
5
  export type AdminMenuProviderProps = {
6
6
  initialGroups?: AdminMenuGroup[];
7
7
  children: React.ReactNode;
8
8
  };
9
9
 
10
- export function AdminMenuProvider({ initialGroups = [], children }: AdminMenuProviderProps) {
10
+ export function AdminMenuProvider({
11
+ initialGroups = [],
12
+ children,
13
+ }: AdminMenuProviderProps) {
11
14
  const [groups, setGroups] = useState<AdminMenuGroup[]>(initialGroups);
12
15
 
13
- const registerGroup = useCallback<AdminMenuContextValue['registerGroup']>((group) => {
14
- setGroups((prev) => {
15
- if (process.env.NODE_ENV !== 'production') {
16
- // eslint-disable-next-line no-console
17
- console.log('[AdminMenuProvider] registerGroup', group);
18
- }
19
- const exists = prev.some((g) => g.id === group.id);
20
- if (exists) return prev;
21
- return [...prev, { id: group.id, label: group.label, items: group.items ?? [] }];
22
- });
23
- }, []);
16
+ const registerGroup = useCallback<AdminMenuContextValue['registerGroup']>(
17
+ (group) => {
18
+ setGroups((prev) => {
19
+ if (process.env.NODE_ENV !== 'production') {
20
+ // eslint-disable-next-line no-console
21
+ console.log('[AdminMenuProvider] registerGroup', group);
22
+ }
23
+ const exists = prev.some((g) => g.id === group.id);
24
+ if (exists) return prev;
25
+ return [
26
+ ...prev,
27
+ { id: group.id, label: group.label, items: group.items ?? [] },
28
+ ];
29
+ });
30
+ },
31
+ [],
32
+ );
24
33
 
25
- const registerItem = useCallback<AdminMenuContextValue['registerItem']>((groupId, item) => {
26
- setGroups((prev) => {
27
- if (process.env.NODE_ENV !== 'production') {
28
- // eslint-disable-next-line no-console
29
- console.log('[AdminMenuProvider] registerItem', groupId, item);
30
- }
31
- // if group exists, append or replace item by id
32
- const idx = prev.findIndex((g) => g.id === groupId);
33
- if (idx >= 0) {
34
- const group = prev[idx];
35
- const items = [...group.items];
36
- const existingIdx = items.findIndex((it) => it.id === item.id);
37
- if (existingIdx >= 0) items[existingIdx] = item; else items.push(item);
38
- const next = [...prev];
39
- next[idx] = { ...group, items };
40
- return next;
41
- }
42
- // create group if missing
43
- return [...prev, { id: groupId, label: groupId, items: [item] }];
44
- });
45
- }, []);
34
+ const registerItem = useCallback<AdminMenuContextValue['registerItem']>(
35
+ (groupId, item) => {
36
+ setGroups((prev) => {
37
+ if (process.env.NODE_ENV !== 'production') {
38
+ // eslint-disable-next-line no-console
39
+ console.log('[AdminMenuProvider] registerItem', groupId, item);
40
+ }
41
+ // if group exists, append or replace item by id
42
+ const idx = prev.findIndex((g) => g.id === groupId);
43
+ if (idx >= 0) {
44
+ const group = prev[idx];
45
+ const items = [...group.items];
46
+ const existingIdx = items.findIndex((it) => it.id === item.id);
47
+ if (existingIdx >= 0) items[existingIdx] = item;
48
+ else items.push(item);
49
+ const next = [...prev];
50
+ next[idx] = { ...group, items };
51
+ return next;
52
+ }
53
+ // create group if missing
54
+ return [...prev, { id: groupId, label: groupId, items: [item] }];
55
+ });
56
+ },
57
+ [],
58
+ );
46
59
 
47
60
  const clear = useCallback(() => {
48
61
  if (process.env.NODE_ENV !== 'production') {
@@ -52,7 +65,14 @@ export function AdminMenuProvider({ initialGroups = [], children }: AdminMenuPro
52
65
  setGroups([]);
53
66
  }, []);
54
67
 
55
- const value = useMemo<AdminMenuContextValue>(() => ({ groups, setGroups, registerGroup, registerItem, clear }), [groups, registerGroup, registerItem, clear]);
68
+ const value = useMemo<AdminMenuContextValue>(
69
+ () => ({ groups, setGroups, registerGroup, registerItem, clear }),
70
+ [groups, registerGroup, registerItem, clear],
71
+ );
56
72
 
57
- return <AdminMenuContext.Provider value={value}>{children}</AdminMenuContext.Provider>;
58
- }
73
+ return (
74
+ <AdminMenuContext.Provider value={value}>
75
+ {children}
76
+ </AdminMenuContext.Provider>
77
+ );
78
+ }
@@ -19,7 +19,7 @@ export type AdminMenuContextValue = {
19
19
  groups: AdminMenuGroup[];
20
20
  setGroups: React.Dispatch<React.SetStateAction<AdminMenuGroup[]>>;
21
21
  registerGroup: (
22
- group: Omit<AdminMenuGroup, 'items'> & { items?: AdminMenuItem[] }
22
+ group: Omit<AdminMenuGroup, 'items'> & { items?: AdminMenuItem[] },
23
23
  ) => void;
24
24
  registerItem: (groupId: string, item: AdminMenuItem) => void;
25
25
  clear: () => void;
@@ -8,4 +8,4 @@
8
8
  @apply bg-[oklch(var(--background))] text-[oklch(var(--foreground))];
9
9
  letter-spacing: var(--tracking-normal);
10
10
  }
11
- }
11
+ }