@fabio.caffarello/react-design-system 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +4 -2
  2. package/dist/granular/index.js +445 -0
  3. package/dist/granular/index.js.map +1 -0
  4. package/dist/granular/ui/components/Accordion/Accordion.js +105 -0
  5. package/dist/granular/ui/components/Accordion/Accordion.js.map +1 -0
  6. package/dist/granular/ui/components/Autocomplete/Autocomplete.js +133 -0
  7. package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -0
  8. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +119 -0
  9. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -0
  10. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +42 -0
  11. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -0
  12. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js +100 -0
  13. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -0
  14. package/dist/granular/ui/components/Card/Card.js +113 -0
  15. package/dist/granular/ui/components/Card/Card.js.map +1 -0
  16. package/dist/granular/ui/components/Card/CardActions.js +51 -0
  17. package/dist/granular/ui/components/Card/CardActions.js.map +1 -0
  18. package/dist/granular/ui/components/Card/CardBody.js +32 -0
  19. package/dist/granular/ui/components/Card/CardBody.js.map +1 -0
  20. package/dist/granular/ui/components/Card/CardHeader.js +47 -0
  21. package/dist/granular/ui/components/Card/CardHeader.js.map +1 -0
  22. package/dist/granular/ui/components/Card/CardSubtitle.js +38 -0
  23. package/dist/granular/ui/components/Card/CardSubtitle.js.map +1 -0
  24. package/dist/granular/ui/components/Card/CardTitle.js +61 -0
  25. package/dist/granular/ui/components/Card/CardTitle.js.map +1 -0
  26. package/dist/granular/ui/components/ColorPicker/ColorPicker.js +250 -0
  27. package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -0
  28. package/dist/granular/ui/components/CommandPalette/CommandPalette.js +274 -0
  29. package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -0
  30. package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js +37 -0
  31. package/dist/granular/ui/components/DashboardLayout/DashboardLayout.js.map +1 -0
  32. package/dist/granular/ui/components/DataGrid/DataGrid.js +155 -0
  33. package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -0
  34. package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js +113 -0
  35. package/dist/granular/ui/components/DataTablePattern/DataTablePattern.js.map +1 -0
  36. package/dist/granular/ui/components/DatePicker/DatePicker.js +126 -0
  37. package/dist/granular/ui/components/DatePicker/DatePicker.js.map +1 -0
  38. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +294 -0
  39. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -0
  40. package/dist/granular/ui/components/DatePicker/DatePickerContext.js +16 -0
  41. package/dist/granular/ui/components/DatePicker/DatePickerContext.js.map +1 -0
  42. package/dist/granular/ui/components/DatePicker/DatePickerInput.js +119 -0
  43. package/dist/granular/ui/components/DatePicker/DatePickerInput.js.map +1 -0
  44. package/dist/granular/ui/components/DatePicker/DatePickerProvider.js +47 -0
  45. package/dist/granular/ui/components/DatePicker/DatePickerProvider.js.map +1 -0
  46. package/dist/granular/ui/components/Dialog/AlertDialog.js +48 -0
  47. package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -0
  48. package/dist/granular/ui/components/Dialog/Dialog.js +36 -0
  49. package/dist/granular/ui/components/Dialog/Dialog.js.map +1 -0
  50. package/dist/granular/ui/components/Dialog/DialogClose.js +34 -0
  51. package/dist/granular/ui/components/Dialog/DialogClose.js.map +1 -0
  52. package/dist/granular/ui/components/Dialog/DialogContent.js +114 -0
  53. package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -0
  54. package/dist/granular/ui/components/Dialog/DialogDescription.js +51 -0
  55. package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -0
  56. package/dist/granular/ui/components/Dialog/DialogFooter.js +45 -0
  57. package/dist/granular/ui/components/Dialog/DialogFooter.js.map +1 -0
  58. package/dist/granular/ui/components/Dialog/DialogHeader.js +45 -0
  59. package/dist/granular/ui/components/Dialog/DialogHeader.js.map +1 -0
  60. package/dist/granular/ui/components/Dialog/DialogTitle.js +53 -0
  61. package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -0
  62. package/dist/granular/ui/components/Dialog/DialogTrigger.js +28 -0
  63. package/dist/granular/ui/components/Dialog/DialogTrigger.js.map +1 -0
  64. package/dist/granular/ui/components/Drawer/Drawer.js +47 -0
  65. package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -0
  66. package/dist/granular/ui/components/Drawer/DrawerContent.js +140 -0
  67. package/dist/granular/ui/components/Drawer/DrawerContent.js.map +1 -0
  68. package/dist/granular/ui/components/Drawer/DrawerContext.js +21 -0
  69. package/dist/granular/ui/components/Drawer/DrawerContext.js.map +1 -0
  70. package/dist/granular/ui/components/Drawer/DrawerFooter.js +53 -0
  71. package/dist/granular/ui/components/Drawer/DrawerFooter.js.map +1 -0
  72. package/dist/granular/ui/components/Drawer/DrawerHeader.js +50 -0
  73. package/dist/granular/ui/components/Drawer/DrawerHeader.js.map +1 -0
  74. package/dist/granular/ui/components/Dropdown/Dropdown.js +243 -0
  75. package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -0
  76. package/dist/granular/ui/components/EmptyState/EmptyState.js +102 -0
  77. package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -0
  78. package/dist/granular/ui/components/FileUpload/FileUpload.js +342 -0
  79. package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -0
  80. package/dist/granular/ui/components/Form/Form.js +184 -0
  81. package/dist/granular/ui/components/Form/Form.js.map +1 -0
  82. package/dist/granular/ui/components/Form/FormContext.js +19 -0
  83. package/dist/granular/ui/components/Form/FormContext.js.map +1 -0
  84. package/dist/granular/ui/components/Form/FormField.js +66 -0
  85. package/dist/granular/ui/components/Form/FormField.js.map +1 -0
  86. package/dist/granular/ui/components/Form/FormProvider.js +17 -0
  87. package/dist/granular/ui/components/Form/FormProvider.js.map +1 -0
  88. package/dist/granular/ui/components/Form/useFormFieldArray.js +29 -0
  89. package/dist/granular/ui/components/Form/useFormFieldArray.js.map +1 -0
  90. package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js +121 -0
  91. package/dist/granular/ui/components/FormWizardPattern/FormWizardPattern.js.map +1 -0
  92. package/dist/granular/ui/components/Header/Header.js +98 -0
  93. package/dist/granular/ui/components/Header/Header.js.map +1 -0
  94. package/dist/granular/ui/components/Header/components/HeaderActions.js +21 -0
  95. package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -0
  96. package/dist/granular/ui/components/Header/components/HeaderHamburger.js +31 -0
  97. package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -0
  98. package/dist/granular/ui/components/Header/components/HeaderLogo.js +50 -0
  99. package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -0
  100. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js +38 -0
  101. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -0
  102. package/dist/granular/ui/components/Header/components/HeaderNavigation.js +27 -0
  103. package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -0
  104. package/dist/granular/ui/components/Header/contexts/HeaderContext.js +49 -0
  105. package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -0
  106. package/dist/granular/ui/components/LoginBox/LoginBox.js +84 -0
  107. package/dist/granular/ui/components/LoginBox/LoginBox.js.map +1 -0
  108. package/dist/granular/ui/components/Menu/Menu.js +45 -0
  109. package/dist/granular/ui/components/Menu/Menu.js.map +1 -0
  110. package/dist/granular/ui/components/Menu/MenuContent.js +94 -0
  111. package/dist/granular/ui/components/Menu/MenuContent.js.map +1 -0
  112. package/dist/granular/ui/components/Menu/MenuContext.js +21 -0
  113. package/dist/granular/ui/components/Menu/MenuContext.js.map +1 -0
  114. package/dist/granular/ui/components/Menu/MenuItem.js +93 -0
  115. package/dist/granular/ui/components/Menu/MenuItem.js.map +1 -0
  116. package/dist/granular/ui/components/Menu/MenuSeparator.js +46 -0
  117. package/dist/granular/ui/components/Menu/MenuSeparator.js.map +1 -0
  118. package/dist/granular/ui/components/Menu/MenuTrigger.js +71 -0
  119. package/dist/granular/ui/components/Menu/MenuTrigger.js.map +1 -0
  120. package/dist/granular/ui/components/Modal/Modal.js +171 -0
  121. package/dist/granular/ui/components/Modal/Modal.js.map +1 -0
  122. package/dist/granular/ui/components/MultiSelect/MultiSelect.js +193 -0
  123. package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -0
  124. package/dist/granular/ui/components/Navigation/Navigation.js +141 -0
  125. package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -0
  126. package/dist/granular/ui/components/PageHeader/PageHeader.js +95 -0
  127. package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -0
  128. package/dist/granular/ui/components/Pagination/Pagination.js +156 -0
  129. package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -0
  130. package/dist/granular/ui/components/Popover/Popover.js +171 -0
  131. package/dist/granular/ui/components/Popover/Popover.js.map +1 -0
  132. package/dist/granular/ui/components/Rating/Rating.js +110 -0
  133. package/dist/granular/ui/components/Rating/Rating.js.map +1 -0
  134. package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js +120 -0
  135. package/dist/granular/ui/components/SearchAndFilterPattern/SearchAndFilterPattern.js.map +1 -0
  136. package/dist/granular/ui/components/SearchInput/SearchInput.js +103 -0
  137. package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -0
  138. package/dist/granular/ui/components/SideNavbar/SideNavbar.js +143 -0
  139. package/dist/granular/ui/components/SideNavbar/SideNavbar.js.map +1 -0
  140. package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js +173 -0
  141. package/dist/granular/ui/components/SideNavbar/components/Navbar/Navbar.js.map +1 -0
  142. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +87 -0
  143. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -0
  144. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +242 -0
  145. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -0
  146. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js +66 -0
  147. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarSeparator.js.map +1 -0
  148. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js +108 -0
  149. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarToggle.js.map +1 -0
  150. package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js +63 -0
  151. package/dist/granular/ui/components/SideNavbar/components/SideNavbarBackdrop.js.map +1 -0
  152. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +113 -0
  153. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -0
  154. package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js +150 -0
  155. package/dist/granular/ui/components/SideNavbar/components/SideNavbarRoot.js.map +1 -0
  156. package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js +197 -0
  157. package/dist/granular/ui/components/SideNavbar/components/SideNavbarToggle.js.map +1 -0
  158. package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js +108 -0
  159. package/dist/granular/ui/components/SideNavbar/components/Sidebar/Sidebar.js.map +1 -0
  160. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js +71 -0
  161. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarContent.js.map +1 -0
  162. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js +64 -0
  163. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarFooter.js.map +1 -0
  164. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js +141 -0
  165. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarGroup.js.map +1 -0
  166. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js +90 -0
  167. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarHeader.js.map +1 -0
  168. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js +12 -0
  169. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlot.js.map +1 -0
  170. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js +13 -0
  171. package/dist/granular/ui/components/SideNavbar/components/Sidebar/SidebarSlotContent.js.map +1 -0
  172. package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js +20 -0
  173. package/dist/granular/ui/components/SideNavbar/contexts/NavbarContext.js.map +1 -0
  174. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js +37 -0
  175. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarConfigContext.js.map +1 -0
  176. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js +20 -0
  177. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarStateContext.js.map +1 -0
  178. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js +28 -0
  179. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarThemeContext.js.map +1 -0
  180. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js +19 -0
  181. package/dist/granular/ui/components/SideNavbar/contexts/SideNavbarToggleContext.js.map +1 -0
  182. package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js +20 -0
  183. package/dist/granular/ui/components/SideNavbar/contexts/SidebarContext.js.map +1 -0
  184. package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js +22 -0
  185. package/dist/granular/ui/components/SideNavbar/contexts/SidebarSlotContext.js.map +1 -0
  186. package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js +43 -0
  187. package/dist/granular/ui/components/SideNavbar/hooks/useFocusManagement.js.map +1 -0
  188. package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js +59 -0
  189. package/dist/granular/ui/components/SideNavbar/hooks/useGroupState.js.map +1 -0
  190. package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js +34 -0
  191. package/dist/granular/ui/components/SideNavbar/hooks/useKeyboardShortcut.js.map +1 -0
  192. package/dist/granular/ui/components/SideNavbar/hooks/useResize.js +58 -0
  193. package/dist/granular/ui/components/SideNavbar/hooks/useResize.js.map +1 -0
  194. package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js +35 -0
  195. package/dist/granular/ui/components/SideNavbar/hooks/useResponsiveSidebar.js.map +1 -0
  196. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js +21 -0
  197. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbar.js.map +1 -0
  198. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js +19 -0
  199. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarContent.js.map +1 -0
  200. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js +21 -0
  201. package/dist/granular/ui/components/SideNavbar/hooks/useSideNavbarNavigation.js.map +1 -0
  202. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js +61 -0
  203. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarConfigProvider.js.map +1 -0
  204. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js +82 -0
  205. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarProvider.js.map +1 -0
  206. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +165 -0
  207. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -0
  208. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js +34 -0
  209. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarThemeProvider.js.map +1 -0
  210. package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js +28 -0
  211. package/dist/granular/ui/components/SideNavbar/providers/SidebarSlotProvider.js.map +1 -0
  212. package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js +60 -0
  213. package/dist/granular/ui/components/SideNavbar/utils/parseKeyboardShortcut.js.map +1 -0
  214. package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js +19 -0
  215. package/dist/granular/ui/components/SideNavbar/utils/parseWidth.js.map +1 -0
  216. package/dist/granular/ui/components/Stat/Stat.js +84 -0
  217. package/dist/granular/ui/components/Stat/Stat.js.map +1 -0
  218. package/dist/granular/ui/components/Stat/StatGroup.js +61 -0
  219. package/dist/granular/ui/components/Stat/StatGroup.js.map +1 -0
  220. package/dist/granular/ui/components/Stepper/Stepper.js +248 -0
  221. package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -0
  222. package/dist/granular/ui/components/Table/Table.js +162 -0
  223. package/dist/granular/ui/components/Table/Table.js.map +1 -0
  224. package/dist/granular/ui/components/Table/TableActions/TableActions.js +67 -0
  225. package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -0
  226. package/dist/granular/ui/components/Table/TableActions.js +44 -0
  227. package/dist/granular/ui/components/Table/TableActions.js.map +1 -0
  228. package/dist/granular/ui/components/Table/TableBody.js +134 -0
  229. package/dist/granular/ui/components/Table/TableBody.js.map +1 -0
  230. package/dist/granular/ui/components/Table/TableCell.js +40 -0
  231. package/dist/granular/ui/components/Table/TableCell.js.map +1 -0
  232. package/dist/granular/ui/components/Table/TableContext.js +19 -0
  233. package/dist/granular/ui/components/Table/TableContext.js.map +1 -0
  234. package/dist/granular/ui/components/Table/TableEmptyState.js +62 -0
  235. package/dist/granular/ui/components/Table/TableEmptyState.js.map +1 -0
  236. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +189 -0
  237. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -0
  238. package/dist/granular/ui/components/Table/TableFilters.js +48 -0
  239. package/dist/granular/ui/components/Table/TableFilters.js.map +1 -0
  240. package/dist/granular/ui/components/Table/TableHeader.js +45 -0
  241. package/dist/granular/ui/components/Table/TableHeader.js.map +1 -0
  242. package/dist/granular/ui/components/Table/TableHeaderCell.js +117 -0
  243. package/dist/granular/ui/components/Table/TableHeaderCell.js.map +1 -0
  244. package/dist/granular/ui/components/Table/TableHeaderRow.js +89 -0
  245. package/dist/granular/ui/components/Table/TableHeaderRow.js.map +1 -0
  246. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js +216 -0
  247. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -0
  248. package/dist/granular/ui/components/Table/TablePagination.js +56 -0
  249. package/dist/granular/ui/components/Table/TablePagination.js.map +1 -0
  250. package/dist/granular/ui/components/Table/TableProvider.js +244 -0
  251. package/dist/granular/ui/components/Table/TableProvider.js.map +1 -0
  252. package/dist/granular/ui/components/Table/TableRow.js +95 -0
  253. package/dist/granular/ui/components/Table/TableRow.js.map +1 -0
  254. package/dist/granular/ui/components/Table/useColumnResizing.js +71 -0
  255. package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -0
  256. package/dist/granular/ui/components/Table/useVirtualScrolling.js +50 -0
  257. package/dist/granular/ui/components/Table/useVirtualScrolling.js.map +1 -0
  258. package/dist/granular/ui/components/Tabs/Tabs.js +39 -0
  259. package/dist/granular/ui/components/Tabs/Tabs.js.map +1 -0
  260. package/dist/granular/ui/components/Tabs/TabsContent.js +59 -0
  261. package/dist/granular/ui/components/Tabs/TabsContent.js.map +1 -0
  262. package/dist/granular/ui/components/Tabs/TabsContext.js +18 -0
  263. package/dist/granular/ui/components/Tabs/TabsContext.js.map +1 -0
  264. package/dist/granular/ui/components/Tabs/TabsList.js +84 -0
  265. package/dist/granular/ui/components/Tabs/TabsList.js.map +1 -0
  266. package/dist/granular/ui/components/Tabs/TabsProvider.js +31 -0
  267. package/dist/granular/ui/components/Tabs/TabsProvider.js.map +1 -0
  268. package/dist/granular/ui/components/Tabs/TabsTrigger.js +103 -0
  269. package/dist/granular/ui/components/Tabs/TabsTrigger.js.map +1 -0
  270. package/dist/granular/ui/components/TimePicker/TimePicker.js +216 -0
  271. package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -0
  272. package/dist/granular/ui/components/Timeline/Timeline.js +152 -0
  273. package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -0
  274. package/dist/granular/ui/components/Toast/Toast.js +159 -0
  275. package/dist/granular/ui/components/Toast/Toast.js.map +1 -0
  276. package/dist/granular/ui/components/Toast/ToastContainer.js +41 -0
  277. package/dist/granular/ui/components/Toast/ToastContainer.js.map +1 -0
  278. package/dist/granular/ui/components/Toast/useToast.js +64 -0
  279. package/dist/granular/ui/components/Toast/useToast.js.map +1 -0
  280. package/dist/granular/ui/hooks/createGenericContext.js +27 -0
  281. package/dist/granular/ui/hooks/createGenericContext.js.map +1 -0
  282. package/dist/granular/ui/hooks/focusable.js +14 -0
  283. package/dist/granular/ui/hooks/focusable.js.map +1 -0
  284. package/dist/granular/ui/hooks/useAutoFocus.js +23 -0
  285. package/dist/granular/ui/hooks/useAutoFocus.js.map +1 -0
  286. package/dist/granular/ui/hooks/useCollapsible.js +37 -0
  287. package/dist/granular/ui/hooks/useCollapsible.js.map +1 -0
  288. package/dist/granular/ui/hooks/useFocusRestore.js +20 -0
  289. package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -0
  290. package/dist/granular/ui/hooks/useFocusTrap.js +31 -0
  291. package/dist/granular/ui/hooks/useFocusTrap.js.map +1 -0
  292. package/dist/granular/ui/hooks/useScrollSpy.js +23 -0
  293. package/dist/granular/ui/hooks/useScrollSpy.js.map +1 -0
  294. package/dist/granular/ui/layouts/Container/Container.js +73 -0
  295. package/dist/granular/ui/layouts/Container/Container.js.map +1 -0
  296. package/dist/granular/ui/layouts/Stack/Stack.js +79 -0
  297. package/dist/granular/ui/layouts/Stack/Stack.js.map +1 -0
  298. package/dist/granular/ui/primitives/Avatar/Avatar.js +122 -0
  299. package/dist/granular/ui/primitives/Avatar/Avatar.js.map +1 -0
  300. package/dist/granular/ui/primitives/Avatar/AvatarGroup.js +97 -0
  301. package/dist/granular/ui/primitives/Avatar/AvatarGroup.js.map +1 -0
  302. package/dist/granular/ui/primitives/Badge/Badge.js +212 -0
  303. package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -0
  304. package/dist/granular/ui/primitives/Button/Button.js +288 -0
  305. package/dist/granular/ui/primitives/Button/Button.js.map +1 -0
  306. package/dist/granular/ui/primitives/Checkbox/Checkbox.js +129 -0
  307. package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -0
  308. package/dist/granular/ui/primitives/Chip/Chip.js +206 -0
  309. package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -0
  310. package/dist/granular/ui/primitives/Collapsible/Collapsible.js +115 -0
  311. package/dist/granular/ui/primitives/Collapsible/Collapsible.js.map +1 -0
  312. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js +54 -0
  313. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -0
  314. package/dist/granular/ui/primitives/Info/Info.js +57 -0
  315. package/dist/granular/ui/primitives/Info/Info.js.map +1 -0
  316. package/dist/granular/ui/primitives/Input/Input.js +351 -0
  317. package/dist/granular/ui/primitives/Input/Input.js.map +1 -0
  318. package/dist/granular/ui/primitives/Label/Label.js +61 -0
  319. package/dist/granular/ui/primitives/Label/Label.js.map +1 -0
  320. package/dist/granular/ui/primitives/NavLink/NavLink.js +229 -0
  321. package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -0
  322. package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js +15 -0
  323. package/dist/granular/ui/primitives/NavLink/hooks/useNavLink.js.map +1 -0
  324. package/dist/granular/ui/primitives/Progress/Progress.js +182 -0
  325. package/dist/granular/ui/primitives/Progress/Progress.js.map +1 -0
  326. package/dist/granular/ui/primitives/Radio/Radio.js +118 -0
  327. package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -0
  328. package/dist/granular/ui/primitives/Select/Select.js +210 -0
  329. package/dist/granular/ui/primitives/Select/Select.js.map +1 -0
  330. package/dist/granular/ui/primitives/Separator/Separator.js +69 -0
  331. package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -0
  332. package/dist/granular/ui/primitives/Skeleton/Skeleton.js +87 -0
  333. package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -0
  334. package/dist/granular/ui/primitives/Slider/Slider.js +291 -0
  335. package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -0
  336. package/dist/granular/ui/primitives/Spinner/Spinner.js +95 -0
  337. package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -0
  338. package/dist/granular/ui/primitives/Switch/Switch.js +212 -0
  339. package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -0
  340. package/dist/granular/ui/primitives/Text/Text.js +118 -0
  341. package/dist/granular/ui/primitives/Text/Text.js.map +1 -0
  342. package/dist/granular/ui/primitives/Textarea/Textarea.js +129 -0
  343. package/dist/granular/ui/primitives/Textarea/Textarea.js.map +1 -0
  344. package/dist/granular/ui/primitives/Tooltip/Tooltip.js +227 -0
  345. package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -0
  346. package/dist/granular/ui/providers/AppProvider.js +50 -0
  347. package/dist/granular/ui/providers/AppProvider.js.map +1 -0
  348. package/dist/granular/ui/providers/ConfigProvider.js +95 -0
  349. package/dist/granular/ui/providers/ConfigProvider.js.map +1 -0
  350. package/dist/granular/ui/providers/DialogContext.js +20 -0
  351. package/dist/granular/ui/providers/DialogContext.js.map +1 -0
  352. package/dist/granular/ui/providers/DialogProvider.js +32 -0
  353. package/dist/granular/ui/providers/DialogProvider.js.map +1 -0
  354. package/dist/granular/ui/providers/ThemeProvider.js +56 -0
  355. package/dist/granular/ui/providers/ThemeProvider.js.map +1 -0
  356. package/dist/granular/ui/providers/ToastContext.js +20 -0
  357. package/dist/granular/ui/providers/ToastContext.js.map +1 -0
  358. package/dist/granular/ui/providers/ToastProvider.js +47 -0
  359. package/dist/granular/ui/providers/ToastProvider.js.map +1 -0
  360. package/dist/granular/ui/providers/providers-bundle.js +23 -0
  361. package/dist/granular/ui/providers/providers-bundle.js.map +1 -0
  362. package/dist/granular/ui/tokens/animations.js +106 -0
  363. package/dist/granular/ui/tokens/animations.js.map +1 -0
  364. package/dist/granular/ui/tokens/borders.js +54 -0
  365. package/dist/granular/ui/tokens/borders.js.map +1 -0
  366. package/dist/granular/ui/tokens/breakpoints.js +43 -0
  367. package/dist/granular/ui/tokens/breakpoints.js.map +1 -0
  368. package/dist/granular/ui/tokens/colors/brand.js +67 -0
  369. package/dist/granular/ui/tokens/colors/brand.js.map +1 -0
  370. package/dist/granular/ui/tokens/colors/index.js +25 -0
  371. package/dist/granular/ui/tokens/colors/index.js.map +1 -0
  372. package/dist/granular/ui/tokens/colors/primitives.js +320 -0
  373. package/dist/granular/ui/tokens/colors/primitives.js.map +1 -0
  374. package/dist/granular/ui/tokens/colors/semantic.js +212 -0
  375. package/dist/granular/ui/tokens/colors/semantic.js.map +1 -0
  376. package/dist/granular/ui/tokens/colors/types.js +18 -0
  377. package/dist/granular/ui/tokens/colors/types.js.map +1 -0
  378. package/dist/granular/ui/tokens/colors/utils.js +131 -0
  379. package/dist/granular/ui/tokens/colors/utils.js.map +1 -0
  380. package/dist/granular/ui/tokens/opacity.js +59 -0
  381. package/dist/granular/ui/tokens/opacity.js.map +1 -0
  382. package/dist/granular/ui/tokens/radius.js +76 -0
  383. package/dist/granular/ui/tokens/radius.js.map +1 -0
  384. package/dist/granular/ui/tokens/shadows.js +63 -0
  385. package/dist/granular/ui/tokens/shadows.js.map +1 -0
  386. package/dist/granular/ui/tokens/sidebar.js +92 -0
  387. package/dist/granular/ui/tokens/sidebar.js.map +1 -0
  388. package/dist/granular/ui/tokens/spacing.js +143 -0
  389. package/dist/granular/ui/tokens/spacing.js.map +1 -0
  390. package/dist/granular/ui/tokens/switch.js +51 -0
  391. package/dist/granular/ui/tokens/switch.js.map +1 -0
  392. package/dist/granular/ui/tokens/typography.js +146 -0
  393. package/dist/granular/ui/tokens/typography.js.map +1 -0
  394. package/dist/granular/ui/tokens/z-index.js +79 -0
  395. package/dist/granular/ui/tokens/z-index.js.map +1 -0
  396. package/dist/granular/ui/utils/cn.js +10 -0
  397. package/dist/granular/ui/utils/cn.js.map +1 -0
  398. package/dist/granular/ui/utils/cva.js +14 -0
  399. package/dist/granular/ui/utils/cva.js.map +1 -0
  400. package/dist/granular/ui/utils/mergeRefs.js +11 -0
  401. package/dist/granular/ui/utils/mergeRefs.js.map +1 -0
  402. package/dist/granular/vite.svg +1 -0
  403. package/dist/hooks/index.cjs +2 -0
  404. package/dist/hooks/index.cjs.map +1 -0
  405. package/dist/hooks/index.js +23 -0
  406. package/dist/hooks/index.js.map +1 -0
  407. package/dist/index.cjs +44 -70
  408. package/dist/index.cjs.map +1 -1
  409. package/dist/index.js +1900 -1885
  410. package/dist/index.js.map +1 -1
  411. package/dist/react-design-system.css +1 -1
  412. package/dist/server/index.cjs +23 -23
  413. package/dist/server/index.cjs.map +1 -1
  414. package/dist/server/index.js +863 -1180
  415. package/dist/server/index.js.map +1 -1
  416. package/dist/ui/components/Accordion/Accordion.d.ts +9 -1
  417. package/dist/ui/hooks-entry.d.ts +2 -0
  418. package/dist/ui/utils/tailwind-safelist.d.ts +3 -1
  419. package/package.json +24 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTablePattern.js","sources":["../../../../../src/ui/components/DataTablePattern/DataTablePattern.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useMemo } from \"react\";\nimport { Table } from \"../../components\";\nimport { Pagination, SearchInput } from \"../../components\";\nimport { Container } from \"../../layouts/Container/Container\";\nimport { Stack } from \"../../layouts/Stack/Stack\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\nimport type { TableColumn } from \"../../components/Table/TableTypes\";\n\n// Extended TableColumn type for DataTablePattern (supports accessor and header for backward compatibility)\nexport interface DataTableColumn<T = unknown> extends Omit<\n TableColumn<T>,\n \"key\" | \"label\"\n> {\n key?: keyof T | string;\n label?: string;\n // Legacy support\n accessor?: keyof T | string | ((row: T) => unknown);\n header?: string;\n}\n\nexport interface DataTablePatternProps<T = unknown> {\n /**\n * Table columns configuration\n * Supports both TableColumn format (key, label) and legacy format (accessor, header)\n */\n columns: DataTableColumn<T>[];\n /**\n * Table data rows\n */\n data: T[];\n /**\n * Search placeholder text\n * @default \"Search...\"\n */\n searchPlaceholder?: string;\n /**\n * Enable search functionality\n * @default true\n */\n enableSearch?: boolean;\n /**\n * Items per page\n * @default 10\n */\n itemsPerPage?: number;\n /**\n * Enable pagination\n * @default true\n */\n enablePagination?: boolean;\n /**\n * Action buttons to display above the table\n */\n actions?: React.ReactNode;\n /**\n * Callback when row is clicked\n */\n onRowClick?: (row: T, index: number) => void;\n /**\n * Loading state\n */\n loading?: boolean;\n /**\n * Empty state message\n */\n emptyMessage?: string;\n}\n\n/**\n * DataTablePattern - A complete data table pattern combining Table, Pagination, Search, and Actions\n *\n * This pattern solves the common UX problem of displaying searchable, paginated data tables\n * with actions. It combines multiple components into a cohesive solution.\n *\n * @example\n * ```tsx\n * <DataTablePattern\n * columns={columns}\n * data={data}\n * enableSearch\n * enablePagination\n * actions={<Button>Export</Button>}\n * />\n * ```\n */\nexport function DataTablePattern<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n columns,\n data,\n searchPlaceholder = \"Search...\",\n enableSearch = true,\n itemsPerPage = 10,\n enablePagination = true,\n actions,\n onRowClick,\n loading = false,\n emptyMessage = \"No data available\",\n}: DataTablePatternProps<T>) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [currentPage, setCurrentPage] = useState(1);\n\n // Convert columns to Table format (key/label from accessor/header if needed)\n const tableColumns: TableColumn<T>[] = useMemo(() => {\n return columns.map((column) => {\n // If using legacy format (accessor/header), convert to key/label\n if (column.accessor || column.header) {\n const key =\n column.key ||\n (typeof column.accessor === \"string\"\n ? column.accessor\n : String(column.accessor));\n const label = column.label || column.header || \"\";\n return {\n ...column,\n key: key as keyof T | string,\n label,\n } as TableColumn<T>;\n }\n // Otherwise use as-is (already in TableColumn format)\n return column as TableColumn<T>;\n });\n }, [columns]);\n\n // Filter data based on search query\n const filteredData = useMemo(() => {\n if (!searchQuery.trim()) return data;\n\n const query = searchQuery.toLowerCase();\n return data.filter((row) => {\n return tableColumns.some((column) => {\n const value = (row as Record<string, unknown>)[String(column.key)];\n return String(value).toLowerCase().includes(query);\n });\n });\n }, [data, searchQuery, tableColumns]);\n\n // Paginate filtered data\n const paginatedData = useMemo(() => {\n if (!enablePagination) return filteredData;\n\n const startIndex = (currentPage - 1) * itemsPerPage;\n const endIndex = startIndex + itemsPerPage;\n return filteredData.slice(startIndex, endIndex);\n }, [filteredData, currentPage, itemsPerPage, enablePagination]);\n\n const totalPages = enablePagination\n ? Math.ceil(filteredData.length / itemsPerPage)\n : 1;\n\n const handlePageChange = (page: number) => {\n setCurrentPage(page);\n };\n\n const handleSearchChange = (value: string) => {\n setSearchQuery(value);\n setCurrentPage(1); // Reset to first page on search\n };\n\n return (\n <Container maxWidth=\"full\" paddingX=\"base\" paddingY=\"base\">\n <Stack spacing=\"md\">\n {/* Header with Search and Actions */}\n <div\n className={`flex items-center justify-between ${getSpacingClass(\"base\", \"gap\")}`}\n >\n {enableSearch && (\n <div className=\"flex-1 max-w-md\">\n <SearchInput\n placeholder={searchPlaceholder}\n value={searchQuery}\n onSearch={handleSearchChange}\n />\n </div>\n )}\n {actions && (\n <div className={`flex ${getSpacingClass(\"sm\", \"gap\")}`}>\n {actions}\n </div>\n )}\n </div>\n\n {/* Table */}\n <Table\n columns={tableColumns}\n data={paginatedData}\n loading={loading}\n emptyMessage={emptyMessage}\n onRowClick={\n onRowClick\n ? (row) => {\n // Find the index of the row in filteredData (not paginated) for accurate index\n const globalIndex = filteredData.findIndex((r) => r === row);\n onRowClick(\n row,\n globalIndex >= 0\n ? globalIndex\n : paginatedData.findIndex((r) => r === row),\n );\n }\n : undefined\n }\n />\n\n {/* Pagination */}\n {enablePagination && totalPages > 1 && (\n <div className=\"flex justify-center\">\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={handlePageChange}\n />\n </div>\n )}\n\n {/* Results count */}\n {enableSearch && (\n <div className=\"text-sm text-fg-secondary text-center\">\n Showing {paginatedData.length} of {filteredData.length} results\n </div>\n )}\n </Stack>\n </Container>\n );\n}\n"],"names":["DataTablePattern","columns","data","searchPlaceholder","enableSearch","itemsPerPage","enablePagination","actions","onRowClick","loading","emptyMessage","searchQuery","setSearchQuery","useState","currentPage","setCurrentPage","tableColumns","useMemo","column","key","label","__spreadProps","__spreadValues","filteredData","query","row","value","paginatedData","startIndex","endIndex","totalPages","handlePageChange","page","handleSearchChange","jsx","Container","jsxs","Stack","getSpacingClass","SearchInput","Table","globalIndex","r","Pagination"],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use client";
