@plexui/ui 0.19.1 → 0.20.1

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 (402) hide show
  1. package/README.md +15 -138
  2. package/dist/es/components/Accordion/Accordion.js +2 -2
  3. package/dist/es/components/Accordion/Accordion.js.map +1 -1
  4. package/dist/es/components/Accordion/index.js +1 -1
  5. package/dist/es/components/Alert/Alert.js +6 -6
  6. package/dist/es/components/Alert/Alert.js.map +1 -1
  7. package/dist/es/components/Alert/index.js +1 -1
  8. package/dist/es/components/Avatar/Avatar.js +12 -5
  9. package/dist/es/components/Avatar/Avatar.js.map +1 -1
  10. package/dist/es/components/Avatar/AvatarGroup.js +2 -2
  11. package/dist/es/components/Avatar/AvatarGroup.js.map +1 -1
  12. package/dist/es/components/Avatar/index.js +2 -2
  13. package/dist/es/components/Badge/index.js +3 -3
  14. package/dist/es/components/Badge/index.js.map +1 -1
  15. package/dist/es/components/Breadcrumb/Breadcrumb.js +34 -0
  16. package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
  17. package/dist/es/components/Breadcrumb/index.js +2 -0
  18. package/dist/es/components/Breadcrumb/index.js.map +1 -0
  19. package/dist/es/components/Button/Button.js +7 -7
  20. package/dist/es/components/Button/Button.js.map +1 -1
  21. package/dist/es/components/Button/CopyButton.js +25 -13
  22. package/dist/es/components/Button/CopyButton.js.map +1 -1
  23. package/dist/es/components/Button/index.js +2 -2
  24. package/dist/es/components/ButtonGroup/ButtonGroup.js +2 -2
  25. package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -1
  26. package/dist/es/components/ButtonGroup/index.js +1 -1
  27. package/dist/es/components/Card/Card.js +4 -3
  28. package/dist/es/components/Card/Card.js.map +1 -1
  29. package/dist/es/components/Card/index.js +1 -1
  30. package/dist/es/components/Checkbox/Checkbox.js +12 -6
  31. package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
  32. package/dist/es/components/Checkbox/index.js +1 -1
  33. package/dist/es/components/CodeBlock/CodeBlock.js +25 -25
  34. package/dist/es/components/CodeBlock/CodeBlock.js.map +1 -1
  35. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js +6 -4
  36. package/dist/es/components/CodeBlock/CollapsibleCodeBlock.js.map +1 -1
  37. package/dist/es/components/CodeBlock/index.js +2 -2
  38. package/dist/es/components/DataTable/DataTable.js +108 -27
  39. package/dist/es/components/DataTable/DataTable.js.map +1 -1
  40. package/dist/es/components/DataTable/DataTableColumnHeader.js +2 -2
  41. package/dist/es/components/DataTable/DataTableColumnHeader.js.map +1 -1
  42. package/dist/es/components/DataTable/DataTablePagination.js +8 -4
  43. package/dist/es/components/DataTable/DataTablePagination.js.map +1 -1
  44. package/dist/es/components/DataTable/columnHelpers.js +3 -3
  45. package/dist/es/components/DataTable/index.js +4 -4
  46. package/dist/es/components/DateInput/DateInput.js +21 -13
  47. package/dist/es/components/DateInput/DateInput.js.map +1 -1
  48. package/dist/es/components/DateInput/index.js +1 -1
  49. package/dist/es/components/DatePicker/Calendar.js +136 -32
  50. package/dist/es/components/DatePicker/Calendar.js.map +1 -1
  51. package/dist/es/components/DatePicker/DatePicker.js +15 -11
  52. package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
  53. package/dist/es/components/DatePicker/index.js +1 -1
  54. package/dist/es/components/DateRangePicker/Calendar.js +125 -22
  55. package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
  56. package/dist/es/components/DateRangePicker/DateRangePicker.js +10 -9
  57. package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
  58. package/dist/es/components/DateRangePicker/Trigger.js +12 -9
  59. package/dist/es/components/DateRangePicker/Trigger.js.map +1 -1
  60. package/dist/es/components/DateRangePicker/index.js +2 -2
  61. package/dist/es/components/Dialog/Dialog.js +11 -6
  62. package/dist/es/components/Dialog/Dialog.js.map +1 -1
  63. package/dist/es/components/Dialog/index.js +1 -1
  64. package/dist/es/components/Dialog/index.js.map +1 -1
  65. package/dist/es/components/EmptyMessage/EmptyMessage.js +4 -4
  66. package/dist/es/components/EmptyMessage/EmptyMessage.js.map +1 -1
  67. package/dist/es/components/EmptyMessage/index.js +1 -1
  68. package/dist/es/components/Field/Field.js +22 -7
  69. package/dist/es/components/Field/Field.js.map +1 -1
  70. package/dist/es/components/Field/index.js +1 -1
  71. package/dist/es/components/FieldError/FieldError.js +4 -4
  72. package/dist/es/components/FieldError/FieldError.js.map +1 -1
  73. package/dist/es/components/FieldError/index.js +1 -1
  74. package/dist/es/components/FileUpload/FileUpload.js +12 -9
  75. package/dist/es/components/FileUpload/FileUpload.js.map +1 -1
  76. package/dist/es/components/FileUpload/index.js +1 -1
  77. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js +31 -4
  78. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.js.map +1 -1
  79. package/dist/es/components/FloatingLabelInput/index.js +1 -1
  80. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js +28 -8
  81. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.js.map +1 -1
  82. package/dist/es/components/FloatingLabelSelect/index.js +1 -1
  83. package/dist/es/components/Icon/aliases.js +20 -20
  84. package/dist/es/components/Icon/index.js +653 -653
  85. package/dist/es/components/Image/Image.js +19 -7
  86. package/dist/es/components/Image/Image.js.map +1 -1
  87. package/dist/es/components/Image/index.js +1 -1
  88. package/dist/es/components/Indicator/CircularProgress.js +3 -3
  89. package/dist/es/components/Indicator/CircularProgress.js.map +1 -1
  90. package/dist/es/components/Indicator/LoadingDots.js +1 -1
  91. package/dist/es/components/Indicator/LoadingDots.js.map +1 -1
  92. package/dist/es/components/Indicator/LoadingIndicator.js +2 -2
  93. package/dist/es/components/Indicator/LoadingIndicator.js.map +1 -1
  94. package/dist/es/components/Indicator/index.js +3 -3
  95. package/dist/es/components/Input/Input.js +16 -5
  96. package/dist/es/components/Input/Input.js.map +1 -1
  97. package/dist/es/components/Input/index.js +1 -1
  98. package/dist/es/components/InputGroup/InputGroup.js +60 -0
  99. package/dist/es/components/InputGroup/InputGroup.js.map +1 -0
  100. package/dist/es/components/InputGroup/index.js +2 -0
  101. package/dist/es/components/InputGroup/index.js.map +1 -0
  102. package/dist/es/components/Kbd/Kbd.js +13 -0
  103. package/dist/es/components/Kbd/Kbd.js.map +1 -0
  104. package/dist/es/components/Kbd/index.js +2 -0
  105. package/dist/es/components/Kbd/index.js.map +1 -0
  106. package/dist/es/components/Label/Label.js +1 -1
  107. package/dist/es/components/Label/Label.js.map +1 -1
  108. package/dist/es/components/Label/index.js +1 -1
  109. package/dist/es/components/Markdown/Markdown.js +8 -8
  110. package/dist/es/components/Markdown/Markdown.js.map +1 -1
  111. package/dist/es/components/Markdown/directives.js +2 -2
  112. package/dist/es/components/Markdown/index.js +4 -5
  113. package/dist/es/components/Markdown/index.js.map +1 -1
  114. package/dist/es/components/MarkdownEditor/MarkdownEditor.js +35 -11
  115. package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
  116. package/dist/es/components/MarkdownEditor/index.js +1 -1
  117. package/dist/es/components/Menu/Menu.js +30 -22
  118. package/dist/es/components/Menu/Menu.js.map +1 -1
  119. package/dist/es/components/Menu/index.js +1 -1
  120. package/dist/es/components/OTPInput/OTPInput.js +51 -34
  121. package/dist/es/components/OTPInput/OTPInput.js.map +1 -1
  122. package/dist/es/components/OTPInput/index.js +1 -1
  123. package/dist/es/components/PlexUIProvider/PlexUIProvider.js +3 -1
  124. package/dist/es/components/PlexUIProvider/PlexUIProvider.js.map +1 -1
  125. package/dist/es/components/PlexUIProvider/index.js +1 -1
  126. package/dist/es/components/PlexUIProvider/internal.js +1 -1
  127. package/dist/es/components/Popover/Popover.js +7 -7
  128. package/dist/es/components/Popover/Popover.js.map +1 -1
  129. package/dist/es/components/Popover/index.js +2 -3
  130. package/dist/es/components/Popover/index.js.map +1 -1
  131. package/dist/es/components/Popover/usePopoverController.js +2 -2
  132. package/dist/es/components/Progress/Progress.js +1 -1
  133. package/dist/es/components/Progress/Progress.js.map +1 -1
  134. package/dist/es/components/Progress/index.js +1 -1
  135. package/dist/es/components/ProgressSteps/ProgressSteps.js +6 -4
  136. package/dist/es/components/ProgressSteps/ProgressSteps.js.map +1 -1
  137. package/dist/es/components/ProgressSteps/index.js +1 -1
  138. package/dist/es/components/RadioGroup/RadioGroup.js +10 -6
  139. package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
  140. package/dist/es/components/RadioGroup/index.js +1 -1
  141. package/dist/es/components/SegmentedControl/index.js +1 -1
  142. package/dist/es/components/Select/Select.js +103 -67
  143. package/dist/es/components/Select/Select.js.map +1 -1
  144. package/dist/es/components/Select/index.js +1 -1
  145. package/dist/es/components/SelectControl/SelectControl.js +10 -5
  146. package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
  147. package/dist/es/components/SelectControl/index.js +1 -1
  148. package/dist/es/components/Separator/Separator.js +1 -1
  149. package/dist/es/components/Separator/Separator.js.map +1 -1
  150. package/dist/es/components/Separator/index.js +1 -1
  151. package/dist/es/components/ShimmerText/ShimmerText.js +1 -1
  152. package/dist/es/components/ShimmerText/ShimmerText.js.map +1 -1
  153. package/dist/es/components/ShimmerText/index.js +1 -1
  154. package/dist/es/components/Sidebar/Sidebar.js +37 -29
  155. package/dist/es/components/Sidebar/Sidebar.js.map +1 -1
  156. package/dist/es/components/Sidebar/index.js +2 -2
  157. package/dist/es/components/Sidebar/useSidebarContext.js +17 -19
  158. package/dist/es/components/Sidebar/useSidebarContext.js.map +1 -1
  159. package/dist/es/components/Skeleton/index.js +1 -1
  160. package/dist/es/components/Skeleton/index.js.map +1 -1
  161. package/dist/es/components/Slider/Slider.js +48 -19
  162. package/dist/es/components/Slider/Slider.js.map +1 -1
  163. package/dist/es/components/Slider/index.js +1 -1
  164. package/dist/es/components/StatCard/StatCard.js +5 -5
  165. package/dist/es/components/StatCard/StatCard.js.map +1 -1
  166. package/dist/es/components/StatCard/index.js +1 -1
  167. package/dist/es/components/Switch/Switch.js +7 -3
  168. package/dist/es/components/Switch/Switch.js.map +1 -1
  169. package/dist/es/components/Switch/index.js +1 -1
  170. package/dist/es/components/Table/Table.js +1 -1
  171. package/dist/es/components/Table/Table.js.map +1 -1
  172. package/dist/es/components/Table/index.js +1 -1
  173. package/dist/es/components/Tabs/Tabs.js +154 -6
  174. package/dist/es/components/Tabs/Tabs.js.map +1 -1
  175. package/dist/es/components/Tabs/index.js +1 -1
  176. package/dist/es/components/Tabs/overflow.js +44 -0
  177. package/dist/es/components/Tabs/overflow.js.map +1 -0
  178. package/dist/es/components/TagInput/TagInput.js +47 -23
  179. package/dist/es/components/TagInput/TagInput.js.map +1 -1
  180. package/dist/es/components/TagInput/index.js +1 -1
  181. package/dist/es/components/TextLink/TextLink.js +16 -5
  182. package/dist/es/components/TextLink/TextLink.js.map +1 -1
  183. package/dist/es/components/TextLink/index.js +1 -1
  184. package/dist/es/components/Textarea/Textarea.js +4 -4
  185. package/dist/es/components/Textarea/Textarea.js.map +1 -1
  186. package/dist/es/components/Textarea/index.js +1 -1
  187. package/dist/es/components/Toast/Toaster.js +2 -2
  188. package/dist/es/components/Toast/Toaster.js.map +1 -1
  189. package/dist/es/components/Toast/index.js +1 -1
  190. package/dist/es/components/Tooltip/CopyTooltip.js +30 -9
  191. package/dist/es/components/Tooltip/CopyTooltip.js.map +1 -1
  192. package/dist/es/components/Tooltip/Tooltip.js +3 -3
  193. package/dist/es/components/Tooltip/Tooltip.js.map +1 -1
  194. package/dist/es/components/Tooltip/index.js +2 -2
  195. package/dist/es/components/Transition/Animate.js +4 -4
  196. package/dist/es/components/Transition/Animate.js.map +1 -1
  197. package/dist/es/components/Transition/AnimateLayout.js +4 -4
  198. package/dist/es/components/Transition/AnimateLayout.js.map +1 -1
  199. package/dist/es/components/Transition/AnimateLayoutGroup.js +12 -8
  200. package/dist/es/components/Transition/AnimateLayoutGroup.js.map +1 -1
  201. package/dist/es/components/Transition/SlotTransitionGroup.js +4 -4
  202. package/dist/es/components/Transition/TransitionGroup.js +5 -5
  203. package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
  204. package/dist/es/components/Transition/getDisableAnimations.js +1 -1
  205. package/dist/es/components/Transition/index.js +5 -5
  206. package/dist/es/components/Transition/shared.js +7 -5
  207. package/dist/es/components/Transition/shared.js.map +1 -1
  208. package/dist/es/components/UIProvider/UIProvider.js +1 -1
  209. package/dist/es/components/UIProvider/index.js +1 -1
  210. package/dist/es/components/UIProvider/internal.js +1 -1
  211. package/dist/es/hooks/useAnimatedScrollTo.js +1 -1
  212. package/dist/es/hooks/useBreakpoints.js +8 -2
  213. package/dist/es/hooks/useBreakpoints.js.map +1 -1
  214. package/dist/es/hooks/useEscCloseStack.js +1 -1
  215. package/dist/es/hooks/usePrevious.js +7 -5
  216. package/dist/es/hooks/usePrevious.js.map +1 -1
  217. package/dist/es/hooks/useTextSelection.js +2 -2
  218. package/dist/es/hooks/useTrailingValue.js +1 -1
  219. package/dist/es/lib/constants.js +1 -1
  220. package/dist/es/lib/helpers.js +1 -1
  221. package/dist/es/lib/helpers.js.map +1 -1
  222. package/dist/es/lib/renderHelpers.js +15 -6
  223. package/dist/es/lib/renderHelpers.js.map +1 -1
  224. package/dist/es/lib/theme.js +16 -16
  225. package/dist/es/lib/theme.js.map +1 -1
  226. package/dist/es/lib/userAgent.js +3 -2
  227. package/dist/es/lib/userAgent.js.map +1 -1
  228. package/dist/es/styles/base.css +1 -102
  229. package/dist/es/styles/globals.css +1 -50
  230. package/dist/es/styles/index.css +1 -25
  231. package/dist/es/styles/katex.min.css +1 -1296
  232. package/dist/es/styles/tailwind-utilities.css +1 -1316
  233. package/dist/es/styles/touch.css +1 -0
  234. package/dist/es/styles/variables-components.css +1 -626
  235. package/dist/es/styles/variables-primitive.css +1 -327
  236. package/dist/es/styles/variables-semantic.css +1 -609
  237. package/dist/es/styles/variables-tailwind-theme.css +1 -34
  238. package/dist/es/styles/variables-tokens-root.css +1 -41
  239. package/dist/es/types.js +1 -1
  240. package/dist/es/types.js.map +1 -1
  241. package/dist/es/vite/index.js +3 -53
  242. package/dist/es/vite/index.js.map +1 -1
  243. package/dist/types/components/Accordion/index.d.ts +1 -1
  244. package/dist/types/components/Alert/Alert.d.ts +8 -2
  245. package/dist/types/components/Alert/index.d.ts +1 -1
  246. package/dist/types/components/Avatar/Avatar.d.ts +1 -1
  247. package/dist/types/components/Avatar/index.d.ts +2 -2
  248. package/dist/types/components/Badge/index.d.ts +1 -1
  249. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +34 -0
  250. package/dist/types/components/Breadcrumb/index.d.ts +1 -0
  251. package/dist/types/components/Button/Button.d.ts +3 -3
  252. package/dist/types/components/Button/CopyButton.d.ts +9 -4
  253. package/dist/types/components/Button/index.d.ts +2 -2
  254. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +4 -3
  255. package/dist/types/components/ButtonGroup/index.d.ts +1 -1
  256. package/dist/types/components/Card/index.d.ts +1 -1
  257. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -1
  258. package/dist/types/components/Checkbox/index.d.ts +1 -1
  259. package/dist/types/components/CodeBlock/index.d.ts +2 -2
  260. package/dist/types/components/DataTable/DataTable.d.ts +3 -2
  261. package/dist/types/components/DataTable/index.d.ts +4 -4
  262. package/dist/types/components/DateInput/DateInput.d.ts +1 -1
  263. package/dist/types/components/DateInput/index.d.ts +1 -1
  264. package/dist/types/components/DatePicker/DatePicker.d.ts +7 -6
  265. package/dist/types/components/DatePicker/context.d.ts +1 -1
  266. package/dist/types/components/DatePicker/index.d.ts +2 -2
  267. package/dist/types/components/DateRangePicker/Calendar.d.ts +1 -1
  268. package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +5 -5
  269. package/dist/types/components/DateRangePicker/context.d.ts +2 -2
  270. package/dist/types/components/DateRangePicker/index.d.ts +2 -2
  271. package/dist/types/components/Dialog/Dialog.d.ts +19 -1
  272. package/dist/types/components/Dialog/index.d.ts +1 -1
  273. package/dist/types/components/EmptyMessage/EmptyMessage.d.ts +15 -3
  274. package/dist/types/components/EmptyMessage/index.d.ts +1 -1
  275. package/dist/types/components/Field/Field.d.ts +14 -4
  276. package/dist/types/components/Field/index.d.ts +1 -1
  277. package/dist/types/components/FieldError/FieldError.d.ts +7 -1
  278. package/dist/types/components/FieldError/index.d.ts +1 -1
  279. package/dist/types/components/FileUpload/index.d.ts +1 -1
  280. package/dist/types/components/FloatingLabelInput/index.d.ts +1 -1
  281. package/dist/types/components/FloatingLabelSelect/index.d.ts +1 -1
  282. package/dist/types/components/Icon/aliases.d.ts +20 -20
  283. package/dist/types/components/Icon/index.d.ts +653 -653
  284. package/dist/types/components/Image/Image.d.ts +1 -1
  285. package/dist/types/components/Image/index.d.ts +1 -1
  286. package/dist/types/components/Indicator/index.d.ts +3 -3
  287. package/dist/types/components/Input/Input.d.ts +2 -2
  288. package/dist/types/components/Input/index.d.ts +1 -1
  289. package/dist/types/components/InputGroup/InputGroup.d.ts +78 -0
  290. package/dist/types/components/InputGroup/index.d.ts +1 -0
  291. package/dist/types/components/Kbd/Kbd.d.ts +20 -0
  292. package/dist/types/components/Kbd/index.d.ts +1 -0
  293. package/dist/types/components/Label/index.d.ts +1 -1
  294. package/dist/types/components/Markdown/Markdown.d.ts +1 -1
  295. package/dist/types/components/Markdown/index.d.ts +4 -4
  296. package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +6 -2
  297. package/dist/types/components/MarkdownEditor/index.d.ts +1 -1
  298. package/dist/types/components/Menu/Menu.d.ts +19 -5
  299. package/dist/types/components/Menu/index.d.ts +1 -1
  300. package/dist/types/components/OTPInput/index.d.ts +1 -1
  301. package/dist/types/components/PlexUIProvider/PlexUIProvider.d.ts +0 -11
  302. package/dist/types/components/PlexUIProvider/index.d.ts +1 -1
  303. package/dist/types/components/Popover/index.d.ts +2 -2
  304. package/dist/types/components/Progress/index.d.ts +1 -1
  305. package/dist/types/components/ProgressSteps/ProgressSteps.d.ts +1 -1
  306. package/dist/types/components/ProgressSteps/index.d.ts +1 -1
  307. package/dist/types/components/RadioGroup/RadioGroup.d.ts +3 -1
  308. package/dist/types/components/RadioGroup/index.d.ts +1 -1
  309. package/dist/types/components/SegmentedControl/index.d.ts +2 -2
  310. package/dist/types/components/Select/Select.d.ts +8 -1
  311. package/dist/types/components/Select/index.d.ts +1 -1
  312. package/dist/types/components/SelectControl/SelectControl.d.ts +1 -1
  313. package/dist/types/components/SelectControl/index.d.ts +1 -1
  314. package/dist/types/components/Separator/index.d.ts +1 -1
  315. package/dist/types/components/ShimmerText/index.d.ts +1 -1
  316. package/dist/types/components/Sidebar/Sidebar.d.ts +4 -8
  317. package/dist/types/components/Sidebar/index.d.ts +4 -4
  318. package/dist/types/components/Slider/Slider.d.ts +8 -0
  319. package/dist/types/components/Slider/index.d.ts +2 -2
  320. package/dist/types/components/StatCard/index.d.ts +1 -1
  321. package/dist/types/components/Switch/index.d.ts +1 -1
  322. package/dist/types/components/Table/index.d.ts +1 -1
  323. package/dist/types/components/Tabs/Tabs.d.ts +15 -2
  324. package/dist/types/components/Tabs/index.d.ts +2 -2
  325. package/dist/types/components/Tabs/overflow.d.ts +17 -0
  326. package/dist/types/components/TagInput/TagInput.d.ts +1 -1
  327. package/dist/types/components/TagInput/index.d.ts +1 -1
  328. package/dist/types/components/TextLink/index.d.ts +1 -1
  329. package/dist/types/components/Textarea/Textarea.d.ts +1 -1
  330. package/dist/types/components/Textarea/index.d.ts +1 -1
  331. package/dist/types/components/Toast/index.d.ts +1 -1
  332. package/dist/types/components/Tooltip/CopyTooltip.d.ts +6 -1
  333. package/dist/types/components/Tooltip/index.d.ts +2 -2
  334. package/dist/types/components/Transition/Animate.d.ts +2 -2
  335. package/dist/types/components/Transition/AnimateLayout.d.ts +2 -2
  336. package/dist/types/components/Transition/AnimateLayoutGroup.d.ts +2 -2
  337. package/dist/types/components/Transition/SlotTransitionGroup.d.ts +1 -1
  338. package/dist/types/components/Transition/TransitionGroup.d.ts +1 -1
  339. package/dist/types/components/Transition/index.d.ts +5 -5
  340. package/dist/types/components/UIProvider/index.d.ts +1 -1
  341. package/dist/types/global.d.ts +5 -1
  342. package/dist/types/lib/constants.d.ts +1 -1
  343. package/dist/types/lib/helpers.d.ts +4 -4
  344. package/dist/types/lib/theme.d.ts +1 -1
  345. package/dist/types/types.d.ts +2 -15
  346. package/dist/types/vite/index.d.ts +2 -55
  347. package/package.json +10 -18
  348. package/dist/es/components/Accordion/Accordion.module.css +0 -89
  349. package/dist/es/components/Alert/Alert.module.css +0 -187
  350. package/dist/es/components/Avatar/Avatar.module.css +0 -168
  351. package/dist/es/components/Avatar/AvatarGroup.module.css +0 -26
  352. package/dist/es/components/Badge/Badge.module.css +0 -196
  353. package/dist/es/components/Button/Button.module.css +0 -859
  354. package/dist/es/components/ButtonGroup/ButtonGroup.module.css +0 -159
  355. package/dist/es/components/Card/Card.module.css +0 -125
  356. package/dist/es/components/Checkbox/Checkbox.module.css +0 -198
  357. package/dist/es/components/CodeBlock/CodeBlock.module.css +0 -137
  358. package/dist/es/components/DataTable/DataTable.module.css +0 -108
  359. package/dist/es/components/DatePicker/Calendar.module.css +0 -271
  360. package/dist/es/components/DateRangePicker/Calendar.module.css +0 -295
  361. package/dist/es/components/DateRangePicker/Trigger.module.css +0 -25
  362. package/dist/es/components/Dialog/Dialog.module.css +0 -133
  363. package/dist/es/components/EmptyMessage/EmptyMessage.module.css +0 -82
  364. package/dist/es/components/Field/Field.module.css +0 -137
  365. package/dist/es/components/FieldError/FieldError.module.css +0 -22
  366. package/dist/es/components/FileUpload/FileUpload.module.css +0 -133
  367. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +0 -220
  368. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +0 -146
  369. package/dist/es/components/Image/Image.module.css +0 -9
  370. package/dist/es/components/Indicator/CircularProgress.module.css +0 -28
  371. package/dist/es/components/Indicator/LoadingDots.module.css +0 -35
  372. package/dist/es/components/Indicator/LoadingIndicator.module.css +0 -41
  373. package/dist/es/components/Input/Input.module.css +0 -507
  374. package/dist/es/components/Label/Label.module.css +0 -16
  375. package/dist/es/components/Markdown/Markdown.module.css +0 -233
  376. package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +0 -297
  377. package/dist/es/components/Menu/Menu.module.css +0 -377
  378. package/dist/es/components/OTPInput/OTPInput.module.css +0 -66
  379. package/dist/es/components/Popover/Popover.module.css +0 -82
  380. package/dist/es/components/Progress/Progress.module.css +0 -34
  381. package/dist/es/components/ProgressSteps/ProgressSteps.module.css +0 -246
  382. package/dist/es/components/RadioGroup/RadioGroup.module.css +0 -137
  383. package/dist/es/components/Select/Select.module.css +0 -310
  384. package/dist/es/components/SelectControl/SelectControl.module.css +0 -558
  385. package/dist/es/components/Separator/Separator.module.css +0 -16
  386. package/dist/es/components/ShimmerText/ShimmerText.module.css +0 -43
  387. package/dist/es/components/Sidebar/Sidebar.module.css +0 -909
  388. package/dist/es/components/Skeleton/Skeleton.module.css +0 -17
  389. package/dist/es/components/Slider/Slider.module.css +0 -203
  390. package/dist/es/components/StatCard/StatCard.module.css +0 -234
  391. package/dist/es/components/Switch/Switch.module.css +0 -121
  392. package/dist/es/components/Table/Table.module.css +0 -56
  393. package/dist/es/components/Tabs/Tabs.module.css +0 -672
  394. package/dist/es/components/TagInput/TagInput.module.css +0 -320
  395. package/dist/es/components/TextLink/TextLink.module.css +0 -50
  396. package/dist/es/components/Textarea/Textarea.module.css +0 -272
  397. package/dist/es/components/Toast/Toast.module.css +0 -84
  398. package/dist/es/components/Tooltip/Tooltip.module.css +0 -91
  399. package/dist/es/components/Transition/Animate.module.css +0 -54
  400. package/dist/es/components/Transition/AnimateLayout.module.css +0 -101
  401. package/dist/es/components/Transition/AnimateLayoutGroup.module.css +0 -72
  402. package/dist/es/components/Transition/TransitionGroup.module.css +0 -4
