@k3-universe/react-kit 0.0.8 → 0.0.10

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 (334) hide show
  1. package/dist/index.js +18655 -16777
  2. package/dist/kit/builder/data-table/components/DataTable.d.ts +2 -2
  3. package/dist/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
  4. package/dist/kit/builder/form/components/FormBuilder.d.ts +42 -14
  5. package/dist/kit/builder/form/components/FormBuilder.d.ts.map +1 -1
  6. package/dist/kit/builder/form/components/FormBuilderField.d.ts.map +1 -1
  7. package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts.map +1 -1
  8. package/dist/kit/builder/form/components/fields/DatePickerField.d.ts +3 -0
  9. package/dist/kit/builder/form/components/fields/DatePickerField.d.ts.map +1 -0
  10. package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts +3 -0
  11. package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts.map +1 -0
  12. package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts +3 -0
  13. package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts.map +1 -0
  14. package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts +3 -0
  15. package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts.map +1 -0
  16. package/dist/kit/builder/form/components/fields/index.d.ts +4 -0
  17. package/dist/kit/builder/form/components/fields/index.d.ts.map +1 -1
  18. package/dist/kit/builder/section/SectionBuilder.d.ts.map +1 -1
  19. package/dist/kit/builder/section/types.d.ts +12 -1
  20. package/dist/kit/builder/section/types.d.ts.map +1 -1
  21. package/dist/kit/builder/stack-dialog/context.d.ts +3 -0
  22. package/dist/kit/builder/stack-dialog/context.d.ts.map +1 -0
  23. package/dist/kit/builder/stack-dialog/hooks.d.ts +6 -0
  24. package/dist/kit/builder/stack-dialog/hooks.d.ts.map +1 -0
  25. package/dist/kit/builder/stack-dialog/index.d.ts +5 -0
  26. package/dist/kit/builder/stack-dialog/index.d.ts.map +1 -0
  27. package/dist/kit/builder/stack-dialog/provider.d.ts +3 -0
  28. package/dist/kit/builder/stack-dialog/provider.d.ts.map +1 -0
  29. package/dist/kit/builder/stack-dialog/renderer.d.ts +6 -0
  30. package/dist/kit/builder/stack-dialog/renderer.d.ts.map +1 -0
  31. package/dist/kit/builder/stack-dialog/types.d.ts +20 -0
  32. package/dist/kit/builder/stack-dialog/types.d.ts.map +1 -0
  33. package/dist/kit/components/autocomplete/Autocomplete.d.ts +35 -3
  34. package/dist/kit/components/autocomplete/Autocomplete.d.ts.map +1 -1
  35. package/dist/kit/components/autocomplete/index.d.ts +1 -0
  36. package/dist/kit/components/autocomplete/index.d.ts.map +1 -1
  37. package/dist/kit/components/datepicker/DatePicker.d.ts +27 -0
  38. package/dist/kit/components/datepicker/DatePicker.d.ts.map +1 -0
  39. package/dist/kit/components/datepicker/DateRangePicker.d.ts +41 -0
  40. package/dist/kit/components/datepicker/DateRangePicker.d.ts.map +1 -0
  41. package/dist/kit/components/monthpicker/MonthInput.d.ts +26 -0
  42. package/dist/kit/components/monthpicker/MonthInput.d.ts.map +1 -0
  43. package/dist/kit/components/monthpicker/MonthPicker.d.ts +32 -0
  44. package/dist/kit/components/monthpicker/MonthPicker.d.ts.map +1 -0
  45. package/dist/kit/components/monthpicker/MonthRangeInput.d.ts +31 -0
  46. package/dist/kit/components/monthpicker/MonthRangeInput.d.ts.map +1 -0
  47. package/dist/kit/components/monthpicker/MonthRangePicker.d.ts +48 -0
  48. package/dist/kit/components/monthpicker/MonthRangePicker.d.ts.map +1 -0
  49. package/dist/kit/themes/clean-slate.css +165 -1
  50. package/dist/kit/themes/default.css +165 -1
  51. package/dist/kit/themes/minimal-modern.css +165 -1
  52. package/dist/kit/themes/spotify.css +165 -1
  53. package/package.json +1 -1
  54. package/src/kit/builder/data-table/components/DataTable.tsx +9 -9
  55. package/src/kit/builder/form/components/FormBuilder.tsx +363 -145
  56. package/src/kit/builder/form/components/FormBuilderField.tsx +52 -3
  57. package/src/kit/builder/form/components/fields/AutocompleteField.tsx +29 -1
  58. package/src/kit/builder/form/components/fields/DatePickerField.tsx +24 -0
  59. package/src/kit/builder/form/components/fields/DateRangePickerField.tsx +41 -0
  60. package/src/kit/builder/form/components/fields/MonthPickerField.tsx +26 -0
  61. package/src/kit/builder/form/components/fields/MonthRangePickerField.tsx +35 -0
  62. package/src/kit/builder/form/components/fields/index.ts +4 -0
  63. package/src/kit/builder/section/SectionBuilder.tsx +24 -2
  64. package/src/kit/builder/section/types.ts +15 -1
  65. package/src/kit/builder/stack-dialog/context.ts +9 -0
  66. package/src/kit/builder/stack-dialog/hooks.ts +11 -0
  67. package/src/kit/builder/stack-dialog/index.ts +13 -0
  68. package/src/kit/builder/stack-dialog/provider.tsx +55 -0
  69. package/src/kit/builder/stack-dialog/renderer.tsx +33 -0
  70. package/src/kit/builder/stack-dialog/types.ts +22 -0
  71. package/src/kit/components/autocomplete/Autocomplete.tsx +783 -233
  72. package/src/kit/components/autocomplete/index.ts +1 -0
  73. package/src/kit/components/datepicker/DatePicker.tsx +149 -0
  74. package/src/kit/components/datepicker/DateRangePicker.tsx +454 -0
  75. package/src/kit/components/monthpicker/MonthInput.tsx +122 -0
  76. package/src/kit/components/monthpicker/MonthPicker.tsx +223 -0
  77. package/src/kit/components/monthpicker/MonthRangeInput.tsx +132 -0
  78. package/src/kit/components/monthpicker/MonthRangePicker.tsx +407 -0
  79. package/src/stories/kit/builder/Form.Autocomplete.stories.tsx +210 -0
  80. package/src/stories/kit/builder/Form.Complex.stories.tsx +101 -0
  81. package/src/stories/kit/builder/Form.Dynamic.stories.tsx +149 -0
  82. package/src/stories/kit/builder/Form.Pickers.stories.tsx +71 -0
  83. package/src/stories/kit/builder/Section.stories.tsx +58 -2
  84. package/src/stories/kit/components/Autocomplete.stories.tsx +27 -0
  85. package/src/stories/kit/components/DatePicker.stories.tsx +128 -0
  86. package/src/stories/kit/components/DateRangePicker.stories.tsx +154 -0
  87. package/src/stories/kit/components/MonthPicker.stories.tsx +80 -0
  88. package/src/stories/kit/components/MonthRangePicker.stories.tsx +98 -0
  89. package/storybook-static/assets/{Accordion.stories-q6yg6wg1.js → Accordion.stories-KU4JBR8U.js} +1 -1
  90. package/storybook-static/assets/{AdminLayout-B9bV4J_6.js → AdminLayout-CPvVCwfY.js} +10 -10
  91. package/storybook-static/assets/AdminLayout.Basic.stories-DkP2UVXe.js +4 -0
  92. package/storybook-static/assets/AdminLayout.Collapsible.stories-BuuVjtpW.js +4 -0
  93. package/storybook-static/assets/AdminLayout.Complex.stories-D-k4H0hJ.js +29 -0
  94. package/storybook-static/assets/AdminLayout.CustomSidebarHeaderComponent.stories-B_0IEDd4.js +9 -0
  95. package/storybook-static/assets/AdminLayout.CustomSidebarTitleAndIcon.stories-CvAeXUyA.js +4 -0
  96. package/storybook-static/assets/AdminLayout.HeaderSlots.stories-RBFHoSZK.js +7 -0
  97. package/storybook-static/assets/{Alert.stories-DXwNfJ3w.js → Alert.stories-DKxKtIc0.js} +1 -1
  98. package/storybook-static/assets/{AlertDialog.stories-I324NsnP.js → AlertDialog.stories-BqTpZ_nG.js} +1 -1
  99. package/storybook-static/assets/{AspectRatio.stories-CghHiX3Z.js → AspectRatio.stories-DPO9QQ5F.js} +1 -1
  100. package/storybook-static/assets/Autocomplete-Cpg4CaJe.js +56 -0
  101. package/storybook-static/assets/Autocomplete.stories-CWj4G5fh.js +56 -0
  102. package/storybook-static/assets/{Avatar.stories-CEF5FVSR.js → Avatar.stories-DPhov_2g.js} +1 -1
  103. package/storybook-static/assets/Badge.stories-DFKrRdXq.js +12 -0
  104. package/storybook-static/assets/{Breadcrumb.stories-DORe9T4b.js → Breadcrumb.stories-CTE6CZUC.js} +1 -1
  105. package/storybook-static/assets/{Button.stories-3nQ6wsBX.js → Button.stories-cbt2InL-.js} +1 -1
  106. package/storybook-static/assets/{Calendar.stories-Dn__djE1.js → Calendar.stories-DRhTw_43.js} +1 -1
  107. package/storybook-static/assets/{Card.stories-BJcbdwCI.js → Card.stories-Isf6n_K3.js} +1 -1
  108. package/storybook-static/assets/{Carousel.stories-CfqbE7Va.js → Carousel.stories-Cmg0I3fR.js} +1 -1
  109. package/storybook-static/assets/{Chart.stories-cGgef3tv.js → Chart.stories-aQ-fNijT.js} +1 -1
  110. package/storybook-static/assets/{Checkbox.stories-BcaxWzCS.js → Checkbox.stories-B7YMXPDc.js} +1 -1
  111. package/storybook-static/assets/{Collapsible.stories-CQ95s7Cs.js → Collapsible.stories-BUzl17ZZ.js} +1 -1
  112. package/storybook-static/assets/{Combination-CeVus13L.js → Combination-BdQWAuko.js} +1 -1
  113. package/storybook-static/assets/{Command.stories-DYflJh8u.js → Command.stories-DzBlWQs0.js} +1 -1
  114. package/storybook-static/assets/{ContextMenu.stories-CU7ehYrE.js → ContextMenu.stories-CJlBQyXc.js} +1 -1
  115. package/storybook-static/assets/DataTable.Basic.stories-BWYKFDmK.js +6 -0
  116. package/storybook-static/assets/DataTable.Filters.stories-uZdtJk8t.js +21 -0
  117. package/storybook-static/assets/DataTable.Pagination.stories-C5N1khkp.js +24 -0
  118. package/storybook-static/assets/DataTable.SelectionAndActions.stories-FhCqZKvO.js +26 -0
  119. package/storybook-static/assets/DataTable.Sorting.stories-D-k7EtRj.js +6 -0
  120. package/storybook-static/assets/{Dialog.stories-DobNZ0Hp.js → Dialog.stories-C62AF-Gx.js} +1 -1
  121. package/storybook-static/assets/{Dialog.stories-Bu6ZJXNH.js → Dialog.stories-lrjRwOus.js} +1 -1
  122. package/storybook-static/assets/{Drawer.stories-BN0idp4u.js → Drawer.stories-CGjkdJeV.js} +1 -1
  123. package/storybook-static/assets/{DropdownMenu.stories-sfsVDTvm.js → DropdownMenu.stories-DkGClRAA.js} +1 -1
  124. package/storybook-static/assets/Form.ArrayLayouts.stories-C5d_062d.js +130 -0
  125. package/storybook-static/assets/Form.Autocomplete.stories-CPZPkk4o.js +142 -0
  126. package/storybook-static/assets/Form.Basic.stories-Bhcu3-3n.js +58 -0
  127. package/storybook-static/assets/Form.Complex.stories-QnXh5a7Q.js +361 -0
  128. package/storybook-static/assets/Form.Dynamic.stories-DFW6wIuT.js +502 -0
  129. package/storybook-static/assets/Form.Simple.stories-BhJcyhbE.js +53 -0
  130. package/storybook-static/assets/{Form.stories-27doU7JS.js → Form.stories-PFNsMYxO.js} +1 -1
  131. package/storybook-static/assets/FormBuilder-BQBBxo_k.js +5 -0
  132. package/storybook-static/assets/{HoverCard.stories-0lted9Zx.js → HoverCard.stories-CAlQEVn8.js} +1 -1
  133. package/storybook-static/assets/{Input.stories-CwsIObFs.js → Input.stories-CEhODt0V.js} +1 -1
  134. package/storybook-static/assets/{InputOtp.stories-DVc086h4.js → InputOtp.stories-DSvNP4dS.js} +1 -1
  135. package/storybook-static/assets/{Label.stories-bJa0rk1A.js → Label.stories-B3pa8ZLY.js} +1 -1
  136. package/storybook-static/assets/{Login.stories-C6X6Kj5B.js → Login.stories-C7KQkmR_.js} +5 -5
  137. package/storybook-static/assets/{Menubar.stories-CuediVp7.js → Menubar.stories-CHXhSHxc.js} +1 -1
  138. package/storybook-static/assets/MonthPicker.stories-BnrOc4fm.js +99 -0
  139. package/storybook-static/assets/MonthRangePicker.stories-55Gk1t-7.js +134 -0
  140. package/storybook-static/assets/{NavigationMenu.stories-CKGZYhKk.js → NavigationMenu.stories-CXoS080P.js} +1 -1
  141. package/storybook-static/assets/{Page.stories-Cf76wtRx.js → Page.stories-GdSJgZ6-.js} +1 -1
  142. package/storybook-static/assets/{Pagination.stories-D7IdL1_4.js → Pagination.stories-BEBwqH4N.js} +1 -1
  143. package/storybook-static/assets/{Popover.stories-1VP_zNY8.js → Popover.stories-BICy98Cw.js} +1 -1
  144. package/storybook-static/assets/{Progress.stories-C35R5YvA.js → Progress.stories-DECHNOME.js} +1 -1
  145. package/storybook-static/assets/{RadioGroup.stories-CjuD3CwD.js → RadioGroup.stories-DA7-uKfV.js} +1 -1
  146. package/storybook-static/assets/{Resizable.stories-Cs8dvdc5.js → Resizable.stories-B99kWkH7.js} +1 -1
  147. package/storybook-static/assets/{ScrollArea.stories-D6_z-5jm.js → ScrollArea.stories-BqvUAXqU.js} +1 -1
  148. package/storybook-static/assets/Section.stories-lFMlFBQn.js +277 -0
  149. package/storybook-static/assets/SectionBuilder-BQW705x0.js +1 -0
  150. package/storybook-static/assets/{Select.stories-w_kbza5k.js → Select.stories-BsKyZ6Io.js} +1 -1
  151. package/storybook-static/assets/{Separator.stories-B5QnaJXb.js → Separator.stories-BTDOaOM2.js} +1 -1
  152. package/storybook-static/assets/{Sheet.stories-CORnEGvV.js → Sheet.stories-Cam1gR6G.js} +1 -1
  153. package/storybook-static/assets/{Sidebar.stories-DVuWTi4j.js → Sidebar.stories-DnOa6G7y.js} +1 -1
  154. package/storybook-static/assets/{Slider.stories-YoS2vvT2.js → Slider.stories-Bslq7hjq.js} +1 -1
  155. package/storybook-static/assets/Sonner.stories-D34pBBtI.js +18 -0
  156. package/storybook-static/assets/Switch.stories-Puyb1-Bx.js +3 -0
  157. package/storybook-static/assets/{Table.stories-BuGU4MUM.js → Table.stories-ClZxAhut.js} +1 -1
  158. package/storybook-static/assets/Tabs.stories-CURNTETB.js +10 -0
  159. package/storybook-static/assets/{Textarea.stories-CHXVobz6.js → Textarea.stories-Cf1ZBrWw.js} +1 -1
  160. package/storybook-static/assets/{Toggle.stories-C4uB4Hkq.js → Toggle.stories-CdMHY_bi.js} +1 -1
  161. package/storybook-static/assets/{ToggleGroup.stories-Cr229wf_.js → ToggleGroup.stories-BM68m1dX.js} +1 -1
  162. package/storybook-static/assets/{Tooltip.stories-DmMYGR3T.js → Tooltip.stories-DiQv64dM.js} +1 -1
  163. package/storybook-static/assets/{accordion-BCfsz_gl.js → accordion-DVgwQcnw.js} +1 -1
  164. package/storybook-static/assets/{alert-dialog-BYt6Z7Kt.js → alert-dialog-DCUEwpqm.js} +1 -1
  165. package/storybook-static/assets/{avatar-CRn1qQsC.js → avatar-BzwOE-mi.js} +1 -1
  166. package/storybook-static/assets/{axe-JCJl60WC.js → axe-HmUsR1st.js} +1 -1
  167. package/storybook-static/assets/badge-BnQWua6u.js +1 -0
  168. package/storybook-static/assets/{button-BObfgcV1.js → button-0oMkiryo.js} +1 -1
  169. package/storybook-static/assets/{chart-column-CplFCmg8.js → chart-column-DZGb4ZZS.js} +1 -1
  170. package/storybook-static/assets/{check-DyecuwP4.js → check-B9hBGj6o.js} +1 -1
  171. package/storybook-static/assets/{checkbox-D5BmNJeL.js → checkbox-CyIeaWHX.js} +1 -1
  172. package/storybook-static/assets/{chevron-down-Bp7zbUB0.js → chevron-down-D_37S6il.js} +1 -1
  173. package/storybook-static/assets/{chevron-left-D1L4J3UW.js → chevron-left-BBoN0vbI.js} +1 -1
  174. package/storybook-static/assets/{chevron-right-oMYqDJ_f.js → chevron-right-B5vIMLxK.js} +1 -1
  175. package/storybook-static/assets/{circle-CyarsADt.js → circle-C5Lzx6Nx.js} +1 -1
  176. package/storybook-static/assets/clean-slate-D1HmMFJM.css +1 -0
  177. package/storybook-static/assets/{command-DCnXmNmT.js → command-Csa9p8_a.js} +1 -1
  178. package/storybook-static/assets/{createLucideIcon-CLBo0iA0.js → createLucideIcon-BrHXro7t.js} +1 -1
  179. package/storybook-static/assets/default-CN_Fo1GY.css +1 -0
  180. package/storybook-static/assets/{dialog-DL0QBIbC.js → dialog-CsnqITTn.js} +1 -1
  181. package/storybook-static/assets/{dropdown-menu-BwL9gQwG.js → dropdown-menu-BWxxwPHL.js} +1 -1
  182. package/storybook-static/assets/{ellipsis-DPg968Rc.js → ellipsis-BRS038RR.js} +1 -1
  183. package/storybook-static/assets/{grip-vertical-CM0GDwvq.js → grip-vertical-BxXG8KNA.js} +1 -1
  184. package/storybook-static/assets/{iframe-BWjPIle6.js → iframe-v7iAhKit.js} +219 -219
  185. package/storybook-static/assets/{index-DschQYGl.js → index-0-qMRXou.js} +1 -1
  186. package/storybook-static/assets/{index-CKwUGXmt.js → index-AvwFFKJc.js} +1 -1
  187. package/storybook-static/assets/{index-BfKpUbCE.js → index-BVDb4dFc.js} +1 -1
  188. package/storybook-static/assets/{index-Dr2xmx-F.js → index-B_qx7A5T.js} +1 -1
  189. package/storybook-static/assets/index-BfiCOk42.js +1 -0
  190. package/storybook-static/assets/{index-C9xvlw_B.js → index-Bv9yk470.js} +1 -1
  191. package/storybook-static/assets/{index-DMk2qc2_.js → index-Bw1A27Kp.js} +1 -1
  192. package/storybook-static/assets/{index-7XoYQV2z.js → index-ByqivBWx.js} +1 -1
  193. package/storybook-static/assets/{index-URSssr5a.js → index-C9Ta0ZTH.js} +1 -1
  194. package/storybook-static/assets/{index-Pk2lGsul.js → index-CDY5kTx5.js} +1 -1
  195. package/storybook-static/assets/{index-3zykFCgl.js → index-CGnyVRgB.js} +1 -1
  196. package/storybook-static/assets/{index-Cw7p-pms.js → index-CWjrGFAQ.js} +1 -1
  197. package/storybook-static/assets/{index-npvyVsxD.js → index-CwBdPBFz.js} +1 -1
  198. package/storybook-static/assets/index-D8RXF03I.js +1 -0
  199. package/storybook-static/assets/{index-DE2OlfDP.js → index-DLIxT4Z7.js} +1 -1
  200. package/storybook-static/assets/{index-BcAKBHrX.js → index-DbaA6-o1.js} +1 -1
  201. package/storybook-static/assets/index-Dph_5COR.js +1 -0
  202. package/storybook-static/assets/index-DrN5n71E.js +1 -0
  203. package/storybook-static/assets/{index-04C4iZwC.js → index-Tp9IdbR8.js} +1 -1
  204. package/storybook-static/assets/{index-Dsg7S8zu.js → index-WyF3-wTE.js} +1 -1
  205. package/storybook-static/assets/{index-A7UzX-Xw.js → index-XSmPROEP.js} +1 -1
  206. package/storybook-static/assets/{index-u70nzfOV.js → index-Z6wF44KX.js} +1 -1
  207. package/storybook-static/assets/{index-Dqw7miiX.js → index-_RPqOjlQ.js} +1 -1
  208. package/storybook-static/assets/{index-Cce91yJQ.js → index-jrimW4QO.js} +1 -1
  209. package/storybook-static/assets/{index-C6O7WofA.js → index-nqc17SX4.js} +1 -1
  210. package/storybook-static/assets/{label-CwntpYJ0.js → label-Do8ODIVk.js} +1 -1
  211. package/storybook-static/assets/lodash-DDwpuhPG.js +73 -0
  212. package/storybook-static/assets/minimal-modern-BlYVzfQU.css +1 -0
  213. package/storybook-static/assets/{popover-ClqrrvjL.js → popover-CcciSWAw.js} +1 -1
  214. package/storybook-static/assets/{radio-group-CvN0LQZp.js → radio-group-DiJ0Y_KQ.js} +1 -1
  215. package/storybook-static/assets/{react-18-Bj31y5Nr.js → react-18-Cr9fq_Ip.js} +1 -1
  216. package/storybook-static/assets/{react-icons.esm-DNr9VcvP.js → react-icons.esm-B_ULMmNU.js} +1 -1
  217. package/storybook-static/assets/{refresh-cw-OZakDsFY.js → refresh-cw-BmRDhIV_.js} +1 -1
  218. package/storybook-static/assets/{schemas-CaLvKjsI.js → schemas-CGNYCiJ6.js} +3 -3
  219. package/storybook-static/assets/{section-factories-DKfKL-5s.js → section-factories-DCCY9R35.js} +1 -1
  220. package/storybook-static/assets/{select-gtXRB92c.js → select-DDrkxaOg.js} +1 -1
  221. package/storybook-static/assets/{separator-CxCWfpZX.js → separator-o5SAUnaJ.js} +1 -1
  222. package/storybook-static/assets/{settings-2-DSSkfF6W.js → settings-2-xWGvvbG6.js} +1 -1
  223. package/storybook-static/assets/{sheet-r0VNiBiN.js → sheet-C7jhU3XE.js} +1 -1
  224. package/storybook-static/assets/{shopping-cart-CJBClF2m.js → shopping-cart-BFlrufvo.js} +1 -1
  225. package/storybook-static/assets/{sidebar-BsMnOE7Y.js → sidebar-C8hU1Mxy.js} +1 -1
  226. package/storybook-static/assets/spotify-CUDj7g8m.css +1 -0
  227. package/storybook-static/assets/switch-CKGRuk3u.js +1 -0
  228. package/storybook-static/assets/tabs-CopK2m3j.js +1 -0
  229. package/storybook-static/assets/{toggle-D08-8sQA.js → toggle-DmHbWetf.js} +1 -1
  230. package/storybook-static/assets/{tooltip-CZ1UAE_e.js → tooltip-_LqYEYFw.js} +1 -1
  231. package/storybook-static/assets/{trash-2-D55eseMQ.js → trash-2-xdbApPby.js} +1 -1
  232. package/storybook-static/assets/{x-n8sFtlI2.js → x-B1a4fyWM.js} +1 -1
  233. package/storybook-static/iframe.html +1 -1
  234. package/storybook-static/index.json +1 -1
  235. package/storybook-static/kit/builder/data-table/components/DataTable.d.ts +6 -3
  236. package/storybook-static/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
  237. package/storybook-static/kit/builder/data-table/index.d.ts +6 -5
  238. package/storybook-static/kit/builder/data-table/index.d.ts.map +1 -1
  239. package/storybook-static/kit/builder/form/components/FormBuilder.d.ts +53 -13
  240. package/storybook-static/kit/builder/form/components/FormBuilder.d.ts.map +1 -1
  241. package/storybook-static/kit/builder/form/components/FormBuilderField.d.ts +5 -5
  242. package/storybook-static/kit/builder/form/components/FormBuilderField.d.ts.map +1 -1
  243. package/storybook-static/kit/builder/form/components/fields/ArrayField.d.ts +3 -0
  244. package/storybook-static/kit/builder/form/components/fields/ArrayField.d.ts.map +1 -0
  245. package/storybook-static/kit/builder/form/components/fields/AutocompleteField.d.ts +3 -0
  246. package/storybook-static/kit/builder/form/components/fields/AutocompleteField.d.ts.map +1 -0
  247. package/storybook-static/kit/builder/form/components/fields/CheckboxField.d.ts +3 -0
  248. package/storybook-static/kit/builder/form/components/fields/CheckboxField.d.ts.map +1 -0
  249. package/storybook-static/kit/builder/form/components/fields/DateField.d.ts +3 -0
  250. package/storybook-static/kit/builder/form/components/fields/DateField.d.ts.map +1 -0
  251. package/storybook-static/kit/builder/form/components/fields/FileField.d.ts +3 -0
  252. package/storybook-static/kit/builder/form/components/fields/FileField.d.ts.map +1 -0
  253. package/storybook-static/kit/builder/form/components/fields/NumberField.d.ts +3 -0
  254. package/storybook-static/kit/builder/form/components/fields/NumberField.d.ts.map +1 -0
  255. package/storybook-static/kit/builder/form/components/fields/ObjectField.d.ts +3 -0
  256. package/storybook-static/kit/builder/form/components/fields/ObjectField.d.ts.map +1 -0
  257. package/storybook-static/kit/builder/form/components/fields/RadioField.d.ts +3 -0
  258. package/storybook-static/kit/builder/form/components/fields/RadioField.d.ts.map +1 -0
  259. package/storybook-static/kit/builder/form/components/fields/SelectField.d.ts +3 -0
  260. package/storybook-static/kit/builder/form/components/fields/SelectField.d.ts.map +1 -0
  261. package/storybook-static/kit/builder/form/components/fields/SwitchField.d.ts +3 -0
  262. package/storybook-static/kit/builder/form/components/fields/SwitchField.d.ts.map +1 -0
  263. package/storybook-static/kit/builder/form/components/fields/TextField.d.ts +3 -0
  264. package/storybook-static/kit/builder/form/components/fields/TextField.d.ts.map +1 -0
  265. package/storybook-static/kit/builder/form/components/fields/TextareaField.d.ts +3 -0
  266. package/storybook-static/kit/builder/form/components/fields/TextareaField.d.ts.map +1 -0
  267. package/storybook-static/kit/builder/form/components/fields/index.d.ts +14 -0
  268. package/storybook-static/kit/builder/form/components/fields/index.d.ts.map +1 -0
  269. package/storybook-static/kit/builder/form/components/fields/types.d.ts +14 -0
  270. package/storybook-static/kit/builder/form/components/fields/types.d.ts.map +1 -0
  271. package/storybook-static/kit/builder/form/utils/field-factories.d.ts +1 -0
  272. package/storybook-static/kit/builder/form/utils/field-factories.d.ts.map +1 -1
  273. package/storybook-static/kit/builder/section/SectionBuilder.d.ts.map +1 -1
  274. package/storybook-static/kit/builder/section/types.d.ts +12 -1
  275. package/storybook-static/kit/builder/section/types.d.ts.map +1 -1
  276. package/storybook-static/kit/builder/stack-dialog/context.d.ts +3 -0
  277. package/storybook-static/kit/builder/stack-dialog/context.d.ts.map +1 -0
  278. package/storybook-static/kit/builder/stack-dialog/hooks.d.ts +6 -0
  279. package/storybook-static/kit/builder/stack-dialog/hooks.d.ts.map +1 -0
  280. package/storybook-static/kit/builder/stack-dialog/index.d.ts +5 -0
  281. package/storybook-static/kit/builder/stack-dialog/index.d.ts.map +1 -0
  282. package/storybook-static/kit/builder/stack-dialog/provider.d.ts +3 -0
  283. package/storybook-static/kit/builder/stack-dialog/provider.d.ts.map +1 -0
  284. package/storybook-static/kit/builder/stack-dialog/renderer.d.ts +6 -0
  285. package/storybook-static/kit/builder/stack-dialog/renderer.d.ts.map +1 -0
  286. package/storybook-static/kit/builder/stack-dialog/types.d.ts +20 -0
  287. package/storybook-static/kit/builder/stack-dialog/types.d.ts.map +1 -0
  288. package/storybook-static/kit/components/autocomplete/Autocomplete.d.ts +35 -3
  289. package/storybook-static/kit/components/autocomplete/Autocomplete.d.ts.map +1 -1
  290. package/storybook-static/kit/components/autocomplete/index.d.ts +1 -0
  291. package/storybook-static/kit/components/autocomplete/index.d.ts.map +1 -1
  292. package/storybook-static/kit/components/autocomplete/types.d.ts +1 -1
  293. package/storybook-static/kit/components/autocomplete/types.d.ts.map +1 -1
  294. package/storybook-static/kit/components/monthpicker/MonthPicker.d.ts +32 -0
  295. package/storybook-static/kit/components/monthpicker/MonthPicker.d.ts.map +1 -0
  296. package/storybook-static/kit/components/monthpicker/MonthRangePicker.d.ts +48 -0
  297. package/storybook-static/kit/components/monthpicker/MonthRangePicker.d.ts.map +1 -0
  298. package/storybook-static/kit/layouts/admin/components/AdminLayout.d.ts.map +1 -1
  299. package/storybook-static/kit/layouts/admin/hooks/menu.d.ts +1 -0
  300. package/storybook-static/kit/layouts/admin/hooks/menu.d.ts.map +1 -1
  301. package/storybook-static/kit/providers/ThemeProvider.d.ts.map +1 -1
  302. package/storybook-static/project.json +1 -1
  303. package/storybook-static/assets/AdminLayout.Basic.stories-C-ZxuH-O.js +0 -4
  304. package/storybook-static/assets/AdminLayout.Collapsible.stories-xcQzkxio.js +0 -4
  305. package/storybook-static/assets/AdminLayout.Complex.stories-DyjkVpvE.js +0 -29
  306. package/storybook-static/assets/AdminLayout.CustomSidebarHeaderComponent.stories-BqhzWCIA.js +0 -9
  307. package/storybook-static/assets/AdminLayout.CustomSidebarTitleAndIcon.stories-aWxyR67T.js +0 -4
  308. package/storybook-static/assets/AdminLayout.HeaderSlots.stories-dNzhUdDt.js +0 -7
  309. package/storybook-static/assets/Autocomplete-B4gV705L.js +0 -35
  310. package/storybook-static/assets/Autocomplete.stories-CyOvjTGN.js +0 -33
  311. package/storybook-static/assets/Badge.stories-_-G3GriP.js +0 -12
  312. package/storybook-static/assets/DataTable.Basic.stories-BQNWUKiw.js +0 -6
  313. package/storybook-static/assets/DataTable.Filters.stories-DPCoeYhK.js +0 -21
  314. package/storybook-static/assets/DataTable.Pagination.stories-8UNqTNgw.js +0 -24
  315. package/storybook-static/assets/DataTable.SelectionAndActions.stories-CDEjgQ6T.js +0 -26
  316. package/storybook-static/assets/DataTable.Sorting.stories-qG7-X_6r.js +0 -6
  317. package/storybook-static/assets/Form.Basic.stories-dE4nbgpr.js +0 -45
  318. package/storybook-static/assets/Form.Complex.stories-BEZufnjb.js +0 -230
  319. package/storybook-static/assets/Form.Dynamic.stories-cJTbd6cV.js +0 -247
  320. package/storybook-static/assets/Form.Simple.stories-DOPzZKhh.js +0 -50
  321. package/storybook-static/assets/FormBuilder-C0S7C69Q.js +0 -5
  322. package/storybook-static/assets/Section.stories-Ce5qYITI.js +0 -196
  323. package/storybook-static/assets/SectionBuilder-Df_lRZkj.js +0 -1
  324. package/storybook-static/assets/Sonner.stories-CXW5e_Qg.js +0 -18
  325. package/storybook-static/assets/Switch.stories-zr6i-aNi.js +0 -3
  326. package/storybook-static/assets/Tabs.stories-jxkJ-AUI.js +0 -10
  327. package/storybook-static/assets/clean-slate-V4nUw2Bm.css +0 -1
  328. package/storybook-static/assets/default-CuTBjDca.css +0 -1
  329. package/storybook-static/assets/index-BN5_W3Yi.js +0 -1
  330. package/storybook-static/assets/index-C5eJ31Z3.js +0 -1
  331. package/storybook-static/assets/index-DWC9SV-P.js +0 -1
  332. package/storybook-static/assets/lodash-BkmSIg_J.js +0 -73
  333. package/storybook-static/assets/minimal-modern-d2yFlFJM.css +0 -1
  334. package/storybook-static/assets/spotify-BuPUgQEa.css +0 -1
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
2
  export { default as Autocomplete } from './Autocomplete';