2
+ import { jsx as r, jsxs as B } from "react/jsx-runtime";
3
+ import { useState as I, useRef as P, useEffect as v } from "react";
4
+ import { createPortal as F } from "react-dom";
5
+ import { DatePickerProvider as E } from "./DatePickerProvider.js";
6
+ import { DatePickerInput as $ } from "./DatePickerInput.js";
7
+ import { DatePickerCalendar as h } from "./DatePickerCalendar.js";
8
+ import { getZIndexClass as X } from "../../tokens/z-index.js";
9
+ import { getRadiusClass as Y } from "../../tokens/radius.js";
10
+ import { getShadowClass as Z } from "../../tokens/shadows.js";
11
+ function d({
12
+ children: i,
13
+ mode: e = "single",
14
+ value: l,
15
+ defaultValue: c,
16
+ onValueChange: a,
17
+ minDate: t,
18
+ maxDate: p,
19
+ disabledDates: o,
20
+ placeholder: u,
21
+ format: L,
22
+ showCalendarButton: O = !0,
23
+ "aria-label": R,
24
+ className: j = ""
25
+ }) {
26
+ const [n, f] = I(!1), m = P(null), w = P(null);
27
+ return v(() => {
28
+ if (!n) return;
29
+ const s = (k) => {
30
+ var C, b, x, y;
31
+ const g = k.target, N = (b = (C = m.current) == null ? void 0 : C.contains(g)) != null ? b : !1, S = (y = (x = w.current) == null ? void 0 : x.contains(g)) != null ? y : !1;
32
+ !N && !S && f(!1);
33
+ };
34
+ return document.addEventListener("mousedown", s), () => document.removeEventListener("mousedown", s);
35
+ }, [n]), v(() => {
36
+ if (!n) return;
37
+ const s = (k) => {
38
+ k.key === "Escape" && f(!1);
39
+ };
40
+ return document.addEventListener("keydown", s), () => document.removeEventListener("keydown", s);
41
+ }, [n]), i ? /* @__PURE__ */ r(
42
+ E,
43
+ {
44
+ mode: e,
45
+ value: l,
46
+ defaultValue: c,
47
+ onValueChange: a,
48
+ minDate: t,
49
+ maxDate: p,
50
+ disabledDates: o,
51
+ children: i
52
+ }
53
+ ) : /* @__PURE__ */ r("div", { ref: m, className: `relative ${j}`, children: /* @__PURE__ */ B(
54
+ E,
55
+ {
56
+ mode: e,
57
+ value: l,
58
+ defaultValue: c,
59
+ onValueChange: a,
60
+ minDate: t,
61
+ maxDate: p,
62
+ disabledDates: o,
63
+ children: [
64
+ /* @__PURE__ */ r(
65
+ $,
66
+ {
67
+ placeholder: u,
68
+ format: L,
69
+ showCalendarButton: O,
70
+ "aria-label": R,
71
+ onFocus: () => f(!0)
72
+ }
73
+ ),
74
+ n && /* @__PURE__ */ r(D, { containerRef: m, popupRef: w, children: /* @__PURE__ */ r(h, {}) })
75
+ ]
76
+ }
77
+ ) });
78
+ }
79
+ function D({
80
+ children: i,
81
+ containerRef: e,
82
+ popupRef: l
83
+ }) {
84
+ const c = P(null), a = l || c, [t, p] = I(null);
85
+ if (v(() => {
86
+ if (e != null && e.current) {
87
+ const u = e.current.getBoundingClientRect();
88
+ p({
89
+ top: u.bottom + window.scrollY + 8,
90
+ left: u.left + window.scrollX
91
+ });
92
+ }
93
+ }, [e]), !t)
94
+ return null;
95
+ const o = /* @__PURE__ */ r(
96
+ "div",
97
+ {
98
+ ref: a,
99
+ className: `
100
+ fixed ${X("popover")}
101
+ bg-surface-overlay
102
+ ${Y("lg")}
103
+ ${Z("xl")}
104
+ border border-line-default
105
+ `,
106
+ role: "dialog",
107
+ "aria-modal": "false",
108
+ "aria-label": "Date picker calendar",
109
+ style: {
110
+ top: `${t.top}px`,
111
+ left: `${t.left}px`
112
+ },
113
+ children: i
114
+ }
115
+ );
116
+ return typeof window != "undefined" ? F(o, document.body) : o;
117
+ }
118
+ d.Input = $;
119
+ d.Calendar = h;
120
+ d.Popup = D;
121
+ const T = d;
122
+ export {
123
+ d as DatePickerComponent,
124
+ T as default
125
+ };
126
+ //# sourceMappingURL=DatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker.js","sources":["../../../../../src/ui/components/DatePicker/DatePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { DatePickerProvider } from \"./DatePickerProvider\";\nimport { DatePickerInput } from \"./DatePickerInput\";\nimport { DatePickerCalendar } from \"./DatePickerCalendar\";\nimport { getRadiusClass, getShadowClass, getZIndexClass } from \"../../tokens\";\n\nexport interface DatePickerProps {\n children?: ReactNode;\n mode?: \"single\" | \"range\";\n value?: Date | { start: Date | null; end: Date | null };\n defaultValue?: Date | { start: Date | null; end: Date | null };\n onValueChange?: (\n value: Date | { start: Date | null; end: Date | null } | null,\n ) => void;\n minDate?: Date;\n maxDate?: Date;\n disabledDates?: Date[];\n placeholder?: string;\n format?: string;\n showCalendarButton?: boolean;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/**\n * DatePicker Component\n *\n * A flexible date picker component with single date and range selection.\n * Supports keyboard navigation and basic localization.\n *\n * @example\n * ```tsx\n * // Single date\n * <DatePicker\n * value={selectedDate}\n * onValueChange={setSelectedDate}\n * />\n *\n * // Date range\n * <DatePicker\n * mode=\"range\"\n * value={{ start: rangeStart, end: rangeEnd }}\n * onValueChange={setRange}\n * />\n *\n * // Compound components\n * <DatePicker>\n * <DatePicker.Input />\n * <DatePicker.Calendar />\n * </DatePicker>\n * ```\n */\nfunction DatePickerComponent({\n children,\n mode = \"single\",\n value,\n defaultValue,\n onValueChange,\n minDate,\n maxDate,\n disabledDates,\n placeholder,\n format,\n showCalendarButton = true,\n \"aria-label\": ariaLabel,\n className = \"\",\n}: DatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n // Close calendar when clicking outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n\n // Check if click is outside both container and popup\n const clickedInsideContainer =\n containerRef.current?.contains(target) ?? false;\n const clickedInsidePopup = popupRef.current?.contains(target) ?? false;\n\n // Close if clicked outside both container and popup\n if (!clickedInsideContainer && !clickedInsidePopup) {\n setIsOpen(false);\n }\n };\n\n // Use mousedown instead of click to catch the event before it bubbles\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n // If children provided, use compound component API\n if (children) {\n return (\n <DatePickerProvider\n mode={mode}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n minDate={minDate}\n maxDate={maxDate}\n disabledDates={disabledDates}\n >\n {children}\n </DatePickerProvider>\n );\n }\n\n // Otherwise, use simplified API\n return (\n <div ref={containerRef} className={`relative ${className}`}>\n <DatePickerProvider\n mode={mode}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n minDate={minDate}\n maxDate={maxDate}\n disabledDates={disabledDates}\n >\n <DatePickerInput\n placeholder={placeholder}\n format={format}\n showCalendarButton={showCalendarButton}\n aria-label={ariaLabel}\n onFocus={() => setIsOpen(true)}\n />\n {isOpen && (\n <DatePickerPopup containerRef={containerRef} popupRef={popupRef}>\n <DatePickerCalendar />\n </DatePickerPopup>\n )}\n </DatePickerProvider>\n </div>\n );\n}\n\n// Popup component for calendar\nfunction DatePickerPopup({\n children,\n containerRef,\n popupRef: externalPopupRef,\n}: {\n children: ReactNode;\n containerRef?: RefObject<HTMLDivElement | null>;\n popupRef?: RefObject<HTMLDivElement | null>;\n}) {\n const internalPopupRef = useRef<HTMLDivElement>(null);\n const popupRef = externalPopupRef || internalPopupRef;\n const [position, setPosition] = useState<{\n top: number;\n left: number;\n } | null>(null);\n\n // Calculate position relative to container\n useEffect(() => {\n if (containerRef?.current) {\n const containerRect = containerRef.current.getBoundingClientRect();\n\n setPosition({\n top: containerRect.bottom + window.scrollY + 8,\n left: containerRect.left + window.scrollX,\n });\n }\n }, [containerRef]);\n\n if (!position) {\n return null; // Wait for position calculation\n }\n\n const popup = (\n <div\n ref={popupRef}\n className={`\n fixed ${getZIndexClass(\"popover\")}\n bg-surface-overlay\n ${getRadiusClass(\"lg\")}\n ${getShadowClass(\"xl\")}\n border border-line-default\n `}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Date picker calendar\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}px`,\n }}\n >\n {children}\n </div>\n );\n\n // Portal rendering for better z-index handling\n if (typeof window !== \"undefined\") {\n return createPortal(popup, document.body);\n }\n\n return popup;\n}\n\n// Compound components\nDatePickerComponent.Input = DatePickerInput;\nDatePickerComponent.Calendar = DatePickerCalendar;\nDatePickerComponent.Popup = DatePickerPopup;\n\n// Type declaration for compound components\nexport interface DatePickerComponentType extends React.FC<DatePickerProps> {\n Input: typeof DatePickerInput;\n Calendar: typeof DatePickerCalendar;\n Popup: typeof DatePickerPopup;\n}\n\n// Cast to include compound components and export as DatePicker\nconst DatePicker: DatePickerComponentType =\n DatePickerComponent as DatePickerComponentType;\n\nexport { DatePickerComponent };\nexport default DatePicker;\n"],"names":["DatePickerComponent","children","mode","value","defaultValue","onValueChange","minDate","maxDate","disabledDates","placeholder","format","showCalendarButton","ariaLabel","className","isOpen","setIsOpen","useState","containerRef","useRef","popupRef","useEffect","handleClickOutside","event","target","clickedInsideContainer","_b","_a","clickedInsidePopup","_d","_c","handleEscape","e","jsx","DatePickerProvider","jsxs","DatePickerInput","DatePickerPopup","DatePickerCalendar","externalPopupRef","internalPopupRef","position","setPosition","containerRect","popup","getZIndexClass","getRadiusClass","getShadowClass","createPortal","DatePicker"],"mappings":"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"}
@@ -0,0 +1,294 @@
1
+ "use client";
2
+ var te = Object.defineProperty, re = Object.defineProperties;
3
+ var ne = Object.getOwnPropertyDescriptors;
4
+ var w = Object.getOwnPropertySymbols;
5
+ var A = Object.prototype.hasOwnProperty, I = Object.prototype.propertyIsEnumerable;
6
+ var T = (t, r, a) => r in t ? te(t, r, { enumerable: !0, configurable: !0, writable: !0, value: a }) : t[r] = a, C = (t, r) => {
7
+ for (var a in r || (r = {}))
8
+ A.call(r, a) && T(t, a, r[a]);
9
+ if (w)
10
+ for (var a of w(r))
11
+ I.call(r, a) && T(t, a, r[a]);
12
+ return t;
13
+ }, E = (t, r) => re(t, ne(r));
14
+ var P = (t, r) => {
15
+ var a = {};
16
+ for (var l in t)
17
+ A.call(t, l) && r.indexOf(l) < 0 && (a[l] = t[l]);
18
+ if (t != null && w)
19
+ for (var l of w(t))
20
+ r.indexOf(l) < 0 && I.call(t, l) && (a[l] = t[l]);
21
+ return a;
22
+ };
23
+ import { jsxs as v, jsx as u } from "react/jsx-runtime";
24
+ import { useState as j, useRef as se, useEffect as q } from "react";
25
+ import { ChevronLeft as ae, ChevronRight as le } from "lucide-react";
26
+ import { useDatePickerContext as ie } from "./DatePickerContext.js";
27
+ import { Button as J } from "../../primitives/Button/Button.js";
28
+ import { getSpacingClass as g } from "../../tokens/spacing.js";
29
+ import { getRadiusClass as oe } from "../../tokens/radius.js";
30
+ function ue(t) {
31
+ return new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();
32
+ }
33
+ function ce(t) {
34
+ return new Date(t.getFullYear(), t.getMonth(), 1).getDay();
35
+ }
36
+ function c(t, r) {
37
+ return !t || !r ? !1 : t.getFullYear() === r.getFullYear() && t.getMonth() === r.getMonth() && t.getDate() === r.getDate();
38
+ }
39
+ function D(t, r) {
40
+ return t.getFullYear() === r.getFullYear() && t.getMonth() === r.getMonth();
41
+ }
42
+ function fe(t, r, a) {
43
+ if (!r || !a) return !1;
44
+ const l = t.getTime();
45
+ return l >= r.getTime() && l <= a.getTime();
46
+ }
47
+ function K(t, r, a, l) {
48
+ return !!(r && t < r || a && t > a || l != null && l.some((M) => c(t, M)));
49
+ }
50
+ const ge = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], me = [
51
+ "January",
52
+ "February",
53
+ "March",
54
+ "April",
55
+ "May",
56
+ "June",
57
+ "July",
58
+ "August",
59
+ "September",
60
+ "October",
61
+ "November",
62
+ "December"
63
+ ];
64
+ function Me(M) {
65
+ var Y = M, {
66
+ month: t,
67
+ onMonthChange: r,
68
+ className: a = ""
69
+ } = Y, l = P(Y, [
70
+ "month",
71
+ "onMonthChange",
72
+ "className"
73
+ ]);
74
+ const {
75
+ selectedDate: f,
76
+ selectedRange: i,
77
+ mode: h,
78
+ onDateChange: z,
79
+ onRangeChange: y,
80
+ minDate: x,
81
+ maxDate: S,
82
+ disabledDates: d
83
+ } = ie(), [o, b] = j(
84
+ t || f || (i == null ? void 0 : i.start) || /* @__PURE__ */ new Date()
85
+ ), F = se(null), [m, H] = j(() => {
86
+ const e = /* @__PURE__ */ new Date(), n = t || f || (i == null ? void 0 : i.start) || e;
87
+ return f && D(f, n) ? f : D(e, n) ? e : new Date(n.getFullYear(), n.getMonth(), 1);
88
+ });
89
+ q(() => {
90
+ t && b(t);
91
+ }, [t]), q(() => {
92
+ if (!F.current) return;
93
+ const e = F.current.querySelector(
94
+ `[data-date="${m.toISOString()}"]`
95
+ );
96
+ e && e.focus();
97
+ }, [m]);
98
+ const L = (() => {
99
+ if (D(m, o)) return m;
100
+ const e = /* @__PURE__ */ new Date();
101
+ return D(e, o) ? e : new Date(o.getFullYear(), o.getMonth(), 1);
102
+ })(), R = ue(o), W = ce(o), p = [];
103
+ for (let e = 0; e < W; e++)
104
+ p.push(null);
105
+ for (let e = 1; e <= R; e++)
106
+ p.push(
107
+ new Date(o.getFullYear(), o.getMonth(), e)
108
+ );
109
+ const k = (e) => {
110
+ if (!K(e, x, S, d)) {
111
+ if (h === "single")
112
+ z(e);
113
+ else if (h === "range") {
114
+ const n = i || { start: null, end: null };
115
+ !n.start || n.start && n.end ? y({ start: e, end: null }) : n.start && !n.end && (e < n.start ? y({ start: e, end: n.start }) : y({ start: n.start, end: e }));
116
+ }
117
+ }
118
+ }, B = () => {
119
+ const e = new Date(
120
+ o.getFullYear(),
121
+ o.getMonth() - 1,
122
+ 1
123
+ );
124
+ b(e), r == null || r(e);
125
+ }, U = () => {
126
+ const e = new Date(
127
+ o.getFullYear(),
128
+ o.getMonth() + 1,
129
+ 1
130
+ );
131
+ b(e), r == null || r(e);
132
+ }, G = (e, n) => {
133
+ let s = null;
134
+ switch (e.key) {
135
+ case "ArrowLeft":
136
+ e.preventDefault(), s = new Date(
137
+ n.getFullYear(),
138
+ n.getMonth(),
139
+ n.getDate() - 1
140
+ );
141
+ break;
142
+ case "ArrowRight":
143
+ e.preventDefault(), s = new Date(
144
+ n.getFullYear(),
145
+ n.getMonth(),
146
+ n.getDate() + 1
147
+ );
148
+ break;
149
+ case "ArrowUp":
150
+ e.preventDefault(), s = new Date(
151
+ n.getFullYear(),
152
+ n.getMonth(),
153
+ n.getDate() - 7
154
+ );
155
+ break;
156
+ case "ArrowDown":
157
+ e.preventDefault(), s = new Date(
158
+ n.getFullYear(),
159
+ n.getMonth(),
160
+ n.getDate() + 7
161
+ );
162
+ break;
163
+ case "Home":
164
+ e.preventDefault(), s = new Date(n.getFullYear(), n.getMonth(), 1);
165
+ break;
166
+ case "End":
167
+ e.preventDefault(), s = new Date(n.getFullYear(), n.getMonth() + 1, 0);
168
+ break;
169
+ case "Enter":
170
+ case " ":
171
+ e.preventDefault(), k(n);
172
+ return;
173
+ }
174
+ s && (D(s, o) || b(new Date(s.getFullYear(), s.getMonth(), 1)), H(s));
175
+ }, N = [];
176
+ for (let e = 0; e < p.length; e += 7)
177
+ N.push(p.slice(e, e + 7));
178
+ return /* @__PURE__ */ v(
179
+ "div",
180
+ E(C({
181
+ ref: F,
182
+ className: `${g("base", "p")} ${a}`
183
+ }, l), {
184
+ children: [
185
+ /* @__PURE__ */ v(
186
+ "div",
187
+ {
188
+ className: `flex items-center justify-between ${g("base", "mb")}`,
189
+ children: [
190
+ /* @__PURE__ */ u(
191
+ J,
192
+ {
193
+ variant: "iconOnly",
194
+ size: "sm",
195
+ onClick: B,
196
+ "aria-label": "Previous month",
197
+ children: /* @__PURE__ */ u(ae, { className: "h-4 w-4" })
198
+ }
199
+ ),
200
+ /* @__PURE__ */ v("div", { className: "text-sm font-semibold", children: [
201
+ me[o.getMonth()],
202
+ " ",
203
+ o.getFullYear()
204
+ ] }),
205
+ /* @__PURE__ */ u(
206
+ J,
207
+ {
208
+ variant: "iconOnly",
209
+ size: "sm",
210
+ onClick: U,
211
+ "aria-label": "Next month",
212
+ children: /* @__PURE__ */ u(le, { className: "h-4 w-4" })
213
+ }
214
+ )
215
+ ]
216
+ }
217
+ ),
218
+ /* @__PURE__ */ v("div", { role: "grid", "aria-label": "Calendar", children: [
219
+ /* @__PURE__ */ u(
220
+ "div",
221
+ {
222
+ role: "row",
223
+ className: `grid grid-cols-7 ${g("xs", "gap")} ${g("sm", "mb")}`,
224
+ children: ge.map((e) => /* @__PURE__ */ u(
225
+ "div",
226
+ {
227
+ role: "columnheader",
228
+ className: `text-center text-xs font-medium text-fg-tertiary ${g("xs", "py")}`,
229
+ children: e
230
+ },
231
+ e
232
+ ))
233
+ }
234
+ ),
235
+ N.map((e, n) => /* @__PURE__ */ u(
236
+ "div",
237
+ {
238
+ role: "row",
239
+ className: `grid grid-cols-7 ${g("xs", "gap")}`,
240
+ children: e.map((s, Q) => {
241
+ if (!s)
242
+ return /* @__PURE__ */ u(
243
+ "div",
244
+ {
245
+ role: "gridcell",
246
+ className: "aspect-square"
247
+ },
248
+ `empty-${n}-${Q}`
249
+ );
250
+ const $ = h === "single" ? c(s, f) : c(s, (i == null ? void 0 : i.start) || null) || c(s, (i == null ? void 0 : i.end) || null), V = h === "range" && i ? fe(s, i.start, i.end) : !1, O = K(
251
+ s,
252
+ x,
253
+ S,
254
+ d
255
+ ), X = c(s, /* @__PURE__ */ new Date()), Z = c(s, m), _ = c(s, L);
256
+ return /* @__PURE__ */ u(
257
+ "button",
258
+ {
259
+ role: "gridcell",
260
+ type: "button",
261
+ "data-date": s.toISOString(),
262
+ tabIndex: _ ? 0 : -1,
263
+ onClick: () => k(s),
264
+ onKeyDown: (ee) => G(ee, s),
265
+ className: `
266
+ aspect-square
267
+ text-sm
268
+ ${oe("md")}
269
+ transition-colors
270
+ focus:outline-none
271
+ focus:ring-2
272
+ focus:ring-offset-1
273
+ ${O ? "text-fg-disabled cursor-not-allowed opacity-50" : $ ? "bg-surface-brand-strong text-fg-inverse font-semibold" : V ? "bg-surface-brand-muted text-fg-brand-emphasis" : X ? "border-2 border-line-brand font-semibold" : Z ? "bg-surface-brand-muted" : "hover:bg-surface-active"}
274
+ `,
275
+ "aria-label": s.toDateString(),
276
+ "aria-selected": $,
277
+ "aria-disabled": O,
278
+ children: s.getDate()
279
+ },
280
+ s.toISOString()
281
+ );
282
+ })
283
+ },
284
+ `week-${n}`
285
+ ))
286
+ ] })
287
+ ]
288
+ })
289
+ );
290
+ }
291
+ export {
292
+ Me as DatePickerCalendar
293
+ };
294
+ //# sourceMappingURL=DatePickerCalendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerCalendar.js","sources":["../../../../../src/ui/components/DatePicker/DatePickerCalendar.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useState,\n useEffect,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent,\n} from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport Button from \"../../primitives/Button/Button\";\nimport { getRadiusClass } from \"../../tokens\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport interface DatePickerCalendarProps extends HTMLAttributes<HTMLDivElement> {\n month?: Date; // Current month to display\n onMonthChange?: (month: Date) => void;\n}\n\n// Helper functions for date manipulation (without date-fns dependency)\nfunction getDaysInMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\nfunction getFirstDayOfMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n}\n\nfunction isSameDay(date1: Date | null, date2: Date | null): boolean {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n}\n\nfunction isSameMonth(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth()\n );\n}\n\nfunction isDateInRange(\n date: Date,\n start: Date | null,\n end: Date | null,\n): boolean {\n if (!start || !end) return false;\n const time = date.getTime();\n return time >= start.getTime() && time <= end.getTime();\n}\n\nfunction isDateDisabled(\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n disabledDates?: Date[],\n): boolean {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n if (disabledDates?.some((d) => isSameDay(date, d))) return true;\n return false;\n}\n\nconst WEEKDAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport function DatePickerCalendar({\n month: controlledMonth,\n onMonthChange,\n className = \"\",\n ...props\n}: DatePickerCalendarProps) {\n const {\n selectedDate,\n selectedRange,\n mode,\n onDateChange,\n onRangeChange,\n minDate,\n maxDate,\n disabledDates,\n } = useDatePickerContext();\n\n const [currentMonth, setCurrentMonth] = useState<Date>(\n controlledMonth || selectedDate || selectedRange?.start || new Date(),\n );\n const calendarRef = useRef<HTMLDivElement>(null);\n\n // Initial focusedDate: prefer selectedDate if in currentMonth, else today\n // if in currentMonth, else first of currentMonth. Always non-null so\n // exactly one cell has tabIndex=0 — required for canonical grid roving\n // tabindex (Tab enters once, arrows navigate within).\n const [focusedDate, setFocusedDate] = useState<Date>(() => {\n const today = new Date();\n const initialMonth =\n controlledMonth || selectedDate || selectedRange?.start || today;\n if (selectedDate && isSameMonth(selectedDate, initialMonth)) {\n return selectedDate;\n }\n if (isSameMonth(today, initialMonth)) {\n return today;\n }\n return new Date(initialMonth.getFullYear(), initialMonth.getMonth(), 1);\n });\n\n // Update current month if controlled\n useEffect(() => {\n if (controlledMonth) {\n setCurrentMonth(controlledMonth);\n }\n }, [controlledMonth]);\n\n // Roving tabindex: when focusedDate changes (via arrow keys or initial\n // mount), move the DOM focus to the matching cell. Without this, axe\n // sees a correct grid structure but the keyboard experience is broken\n // — arrow keys change only the state, not the actual focus.\n useEffect(() => {\n if (!calendarRef.current) return;\n const cell = calendarRef.current.querySelector<HTMLElement>(\n `[data-date=\"${focusedDate.toISOString()}\"]`,\n );\n if (cell) cell.focus();\n }, [focusedDate]);\n\n // Effective focused date for tabIndex assignment: if focusedDate is not\n // in currentMonth (e.g. user clicked Prev/Next via mouse), still keep\n // exactly one cell with tabIndex=0 so Tab can re-enter the grid. Pick a\n // sensible fallback in the visible month.\n const effectiveFocusedDate = (() => {\n if (isSameMonth(focusedDate, currentMonth)) return focusedDate;\n const today = new Date();\n if (isSameMonth(today, currentMonth)) return today;\n return new Date(currentMonth.getFullYear(), currentMonth.getMonth(), 1);\n })();\n\n const daysInMonth = getDaysInMonth(currentMonth);\n const firstDay = getFirstDayOfMonth(currentMonth);\n const days: (Date | null)[] = [];\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n\n // Add all days of the month\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day),\n );\n }\n\n const handleDateClick = (date: Date) => {\n if (isDateDisabled(date, minDate, maxDate, disabledDates)) return;\n\n if (mode === \"single\") {\n onDateChange(date);\n } else if (mode === \"range\") {\n const currentRange = selectedRange || { start: null, end: null };\n if (!currentRange.start || (currentRange.start && currentRange.end)) {\n // Start new range\n onRangeChange({ start: date, end: null });\n } else if (currentRange.start && !currentRange.end) {\n // Complete range\n if (date < currentRange.start) {\n onRangeChange({ start: date, end: currentRange.start });\n } else {\n onRangeChange({ start: currentRange.start, end: date });\n }\n }\n }\n };\n\n const handlePreviousMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() - 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleNextMonth = () => {\n const newMonth = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth() + 1,\n 1,\n );\n setCurrentMonth(newMonth);\n onMonthChange?.(newMonth);\n };\n\n const handleKeyDown = (\n e: KeyboardEvent<HTMLButtonElement | HTMLDivElement>,\n date: Date,\n ) => {\n let newDate: Date | null = null;\n\n switch (e.key) {\n case \"ArrowLeft\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 1,\n );\n break;\n case \"ArrowRight\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 1,\n );\n break;\n case \"ArrowUp\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() - 7,\n );\n break;\n case \"ArrowDown\":\n e.preventDefault();\n newDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate() + 7,\n );\n break;\n case \"Home\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth(), 1);\n break;\n case \"End\":\n e.preventDefault();\n newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n handleDateClick(date);\n return;\n }\n\n if (newDate) {\n // Adjust month if needed\n if (!isSameMonth(newDate, currentMonth)) {\n setCurrentMonth(new Date(newDate.getFullYear(), newDate.getMonth(), 1));\n }\n setFocusedDate(newDate);\n }\n };\n\n // Chunk days into rows of 7 (one per week). The previous implementation\n // rendered all ~35 day cells as direct children of a single CSS grid div,\n // which made role=\"grid\" structurally invalid (grid must contain rows;\n // rows must contain gridcells). Each week is now a role=\"row\".\n const weeks: (Date | null)[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return (\n <div\n ref={calendarRef}\n className={`${getSpacingClass(\"base\", \"p\")} ${className}`}\n {...props}\n >\n {/* Header with month navigation — sits OUTSIDE the role=\"grid\" so\n the grid's direct children are only rows. */}\n <div\n className={`flex items-center justify-between ${getSpacingClass(\"base\", \"mb\")}`}\n >\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handlePreviousMonth}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"text-sm font-semibold\">\n {MONTHS[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </div>\n <Button\n variant=\"iconOnly\"\n size=\"sm\"\n onClick={handleNextMonth}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div role=\"grid\" aria-label=\"Calendar\">\n {/* Weekday header row */}\n <div\n role=\"row\"\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")} ${getSpacingClass(\"sm\", \"mb\")}`}\n >\n {WEEKDAYS.map((day) => (\n <div\n key={day}\n role=\"columnheader\"\n className={`text-center text-xs font-medium text-fg-tertiary ${getSpacingClass(\"xs\", \"py\")}`}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid — one role=\"row\" per week, role=\"gridcell\" per day.\n The buttons carry role=\"gridcell\" explicitly: the explicit role\n overrides the implicit button role, so aria-selected (allowed on\n gridcell, prohibited on button) becomes valid. */}\n {weeks.map((week, weekIdx) => (\n <div\n role=\"row\"\n key={`week-${weekIdx}`}\n className={`grid grid-cols-7 ${getSpacingClass(\"xs\", \"gap\")}`}\n >\n {week.map((date, dayIdx) => {\n if (!date) {\n return (\n <div\n role=\"gridcell\"\n key={`empty-${weekIdx}-${dayIdx}`}\n className=\"aspect-square\"\n />\n );\n }\n\n const isSelected =\n mode === \"single\"\n ? isSameDay(date, selectedDate)\n : isSameDay(date, selectedRange?.start || null) ||\n isSameDay(date, selectedRange?.end || null);\n\n const isInRange =\n mode === \"range\" && selectedRange\n ? isDateInRange(date, selectedRange.start, selectedRange.end)\n : false;\n\n const isDisabled = isDateDisabled(\n date,\n minDate,\n maxDate,\n disabledDates,\n );\n const isToday = isSameDay(date, new Date());\n const isFocused = isSameDay(date, focusedDate);\n // Roving tabindex: exactly one cell has tabIndex=0 per render,\n // and it is the effective focused cell. Other cells are\n // tabIndex=-1 (programmatically focusable via arrows, but\n // skipped by Tab). When focusedDate is outside currentMonth\n // (mouse-driven Prev/Next month nav), effectiveFocusedDate\n // picks a fallback so the grid never loses its single tab stop.\n const isTabStop = isSameDay(date, effectiveFocusedDate);\n\n return (\n <button\n key={date.toISOString()}\n role=\"gridcell\"\n type=\"button\"\n data-date={date.toISOString()}\n tabIndex={isTabStop ? 0 : -1}\n onClick={() => handleDateClick(date)}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={`\n aspect-square\n text-sm\n ${getRadiusClass(\"md\")}\n transition-colors\n focus:outline-none\n focus:ring-2\n focus:ring-offset-1\n ${\n isDisabled\n ? \"text-fg-disabled cursor-not-allowed opacity-50\"\n : isSelected\n ? \"bg-surface-brand-strong text-fg-inverse font-semibold\"\n : isInRange\n ? \"bg-surface-brand-muted text-fg-brand-emphasis\"\n : isToday\n ? \"border-2 border-line-brand font-semibold\"\n : isFocused\n ? \"bg-surface-brand-muted\"\n : \"hover:bg-surface-active\"\n }\n `}\n aria-label={date.toDateString()}\n aria-selected={isSelected}\n aria-disabled={isDisabled}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["getDaysInMonth","date","getFirstDayOfMonth","isSameDay","date1","date2","isSameMonth","isDateInRange","start","end","time","isDateDisabled","minDate","maxDate","disabledDates","d","WEEKDAYS","MONTHS","DatePickerCalendar","_a","_b","controlledMonth","onMonthChange","className","props","__objRest","selectedDate","selectedRange","mode","onDateChange","onRangeChange","useDatePickerContext","currentMonth","setCurrentMonth","useState","calendarRef","useRef","focusedDate","setFocusedDate","today","initialMonth","useEffect","cell","effectiveFocusedDate","daysInMonth","firstDay","days","i","day","handleDateClick","currentRange","handlePreviousMonth","newMonth","handleNextMonth","handleKeyDown","newDate","weeks","jsxs","__spreadProps","__spreadValues","getSpacingClass","jsx","Button","ChevronLeft","ChevronRight","week","weekIdx","dayIdx","isSelected","isInRange","isDisabled","isToday","isFocused","isTabStop","e","getRadiusClass"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { useContext as e, createContext as o } from "react";
3
+ const n = o(void 0);
4
+ function c() {
5
+ const t = e(n);
6
+ if (!t)
7
+ throw new Error(
8
+ "DatePicker components must be used within a DatePicker component"
9
+ );
10
+ return t;
11
+ }
12
+ export {
13
+ n as DatePickerContext,
14
+ c as useDatePickerContext
15
+ };
16
+ //# sourceMappingURL=DatePickerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerContext.js","sources":["../../../../../src/ui/components/DatePicker/DatePickerContext.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nexport interface DatePickerContextValue {\n selectedDate: Date | null;\n selectedRange: { start: Date | null; end: Date | null } | null;\n mode: \"single\" | \"range\";\n onDateChange: (date: Date | null) => void;\n onRangeChange: (range: { start: Date | null; end: Date | null }) => void;\n minDate?: Date;\n maxDate?: Date;\n disabledDates?: Date[];\n locale?: Locale;\n}\n\nexport const DatePickerContext = createContext<\n DatePickerContextValue | undefined\n>(undefined);\n\nexport function useDatePickerContext(): DatePickerContextValue {\n const context = useContext(DatePickerContext);\n if (!context) {\n throw new Error(\n \"DatePicker components must be used within a DatePicker component\",\n );\n }\n return context;\n}\n\nexport function useDatePickerContextOptional():\n | DatePickerContextValue\n | undefined {\n return useContext(DatePickerContext);\n}\n\n// Locale type - will be provided by date-fns\nexport interface Locale {\n code?: string;\n localize?: unknown;\n formatLong?: unknown;\n format?: unknown;\n match?: unknown;\n options?: unknown;\n}\n"],"names":["DatePickerContext","createContext","useDatePickerContext","context","useContext"],"mappings":";;AAgBO,MAAMA,IAAoBC,EAE/B,MAAS;AAEJ,SAASC,IAA+C;AAC7D,QAAMC,IAAUC,EAAWJ,CAAiB;AAC5C,MAAI,CAACG;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGJ,SAAOA;AACT;"}
@@ -0,0 +1,119 @@
1
+ "use client";
2
+ var P = Object.defineProperty, V = Object.defineProperties;
3
+ var j = Object.getOwnPropertyDescriptors;
4
+ var y = Object.getOwnPropertySymbols;
5
+ var C = Object.prototype.hasOwnProperty, N = Object.prototype.propertyIsEnumerable;
6
+ var D = (e, t, n) => t in e ? P(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, S = (e, t) => {
7
+ for (var n in t || (t = {}))
8
+ C.call(t, n) && D(e, n, t[n]);
9
+ if (y)
10
+ for (var n of y(t))
11
+ N.call(t, n) && D(e, n, t[n]);
12
+ return e;
13
+ }, b = (e, t) => V(e, j(t));
14
+ var k = (e, t) => {
15
+ var n = {};
16
+ for (var a in e)
17
+ C.call(e, a) && t.indexOf(a) < 0 && (n[a] = e[a]);
18
+ if (e != null && y)
19
+ for (var a of y(e))
20
+ t.indexOf(a) < 0 && N.call(e, a) && (n[a] = e[a]);
21
+ return n;
22
+ };
23
+ import { jsx as f } from "react/jsx-runtime";
24
+ import { useState as v, useRef as z, useEffect as E } from "react";
25
+ import { Calendar as Y } from "lucide-react";
26
+ import { useDatePickerContext as _ } from "./DatePickerContext.js";
27
+ import q from "../../primitives/Input/Input.js";
28
+ import { Button as A } from "../../primitives/Button/Button.js";
29
+ function p(e, t = "yyyy-MM-dd") {
30
+ const n = e.getFullYear(), a = String(e.getMonth() + 1).padStart(2, "0"), r = String(e.getDate()).padStart(2, "0");
31
+ return t.replace("yyyy", String(n)).replace("MM", a).replace("dd", r).replace("MM/dd/yyyy", `${a}/${r}/${n}`).replace("dd/MM/yyyy", `${r}/${a}/${n}`);
32
+ }
33
+ function w(e) {
34
+ if (!e) return null;
35
+ const t = e.match(/^(\d{4})-(\d{2})-(\d{2})$/);
36
+ if (t) {
37
+ const [, r, c, l] = t, s = new Date(parseInt(r), parseInt(c) - 1, parseInt(l));
38
+ if (!isNaN(s.getTime())) return s;
39
+ }
40
+ const n = e.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
41
+ if (n) {
42
+ const [, r, c, l] = n, s = new Date(parseInt(l), parseInt(r) - 1, parseInt(c));
43
+ if (!isNaN(s.getTime())) return s;
44
+ }
45
+ const a = e.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
46
+ if (a) {
47
+ const [, r, c, l] = a, s = new Date(parseInt(l), parseInt(c) - 1, parseInt(r));
48
+ if (!isNaN(s.getTime())) return s;
49
+ }
50
+ return null;
51
+ }
52
+ function W(s) {
53
+ var g = s, {
54
+ placeholder: e = "Select date",
55
+ format: t = "yyyy-MM-dd",
56
+ showCalendarButton: n = !0,
57
+ "aria-label": a,
58
+ onFocus: r,
59
+ className: c = ""
60
+ } = g, l = k(g, [
61
+ "placeholder",
62
+ "format",
63
+ "showCalendarButton",
64
+ "aria-label",
65
+ "onFocus",
66
+ "className"
67
+ ]);
68
+ const { selectedDate: m, selectedRange: i, mode: u, onDateChange: x } = _(), [h, o] = v(""), [F, I] = v(!1), M = z(null);
69
+ E(() => {
70
+ u === "single" && m ? o(p(m, t)) : u === "range" && i ? i.start && i.end ? o(
71
+ `${p(i.start, t)} - ${p(i.end, t)}`
72
+ ) : i.start ? o(p(i.start, t)) : o("") : o("");
73
+ }, [m, i, u, t]);
74
+ const B = (d) => {
75
+ const $ = d.target.value;
76
+ if (o($), u === "single") {
77
+ const O = w($);
78
+ x(O);
79
+ }
80
+ }, R = () => {
81
+ if (I(!1), h && u === "single") {
82
+ const d = w(h);
83
+ d && o(p(d, t));
84
+ }
85
+ }, T = () => {
86
+ var d;
87
+ (d = M.current) == null || d.focus();
88
+ };
89
+ return /* @__PURE__ */ f("div", b(S({ className: `relative ${c}` }, l), { children: /* @__PURE__ */ f(
90
+ q,
91
+ {
92
+ ref: M,
93
+ type: "text",
94
+ value: h,
95
+ onChange: B,
96
+ onFocus: () => {
97
+ I(!0), r == null || r();
98
+ },
99
+ onBlur: R,
100
+ placeholder: e,
101
+ "aria-label": a || e,
102
+ rightIcon: n ? /* @__PURE__ */ f(
103
+ A,
104
+ {
105
+ variant: "iconOnly",
106
+ size: "sm",
107
+ onClick: T,
108
+ "aria-label": "Open calendar",
109
+ type: "button",
110
+ children: /* @__PURE__ */ f(Y, { className: "h-4 w-4" })
111
+ }
112
+ ) : void 0
113
+ }
114
+ ) }));
115
+ }
116
+ export {
117
+ W as DatePickerInput
118
+ };
119
+ //# sourceMappingURL=DatePickerInput.js.map