@@ -2,23 +2,54 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DateTime, Interval } from "luxon";
4
4
  import { useEffect, useMemo, useRef, useState } from "react";
5
- import { chunkIntoWeeks, getDaysOfMonth, isBefore, isSameDay, isToday } from "../../lib/dateUtils";
6
- import { waitForAnimationFrame } from "../../lib/helpers";
7
- import { Button } from "../Button";
8
- import { ChevronLeft, ChevronRight } from "../Icon";
9
- import { usePopoverClose } from "../Popover/usePopoverController";
10
- import { Select } from "../Select";
11
- import { TransitionGroup } from "../Transition";
12
- import s from "./Calendar.module.css";
13
- import { useDateContext } from "./context";
5
+ import { useStableCallback } from "../../hooks/useStableCallback.js";
6
+ import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, } from "../../lib/dateUtils.js";
7
+ import { waitForAnimationFrame } from "../../lib/helpers.js";
8
+ import { Button } from "../Button/index.js";
9
+ import { ChevronLeft, ChevronRight } from "../Icon/index.js";
10
+ import { usePopoverClose } from "../Popover/usePopoverController.js";
11
+ import { Select } from "../Select/index.js";
12
+ import { TransitionGroup } from "../Transition/index.js";
13
+ import s from "@plexui/styles/components/DatePicker/Calendar.module.css";
14
+ import { useDateContext } from "./context.js";
14
15
  const CALENDAR_WIDTH_PX = 210;