3
+ export type { AutocompleteProps } from './Autocomplete';
@@ -0,0 +1,149 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { Calendar as CalendarIcon } from 'lucide-react';
5
+ import { cn } from '../../../shadcn/lib/utils';
6
+ import { Button } from '../../../shadcn/ui/button';
7
+ import { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/ui/popover';
8
+ import { Calendar } from '../../../shadcn/ui/calendar';
9
+
10
+ export interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
11
+ value?: Date | null;
12
+ onChange?: (date: Date | null) => void;
13
+ placeholder?: string;
14
+ disabled?: boolean;
15
+ minDate?: Date;
16
+ maxDate?: Date;
17
+ disabledDates?: Array<Date | { from: Date; to: Date }>;
18
+ format?: (date: Date) => string;
19
+ buttonVariant?: React.ComponentProps<typeof Button>['variant'];
20
+ open?: boolean;
21
+ onOpenChange?: (open: boolean) => void;
22
+ showFooter?: boolean;
23
+ clearLabel?: string;
24
+ closeLabel?: string;
25
+ }
26
+
27
+ function isBefore(date: Date, min?: Date) {
28
+ return !!(min && date < new Date(min.getFullYear(), min.getMonth(), min.getDate()));
29
+ }
30
+
31
+ function isAfter(date: Date, max?: Date) {
32
+ return !!(max && date > new Date(max.getFullYear(), max.getMonth(), max.getDate()));
33
+ }
34
+
35
+ function startOfDay(d: Date) {
36
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
37
+ }
38
+
39
+ function sameDay(a: Date, b: Date) {
40
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
41
+ }
42
+
43
+ function inDisabled(date: Date, items?: Array<Date | { from: Date; to: Date }>) {
44
+ if (!items || items.length === 0) return false;
45
+ const d = startOfDay(date);
46
+ for (const it of items) {
47
+ if (it instanceof Date) {
48
+ if (sameDay(d, it)) return true;
49
+ } else if (it && 'from' in it && 'to' in it) {
50
+ const from = startOfDay(it.from);
51
+ const to = startOfDay(it.to);
52
+ if (d >= from && d <= to) return true;
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+
58
+ export function DatePicker({
59
+ value,
60
+ onChange,
61
+ placeholder = 'Pick a date',
62
+ disabled,
63
+ minDate,
64
+ maxDate,
65
+ disabledDates,
66
+ format,
67
+ className,
68
+ buttonVariant = 'outline',
69
+ ...props
70
+ }: DatePickerProps) {
71
+ const [internalOpen, setInternalOpen] = React.useState(false);
72
+ const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
73
+ const setOpen = (o: boolean) => props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
74
+
75
+ const isDisabled = (date: Date) => {
76
+ if (isBefore(date, minDate) || isAfter(date, maxDate)) return true;
77
+ if (inDisabled(date, disabledDates)) return true;
78
+ return false;
79
+ };
80
+
81
+ const label = value
82
+ ? format
83
+ ? format(value)
84
+ : value.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: '2-digit' })
85
+ : placeholder;
86
+
87
+ return (
88
+ <div className={cn('w-fit', className)} {...props}>
89
+ <Popover open={isOpen} onOpenChange={setOpen}>
90
+ <PopoverTrigger asChild>
91
+ <Button
92
+ type="button"
93
+ disabled={disabled}
94
+ variant={buttonVariant}
95
+ className={cn('w-[240px] justify-start text-left font-normal', !value && 'text-muted-foreground')}
96
+ >
97
+ <CalendarIcon className="mr-2 h-4 w-4" />
98
+ {label}
99
+ </Button>
100
+ </PopoverTrigger>
101
+ <PopoverContent className="p-0" align="start">
102
+ <Calendar
103
+ mode="single"
104
+ selected={value ?? undefined}
105
+ onSelect={(d) => {
106
+ if (disabled) return;
107
+ if (!d) {
108
+ onChange?.(null);
109
+ return;
110
+ }
111
+ if (isDisabled(d)) return;
112
+ onChange?.(d);
113
+ setOpen(false);
114
+ }}
115
+ defaultMonth={value ?? new Date()}
116
+ disabled={isDisabled}
117
+ buttonVariant="ghost"
118
+ showOutsideDays
119
+ />
120
+ {(props.showFooter ?? true) && (
121
+ <div className="flex items-center justify-between gap-2 p-2 border-t">
122
+ <Button
123
+ type="button"
124
+ variant="ghost"
125
+ size="sm"
126
+ onClick={() => onChange?.(null)}
127
+ disabled={disabled}
128
+ >
129
+ {props.clearLabel ?? 'Clear'}
130
+ </Button>
131
+ <Button
132
+ type="button"
133
+ variant="secondary"
134
+ size="sm"
135
+ onClick={() => setOpen(false)}
136
+ >
137
+ {props.closeLabel ?? 'Close'}
138
+ </Button>
139
+ </div>
140
+ )}
141
+ </PopoverContent>
142
+ </Popover>
143
+ </div>
144
+ );
145
+ }
146
+
147
+ DatePicker.displayName = 'DatePicker';
148
+
149
+ export default DatePicker;
@@ -0,0 +1,454 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { Calendar as CalendarIcon } from 'lucide-react';
5
+ import { cn } from '../../../shadcn/lib/utils';
6
+ import { Button } from '../../../shadcn/ui/button';
7
+ import { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/ui/popover';
8
+ import { Calendar } from '../../../shadcn/ui/calendar';
9
+ import type { DateRange } from 'react-day-picker';
10
+
11
+ export interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
12
+ value?: DateRange | null;
13
+ onChange?: (range: DateRange | null) => void;
14
+ placeholder?: string;
15
+ disabled?: boolean;
16
+ minDate?: Date;
17
+ maxDate?: Date;
18
+ disabledDates?: Array<Date | { from: Date; to: Date }>;
19
+ numberOfMonths?: number;
20
+ format?: (from?: Date, to?: Date) => string;
21
+ buttonVariant?: React.ComponentProps<typeof Button>['variant'];
22
+ open?: boolean;
23
+ onOpenChange?: (open: boolean) => void;
24
+ popoverSide?: 'top' | 'right' | 'bottom' | 'left';
25
+ // Footer and actions
26
+ showFooter?: boolean; // default true
27
+ cancelLabel?: string; // default 'Cancel'
28
+ applyLabel?: string; // default 'Update'
29
+ // Presets panel on the right
30
+ presetsPanel?: boolean; // default true
31
+ presets?: Array<{ id?: string; label: string; getRange: () => DateRange }>; // custom presets
32
+ // Back-compat aliases (will be ignored if `presets` provided)
33
+ showQuickSelectors?: boolean;
34
+ quickSelectors?: Array<{ label: string; getRange: () => DateRange }>;
35
+ }
36
+
37
+ function sameDay(a: Date, b: Date) {
38
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
39
+ }
40
+
41
+ function isBefore(date: Date, min?: Date) {
42
+ return !!(min && date < new Date(min.getFullYear(), min.getMonth(), min.getDate()));
43
+ }
44
+
45
+ function isAfter(date: Date, max?: Date) {
46
+ return !!(max && date > new Date(max.getFullYear(), max.getMonth(), max.getDate()));
47
+ }
48
+
49
+ function startOfDay(d: Date) {
50
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
51
+ }
52
+
53
+ function inDisabled(date: Date, items?: Array<Date | { from: Date; to: Date }>) {
54
+ if (!items || items.length === 0) return false;
55
+ const d = startOfDay(date);
56
+ for (const it of items) {
57
+ if (it instanceof Date) {
58
+ if (sameDay(d, it)) return true;
59
+ } else if (it && 'from' in it && 'to' in it) {
60
+ const from = startOfDay(it.from);
61
+ const to = startOfDay(it.to);
62
+ if (d >= from && d <= to) return true;
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+
68
+ function rangeContainsDisabled(
69
+ from?: Date,
70
+ to?: Date,
71
+ items?: Array<Date | { from: Date; to: Date }>
72
+ ) {
73
+ if (!from || !to) return false;
74
+ if (!items || items.length === 0) return false;
75
+ const a = startOfDay(from);
76
+ const b = startOfDay(to);
77
+ const start = a <= b ? a : b;
78
+ const end = a <= b ? b : a;
79
+ let cur = start;
80
+ while (cur <= end) {
81
+ if (inDisabled(cur, items)) return true;
82
+ cur = new Date(cur.getFullYear(), cur.getMonth(), cur.getDate() + 1);
83
+ }
84
+ return false;
85
+ }
86
+
87
+ export function DateRangePicker({
88
+ value,
89
+ onChange,
90
+ placeholder = 'Pick a date range',
91
+ disabled,
92
+ minDate,
93
+ maxDate,
94
+ disabledDates,
95
+ numberOfMonths = 2,
96
+ format,
97
+ className,
98
+ buttonVariant = 'outline',
99
+ ...props
100
+ }: DateRangePickerProps) {
101
+ const [internalOpen, setInternalOpen] = React.useState(false);
102
+ const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
103
+ const setOpen = (o: boolean) => (props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o));
104
+
105
+ const isDisabled = (date: Date) => {
106
+ if (isBefore(date, minDate) || isAfter(date, maxDate)) return true;
107
+ if (inDisabled(date, disabledDates)) return true;
108
+ return false;
109
+ };
110
+
111
+ const label = value?.from
112
+ ? format
113
+ ? format(value.from, value.to)
114
+ : value.to
115
+ ? `${value.from.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: '2-digit' })} \t– ${value.to.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: '2-digit' })}`
116
+ : `${value.from.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: '2-digit' })} \t– …`
117
+ : placeholder;
118
+
119
+ // Draft (apply mode) — selection applies when clicking Update
120
+ const [draft, setDraft] = React.useState<DateRange | null>(value ?? null);
121
+ // Sync draft when opening or when value changes while closed
122
+ React.useEffect(() => {
123
+ if (!isOpen) setDraft(value ?? null);
124
+ }, [isOpen, value]);
125
+
126
+ // Inputs state at the top
127
+ const fmt = React.useCallback((d?: Date) => {
128
+ if (!d) return '';
129
+ const dd = String(d.getDate()).padStart(2, '0');
130
+ const mm = String(d.getMonth() + 1).padStart(2, '0');
131
+ const yyyy = d.getFullYear();
132
+ return `${dd} / ${mm} / ${yyyy}`;
133
+ }, []);
134
+ const [fromInput, setFromInput] = React.useState<string>(fmt(value?.from));
135
+ const [toInput, setToInput] = React.useState<string>(fmt(value?.to));
136
+ const [fromTouched, setFromTouched] = React.useState(false);
137
+ const [toTouched, setToTouched] = React.useState(false);
138
+ React.useEffect(() => {
139
+ setFromInput(fmt(draft?.from));
140
+ setToInput(fmt(draft?.to));
141
+ }, [draft, fmt]);
142
+
143
+ // Input masking helpers (DD / MM / YYYY)
144
+ const maskDate = (raw: string) => {
145
+ const digits = raw.replace(/\D/g, '').slice(0, 8);
146
+ const parts: string[] = [];
147
+ const dd = digits.slice(0, Math.min(2, digits.length));
148
+ if (dd) parts.push(dd);
149
+ const mm = digits.length > 2 ? digits.slice(2, Math.min(4, digits.length)) : '';
150
+ if (mm) parts.push(mm);
151
+ const yyyy = digits.length > 4 ? digits.slice(4) : '';
152
+ if (yyyy) parts.push(yyyy);
153
+ return parts.join(' / ');
154
+ };
155
+
156
+ const parseMasked = (masked: string): Date | undefined => {
157
+ const m = masked.match(/^(\d{1,2})\s*\/\s*(\d{1,2})\s*\/\s*(\d{4})$/);
158
+ if (!m) return undefined;
159
+ const dd = Number(m[1]);
160
+ const mm = Number(m[2]);
161
+ const yyyy = Number(m[3]);
162
+ if (mm < 1 || mm > 12) return undefined;
163
+ const lastDay = new Date(yyyy, mm, 0).getDate();
164
+ if (dd < 1 || dd > lastDay) return undefined;
165
+ const out = new Date(yyyy, mm - 1, dd);
166
+ // bounds and disabled validation
167
+ if (minDate && out < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) return undefined;
168
+ if (maxDate && out > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) return undefined;
169
+ if (inDisabled(out, disabledDates)) return undefined;
170
+ return out;
171
+ };
172
+
173
+ const onFromChange = (val: string) => {
174
+ const masked = maskDate(val);
175
+ setFromInput(masked);
176
+ };
177
+ const onToChange = (val: string) => {
178
+ const masked = maskDate(val);
179
+ setToInput(masked);
180
+ };
181
+
182
+ const fromParsed = parseMasked(fromInput);
183
+ const toParsed = parseMasked(toInput);
184
+ const fromInvalid = fromTouched && !!fromInput && !fromParsed;
185
+ const toInvalid = toTouched && !!toInput && !toParsed;
186
+ const mergedFrom = fromParsed ?? draft?.from ?? undefined;
187
+ const mergedTo = toParsed ?? draft?.to ?? undefined;
188
+ const invalidRange =
189
+ !mergedFrom ||
190
+ !mergedTo ||
191
+ isDisabled(mergedFrom) ||
192
+ isDisabled(mergedTo) ||
193
+ mergedFrom > mergedTo ||
194
+ rangeContainsDisabled(mergedFrom, mergedTo, disabledDates);
195
+
196
+ const applyFromInput = () => {
197
+ setFromTouched(true);
198
+ if (!fromParsed) return;
199
+ setDraft((prev) => ({ from: fromParsed, to: prev?.to } as DateRange));
200
+ };
201
+ const applyToInput = () => {
202
+ setToTouched(true);
203
+ if (!toParsed) return;
204
+ setDraft((prev) => ({ from: prev?.from, to: toParsed } as DateRange));
205
+ };
206
+
207
+ // If current draft is invalid (e.g., starts on a disabled day), hide it from the calendar selection
208
+ const draftInvalidForSelection =
209
+ (!!draft?.from && isDisabled(draft.from)) ||
210
+ (!!draft?.to && isDisabled(draft.to)) ||
211
+ (!!draft?.from && !!draft?.to && rangeContainsDisabled(draft.from, draft.to, disabledDates));
212
+ const selectedRange = draftInvalidForSelection ? undefined : draft ?? undefined;
213
+
214
+ // Helpers for presets
215
+ const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
216
+ const startOfWeek = (d: Date) => {
217
+ const s = startOfDay(d);
218
+ return new Date(s.getFullYear(), s.getMonth(), s.getDate() - s.getDay()); // Sunday start
219
+ };
220
+ const endOfWeek = (d: Date) => {
221
+ const s = startOfWeek(d);
222
+ return new Date(s.getFullYear(), s.getMonth(), s.getDate() + 6);
223
+ };
224
+ const clamp = (d: Date) => {
225
+ let out = startOfDay(d);
226
+ if (minDate && out < startOfDay(minDate)) out = startOfDay(minDate);
227
+ if (maxDate && out > startOfDay(maxDate)) out = startOfDay(maxDate);
228
+ return out;
229
+ };
230
+ const defaultPresets: Array<{ label: string; getRange: () => DateRange }> = [
231
+ { label: 'Today', getRange: () => { const t = startOfDay(new Date()); return { from: clamp(t), to: clamp(t) }; } },
232
+ { label: 'Yesterday', getRange: () => { const t = startOfDay(new Date()); const y = new Date(t); y.setDate(t.getDate() - 1); return { from: clamp(y), to: clamp(y) }; } },
233
+ {
234
+ label: 'Last 7 days',
235
+ getRange: () => {
236
+ const end = startOfDay(new Date());
237
+ const start = new Date(end);
238
+ start.setDate(end.getDate() - 6);
239
+ return { from: clamp(start), to: clamp(end) };
240
+ },
241
+ },
242
+ {
243
+ label: 'Last 14 days',
244
+ getRange: () => {
245
+ const end = startOfDay(new Date());
246
+ const start = new Date(end);
247
+ start.setDate(end.getDate() - 13);
248
+ return { from: clamp(start), to: clamp(end) };
249
+ },
250
+ },
251
+ {
252
+ label: 'Last 30 days',
253
+ getRange: () => {
254
+ const end = startOfDay(new Date());
255
+ const start = new Date(end);
256
+ start.setDate(end.getDate() - 29);
257
+ return { from: clamp(start), to: clamp(end) };
258
+ },
259
+ },
260
+ {
261
+ label: 'This Week',
262
+ getRange: () => {
263
+ const now = new Date();
264
+ return { from: clamp(startOfWeek(now)), to: clamp(endOfWeek(now)) };
265
+ },
266
+ },
267
+ {
268
+ label: 'Last Week',
269
+ getRange: () => {
270
+ const now = new Date();
271
+ const last = new Date(now);
272
+ last.setDate(now.getDate() - 7);
273
+ return { from: clamp(startOfWeek(last)), to: clamp(endOfWeek(last)) };
274
+ },
275
+ },
276
+ {
277
+ label: 'This Month',
278
+ getRange: () => {
279
+ const now = new Date();
280
+ const from = new Date(now.getFullYear(), now.getMonth(), 1);
281
+ const to = new Date(now.getFullYear(), now.getMonth() + 1, 0);
282
+ return { from: clamp(from), to: clamp(to) };
283
+ },
284
+ },
285
+ {
286
+ label: 'Last Month',
287
+ getRange: () => {
288
+ const now = new Date();
289
+ const from = new Date(now.getFullYear(), now.getMonth() - 1, 1);
290
+ const to = new Date(now.getFullYear(), now.getMonth(), 0);
291
+ return { from: clamp(from), to: clamp(to) };
292
+ },
293
+ },
294
+ ];
295
+ const presets: Array<{ label: string; getRange: () => DateRange }> = (
296
+ props.presets ?? props.quickSelectors ?? defaultPresets
297
+ ).filter(Boolean);
298
+
299
+ const eqRange = (a?: DateRange | null, b?: DateRange | null) => {
300
+ if (!a?.from || !a?.to || !b?.from || !b?.to) return false;
301
+ return (
302
+ sameDay(a.from, b.from) &&
303
+ sameDay(a.to, b.to)
304
+ );
305
+ };
306
+
307
+ return (
308
+ <div className={cn('w-fit', className)} {...props}>
309
+ <Popover open={isOpen} onOpenChange={(o) => !disabled && setOpen(o)}>
310
+ <PopoverTrigger asChild>
311
+ <Button
312
+ type="button"
313
+ disabled={disabled}
314
+ variant={buttonVariant}
315
+ className={cn('w-[280px] justify-start text-left font-normal', !value?.from && 'text-muted-foreground')}
316
+ >
317
+ <CalendarIcon className="mr-2 h-4 w-4" />
318
+ {label}
319
+ </Button>
320
+ </PopoverTrigger>
321
+ <PopoverContent className="w-auto p-4" align="start" side={props.popoverSide ?? 'bottom'} sideOffset={8}>
322
+ <div className="flex gap-6 min-w-[900px]">
323
+ <div className="flex-1 pr-2">
324
+ {/* Inputs */}
325
+ <div className="flex items-center justify-center gap-2 mb-4 rounded-md border border-input bg-background/50 px-2 py-1 w-fit mx-auto">
326
+ <input
327
+ type="text"
328
+ inputMode="numeric"
329
+ value={fromInput}
330
+ onChange={(e) => onFromChange(e.target.value)}
331
+ onBlur={applyFromInput}
332
+ placeholder="dd/mm/yyyy"
333
+ className={cn(
334
+ 'h-9 w-40 rounded-md border bg-background px-3 text-sm shadow-xs outline-hidden',
335
+ fromInvalid ? 'border-destructive ring-1 ring-destructive/50' : 'border-input'
336
+ )}
337
+ />
338
+ <span className="text-muted-foreground">–</span>
339
+ <input
340
+ type="text"
341
+ inputMode="numeric"
342
+ value={toInput}
343
+ onChange={(e) => onToChange(e.target.value)}
344
+ onBlur={applyToInput}
345
+ placeholder="dd/mm/yyyy"
346
+ className={cn(
347
+ 'h-9 w-40 rounded-md border bg-background px-3 text-sm shadow-xs outline-hidden',
348
+ toInvalid ? 'border-destructive ring-1 ring-destructive/50' : 'border-input'
349
+ )}
350
+ />
351
+ </div>
352
+ {/* Calendar */}
353
+ <Calendar
354
+ mode="range"
355
+ numberOfMonths={numberOfMonths}
356
+ selected={selectedRange}
357
+ onSelect={(range) => {
358
+ if (disabled) return;
359
+ if (!range) {
360
+ setDraft(null);
361
+ return;
362
+ }
363
+ const { from, to } = range;
364
+ // If user attempts to start on a disabled day, ignore (DayPicker typically prevents this already)
365
+ if (from && isDisabled(from)) {
366
+ setDraft(null);
367
+ return;
368
+ }
369
+ if (to && isDisabled(to)) {
370
+ setDraft({ from, to: undefined });
371
+ return;
372
+ }
373
+ // If the selected span contains any disabled date, reset selection
374
+ if (from && to && rangeContainsDisabled(from, to, disabledDates)) {
375
+ setDraft(null);
376
+ setFromTouched(true);
377
+ setToTouched(true);
378
+ setFromInput('');
379
+ setToInput('');
380
+ return;
381
+ }
382
+ setDraft(range);
383
+ // sync inputs
384
+ setFromTouched(false);
385
+ setToTouched(false);
386
+ setFromInput(fmt(from));
387
+ setToInput(fmt(to));
388
+ }}
389
+ defaultMonth={selectedRange?.from ?? value?.from ?? new Date()}
390
+ disabled={isDisabled}
391
+ buttonVariant="ghost"
392
+ showOutsideDays
393
+ />
394
+ </div>
395
+ {(props.presetsPanel ?? true) && presets.length > 0 && (
396
+ <div className="w-64 border-l pl-4 max-h-[420px] overflow-auto">
397
+ <div className="flex flex-col gap-1">
398
+ {presets.map((p) => {
399
+ const pr = p.getRange();
400
+ const active = eqRange(draft, pr);
401
+ return (
402
+ <Button
403
+ key={p.label}
404
+ type="button"
405
+ size="sm"
406
+ variant={active ? 'secondary' : 'ghost'}
407
+ className="justify-between w-full"
408
+ onClick={() => {
409
+ // Ignore presets that include disabled dates
410
+ if (rangeContainsDisabled(pr.from, pr.to, disabledDates)) return;
411
+ setDraft(pr);
412
+ setFromTouched(false);
413
+ setToTouched(false);
414
+ setFromInput(fmt(pr.from));
415
+ setToInput(fmt(pr.to));
416
+ }}
417
+ >
418
+ {p.label}
419
+ {active ? '✓' : ''}
420
+ </Button>
421
+ );
422
+ })}
423
+ </div>
424
+ </div>
425
+ )}
426
+ </div>
427
+ {(props.showFooter ?? true) && (
428
+ <div className="flex items-center justify-end gap-2 pt-3 mt-3 border-t">
429
+ <Button type="button" variant="ghost" onClick={() => { setDraft(value ?? null); setOpen(false); }}>
430
+ {props.cancelLabel ?? 'Cancel'}
431
+ </Button>
432
+ <Button
433
+ type="button"
434
+ variant="default"
435
+ onClick={() => {
436
+ if (invalidRange || !mergedFrom || !mergedTo) return;
437
+ onChange?.({ from: mergedFrom, to: mergedTo });
438
+ setOpen(false);
439
+ }}
440
+ disabled={disabled || invalidRange}
441
+ >
442
+ {props.applyLabel ?? 'Update'}
443
+ </Button>
444
+ </div>
445
+ )}
446
+ </PopoverContent>
447
+ </Popover>
448
+ </div>
449
+ );
450
+ }
451
+
452
+ DateRangePicker.displayName = 'DateRangePicker';
453
+
454
+ export default DateRangePicker;