15
16
  const CALENDAR_GAP_PX = 32;
16
17
  const STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX;
17
18
  const SHORT_MONTH_NAMES = Array.from({ length: 12 }, (_, i) => DateTime.local(2024, i + 1, 1).monthShort);
19
+ // The day a grid key moves to: a day, a week, the Sunday or Saturday of the
20
+ // week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)
21
+ const getKeyTarget = (key, day) => {
22
+ switch (key) {
23
+ case "ArrowLeft":
24
+ return day.minus({ days: 1 });
25
+ case "ArrowRight":
26
+ return day.plus({ days: 1 });
27
+ case "ArrowUp":
28
+ return day.minus({ days: 7 });
29
+ case "ArrowDown":
30
+ return day.plus({ days: 7 });
31
+ case "Home":
32
+ return day.minus({ days: day.weekday % 7 });
33
+ case "End":
34
+ return day.plus({ days: 6 - (day.weekday % 7) });
35
+ case "PageUp":
36
+ return day.minus({ months: 1 });
37
+ case "PageDown":
38
+ return day.plus({ months: 1 });
39
+ default:
40
+ return null;
41
+ }
42
+ };
43
+ // Whole-day bounds, as the day buttons' disabled state
44
+ const isDayWithinLimits = (day, min, max) => !(min && isBefore(day, min.startOf("day"))) && !(max && isAfter(day, max.endOf("day")));
45
+ const monthIndex = (date) => date.year * 12 + date.month;
18
46
  export const DateCalendar = () => {
19
47
  const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext();
20
48
  const closePopover = usePopoverClose();
21
49
  const calendarContainerRef = useRef(null);
50
+ // The day to focus once a key has moved the view to its month. It lives
51
+ // here, outside the wrapper that the dropdown layout re-keys
52
+ const pendingFocusRef = useRef(null);
22
53
  const [calendarSteps, setCalendarSteps] = useState(0);
23
54
  const [forceRenderIncrement, setForceRenderIncrement] = useState(0);
24
55
  const [calendarDate, setCalendarDate] = useState(() => value ?? DateTime.now());
@@ -53,9 +84,18 @@ export const DateCalendar = () => {
53
84
  setCalendarDate((dt) => dt.minus({ months: 1 }));
54
85
  }
55
86
  };
87
+ // The calendar limits whole days; with a time picker the chosen time on a
88
+ // min or max day can still cross the bound, so clamp the full date-time
89
+ const clampToBounds = (dateTime) => {
90
+ if (min && dateTime.toMillis() < min.toMillis())
91
+ return min;
92
+ if (max && dateTime.toMillis() > max.toMillis())
93
+ return max;
94
+ return dateTime;
95
+ };
56
96
  const handleDateSelect = (selectedDate) => {
57
97
  if (showTime) {
58
- onChangeRef.current(selectedDate.set({ hour: pendingHour, minute: pendingMinute }));
98
+ onChangeRef.current(clampToBounds(selectedDate.set({ hour: pendingHour, minute: pendingMinute })));
59
99
  }
60
100
  else {
61
101
  onChangeRef.current(selectedDate);
@@ -63,10 +103,12 @@ export const DateCalendar = () => {
63
103
  }
64
104
  };
65
105
  const handleTimeChange = (hour, minute) => {
66
- setPendingHour(hour);
67
- setPendingMinute(minute);
68
- if (value) {
69
- onChangeRef.current(value.set({ hour, minute }));
106
+ const next = value ? clampToBounds(value.set({ hour, minute })) : null;
107
+ // Show the time that was actually applied, even when clamping left value unchanged
108
+ setPendingHour(next ? next.hour : hour);
109
+ setPendingMinute(next ? next.minute : minute);
110
+ if (next) {
111
+ onChangeRef.current(next);
70
112
  }
71
113
  };
72
114
  const handleDropdownMonthChange = (month) => {
@@ -77,6 +119,66 @@ export const DateCalendar = () => {
77
119
  setCalendarDate(DateTime.local(year, calendarDate.month, 1));
78
120
  setForceRenderIncrement((c) => c + 1);
79
121
  };
122
+ // Days are named by their full date; skip a calendar that is leaving
123
+ const focusDay = (day) => {
124
+ const label = day.toLocaleString(DateTime.DATE_HUGE);
125
+ const buttons = calendarContainerRef.current?.querySelectorAll(`button[aria-label="${label}"]`);
126
+ Array.from(buttons ?? [])
127
+ .find((button) => !button.closest("[data-exiting]"))
128
+ ?.focus();
129
+ };
130
+ // A calendar that is leaving keeps the props it last rendered with, so its
131
+ // days reach the current state through a stable callback
132
+ const handleDayKeyDown = useStableCallback((event, day) => {
133
+ if (event.altKey || event.ctrlKey || event.metaKey) {
134
+ return;
135
+ }
136
+ // While a move waits for its month to render, the next key starts from
137
+ // the day it is moving to (key repeat), not the day that still has focus
138
+ const target = getKeyTarget(event.key, pendingFocusRef.current ?? day);
139
+ if (!target) {
140
+ return;
141
+ }
142
+ event.preventDefault();
143
+ // A disabled day keeps focus where it is
144
+ if (!isDayWithinLimits(target, min, max)) {
145
+ return;
146
+ }
147
+ const months = monthIndex(target) - monthIndex(calendarDate);
148
+ if (months === 0) {
149
+ pendingFocusRef.current = null;
150
+ focusDay(target);
151
+ return;
152
+ }
153
+ // Step the view like the month buttons; a day within min/max keeps every step in bounds
154
+ if (months > 0 ? !canGoForward : !canGoBack) {
155
+ return;
156
+ }
157
+ pendingFocusRef.current = target;
158
+ for (let step = 0; step < Math.abs(months); step++) {
159
+ if (months > 0) {
160
+ handleNext();
161
+ }
162
+ else {
163
+ handlePrevious();
164
+ }
165
+ }
166
+ });
167
+ // Focus a pending day once its month has rendered. New calendars mount
168
+ // after this render (TransitionGroup), so wait a frame like the height does
169
+ useEffect(() => {
170
+ if (!pendingFocusRef.current) {
171
+ return;
172
+ }
173
+ return waitForAnimationFrame(() => {
174
+ const target = pendingFocusRef.current;
175
+ pendingFocusRef.current = null;
176
+ if (target) {
177
+ focusDay(target);
178
+ }
179
+ });
180
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when the month changes
181
+ }, [calendarDate]);
80
182
  // Force re-renders when `value` changes out of band from direct user-selection
81
183
  useEffect(() => {
82
184
  // No-op when value is empty
@@ -125,12 +227,12 @@ export const DateCalendar = () => {
125
227
  }
126
228
  });
127
229
  }, [calendarDate]);
128
- return (_jsxs("div", { className: s.CalendarWrapper, children: [_jsxs("div", { ref: calendarContainerRef, className: s.CalendarContainer, "data-dropdown": isDropdown ? "" : undefined, children: [_jsx("div", { className: s.Previous, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handlePrevious, disabled: !canGoBack, children: _jsx(ChevronLeft, {}) }) }), _jsx("div", { className: s.Next, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handleNext, disabled: !canGoForward, children: _jsx(ChevronRight, {}) }) }), isDropdown && (_jsx(DropdownCaption, { date: calendarDate, onMonthChange: handleDropdownMonthChange, onYearChange: handleDropdownYearChange, min: min, max: max, yearRange: yearRange })), _jsx("div", { className: s.CalendarRange, style: !isDropdown
230
+ return (_jsxs("div", { className: s.CalendarWrapper, children: [_jsxs("div", { ref: calendarContainerRef, className: s.CalendarContainer, "data-dropdown": isDropdown ? "" : undefined, children: [_jsx("div", { className: s.Previous, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handlePrevious, disabled: !canGoBack, "aria-label": "Previous month", children: _jsx(ChevronLeft, {}) }) }), _jsx("div", { className: s.Next, children: _jsx(Button, { variant: "ghost", color: "secondary", size: "sm", gutterSize: "2xs", pill: false, iconSize: "sm", onClick: handleNext, disabled: !canGoForward, "aria-label": "Next month", children: _jsx(ChevronRight, {}) }) }), isDropdown && (_jsx(DropdownCaption, { date: calendarDate, onMonthChange: handleDropdownMonthChange, onYearChange: handleDropdownYearChange, min: min, max: max, yearRange: yearRange })), _jsx("div", { className: s.CalendarRange, style: !isDropdown
129
231
  ? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }
130
- : undefined, children: !isDropdown ? (_jsx(TransitionGroup, { enterDuration: 400, exitDuration: 400, children: _jsx(CalendarView, { stepPosition: calendarSteps, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, hideMonthLabel: false }, calendarDate.toLocaleString({
232
+ : undefined, children: !isDropdown ? (_jsx(TransitionGroup, { enterDuration: 400, exitDuration: 400, children: _jsx(CalendarView, { stepPosition: calendarSteps, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, onDayKeyDown: handleDayKeyDown, hideMonthLabel: false }, calendarDate.toLocaleString({
131
233
  month: "long",
132
234
  year: "numeric",
133
- })) })) : (_jsx(CalendarView, { stepPosition: 0, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, hideMonthLabel: true }, calendarDate.toLocaleString({
235
+ })) })) : (_jsx(CalendarView, { stepPosition: 0, date: calendarDate, selectedDate: value, min: min, max: max, onDateSelect: handleDateSelect, onDayKeyDown: handleDayKeyDown, hideMonthLabel: true }, calendarDate.toLocaleString({
134
236
  month: "long",
135
237
  year: "numeric",
136
238
  }))) })] }), showTime && (_jsx(TimeInput, { hour: pendingHour, minute: pendingMinute, onChange: handleTimeChange }))] }, `stable-view-${forceRenderIncrement}`));
@@ -173,6 +275,8 @@ const TimeInput = ({ hour, minute, onChange }) => {
173
275
  setMinuteText(raw);
174
276
  if (raw.length === 2) {
175
277
  onChange(hour, Math.min(59, Number(raw)));
278
+ // Show the accepted value: the parent may clamp it to min/max
279
+ setMinuteText(null);
176
280
  }
177
281
  };
178
282
  const handleMinuteBlur = (e) => {
@@ -181,32 +285,30 @@ const TimeInput = ({ hour, minute, onChange }) => {
181
285
  onChange(hour, m);
182
286
  setMinuteText(null);
183
287
  };
288
+ // Arrow steps drop the draft text so the field shows the accepted value,
289
+ // which the parent may have clamped to min/max
184
290
  const handleKeyDown = (e, type) => {
185
291
  const step = e.shiftKey ? 10 : 1;
186
292
  if (e.key === "ArrowUp") {
187
293
  e.preventDefault();
188
294
  if (type === "hour") {
189
- const h = (hour + step) % 24;
190
- onChange(h, minute);
191
- setHourText(String(h).padStart(2, "0"));
295
+ onChange((hour + step) % 24, minute);
296
+ setHourText(null);
192
297
  }
193
298
  else {
194
- const m = (minute + step) % 60;
195
- onChange(hour, m);
196
- setMinuteText(String(m).padStart(2, "0"));
299
+ onChange(hour, (minute + step) % 60);
300
+ setMinuteText(null);
197
301
  }
198
302
  }
199
303
  else if (e.key === "ArrowDown") {
200
304
  e.preventDefault();
201
305
  if (type === "hour") {
202
- const h = (hour - step + 24) % 24;
203
- onChange(h, minute);
204
- setHourText(String(h).padStart(2, "0"));
306
+ onChange((hour - step + 24) % 24, minute);
307
+ setHourText(null);
205
308
  }
206
309
  else {
207
- const m = (minute - step + 60) % 60;
208
- onChange(hour, m);
209
- setMinuteText(String(m).padStart(2, "0"));
310
+ onChange(hour, (minute - step + 60) % 60);
311
+ setMinuteText(null);
210
312
  }
211
313
  }
212
314
  };
@@ -219,7 +321,7 @@ const TimeInput = ({ hour, minute, onChange }) => {
219
321
  }, onKeyDown: (e) => handleKeyDown(e, "minute"), maxLength: 2, "aria-label": "Minute" })] })] }));
220
322
  };
221
323
  const daysOfTheWeekLabels = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
222
- const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition, hideMonthLabel = false, }) => {
324
+ const CalendarView = ({ date, selectedDate, min, max, onDateSelect, onDayKeyDown, stepPosition, hideMonthLabel = false, }) => {
223
325
  // Lock position on mount and don't respond to changes
224
326
  const [position] = useState(stepPosition);
225
327
  const { startOfMonth, weeks, enabledInterval } = useMemo(() => {
@@ -229,7 +331,9 @@ const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition
229
331
  const blankDays = new Array(daysBeforeMonthStart).fill(null);
230
332
  const daysInMonth = getDaysOfMonth(monthStart);
231
333
  const calendarCells = [...blankDays, ...daysInMonth];
232
- const enabledDateInterval = Interval.fromDateTimes(min || monthStart, max || endOfMonth);
334
+ // Cells are start-of-day values and Interval excludes its end, so widen the
335
+ // bounds to whole days: min/max days themselves stay selectable.
336
+ const enabledDateInterval = Interval.fromDateTimes((min || monthStart).startOf("day"), (max || endOfMonth).endOf("day"));
233
337
  return {
234
338
  startOfMonth: monthStart,
235
339
  endOfMonth,
@@ -244,7 +348,7 @@ const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition
244
348
  const enabled = enabledInterval.contains(d);
245
349
  const isSelected = enabled && selectedDate && isSameDay(d, selectedDate);
246
350
  const dayIsToday = isToday(d);
247
- return (_jsx("div", { className: s.Day, "data-is-selected": isSelected ? "" : undefined, children: _jsxs("button", { type: "button", className: s.InteractiveDay, disabled: !enabled, onClick: () => d && onDateSelect?.(d), children: [d.day, dayIsToday && _jsx("span", { className: s.TodayDot })] }) }, dayIndex));
351
+ return (_jsx("div", { className: s.Day, "data-is-selected": isSelected ? "" : undefined, children: _jsxs("button", { type: "button", className: s.InteractiveDay, disabled: !enabled, "aria-label": d.toLocaleString(DateTime.DATE_HUGE), "aria-pressed": !!isSelected, "aria-current": dayIsToday ? "date" : undefined, onClick: () => d && onDateSelect?.(d), onKeyDown: (event) => d && onDayKeyDown?.(event, d), children: [d.day, dayIsToday && _jsx("span", { className: s.TodayDot })] }) }, dayIndex));
248
352
  }) }, weekIndex)))] }));
249
353
  };
250
354
  //# sourceMappingURL=Calendar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/Calendar.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DateTime, Interval } from \"luxon\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { chunkIntoWeeks, getDaysOfMonth, isBefore, isSameDay, isToday } from \"../../lib/dateUtils\"\nimport { waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { ChevronLeft, ChevronRight } from \"../Icon\"\nimport { usePopoverClose } from \"../Popover/usePopoverController\"\nimport { Select } from \"../Select\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Calendar.module.css\"\nimport { useDateContext } from \"./context\"\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\nconst SHORT_MONTH_NAMES = Array.from(\n { length: 12 },\n (_, i) => DateTime.local(2024, i + 1, 1).monthShort!,\n)\n\nexport const DateCalendar = () => {\n const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext()\n const closePopover = usePopoverClose()\n const calendarContainerRef = useRef<HTMLDivElement | null>(null)\n const [calendarSteps, setCalendarSteps] = useState<number>(0)\n const [forceRenderIncrement, setForceRenderIncrement] = useState<number>(0)\n const [calendarDate, setCalendarDate] = useState<DateTime>(() => value ?? DateTime.now())\n\n const isDropdown = captionLayout === \"dropdown\"\n\n const canGoBack = !min || isBefore(min, calendarDate.startOf(\"month\"))\n const canGoForward = !max || isBefore(calendarDate.endOf(\"month\"), max)\n\n const [pendingHour, setPendingHour] = useState<number>(() => value?.hour ?? 12)\n const [pendingMinute, setPendingMinute] = useState<number>(() => value?.minute ?? 0)\n\n useEffect(() => {\n if (value) {\n setPendingHour(value.hour)\n setPendingMinute(value.minute)\n }\n }, [value])\n\n const handleNext = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c + 1)\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n }\n }\n\n const handlePrevious = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c - 1)\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n }\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (showTime) {\n onChangeRef.current(selectedDate.set({ hour: pendingHour, minute: pendingMinute }))\n } else {\n onChangeRef.current(selectedDate)\n closePopover()\n }\n }\n\n const handleTimeChange = (hour: number, minute: number) => {\n setPendingHour(hour)\n setPendingMinute(minute)\n if (value) {\n onChangeRef.current(value.set({ hour, minute }))\n }\n }\n\n const handleDropdownMonthChange = (month: number) => {\n setCalendarDate(DateTime.local(calendarDate.year, month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n const handleDropdownYearChange = (year: number) => {\n setCalendarDate(DateTime.local(year, calendarDate.month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n // Force re-renders when `value` changes out of band from direct user-selection\n useEffect(() => {\n // No-op when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n calendarDate.startOf(\"month\"),\n calendarDate.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value)\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n setCalendarSteps(0)\n setCalendarDate(value)\n setForceRenderIncrement((c) => c + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when value changes\n }, [value])\n\n // Detect height changes when new calendars are rendered\n useEffect(() => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.current\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }, [calendarDate])\n\n return (\n <div className={s.CalendarWrapper} key={`stable-view-${forceRenderIncrement}`}>\n <div\n ref={calendarContainerRef}\n className={s.CalendarContainer}\n data-dropdown={isDropdown ? \"\" : undefined}\n >\n <div className={s.Previous}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handlePrevious}\n disabled={!canGoBack}\n >\n <ChevronLeft />\n </Button>\n </div>\n <div className={s.Next}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handleNext}\n disabled={!canGoForward}\n >\n <ChevronRight />\n </Button>\n </div>\n {isDropdown && (\n <DropdownCaption\n date={calendarDate}\n onMonthChange={handleDropdownMonthChange}\n onYearChange={handleDropdownYearChange}\n min={min}\n max={max}\n yearRange={yearRange}\n />\n )}\n <div\n className={s.CalendarRange}\n style={\n !isDropdown\n ? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }\n : undefined\n }\n >\n {!isDropdown ? (\n <TransitionGroup enterDuration={400} exitDuration={400}>\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={calendarSteps}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel={false}\n />\n </TransitionGroup>\n ) : (\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={0}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel\n />\n )}\n </div>\n </div>\n {showTime && (\n <TimeInput hour={pendingHour} minute={pendingMinute} onChange={handleTimeChange} />\n )}\n </div>\n )\n}\n\ntype DropdownCaptionProps = {\n date: DateTime\n onMonthChange: (month: number) => void\n onYearChange: (year: number) => void\n min?: DateTime\n max?: DateTime\n yearRange?: [number, number]\n}\n\nconst DropdownCaption = ({\n date,\n onMonthChange,\n onYearChange,\n min,\n max,\n yearRange,\n}: DropdownCaptionProps) => {\n const currentYear = DateTime.now().year\n const minYear = yearRange?.[0] ?? min?.year ?? currentYear - 120\n const maxYear = yearRange?.[1] ?? max?.year ?? currentYear\n\n const years = useMemo(() => {\n const result: number[] = []\n for (let y = maxYear; y >= minYear; y--) {\n result.push(y)\n }\n return result\n }, [minYear, maxYear])\n\n return (\n <div className={s.DropdownCaption}>\n <Select\n aria-label=\"Month\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.month)}\n options={SHORT_MONTH_NAMES.map((label, index) => ({ value: String(index + 1), label }))}\n onChange={(option) => onMonthChange(Number(option.value))}\n />\n <Select\n aria-label=\"Year\"\n searchAriaLabel=\"Search year\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.year)}\n options={years.map((year) => ({ value: String(year), label: String(year) }))}\n onChange={(option) => onYearChange(Number(option.value))}\n />\n </div>\n )\n}\n\ntype TimeInputProps = {\n hour: number\n minute: number\n onChange: (hour: number, minute: number) => void\n}\n\nconst TimeInput = ({ hour, minute, onChange }: TimeInputProps) => {\n const hourRef = useRef<HTMLInputElement>(null)\n const minuteRef = useRef<HTMLInputElement>(null)\n const [hourText, setHourText] = useState<string | null>(null)\n const [minuteText, setMinuteText] = useState<string | null>(null)\n\n const handleHourChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setHourText(raw)\n if (raw.length === 2) {\n onChange(Math.min(23, Number(raw)), minute)\n minuteRef.current?.focus()\n minuteRef.current?.select()\n }\n }\n\n const handleHourBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const h = Math.min(23, Number(raw) || 0)\n onChange(h, minute)\n setHourText(null)\n }\n\n const handleMinuteChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setMinuteText(raw)\n if (raw.length === 2) {\n onChange(hour, Math.min(59, Number(raw)))\n }\n }\n\n const handleMinuteBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const m = Math.min(59, Number(raw) || 0)\n onChange(hour, m)\n setMinuteText(null)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, type: \"hour\" | \"minute\") => {\n const step = e.shiftKey ? 10 : 1\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour + step) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute + step) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour - step + 24) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute - step + 60) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n }\n }\n\n return (\n <div className={s.TimeFooter}>\n <span className={s.TimeLabel}>Time</span>\n <div className={s.TimeInputGroup}>\n <input\n ref={hourRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourText ?? String(hour).padStart(2, \"0\")}\n onChange={handleHourChange}\n onBlur={handleHourBlur}\n onFocus={(e) => {\n setHourText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n maxLength={2}\n aria-label=\"Hour\"\n />\n <span className={s.TimeSeparator}>:</span>\n <input\n ref={minuteRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteText ?? String(minute).padStart(2, \"0\")}\n onChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n onFocus={(e) => {\n setMinuteText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n maxLength={2}\n aria-label=\"Minute\"\n />\n </div>\n </div>\n )\n}\n\ntype CalendarViewProps = {\n date: DateTime\n selectedDate?: DateTime | null\n onDateSelect?: (dt: DateTime) => void\n min?: DateTime\n max?: DateTime\n stepPosition: number\n hideMonthLabel?: boolean\n}\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = ({\n date,\n selectedDate,\n min,\n max,\n onDateSelect,\n stepPosition,\n hideMonthLabel = false,\n}: CalendarViewProps) => {\n // Lock position on mount and don't respond to changes\n const [position] = useState(stepPosition)\n const { startOfMonth, weeks, enabledInterval } = useMemo(() => {\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n const enabledDateInterval = Interval.fromDateTimes(min || monthStart, max || endOfMonth)\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7),\n enabledInterval: enabledDateInterval,\n }\n }, [date, min, max])\n\n return (\n <div\n className={s.Calendar}\n style={hideMonthLabel ? undefined : { left: position * STEP_DISTANCE_PX }}\n data-calendar\n data-static={hideMonthLabel ? \"\" : undefined}\n >\n {hideMonthLabel ? (\n <div className={s.MonthLabelSpacer} aria-hidden=\"true\" />\n ) : (\n <p className={s.MonthLabel}>\n {startOfMonth.monthLong} {startOfMonth.year}\n </p>\n )}\n <div className={s.Week}>\n {daysOfTheWeekLabels.map((day) => (\n <div key={day} className={s.DayLabel}>\n {day}\n </div>\n ))}\n </div>\n {weeks.map((week, weekIndex) => (\n <div className={s.Week} key={weekIndex}>\n {week.map((d, dayIndex) => {\n if (!d) {\n return <div className={s.Day} key={`${weekIndex}-${dayIndex}`} />\n }\n\n const enabled = enabledInterval.contains(d)\n const isSelected = enabled && selectedDate && isSameDay(d, selectedDate)\n const dayIsToday = isToday(d)\n\n return (\n <div className={s.Day} key={dayIndex} data-is-selected={isSelected ? \"\" : undefined}>\n <button\n type=\"button\"\n className={s.InteractiveDay}\n disabled={!enabled}\n onClick={() => d && onDateSelect?.(d)}\n >\n {d.day}\n {dayIsToday && <span className={s.TodayDot} />}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/Calendar.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DateTime, Interval } from \"luxon\"\nimport { useEffect, useMemo, useRef, useState, type KeyboardEvent } from \"react\"\nimport { useStableCallback } from \"../../hooks/useStableCallback\"\nimport {\n chunkIntoWeeks,\n getDaysOfMonth,\n isAfter,\n isBefore,\n isSameDay,\n isToday,\n} from \"../../lib/dateUtils\"\nimport { waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { ChevronLeft, ChevronRight } from \"../Icon\"\nimport { usePopoverClose } from \"../Popover/usePopoverController\"\nimport { Select } from \"../Select\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"@plexui/styles/components/DatePicker/Calendar.module.css\"\nimport { useDateContext } from \"./context\"\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\nconst SHORT_MONTH_NAMES = Array.from(\n { length: 12 },\n (_, i) => DateTime.local(2024, i + 1, 1).monthShort!,\n)\n\n// The day a grid key moves to: a day, a week, the Sunday or Saturday of the\n// week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)\nconst getKeyTarget = (key: string, day: DateTime): DateTime | null => {\n switch (key) {\n case \"ArrowLeft\":\n return day.minus({ days: 1 })\n case \"ArrowRight\":\n return day.plus({ days: 1 })\n case \"ArrowUp\":\n return day.minus({ days: 7 })\n case \"ArrowDown\":\n return day.plus({ days: 7 })\n case \"Home\":\n return day.minus({ days: day.weekday % 7 })\n case \"End\":\n return day.plus({ days: 6 - (day.weekday % 7) })\n case \"PageUp\":\n return day.minus({ months: 1 })\n case \"PageDown\":\n return day.plus({ months: 1 })\n default:\n return null\n }\n}\n\n// Whole-day bounds, as the day buttons' disabled state\nconst isDayWithinLimits = (day: DateTime, min?: DateTime, max?: DateTime) =>\n !(min && isBefore(day, min.startOf(\"day\"))) && !(max && isAfter(day, max.endOf(\"day\")))\n\nconst monthIndex = (date: DateTime) => date.year * 12 + date.month\n\nexport const DateCalendar = () => {\n const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext()\n const closePopover = usePopoverClose()\n const calendarContainerRef = useRef<HTMLDivElement | null>(null)\n // The day to focus once a key has moved the view to its month. It lives\n // here, outside the wrapper that the dropdown layout re-keys\n const pendingFocusRef = useRef<DateTime | null>(null)\n const [calendarSteps, setCalendarSteps] = useState<number>(0)\n const [forceRenderIncrement, setForceRenderIncrement] = useState<number>(0)\n const [calendarDate, setCalendarDate] = useState<DateTime>(() => value ?? DateTime.now())\n\n const isDropdown = captionLayout === \"dropdown\"\n\n const canGoBack = !min || isBefore(min, calendarDate.startOf(\"month\"))\n const canGoForward = !max || isBefore(calendarDate.endOf(\"month\"), max)\n\n const [pendingHour, setPendingHour] = useState<number>(() => value?.hour ?? 12)\n const [pendingMinute, setPendingMinute] = useState<number>(() => value?.minute ?? 0)\n\n useEffect(() => {\n if (value) {\n setPendingHour(value.hour)\n setPendingMinute(value.minute)\n }\n }, [value])\n\n const handleNext = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c + 1)\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n }\n }\n\n const handlePrevious = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c - 1)\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n }\n }\n\n // The calendar limits whole days; with a time picker the chosen time on a\n // min or max day can still cross the bound, so clamp the full date-time\n const clampToBounds = (dateTime: DateTime) => {\n if (min && dateTime.toMillis() < min.toMillis()) return min\n if (max && dateTime.toMillis() > max.toMillis()) return max\n return dateTime\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (showTime) {\n onChangeRef.current(\n clampToBounds(selectedDate.set({ hour: pendingHour, minute: pendingMinute })),\n )\n } else {\n onChangeRef.current(selectedDate)\n closePopover()\n }\n }\n\n const handleTimeChange = (hour: number, minute: number) => {\n const next = value ? clampToBounds(value.set({ hour, minute })) : null\n // Show the time that was actually applied, even when clamping left value unchanged\n setPendingHour(next ? next.hour : hour)\n setPendingMinute(next ? next.minute : minute)\n if (next) {\n onChangeRef.current(next)\n }\n }\n\n const handleDropdownMonthChange = (month: number) => {\n setCalendarDate(DateTime.local(calendarDate.year, month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n const handleDropdownYearChange = (year: number) => {\n setCalendarDate(DateTime.local(year, calendarDate.month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n // Days are named by their full date; skip a calendar that is leaving\n const focusDay = (day: DateTime) => {\n const label = day.toLocaleString(DateTime.DATE_HUGE)\n const buttons = calendarContainerRef.current?.querySelectorAll<HTMLButtonElement>(\n `button[aria-label=\"${label}\"]`,\n )\n Array.from(buttons ?? [])\n .find((button) => !button.closest(\"[data-exiting]\"))\n ?.focus()\n }\n\n // A calendar that is leaving keeps the props it last rendered with, so its\n // days reach the current state through a stable callback\n const handleDayKeyDown = useStableCallback((event: KeyboardEvent, day: DateTime) => {\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n\n // While a move waits for its month to render, the next key starts from\n // the day it is moving to (key repeat), not the day that still has focus\n const target = getKeyTarget(event.key, pendingFocusRef.current ?? day)\n if (!target) {\n return\n }\n\n event.preventDefault()\n\n // A disabled day keeps focus where it is\n if (!isDayWithinLimits(target, min, max)) {\n return\n }\n\n const months = monthIndex(target) - monthIndex(calendarDate)\n if (months === 0) {\n pendingFocusRef.current = null\n focusDay(target)\n return\n }\n\n // Step the view like the month buttons; a day within min/max keeps every step in bounds\n if (months > 0 ? !canGoForward : !canGoBack) {\n return\n }\n\n pendingFocusRef.current = target\n for (let step = 0; step < Math.abs(months); step++) {\n if (months > 0) {\n handleNext()\n } else {\n handlePrevious()\n }\n }\n })\n\n // Focus a pending day once its month has rendered. New calendars mount\n // after this render (TransitionGroup), so wait a frame like the height does\n useEffect(() => {\n if (!pendingFocusRef.current) {\n return\n }\n\n return waitForAnimationFrame(() => {\n const target = pendingFocusRef.current\n pendingFocusRef.current = null\n if (target) {\n focusDay(target)\n }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when the month changes\n }, [calendarDate])\n\n // Force re-renders when `value` changes out of band from direct user-selection\n useEffect(() => {\n // No-op when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n calendarDate.startOf(\"month\"),\n calendarDate.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value)\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n setCalendarSteps(0)\n setCalendarDate(value)\n setForceRenderIncrement((c) => c + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when value changes\n }, [value])\n\n // Detect height changes when new calendars are rendered\n useEffect(() => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.current\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }, [calendarDate])\n\n return (\n <div className={s.CalendarWrapper} key={`stable-view-${forceRenderIncrement}`}>\n <div\n ref={calendarContainerRef}\n className={s.CalendarContainer}\n data-dropdown={isDropdown ? \"\" : undefined}\n >\n <div className={s.Previous}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handlePrevious}\n disabled={!canGoBack}\n aria-label=\"Previous month\"\n >\n <ChevronLeft />\n </Button>\n </div>\n <div className={s.Next}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handleNext}\n disabled={!canGoForward}\n aria-label=\"Next month\"\n >\n <ChevronRight />\n </Button>\n </div>\n {isDropdown && (\n <DropdownCaption\n date={calendarDate}\n onMonthChange={handleDropdownMonthChange}\n onYearChange={handleDropdownYearChange}\n min={min}\n max={max}\n yearRange={yearRange}\n />\n )}\n <div\n className={s.CalendarRange}\n style={\n !isDropdown\n ? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }\n : undefined\n }\n >\n {!isDropdown ? (\n <TransitionGroup enterDuration={400} exitDuration={400}>\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={calendarSteps}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n onDayKeyDown={handleDayKeyDown}\n hideMonthLabel={false}\n />\n </TransitionGroup>\n ) : (\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={0}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n onDayKeyDown={handleDayKeyDown}\n hideMonthLabel\n />\n )}\n </div>\n </div>\n {showTime && (\n <TimeInput hour={pendingHour} minute={pendingMinute} onChange={handleTimeChange} />\n )}\n </div>\n )\n}\n\ntype DropdownCaptionProps = {\n date: DateTime\n onMonthChange: (month: number) => void\n onYearChange: (year: number) => void\n min?: DateTime\n max?: DateTime\n yearRange?: [number, number]\n}\n\nconst DropdownCaption = ({\n date,\n onMonthChange,\n onYearChange,\n min,\n max,\n yearRange,\n}: DropdownCaptionProps) => {\n const currentYear = DateTime.now().year\n const minYear = yearRange?.[0] ?? min?.year ?? currentYear - 120\n const maxYear = yearRange?.[1] ?? max?.year ?? currentYear\n\n const years = useMemo(() => {\n const result: number[] = []\n for (let y = maxYear; y >= minYear; y--) {\n result.push(y)\n }\n return result\n }, [minYear, maxYear])\n\n return (\n <div className={s.DropdownCaption}>\n <Select\n aria-label=\"Month\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.month)}\n options={SHORT_MONTH_NAMES.map((label, index) => ({ value: String(index + 1), label }))}\n onChange={(option) => onMonthChange(Number(option.value))}\n />\n <Select\n aria-label=\"Year\"\n searchAriaLabel=\"Search year\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.year)}\n options={years.map((year) => ({ value: String(year), label: String(year) }))}\n onChange={(option) => onYearChange(Number(option.value))}\n />\n </div>\n )\n}\n\ntype TimeInputProps = {\n hour: number\n minute: number\n onChange: (hour: number, minute: number) => void\n}\n\nconst TimeInput = ({ hour, minute, onChange }: TimeInputProps) => {\n const hourRef = useRef<HTMLInputElement>(null)\n const minuteRef = useRef<HTMLInputElement>(null)\n const [hourText, setHourText] = useState<string | null>(null)\n const [minuteText, setMinuteText] = useState<string | null>(null)\n\n const handleHourChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setHourText(raw)\n if (raw.length === 2) {\n onChange(Math.min(23, Number(raw)), minute)\n minuteRef.current?.focus()\n minuteRef.current?.select()\n }\n }\n\n const handleHourBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const h = Math.min(23, Number(raw) || 0)\n onChange(h, minute)\n setHourText(null)\n }\n\n const handleMinuteChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setMinuteText(raw)\n if (raw.length === 2) {\n onChange(hour, Math.min(59, Number(raw)))\n // Show the accepted value: the parent may clamp it to min/max\n setMinuteText(null)\n }\n }\n\n const handleMinuteBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const m = Math.min(59, Number(raw) || 0)\n onChange(hour, m)\n setMinuteText(null)\n }\n\n // Arrow steps drop the draft text so the field shows the accepted value,\n // which the parent may have clamped to min/max\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, type: \"hour\" | \"minute\") => {\n const step = e.shiftKey ? 10 : 1\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n if (type === \"hour\") {\n onChange((hour + step) % 24, minute)\n setHourText(null)\n } else {\n onChange(hour, (minute + step) % 60)\n setMinuteText(null)\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n if (type === \"hour\") {\n onChange((hour - step + 24) % 24, minute)\n setHourText(null)\n } else {\n onChange(hour, (minute - step + 60) % 60)\n setMinuteText(null)\n }\n }\n }\n\n return (\n <div className={s.TimeFooter}>\n <span className={s.TimeLabel}>Time</span>\n <div className={s.TimeInputGroup}>\n <input\n ref={hourRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourText ?? String(hour).padStart(2, \"0\")}\n onChange={handleHourChange}\n onBlur={handleHourBlur}\n onFocus={(e) => {\n setHourText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n maxLength={2}\n aria-label=\"Hour\"\n />\n <span className={s.TimeSeparator}>:</span>\n <input\n ref={minuteRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteText ?? String(minute).padStart(2, \"0\")}\n onChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n onFocus={(e) => {\n setMinuteText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n maxLength={2}\n aria-label=\"Minute\"\n />\n </div>\n </div>\n )\n}\n\ntype CalendarViewProps = {\n date: DateTime\n selectedDate?: DateTime | null\n onDateSelect?: (dt: DateTime) => void\n onDayKeyDown?: (event: KeyboardEvent<HTMLButtonElement>, dt: DateTime) => void\n min?: DateTime\n max?: DateTime\n stepPosition: number\n hideMonthLabel?: boolean\n}\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = ({\n date,\n selectedDate,\n min,\n max,\n onDateSelect,\n onDayKeyDown,\n stepPosition,\n hideMonthLabel = false,\n}: CalendarViewProps) => {\n // Lock position on mount and don't respond to changes\n const [position] = useState(stepPosition)\n const { startOfMonth, weeks, enabledInterval } = useMemo(() => {\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n // Cells are start-of-day values and Interval excludes its end, so widen the\n // bounds to whole days: min/max days themselves stay selectable.\n const enabledDateInterval = Interval.fromDateTimes(\n (min || monthStart).startOf(\"day\"),\n (max || endOfMonth).endOf(\"day\"),\n )\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7),\n enabledInterval: enabledDateInterval,\n }\n }, [date, min, max])\n\n return (\n <div\n className={s.Calendar}\n style={hideMonthLabel ? undefined : { left: position * STEP_DISTANCE_PX }}\n data-calendar\n data-static={hideMonthLabel ? \"\" : undefined}\n >\n {hideMonthLabel ? (\n <div className={s.MonthLabelSpacer} aria-hidden=\"true\" />\n ) : (\n <p className={s.MonthLabel}>\n {startOfMonth.monthLong} {startOfMonth.year}\n </p>\n )}\n <div className={s.Week}>\n {daysOfTheWeekLabels.map((day) => (\n <div key={day} className={s.DayLabel}>\n {day}\n </div>\n ))}\n </div>\n {weeks.map((week, weekIndex) => (\n <div className={s.Week} key={weekIndex}>\n {week.map((d, dayIndex) => {\n if (!d) {\n return <div className={s.Day} key={`${weekIndex}-${dayIndex}`} />\n }\n\n const enabled = enabledInterval.contains(d)\n const isSelected = enabled && selectedDate && isSameDay(d, selectedDate)\n const dayIsToday = isToday(d)\n\n return (\n <div className={s.Day} key={dayIndex} data-is-selected={isSelected ? \"\" : undefined}>\n {/* The full date names the day, which \"15\" alone does not across months */}\n <button\n type=\"button\"\n className={s.InteractiveDay}\n disabled={!enabled}\n aria-label={d.toLocaleString(DateTime.DATE_HUGE)}\n aria-pressed={!!isSelected}\n aria-current={dayIsToday ? \"date\" : undefined}\n onClick={() => d && onDateSelect?.(d)}\n onKeyDown={(event) => d && onDayKeyDown?.(event, d)}\n >\n {d.day}\n {dayIsToday && <span className={s.TodayDot} />}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n"]}
@@ -1,19 +1,23 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DateTime } from "luxon";
4
- import { useMemo } from "react";
5
- import { useLatestValue } from "../../hooks/useLatestValue";
6
- import { isBefore } from "../../lib/dateUtils";
7
- import { Calendar } from "../Icon";
8
- import { Popover } from "../Popover";
9
- import { SelectControl } from "../SelectControl";
10
- import { DateCalendar } from "./Calendar";
11
- import { DateContext } from "./context";
4
+ import { useId, useMemo } from "react";
5
+ import { useLatestValue } from "../../hooks/useLatestValue.js";
6
+ import { isAfter } from "../../lib/dateUtils.js";
7
+ import { Calendar } from "../Icon/index.js";
8
+ import { Popover } from "../Popover/index.js";
9
+ import { SelectControl } from "../SelectControl/index.js";
10
+ import { DateCalendar } from "./Calendar.js";
11
+ import { DateContext } from "./context.js";
12
12
  export const DatePicker = (props) => {
13
13
  const { id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, value, onChange, min, max, side = "bottom", sideOffset = 8, align = "center", alignOffset, variant = "outline", size = "md", clearable = false, disabled = false, dropdownIconType, placeholder = "Select date...", pill = true, block = false, triggerClassName, triggerShowIcon = true, captionLayout = "buttons", showTime = false, yearRange, triggerDateFormat = showTime ? "MM/dd/yy HH:mm" : "MM/dd/yy", } = props;
14
- if (min && max && !isBefore(min, max)) {
15
- throw new Error("DatePicker error: `min` date must be before the `max` date");
14
+ // min and max are inclusive, so equal bounds allow one date
15
+ if (min && max && isAfter(min, max)) {
16
+ throw new Error("DatePicker error: `min` date must not be after the `max` date");
16
17
  }
18
+ // The value text needs an id for aria-labelledby, also when `id` is not set
19
+ const generatedId = useId();
20
+ const valueId = `${id ?? generatedId}-value`;
17
21
  // Create stable, mutable references to avoid memoization requirements from consumers
18
22
  const onChangeRef = useLatestValue(onChange);
19
23
  const store = useMemo(() => ({
@@ -58,6 +62,6 @@ export const DatePicker = (props) => {
58
62
  const handleClearClick = () => {
59
63
  onChangeRef.current(null);
60
64
  };
61
- return (_jsx(DateContext, { value: store, children: _jsxs(Popover, { children: [_jsx(Popover.Trigger, { children: _jsx(SelectControl, { id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy ? `${ariaLabelledBy} ${id}-value` : undefined, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, className: triggerClassName, selected: !!value, variant: variant, pill: pill, block: block, size: size, disabled: disabled, StartIcon: triggerShowIcon ? Calendar : undefined, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, children: ariaLabelledBy ? (_jsx("span", { id: `${id}-value`, children: value?.toFormat(triggerDateFormat) ?? placeholder })) : value?.toFormat(triggerDateFormat) ?? placeholder }) }), _jsx(Popover.Content, { minWidth: 230, side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset ?? (align === "center" ? 0 : -5), children: _jsx(DateCalendar, {}) })] }) }));
65
+ return (_jsx(DateContext, { value: store, children: _jsxs(Popover, { children: [_jsx(Popover.Trigger, { children: _jsx(SelectControl, { id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy ? `${ariaLabelledBy} ${valueId}` : undefined, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, className: triggerClassName, selected: !!value, variant: variant, pill: pill, block: block, size: size, disabled: disabled, StartIcon: triggerShowIcon ? Calendar : undefined, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, children: ariaLabelledBy ? (_jsx("span", { id: valueId, children: value?.toFormat(triggerDateFormat) ?? placeholder })) : value?.toFormat(triggerDateFormat) ?? placeholder }) }), _jsx(Popover.Content, { minWidth: 230, side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset ?? (align === "center" ? 0 : -5), children: _jsx(DateCalendar, {}) })] }) }));
62
66
  };
63
67
  //# sourceMappingURL=DatePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DateTime } from \"luxon\"\nimport { useMemo } from \"react\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { isBefore } from \"../../lib/dateUtils\"\nimport { Calendar } from \"../Icon\"\nimport { Popover, type PopoverContentProps } from \"../Popover\"\nimport { SelectControl, type SelectControlProps } from \"../SelectControl\"\nimport { DateCalendar } from \"./Calendar\"\nimport { DateContext, type DateContextValue } from \"./context\"\n\nexport type DatePickerProps = Pick<SelectControlProps, \"aria-label\" | \"aria-labelledby\" | \"aria-describedby\" | \"aria-invalid\"> & {\n /**\n * Allow targeting the input for forms and accessibility.\n */\n id: string\n /**\n * The selected date value.\n */\n value: DateTime | null\n /**\n * Handler that is triggered when the date changes.\n */\n onChange: (nextValue: DateTime | null) => void\n /**\n * Defines the earliest selectable date (inclusive).\n */\n min?: DateTime\n /**\n * Defines the latest selectable date (inclusive).\n */\n max?: DateTime\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: PopoverContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 8\n */\n sideOffset?: PopoverContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: PopoverContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: PopoverContentProps[\"alignOffset\"]\n\n /**\n * Disables the select visually and from interactions\n * @default false\n */\n disabled?: boolean\n /**\n * Placeholder text for the select\n * @default Select date...\n */\n placeholder?: string\n /**\n * Style variant for the select trigger\n * @default outline\n */\n variant?: SelectControlProps[\"variant\"]\n /**\n * Determines if the select trigger should be a fully rounded pill shape\n * @default false\n */\n pill?: boolean\n /**\n * Determines size of the size and spacing of the control.\n *\n * | 3xs | 2xs | xs | sm | md | lg | xl | 2xl | 3xl |\n * | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |\n * | `22px` | `24px` | `26px` | `28px` | `32px` | `36px` | `40px` | `44px` | `48px` |\n * @default md\n */\n size?: SelectControlProps[\"size\"]\n /**\n * Icon displayed in the far right of the select trigger\n * @default dropdown\n */\n dropdownIconType?: SelectControlProps[\"dropdownIconType\"]\n /**\n * Custom class applied to the select trigger\n */\n triggerClassName?: string\n /**\n * Display calendar icon at the start of the trigger\n * @default true\n */\n triggerShowIcon?: boolean\n /**\n * Format of dates displayed in the trigger\n */\n triggerDateFormat: string\n /**\n * Display a clear action that allows the select to be unset.\n * @default false\n */\n clearable?: boolean\n /**\n * Extends select to 100% of available width.\n * @default true\n */\n block?: boolean\n /**\n * Controls how the calendar header is rendered.\n * - `\"buttons\"` — Arrow navigation between months (default)\n * - `\"dropdown\"` — Month and year dropdown selects (ideal for date of birth)\n * @default buttons\n */\n captionLayout?: \"buttons\" | \"dropdown\"\n /**\n * Show time input below the calendar for combined date and time selection.\n * @default false\n */\n showTime?: boolean\n /**\n * Range of selectable years when `captionLayout` is `\"dropdown\"`.\n * @default [currentYear - 120, currentYear]\n */\n yearRange?: [number, number]\n}\n\nexport const DatePicker = (props: DatePickerProps) => {\n const {\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n value,\n onChange,\n min,\n max,\n side = \"bottom\",\n sideOffset = 8,\n align = \"center\",\n alignOffset,\n variant = \"outline\",\n size = \"md\",\n clearable = false,\n disabled = false,\n dropdownIconType,\n placeholder = \"Select date...\",\n pill = true,\n block = false,\n triggerClassName,\n triggerShowIcon = true,\n captionLayout = \"buttons\",\n showTime = false,\n yearRange,\n triggerDateFormat = showTime ? \"MM/dd/yy HH:mm\" : \"MM/dd/yy\",\n } = props\n\n if (min && max && !isBefore(min, max)) {\n throw new Error(\"DatePicker error: `min` date must be before the `max` date\")\n }\n\n // Create stable, mutable references to avoid memoization requirements from consumers\n const onChangeRef = useLatestValue(onChange)\n\n const store = useMemo<DateContextValue>(\n () => ({\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n }),\n [\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n ],\n )\n\n const handleClearClick = () => {\n onChangeRef.current(null)\n }\n\n return (\n <DateContext value={store}>\n <Popover>\n <Popover.Trigger>\n <SelectControl\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ? `${ariaLabelledBy} ${id}-value` : undefined}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n className={triggerClassName}\n selected={!!value}\n variant={variant}\n pill={pill}\n block={block}\n size={size}\n disabled={disabled}\n StartIcon={triggerShowIcon ? Calendar : undefined}\n dropdownIconType={dropdownIconType}\n onClearClick={clearable ? handleClearClick : undefined}\n >\n {ariaLabelledBy ? (\n <span id={`${id}-value`}>{value?.toFormat(triggerDateFormat) ?? placeholder}</span>\n ) : value?.toFormat(triggerDateFormat) ?? placeholder}\n </SelectControl>\n </Popover.Trigger>\n <Popover.Content\n minWidth={230}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n >\n <DateCalendar />\n </Popover.Content>\n </Popover>\n </DateContext>\n )\n}\n"]}
1
+ {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAA4B,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,aAAa,EAA2B,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAyB,MAAM,WAAW,CAAA;AAyH9D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAE,EAAE;IACnD,MAAM,EACJ,EAAE,EACF,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,kBAAkB,EAAE,eAAe,EACnC,cAAc,EAAE,WAAW,EAC3B,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,EACH,IAAI,GAAG,QAAQ,EACf,UAAU,GAAG,CAAC,EACd,KAAK,GAAG,QAAQ,EAChB,WAAW,EACX,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,KAAK,EACjB,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,WAAW,GAAG,gBAAgB,EAC9B,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,KAAK,EACb,gBAAgB,EAChB,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,SAAS,EACzB,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,GAC7D,GAAG,KAAK,CAAA;IAET,4DAA4D;IAC5D,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAClF,CAAC;IAED,4EAA4E;IAC5E,MAAM,WAAW,GAAG,KAAK,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,WAAW,QAAQ,CAAA;IAE5C,qFAAqF;IACrF,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IAE5C,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,KAAK;QACL,GAAG;QACH,GAAG;QACH,OAAO;QACP,IAAI;QACJ,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,WAAW;QACX,KAAK;QACL,IAAI;QACJ,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,aAAa;QACb,QAAQ;QACR,SAAS;QACT,WAAW;KACZ,CAAC,EACF;QACE,KAAK;QACL,GAAG;QACH,GAAG;QACH,OAAO;QACP,IAAI;QACJ,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,WAAW;QACX,KAAK;QACL,IAAI;QACJ,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,aAAa;QACb,QAAQ;QACR,SAAS;QACT,WAAW;KACZ,CACF,CAAA;IAED,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,OAAO,CACL,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,YACvB,MAAC,OAAO,eACN,KAAC,OAAO,CAAC,OAAO,cACd,KAAC,aAAa,IACZ,EAAE,EAAE,EAAE,gBACM,SAAS,qBACJ,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,sBAC1D,eAAe,kBACnB,WAAW,EACzB,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,CAAC,CAAC,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACjD,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,YAErD,cAAc,CAAC,CAAC,CAAC,CAChB,eAAM,EAAE,EAAE,OAAO,YAAG,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,WAAW,GAAQ,CAC9E,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,WAAW,GACvC,GACA,EAClB,KAAC,OAAO,CAAC,OAAO,IACd,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAEzD,KAAC,YAAY,KAAG,GACA,IACV,GACE,CACf,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { DateTime } from \"luxon\"\nimport { useId, useMemo } from \"react\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { isAfter } from \"../../lib/dateUtils\"\nimport { Calendar } from \"../Icon\"\nimport { Popover, type PopoverContentProps } from \"../Popover\"\nimport { SelectControl, type SelectControlProps } from \"../SelectControl\"\nimport { DateCalendar } from \"./Calendar\"\nimport { DateContext, type DateContextValue } from \"./context\"\n\nexport type DatePickerProps = Pick<SelectControlProps, \"aria-label\" | \"aria-labelledby\" | \"aria-describedby\" | \"aria-invalid\"> & {\n /**\n * Allow targeting the input for forms and accessibility.\n */\n id?: string\n /**\n * The selected date value.\n */\n value: DateTime | null\n /**\n * Handler that is triggered when the date changes.\n */\n onChange: (nextValue: DateTime | null) => void\n /**\n * Defines the earliest selectable date (inclusive).\n */\n min?: DateTime\n /**\n * Defines the latest selectable date (inclusive).\n */\n max?: DateTime\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: PopoverContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 8\n */\n sideOffset?: PopoverContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: PopoverContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: PopoverContentProps[\"alignOffset\"]\n\n /**\n * Disables the select visually and from interactions\n * @default false\n */\n disabled?: boolean\n /**\n * Placeholder text for the select\n * @default Select date...\n */\n placeholder?: string\n /**\n * Style variant for the select trigger\n * @default outline\n */\n variant?: SelectControlProps[\"variant\"]\n /**\n * Determines if the select trigger should be a fully rounded pill shape\n * @default true\n */\n pill?: boolean\n /**\n * Determines size of the size and spacing of the control.\n *\n * | 3xs | 2xs | xs | sm | md | lg | xl | 2xl | 3xl |\n * | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |\n * | `22px` | `24px` | `26px` | `28px` | `32px` | `36px` | `40px` | `44px` | `48px` |\n * @default md\n */\n size?: SelectControlProps[\"size\"]\n /**\n * Icon displayed in the far right of the select trigger\n * @default dropdown\n */\n dropdownIconType?: SelectControlProps[\"dropdownIconType\"]\n /**\n * Custom class applied to the select trigger\n */\n triggerClassName?: string\n /**\n * Display calendar icon at the start of the trigger\n * @default true\n */\n triggerShowIcon?: boolean\n /**\n * Format of dates displayed in the trigger\n * @default \"MM/dd/yy\", or \"MM/dd/yy HH:mm\" with showTime\n */\n triggerDateFormat?: string\n /**\n * Display a clear action that allows the select to be unset.\n * @default false\n */\n clearable?: boolean\n /**\n * Extends select to 100% of available width.\n * @default false\n */\n block?: boolean\n /**\n * Controls how the calendar header is rendered.\n * - `\"buttons\"` — Arrow navigation between months (default)\n * - `\"dropdown\"` — Month and year dropdown selects (ideal for date of birth)\n * @default buttons\n */\n captionLayout?: \"buttons\" | \"dropdown\"\n /**\n * Show time input below the calendar for combined date and time selection.\n * @default false\n */\n showTime?: boolean\n /**\n * Range of selectable years when `captionLayout` is `\"dropdown\"`.\n * @default [currentYear - 120, currentYear]\n */\n yearRange?: [number, number]\n}\n\nexport const DatePicker = (props: DatePickerProps) => {\n const {\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n value,\n onChange,\n min,\n max,\n side = \"bottom\",\n sideOffset = 8,\n align = \"center\",\n alignOffset,\n variant = \"outline\",\n size = \"md\",\n clearable = false,\n disabled = false,\n dropdownIconType,\n placeholder = \"Select date...\",\n pill = true,\n block = false,\n triggerClassName,\n triggerShowIcon = true,\n captionLayout = \"buttons\",\n showTime = false,\n yearRange,\n triggerDateFormat = showTime ? \"MM/dd/yy HH:mm\" : \"MM/dd/yy\",\n } = props\n\n // min and max are inclusive, so equal bounds allow one date\n if (min && max && isAfter(min, max)) {\n throw new Error(\"DatePicker error: `min` date must not be after the `max` date\")\n }\n\n // The value text needs an id for aria-labelledby, also when `id` is not set\n const generatedId = useId()\n const valueId = `${id ?? generatedId}-value`\n\n // Create stable, mutable references to avoid memoization requirements from consumers\n const onChangeRef = useLatestValue(onChange)\n\n const store = useMemo<DateContextValue>(\n () => ({\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n }),\n [\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n ],\n )\n\n const handleClearClick = () => {\n onChangeRef.current(null)\n }\n\n return (\n <DateContext value={store}>\n <Popover>\n <Popover.Trigger>\n <SelectControl\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ? `${ariaLabelledBy} ${valueId}` : undefined}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n className={triggerClassName}\n selected={!!value}\n variant={variant}\n pill={pill}\n block={block}\n size={size}\n disabled={disabled}\n StartIcon={triggerShowIcon ? Calendar : undefined}\n dropdownIconType={dropdownIconType}\n onClearClick={clearable ? handleClearClick : undefined}\n >\n {ariaLabelledBy ? (\n <span id={valueId}>{value?.toFormat(triggerDateFormat) ?? placeholder}</span>\n ) : value?.toFormat(triggerDateFormat) ?? placeholder}\n </SelectControl>\n </Popover.Trigger>\n <Popover.Content\n minWidth={230}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n >\n <DateCalendar />\n </Popover.Content>\n </Popover>\n </DateContext>\n )\n}\n"]}
@@ -1,2 +1,2 @@
1
- export { DatePicker } from "./DatePicker";
1
+ export { DatePicker } from "./DatePicker.js";
2
2
  //# sourceMappingURL=index.js.map