@mezzanine-ui/react 1.0.0-canary.2 → 1.0.0-canary.4

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 (333) hide show
  1. package/AlertBanner/AlertBanner.d.ts +93 -0
  2. package/AlertBanner/AlertBanner.js +154 -0
  3. package/AlertBanner/index.d.ts +2 -0
  4. package/AlertBanner/index.js +1 -0
  5. package/{Overlay/Overlay.d.ts → Backdrop/Backdrop.d.ts} +12 -16
  6. package/Backdrop/Backdrop.js +40 -0
  7. package/Backdrop/index.d.ts +2 -0
  8. package/Backdrop/index.js +1 -0
  9. package/Badge/Badge.d.ts +20 -14
  10. package/Badge/Badge.js +14 -16
  11. package/Badge/BadgeContainer.d.ts +1 -1
  12. package/Badge/BadgeContainer.js +1 -1
  13. package/Badge/index.d.ts +1 -2
  14. package/Badge/typings.d.ts +48 -0
  15. package/Breadcrumb/Breadcrumb.d.ts +6 -0
  16. package/Breadcrumb/Breadcrumb.js +25 -0
  17. package/Breadcrumb/BreadcrumbItem.d.ts +4 -0
  18. package/Breadcrumb/BreadcrumbItem.js +45 -0
  19. package/Breadcrumb/index.d.ts +2 -0
  20. package/Breadcrumb/index.js +1 -0
  21. package/Breadcrumb/typings.d.ts +70 -0
  22. package/Button/Button.js +2 -2
  23. package/Calendar/Calendar.d.ts +31 -2
  24. package/Calendar/Calendar.js +73 -19
  25. package/Calendar/CalendarCell.d.ts +4 -0
  26. package/Calendar/CalendarCell.js +3 -3
  27. package/Calendar/CalendarContext.d.ts +14 -7
  28. package/Calendar/CalendarContext.js +7 -13
  29. package/Calendar/CalendarControls.d.ts +16 -0
  30. package/Calendar/CalendarControls.js +3 -7
  31. package/Calendar/CalendarDayOfWeek.js +3 -3
  32. package/Calendar/CalendarDays.d.ts +9 -1
  33. package/Calendar/CalendarDays.js +62 -37
  34. package/Calendar/CalendarFooterActions.d.ts +13 -0
  35. package/Calendar/CalendarFooterActions.js +14 -0
  36. package/Calendar/CalendarFooterControl.d.ts +16 -0
  37. package/Calendar/CalendarFooterControl.js +14 -0
  38. package/Calendar/CalendarHalfYears.d.ts +39 -0
  39. package/Calendar/CalendarHalfYears.js +62 -0
  40. package/Calendar/CalendarMonths.js +15 -4
  41. package/Calendar/CalendarQuarters.d.ts +37 -0
  42. package/Calendar/CalendarQuarters.js +64 -0
  43. package/Calendar/CalendarQuickSelect.d.ts +21 -0
  44. package/Calendar/CalendarQuickSelect.js +15 -0
  45. package/Calendar/CalendarWeeks.d.ts +1 -1
  46. package/Calendar/CalendarWeeks.js +88 -43
  47. package/Calendar/CalendarYears.js +12 -3
  48. package/Calendar/RangeCalendar.d.ts +59 -0
  49. package/Calendar/RangeCalendar.js +232 -0
  50. package/Calendar/index.d.ts +8 -1
  51. package/Calendar/index.js +4 -0
  52. package/Calendar/useCalendarControlModifiers.d.ts +4 -4
  53. package/Calendar/useCalendarControlModifiers.js +39 -8
  54. package/Calendar/useCalendarControls.d.ts +2 -0
  55. package/Calendar/useCalendarControls.js +18 -2
  56. package/Calendar/useRangeCalendarControls.d.ts +18 -0
  57. package/Calendar/useRangeCalendarControls.js +115 -0
  58. package/Checkbox/CheckAll.d.ts +16 -6
  59. package/Checkbox/CheckAll.js +40 -26
  60. package/Checkbox/Checkbox.d.ts +100 -22
  61. package/Checkbox/Checkbox.js +72 -16
  62. package/Checkbox/CheckboxGroup.d.ts +100 -18
  63. package/Checkbox/CheckboxGroup.js +169 -24
  64. package/Checkbox/CheckboxGroupContext.d.ts +0 -2
  65. package/Checkbox/index.d.ts +15 -6
  66. package/Checkbox/index.js +6 -2
  67. package/Checkbox/typings.d.ts +37 -0
  68. package/ClearActions/ClearActions.d.ts +41 -0
  69. package/ClearActions/ClearActions.js +23 -0
  70. package/ClearActions/index.d.ts +3 -0
  71. package/ClearActions/index.js +5 -0
  72. package/DatePicker/DatePicker.d.ts +12 -1
  73. package/DatePicker/DatePicker.js +40 -9
  74. package/DatePicker/DatePickerCalendar.d.ts +2 -5
  75. package/DatePicker/DatePickerCalendar.js +36 -37
  76. package/DateRangePicker/DateRangePicker.d.ts +18 -2
  77. package/DateRangePicker/DateRangePicker.js +142 -100
  78. package/DateRangePicker/DateRangePickerCalendar.d.ts +13 -9
  79. package/DateRangePicker/DateRangePickerCalendar.js +6 -94
  80. package/DateRangePicker/useDateRangeCalendarControls.js +6 -2
  81. package/DateRangePicker/useDateRangePickerValue.d.ts +38 -15
  82. package/DateRangePicker/useDateRangePickerValue.js +141 -63
  83. package/DateTimePicker/DateTimePicker.d.ts +31 -10
  84. package/DateTimePicker/DateTimePicker.js +178 -94
  85. package/DateTimePicker/index.d.ts +0 -2
  86. package/DateTimePicker/index.js +0 -1
  87. package/Drawer/Drawer.js +2 -2
  88. package/Dropdown/Dropdown.js +12 -22
  89. package/Empty/Empty.d.ts +1 -16
  90. package/Empty/Empty.js +36 -7
  91. package/Empty/icons/EmptyMainInitialDataIcon.d.ts +4 -0
  92. package/Empty/icons/EmptyMainInitialDataIcon.js +9 -0
  93. package/Empty/icons/EmptyMainResultIcon.d.ts +4 -0
  94. package/Empty/icons/EmptyMainResultIcon.js +9 -0
  95. package/Empty/icons/EmptyMainSystemIcon.d.ts +4 -0
  96. package/Empty/icons/EmptyMainSystemIcon.js +9 -0
  97. package/Empty/index.d.ts +1 -1
  98. package/Empty/typings.d.ts +52 -0
  99. package/Form/FormHintText.d.ts +18 -0
  100. package/Form/FormHintText.js +17 -0
  101. package/Form/index.d.ts +2 -2
  102. package/Form/index.js +1 -1
  103. package/InlineMessage/InlineMessage.d.ts +33 -0
  104. package/InlineMessage/InlineMessage.js +42 -0
  105. package/InlineMessage/InlineMessageGroup.d.ts +24 -0
  106. package/InlineMessage/InlineMessageGroup.js +21 -0
  107. package/InlineMessage/index.d.ts +4 -0
  108. package/InlineMessage/index.js +2 -0
  109. package/Input/ActionButton/ActionButton.d.ts +26 -0
  110. package/Input/ActionButton/ActionButton.js +14 -0
  111. package/Input/ActionButton/index.d.ts +2 -0
  112. package/Input/ActionButton/index.js +1 -0
  113. package/Input/Input.d.ts +147 -42
  114. package/Input/Input.js +194 -27
  115. package/Input/PasswordStrengthIndicator/PasswordStrengthIndicator.d.ts +31 -0
  116. package/Input/PasswordStrengthIndicator/PasswordStrengthIndicator.js +18 -0
  117. package/Input/PasswordStrengthIndicator/index.d.ts +2 -0
  118. package/Input/PasswordStrengthIndicator/index.js +1 -0
  119. package/Input/SelectButton/SelectButton.d.ts +20 -0
  120. package/Input/SelectButton/SelectButton.js +21 -0
  121. package/Input/SelectButton/index.d.ts +2 -0
  122. package/Input/SelectButton/index.js +1 -0
  123. package/Input/SpinnerButton/SpinnerButton.d.ts +19 -0
  124. package/Input/SpinnerButton/SpinnerButton.js +14 -0
  125. package/Input/SpinnerButton/index.d.ts +2 -0
  126. package/Input/SpinnerButton/index.js +1 -0
  127. package/Input/index.d.ts +2 -2
  128. package/Message/Message.d.ts +6 -4
  129. package/Message/Message.js +86 -9
  130. package/Message/MessageTimerController.d.ts +14 -0
  131. package/Message/MessageTimerController.js +27 -0
  132. package/Modal/Modal.js +2 -2
  133. package/Modal/useModalContainer.d.ts +1 -1
  134. package/Modal/useModalContainer.js +2 -4
  135. package/Navigation/NavigationSubMenu.js +15 -26
  136. package/Notifier/NotifierManager.d.ts +15 -2
  137. package/Notifier/NotifierManager.js +60 -18
  138. package/Notifier/createNotifier.d.ts +9 -0
  139. package/Notifier/createNotifier.js +3 -2
  140. package/Notifier/typings.d.ts +3 -1
  141. package/OverflowTooltip/OverflowCounterTag.d.ts +12 -0
  142. package/OverflowTooltip/OverflowCounterTag.js +48 -0
  143. package/OverflowTooltip/OverflowTooltip.d.ts +34 -0
  144. package/OverflowTooltip/OverflowTooltip.js +53 -0
  145. package/OverflowTooltip/index.d.ts +2 -0
  146. package/OverflowTooltip/index.js +2 -0
  147. package/PageFooter/PageFooter.d.ts +73 -8
  148. package/PageFooter/PageFooter.js +34 -3
  149. package/PageHeader/PageHeader.d.ts +36 -0
  150. package/PageHeader/PageHeader.js +65 -0
  151. package/PageHeader/index.d.ts +2 -0
  152. package/PageHeader/index.js +1 -0
  153. package/PageToolbar/PageToolbar.d.ts +67 -0
  154. package/PageToolbar/PageToolbar.js +114 -0
  155. package/PageToolbar/index.d.ts +2 -0
  156. package/PageToolbar/index.js +1 -0
  157. package/Picker/FormattedInput.d.ts +17 -0
  158. package/Picker/FormattedInput.js +74 -0
  159. package/Picker/MaskFormat.d.ts +39 -0
  160. package/Picker/MaskFormat.js +94 -0
  161. package/Picker/PickerTrigger.d.ts +13 -3
  162. package/Picker/PickerTrigger.js +17 -2
  163. package/Picker/PickerTriggerWithSeparator.d.ts +124 -0
  164. package/Picker/PickerTriggerWithSeparator.js +80 -0
  165. package/Picker/RangePickerTrigger.d.ts +55 -4
  166. package/Picker/RangePickerTrigger.js +65 -7
  167. package/Picker/formatUtils.d.ts +34 -0
  168. package/Picker/formatUtils.js +124 -0
  169. package/Picker/index.d.ts +7 -2
  170. package/Picker/index.js +4 -1
  171. package/Picker/useDateInputFormatter.d.ts +52 -0
  172. package/Picker/useDateInputFormatter.js +382 -0
  173. package/Picker/usePickerValue.d.ts +1 -2
  174. package/Picker/usePickerValue.js +8 -13
  175. package/Popover/Popover.js +4 -8
  176. package/Popper/Popper.d.ts +15 -10
  177. package/Popper/Popper.js +88 -17
  178. package/Popper/index.d.ts +1 -1
  179. package/Portal/Portal.d.ts +13 -5
  180. package/Portal/Portal.js +25 -10
  181. package/Portal/index.d.ts +2 -0
  182. package/Portal/index.js +1 -0
  183. package/Portal/portalRegistry.d.ts +17 -0
  184. package/Portal/portalRegistry.js +92 -0
  185. package/Progress/Progress.d.ts +23 -30
  186. package/Progress/Progress.js +70 -21
  187. package/Progress/index.d.ts +2 -2
  188. package/Provider/ConfigProvider.d.ts +1 -0
  189. package/Provider/ConfigProvider.js +1 -0
  190. package/ResultState/ResultState.d.ts +52 -0
  191. package/ResultState/ResultState.js +24 -0
  192. package/ResultState/index.d.ts +2 -0
  193. package/ResultState/index.js +1 -0
  194. package/Select/AutoComplete.d.ts +1 -1
  195. package/Select/Select.d.ts +1 -1
  196. package/Select/SelectTrigger.d.ts +1 -87
  197. package/Select/SelectTrigger.js +26 -21
  198. package/Select/SelectTriggerTags.d.ts +1 -1
  199. package/Select/SelectTriggerTags.js +47 -18
  200. package/Select/TreeSelect.d.ts +1 -1
  201. package/Select/typings.d.ts +99 -0
  202. package/Select/useSelectTriggerTags.d.ts +15 -8
  203. package/Select/useSelectTriggerTags.js +83 -44
  204. package/Selection/Selection.d.ts +98 -0
  205. package/Selection/Selection.js +46 -0
  206. package/Selection/index.d.ts +12 -0
  207. package/Selection/index.js +5 -0
  208. package/Skeleton/Skeleton.d.ts +10 -3
  209. package/Skeleton/Skeleton.js +12 -4
  210. package/Slider/Slider.d.ts +44 -7
  211. package/Slider/Slider.js +17 -13
  212. package/Spin/Spin.d.ts +39 -0
  213. package/{Loading/Loading.js → Spin/Spin.js} +8 -8
  214. package/Spin/index.d.ts +2 -0
  215. package/Spin/index.js +1 -0
  216. package/Stepper/Step.d.ts +1 -35
  217. package/Stepper/Step.js +43 -10
  218. package/Stepper/Stepper.d.ts +1 -14
  219. package/Stepper/Stepper.js +49 -15
  220. package/Stepper/index.d.ts +3 -2
  221. package/Stepper/index.js +1 -0
  222. package/Stepper/typings.d.ts +77 -0
  223. package/Stepper/useStepDistance.d.ts +10 -0
  224. package/Stepper/useStepDistance.js +81 -0
  225. package/Stepper/useStepper.d.ts +21 -0
  226. package/Stepper/useStepper.js +26 -0
  227. package/Table/Table.js +2 -2
  228. package/Table/TableBody.js +2 -2
  229. package/Table/rowSelection/TableRowSelection.js +1 -1
  230. package/Tag/Tag.d.ts +2 -25
  231. package/Tag/Tag.js +22 -13
  232. package/Tag/TagGroup.d.ts +12 -0
  233. package/Tag/TagGroup.js +41 -0
  234. package/Tag/index.d.ts +1 -1
  235. package/Tag/typings.d.ts +78 -0
  236. package/TextField/TextField.d.ts +78 -19
  237. package/TextField/TextField.js +57 -20
  238. package/TextField/index.d.ts +1 -1
  239. package/Textarea/Textarea.d.ts +19 -51
  240. package/Textarea/Textarea.js +12 -19
  241. package/Textarea/index.d.ts +0 -1
  242. package/TimePanel/TimePanel.d.ts +1 -22
  243. package/TimePanel/TimePanel.js +30 -26
  244. package/TimePanel/TimePanelAction.d.ts +2 -8
  245. package/TimePanel/TimePanelAction.js +2 -2
  246. package/TimePanel/TimePanelColumn.d.ts +0 -13
  247. package/TimePanel/TimePanelColumn.js +9 -11
  248. package/TimePicker/TimePicker.d.ts +10 -1
  249. package/TimePicker/TimePicker.js +85 -35
  250. package/TimePicker/TimePickerPanel.d.ts +1 -2
  251. package/TimePicker/TimePickerPanel.js +2 -2
  252. package/Toggle/Toggle.d.ts +46 -0
  253. package/Toggle/Toggle.js +29 -0
  254. package/Toggle/index.d.ts +3 -0
  255. package/Toggle/index.js +1 -0
  256. package/Tooltip/Tooltip.d.ts +13 -2
  257. package/Tooltip/Tooltip.js +56 -10
  258. package/Tooltip/useDelayMouseEnterLeave.d.ts +1 -2
  259. package/Tooltip/useDelayMouseEnterLeave.js +0 -4
  260. package/Transition/Collapse.d.ts +2 -0
  261. package/Transition/Collapse.js +3 -2
  262. package/Transition/Fade.js +4 -4
  263. package/Transition/Rotate.d.ts +42 -0
  264. package/Transition/Rotate.js +30 -0
  265. package/Transition/Scale.d.ts +13 -0
  266. package/Transition/{Grow.js → Scale.js} +17 -12
  267. package/Transition/Slide.d.ts +7 -0
  268. package/Transition/{Zoom.js → Slide.js} +14 -12
  269. package/Transition/SlideFade.d.ts +3 -0
  270. package/Transition/SlideFade.js +5 -4
  271. package/Transition/Transition.d.ts +1 -1
  272. package/Transition/Translate.d.ts +14 -0
  273. package/Transition/Translate.js +94 -0
  274. package/Transition/index.d.ts +8 -4
  275. package/Transition/index.js +4 -2
  276. package/Tree/TreeNode.js +6 -6
  277. package/Upload/Upload.d.ts +175 -0
  278. package/Upload/Upload.js +279 -0
  279. package/Upload/UploadItem.d.ts +82 -0
  280. package/Upload/UploadItem.js +118 -0
  281. package/Upload/UploadPictureCard.d.ts +110 -0
  282. package/Upload/UploadPictureCard.js +101 -0
  283. package/Upload/Uploader.d.ts +161 -0
  284. package/Upload/Uploader.js +120 -0
  285. package/Upload/index.d.ts +8 -11
  286. package/Upload/index.js +4 -5
  287. package/Upload/upload-utils.d.ts +41 -0
  288. package/Upload/upload-utils.js +65 -0
  289. package/_internal/InputTriggerPopper/InputTriggerPopper.js +15 -25
  290. package/_internal/SlideFadeOverlay/SlideFadeOverlay.d.ts +2 -2
  291. package/_internal/SlideFadeOverlay/SlideFadeOverlay.js +4 -27
  292. package/hooks/useScrollLock.d.ts +28 -0
  293. package/hooks/useScrollLock.js +134 -0
  294. package/index.d.ts +99 -84
  295. package/index.js +92 -78
  296. package/package.json +7 -7
  297. package/utils/get-css-variable-value.d.ts +1 -0
  298. package/utils/get-css-variable-value.js +9 -0
  299. package/DateTimePicker/DateTimePickerPanel.d.ts +0 -28
  300. package/DateTimePicker/DateTimePickerPanel.js +0 -50
  301. package/Form/FormMessage.d.ts +0 -7
  302. package/Form/FormMessage.js +0 -19
  303. package/Form/useInputWithTagsModeValue.js +0 -88
  304. package/Loading/Loading.d.ts +0 -33
  305. package/Loading/index.d.ts +0 -2
  306. package/Loading/index.js +0 -1
  307. package/Overlay/Overlay.js +0 -31
  308. package/Overlay/index.d.ts +0 -2
  309. package/Overlay/index.js +0 -1
  310. package/Picker/useRangePickerValue.d.ts +0 -23
  311. package/Picker/useRangePickerValue.js +0 -99
  312. package/Switch/Switch.d.ts +0 -43
  313. package/Switch/Switch.js +0 -29
  314. package/Switch/index.d.ts +0 -3
  315. package/Switch/index.js +0 -1
  316. package/Transition/Grow.d.ts +0 -12
  317. package/Transition/Zoom.d.ts +0 -7
  318. package/Upload/UploadButton.d.ts +0 -9
  319. package/Upload/UploadButton.js +0 -23
  320. package/Upload/UploadInput.d.ts +0 -20
  321. package/Upload/UploadInput.js +0 -23
  322. package/Upload/UploadPicture.d.ts +0 -49
  323. package/Upload/UploadPicture.js +0 -51
  324. package/Upload/UploadPictureBlock.d.ts +0 -20
  325. package/Upload/UploadPictureBlock.js +0 -79
  326. package/Upload/UploadPictureWall.d.ts +0 -81
  327. package/Upload/UploadPictureWall.js +0 -168
  328. package/Upload/UploadPictureWallItem.d.ts +0 -15
  329. package/Upload/UploadPictureWallItem.js +0 -18
  330. package/Upload/UploadResult.d.ts +0 -35
  331. package/Upload/UploadResult.js +0 -30
  332. package/utils/scroll-lock.d.ts +0 -2
  333. package/utils/scroll-lock.js +0 -24
@@ -0,0 +1,232 @@
1
+ 'use client';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { calendarClasses } from '@mezzanine-ui/core/calendar';
4
+ import castArray from 'lodash/castArray';
5
+ import { forwardRef, useCallback } from 'react';
6
+ import Calendar from './Calendar.js';
7
+ import { useCalendarContext } from './CalendarContext.js';
8
+ import { useRangeCalendarControls } from './useRangeCalendarControls.js';
9
+ import CalendarFooterActions from './CalendarFooterActions.js';
10
+ import CalendarQuickSelect from './CalendarQuickSelect.js';
11
+ import cx from 'clsx';
12
+
13
+ /**
14
+ * The react component for `mezzanine` range calendar.
15
+ * Displays two calendars side by side for range selection.
16
+ * Notice that any component related to calendar should be used along with `CalendarContext`.
17
+ */
18
+ const RangeCalendar = forwardRef(function RangeCalendar(props, ref) {
19
+ const { locale, getMonth, getYear, setMonth, setYear, getCurrentWeekFirstDate, getCurrentMonthFirstDate, getCurrentYearFirstDate, getCurrentQuarterFirstDate, getCurrentHalfYearFirstDate, addSecond, addDay, addMonth, addYear, setHour, setMinute, setSecond, setMillisecond, isBefore, } = useCalendarContext();
20
+ const { actions, renderAnnotations, calendarProps, className, disabledMonthSwitch, disabledYearSwitch, disableOnNext, disableOnPrev, disableOnDoubleNext, disableOnDoublePrev, displayMonthLocale = locale, displayWeekDayLocale = locale, firstCalendarRef, isDateDisabled, isDateInRange, isMonthDisabled, isMonthInRange, isWeekDisabled, isWeekInRange, isYearDisabled, isYearInRange, isQuarterDisabled, isQuarterInRange, isHalfYearDisabled, isHalfYearInRange, mode = 'day', onChange: onChangeProp, onDateHover, onMonthHover, onWeekHover, onYearHover, onQuarterHover, onHalfYearHover, quickSelect, referenceDate: referenceDateProp, secondCalendarRef, value: valueProp, ...restProps } = props;
21
+ const value = valueProp ? castArray(valueProp) : undefined;
22
+ const { currentMode, onMonthControlClick, onFirstPrev, onFirstDoublePrev, onSecondNext, onSecondDoubleNext, onYearControlClick, popModeStack, referenceDates, updateFirstReferenceDate, updateSecondReferenceDate, } = useRangeCalendarControls(referenceDateProp, mode);
23
+ const normalizeRangeStart = useCallback((date) => {
24
+ switch (mode) {
25
+ case 'day':
26
+ return setMillisecond(setSecond(setMinute(setHour(date, 0), 0), 0), 0);
27
+ case 'week':
28
+ return getCurrentWeekFirstDate(date, displayWeekDayLocale);
29
+ case 'month':
30
+ return getCurrentMonthFirstDate(date);
31
+ case 'year':
32
+ return getCurrentYearFirstDate(date);
33
+ case 'quarter':
34
+ return getCurrentQuarterFirstDate(date);
35
+ case 'half-year':
36
+ return getCurrentHalfYearFirstDate(date);
37
+ default:
38
+ return date;
39
+ }
40
+ }, [
41
+ displayWeekDayLocale,
42
+ mode,
43
+ getCurrentWeekFirstDate,
44
+ getCurrentMonthFirstDate,
45
+ getCurrentYearFirstDate,
46
+ getCurrentQuarterFirstDate,
47
+ getCurrentHalfYearFirstDate,
48
+ setHour,
49
+ setMinute,
50
+ setSecond,
51
+ setMillisecond,
52
+ ]);
53
+ const normalizeRangeEnd = useCallback((date) => {
54
+ switch (mode) {
55
+ case 'day':
56
+ return setMillisecond(setSecond(setMinute(setHour(date, 23), 59), 59), 999);
57
+ case 'week': {
58
+ const weekStart = getCurrentWeekFirstDate(date, displayWeekDayLocale);
59
+ const weekEnd = addSecond(addDay(weekStart, 7), -1);
60
+ return setMillisecond(setSecond(setMinute(setHour(weekEnd, 23), 59), 59), 999);
61
+ }
62
+ case 'month': {
63
+ const nextMonth = addSecond(addMonth(getCurrentMonthFirstDate(date), 1), -1);
64
+ return setMillisecond(setSecond(setMinute(setHour(nextMonth, 23), 59), 59), 999);
65
+ }
66
+ case 'year': {
67
+ const nextYear = addSecond(addYear(getCurrentYearFirstDate(date), 1), -1);
68
+ return setMillisecond(setSecond(setMinute(setHour(nextYear, 23), 59), 59), 999);
69
+ }
70
+ case 'quarter': {
71
+ const nextQuarter = addSecond(addMonth(getCurrentQuarterFirstDate(date), 3), -1);
72
+ return setMillisecond(setSecond(setMinute(setHour(nextQuarter, 23), 59), 59), 999);
73
+ }
74
+ case 'half-year': {
75
+ const nextHalfYear = addSecond(addMonth(getCurrentHalfYearFirstDate(date), 6), -1);
76
+ return setMillisecond(setSecond(setMinute(setHour(nextHalfYear, 23), 59), 59), 999);
77
+ }
78
+ default:
79
+ return date;
80
+ }
81
+ }, [
82
+ displayWeekDayLocale,
83
+ mode,
84
+ getCurrentWeekFirstDate,
85
+ getCurrentMonthFirstDate,
86
+ getCurrentYearFirstDate,
87
+ getCurrentQuarterFirstDate,
88
+ getCurrentHalfYearFirstDate,
89
+ addSecond,
90
+ addDay,
91
+ addMonth,
92
+ addYear,
93
+ setHour,
94
+ setMinute,
95
+ setSecond,
96
+ setMillisecond,
97
+ ]);
98
+ const hasDisabledDateInRange = useCallback((start, end) => {
99
+ var _a, _b, _c, _d, _e, _f;
100
+ const [rangeStart, rangeEnd] = isBefore(start, end)
101
+ ? [start, end]
102
+ : [end, start];
103
+ let current = rangeStart;
104
+ while (isBefore(current, rangeEnd) || current === rangeEnd) {
105
+ // Check disabled based on current mode
106
+ let isDisabled = false;
107
+ switch (mode) {
108
+ case 'day':
109
+ isDisabled = (_a = isDateDisabled === null || isDateDisabled === void 0 ? void 0 : isDateDisabled(current)) !== null && _a !== void 0 ? _a : false;
110
+ break;
111
+ case 'week':
112
+ isDisabled = (_b = isWeekDisabled === null || isWeekDisabled === void 0 ? void 0 : isWeekDisabled(current)) !== null && _b !== void 0 ? _b : false;
113
+ break;
114
+ case 'month':
115
+ isDisabled = (_c = isMonthDisabled === null || isMonthDisabled === void 0 ? void 0 : isMonthDisabled(current)) !== null && _c !== void 0 ? _c : false;
116
+ break;
117
+ case 'year':
118
+ isDisabled = (_d = isYearDisabled === null || isYearDisabled === void 0 ? void 0 : isYearDisabled(current)) !== null && _d !== void 0 ? _d : false;
119
+ break;
120
+ case 'quarter':
121
+ isDisabled = (_e = isQuarterDisabled === null || isQuarterDisabled === void 0 ? void 0 : isQuarterDisabled(current)) !== null && _e !== void 0 ? _e : false;
122
+ break;
123
+ case 'half-year':
124
+ isDisabled = (_f = isHalfYearDisabled === null || isHalfYearDisabled === void 0 ? void 0 : isHalfYearDisabled(current)) !== null && _f !== void 0 ? _f : false;
125
+ break;
126
+ }
127
+ if (isDisabled) {
128
+ return true;
129
+ }
130
+ current = addDay(current, 1);
131
+ // Break if we've passed the end date (safety check)
132
+ if (isBefore(rangeEnd, current)) {
133
+ break;
134
+ }
135
+ }
136
+ return false;
137
+ }, [
138
+ mode,
139
+ isBefore,
140
+ addDay,
141
+ isDateDisabled,
142
+ isWeekDisabled,
143
+ isMonthDisabled,
144
+ isYearDisabled,
145
+ isQuarterDisabled,
146
+ isHalfYearDisabled,
147
+ ]);
148
+ const handleRangeSelection = useCallback((target) => {
149
+ if (!onChangeProp)
150
+ return;
151
+ const [existingStart, existingEnd] = value || [];
152
+ if (!existingStart || (existingStart && existingEnd)) {
153
+ // 未選取起始日期,或已完成區間選取,重新開始選取
154
+ onChangeProp([target, undefined]);
155
+ }
156
+ else {
157
+ const rawStart = existingStart;
158
+ const rawEnd = target;
159
+ // 檢查是否有不可選日期
160
+ if (hasDisabledDateInRange(rawStart, rawEnd)) {
161
+ onChangeProp([target, undefined]);
162
+ return;
163
+ }
164
+ const isEndBeforeStart = isBefore(rawEnd, rawStart);
165
+ const [start, end] = isEndBeforeStart
166
+ ? [rawEnd, rawStart]
167
+ : [rawStart, rawEnd];
168
+ const normalizedStart = normalizeRangeStart(start);
169
+ const normalizedEnd = normalizeRangeEnd(end);
170
+ onChangeProp([normalizedStart, normalizedEnd]);
171
+ }
172
+ }, [
173
+ value,
174
+ onChangeProp,
175
+ isBefore,
176
+ normalizeRangeStart,
177
+ normalizeRangeEnd,
178
+ hasDisabledDateInRange,
179
+ ]);
180
+ const getTargetValue = useCallback((target, targetDate) => {
181
+ if (currentMode === mode) {
182
+ return target;
183
+ }
184
+ if (currentMode === 'month') {
185
+ return setMonth(targetDate, getMonth(target));
186
+ }
187
+ if (currentMode === 'year') {
188
+ return setYear(targetDate, getYear(target));
189
+ }
190
+ return target;
191
+ }, [currentMode, mode, getMonth, getYear, setMonth, setYear]);
192
+ const onChangeFactory = useCallback((calendar) => {
193
+ const targetDate = referenceDates[calendar];
194
+ const updateReferenceDate = calendar
195
+ ? updateSecondReferenceDate
196
+ : updateFirstReferenceDate;
197
+ return (target) => {
198
+ if (currentMode === mode) {
199
+ const resultValue = getTargetValue(target, targetDate);
200
+ handleRangeSelection(resultValue);
201
+ }
202
+ else {
203
+ const resultValue = getTargetValue(target, targetDate);
204
+ updateReferenceDate(resultValue);
205
+ popModeStack();
206
+ }
207
+ };
208
+ }, [
209
+ currentMode,
210
+ mode,
211
+ referenceDates,
212
+ updateFirstReferenceDate,
213
+ updateSecondReferenceDate,
214
+ popModeStack,
215
+ getTargetValue,
216
+ handleRangeSelection,
217
+ ]);
218
+ return (jsxs("div", { ...restProps, ref: ref, role: "application", "aria-label": `Range calendar, ${mode} view`, className: cx(calendarClasses.host, className), children: [quickSelect && (jsx(CalendarQuickSelect, { activeId: quickSelect.activeId, options: quickSelect.options })), jsxs("div", { className: calendarClasses.mainWithFooter, children: [jsxs("div", { style: { display: 'inline-flex', flexFlow: 'row' }, children: [jsx(Calendar, { ...calendarProps, renderAnnotations: renderAnnotations, className: cx(calendarClasses.noShadowHost, calendarProps === null || calendarProps === void 0 ? void 0 : calendarProps.className), ref: firstCalendarRef, mode: currentMode, value: value, onChange: onChangeFactory(0), referenceDate: referenceDates[0], onPrev: onFirstPrev, onDoublePrev: onFirstDoublePrev, onMonthControlClick: onMonthControlClick, onYearControlClick: onYearControlClick, disabledFooterControl: true, disabledMonthSwitch: disabledMonthSwitch, disabledYearSwitch: disabledYearSwitch, disableOnPrev: disableOnPrev, disableOnDoublePrev: disableOnDoublePrev, displayMonthLocale: displayMonthLocale, displayWeekDayLocale: displayWeekDayLocale, isDateDisabled: isDateDisabled, isDateInRange: isDateInRange, onDateHover: onDateHover, isMonthDisabled: isMonthDisabled, isMonthInRange: isMonthInRange, onMonthHover: onMonthHover, isWeekDisabled: isWeekDisabled, isWeekInRange: isWeekInRange, onWeekHover: onWeekHover, isYearDisabled: isYearDisabled, isYearInRange: isYearInRange, onYearHover: onYearHover, isQuarterDisabled: isQuarterDisabled, isQuarterInRange: isQuarterInRange, onQuarterHover: onQuarterHover, isHalfYearDisabled: isHalfYearDisabled, isHalfYearInRange: isHalfYearInRange, onHalfYearHover: onHalfYearHover }), jsx(Calendar, { ...calendarProps, renderAnnotations: renderAnnotations, className: cx(calendarClasses.noShadowHost, calendarProps === null || calendarProps === void 0 ? void 0 : calendarProps.className), ref: secondCalendarRef, mode: currentMode, value: value, onChange: onChangeFactory(1), referenceDate: referenceDates[1], onNext: onSecondNext, onDoubleNext: onSecondDoubleNext, onMonthControlClick: onMonthControlClick, onYearControlClick: onYearControlClick, disabledFooterControl: true, disabledMonthSwitch: disabledMonthSwitch, disabledYearSwitch: disabledYearSwitch, disableOnNext: disableOnNext, disableOnDoubleNext: disableOnDoubleNext, displayMonthLocale: displayMonthLocale, displayWeekDayLocale: displayWeekDayLocale, isDateDisabled: isDateDisabled, isDateInRange: isDateInRange, onDateHover: onDateHover, isMonthDisabled: isMonthDisabled, isMonthInRange: isMonthInRange, onMonthHover: onMonthHover, isWeekDisabled: isWeekDisabled, isWeekInRange: isWeekInRange, onWeekHover: onWeekHover, isYearDisabled: isYearDisabled, isYearInRange: isYearInRange, onYearHover: onYearHover, isQuarterDisabled: isQuarterDisabled, isQuarterInRange: isQuarterInRange, onQuarterHover: onQuarterHover, isHalfYearDisabled: isHalfYearDisabled, isHalfYearInRange: isHalfYearInRange, onHalfYearHover: onHalfYearHover })] }), actions && (jsx(CalendarFooterActions, { actions: {
219
+ secondaryButtonProps: {
220
+ children: 'Cancel',
221
+ disabled: false,
222
+ ...actions === null || actions === void 0 ? void 0 : actions.secondaryButtonProps,
223
+ },
224
+ primaryButtonProps: {
225
+ children: 'Ok',
226
+ disabled: false,
227
+ ...actions === null || actions === void 0 ? void 0 : actions.primaryButtonProps,
228
+ },
229
+ } }))] })] }));
230
+ });
231
+
232
+ export { RangeCalendar as default };
@@ -3,9 +3,13 @@ export type { CalendarControlModifier, UseCalendarControlModifiersResult, } from
3
3
  export { useCalendarModeStack } from './useCalendarModeStack';
4
4
  export { useCalendarControls } from './useCalendarControls';
5
5
  export { CalendarContext, useCalendarContext, default as CalendarConfigProvider, } from './CalendarContext';
6
- export type { CalendarConfigs, CalendarConfigProviderProps, } from './CalendarContext';
6
+ export type { CalendarLocale, CalendarConfigs, CalendarConfigProviderProps, } from './CalendarContext';
7
7
  export type { CalendarYearsProps } from './CalendarYears';
8
8
  export { default as CalendarYears } from './CalendarYears';
9
+ export type { CalendarQuartersProps } from './CalendarQuarters';
10
+ export { default as CalendarQuarters } from './CalendarQuarters';
11
+ export type { CalendarHalfYearsProps } from './CalendarHalfYears';
12
+ export { default as CalendarHalfYears } from './CalendarHalfYears';
9
13
  export type { CalendarWeeksProps } from './CalendarWeeks';
10
14
  export { default as CalendarWeeks } from './CalendarWeeks';
11
15
  export { default as CalendarMonths } from './CalendarMonths';
@@ -20,3 +24,6 @@ export type { CalendarCellProps } from './CalendarCell';
20
24
  export { default as CalendarCell } from './CalendarCell';
21
25
  export type { CalendarProps } from './Calendar';
22
26
  export { default } from './Calendar';
27
+ export type { RangeCalendarProps } from './RangeCalendar';
28
+ export { default as RangeCalendar } from './RangeCalendar';
29
+ export { useRangeCalendarControls } from './useRangeCalendarControls';
package/Calendar/index.js CHANGED
@@ -3,6 +3,8 @@ export { useCalendarModeStack } from './useCalendarModeStack.js';
3
3
  export { useCalendarControls } from './useCalendarControls.js';
4
4
  export { default as CalendarConfigProvider, CalendarContext, useCalendarContext } from './CalendarContext.js';
5
5
  export { default as CalendarYears } from './CalendarYears.js';
6
+ export { default as CalendarQuarters } from './CalendarQuarters.js';
7
+ export { default as CalendarHalfYears } from './CalendarHalfYears.js';
6
8
  export { default as CalendarWeeks } from './CalendarWeeks.js';
7
9
  export { default as CalendarMonths } from './CalendarMonths.js';
8
10
  export { default as CalendarDays } from './CalendarDays.js';
@@ -10,3 +12,5 @@ export { default as CalendarDayOfWeek } from './CalendarDayOfWeek.js';
10
12
  export { default as CalendarControls } from './CalendarControls.js';
11
13
  export { default as CalendarCell } from './CalendarCell.js';
12
14
  export { default } from './Calendar.js';
15
+ export { default as RangeCalendar } from './RangeCalendar.js';
16
+ export { useRangeCalendarControls } from './useRangeCalendarControls.js';
@@ -1,7 +1,7 @@
1
1
  import { CalendarMode, DateType } from '@mezzanine-ui/core/calendar';
2
2
  export type CalendarControlModifier = (value: DateType) => DateType;
3
- export type UseCalendarControlModifiersResult = Record<CalendarMode, [
4
- CalendarControlModifier,
5
- CalendarControlModifier
6
- ]>;
3
+ export type UseCalendarControlModifiersResult = Record<CalendarMode, {
4
+ single: [CalendarControlModifier, CalendarControlModifier] | null;
5
+ double: [CalendarControlModifier, CalendarControlModifier];
6
+ }>;
7
7
  export declare function useCalendarControlModifiers(): UseCalendarControlModifiersResult;
@@ -1,18 +1,49 @@
1
1
  'use client';
2
- import { calendarYearModuler } from '@mezzanine-ui/core/calendar';
2
+ import { calendarHalfYearYearsCount, calendarQuarterYearsCount, calendarYearModuler } from '@mezzanine-ui/core/calendar';
3
3
  import { useMemo } from 'react';
4
4
  import { useCalendarContext } from './CalendarContext.js';
5
5
 
6
6
  function useCalendarControlModifiers() {
7
7
  const { addYear, addMonth } = useCalendarContext();
8
8
  return useMemo(() => ({
9
- year: [
10
- (date) => addYear(date, -calendarYearModuler),
11
- (date) => addYear(date, calendarYearModuler),
12
- ],
13
- month: [(date) => addYear(date, -1), (date) => addYear(date, 1)],
14
- week: [(date) => addMonth(date, -1), (date) => addMonth(date, 1)],
15
- day: [(date) => addMonth(date, -1), (date) => addMonth(date, 1)],
9
+ // day and week modes: single=month, double=year
10
+ day: {
11
+ single: [(date) => addMonth(date, -1), (date) => addMonth(date, 1)],
12
+ double: [(date) => addYear(date, -1), (date) => addYear(date, 1)],
13
+ },
14
+ week: {
15
+ single: [(date) => addMonth(date, -1), (date) => addMonth(date, 1)],
16
+ double: [(date) => addYear(date, -1), (date) => addYear(date, 1)],
17
+ },
18
+ // month mode: only double (year)
19
+ month: {
20
+ single: null,
21
+ double: [(date) => addYear(date, -1), (date) => addYear(date, 1)],
22
+ },
23
+ // year mode: only double (10 years)
24
+ year: {
25
+ single: null,
26
+ double: [
27
+ (date) => addYear(date, -calendarYearModuler),
28
+ (date) => addYear(date, calendarYearModuler),
29
+ ],
30
+ },
31
+ // quarter mode: only double (5 years)
32
+ quarter: {
33
+ single: null,
34
+ double: [
35
+ (date) => addYear(date, -calendarQuarterYearsCount),
36
+ (date) => addYear(date, calendarQuarterYearsCount),
37
+ ],
38
+ },
39
+ // half-year mode: only double (5 years)
40
+ 'half-year': {
41
+ single: null,
42
+ double: [
43
+ (date) => addYear(date, -calendarHalfYearYearsCount),
44
+ (date) => addYear(date, calendarHalfYearYearsCount),
45
+ ],
46
+ },
16
47
  }), [addYear, addMonth]);
17
48
  }
18
49
 
@@ -4,6 +4,8 @@ export declare function useCalendarControls(referenceDateProp: DateType, mode?:
4
4
  onMonthControlClick: () => void;
5
5
  onNext: () => void;
6
6
  onPrev: () => void;
7
+ onDoubleNext: () => void;
8
+ onDoublePrev: () => void;
7
9
  onYearControlClick: () => void;
8
10
  popModeStack: () => void;
9
11
  referenceDate: string;
@@ -11,11 +11,25 @@ function useCalendarControls(referenceDateProp, mode) {
11
11
  const { currentMode, pushModeStack, popModeStack } = useCalendarModeStack(mode || 'day');
12
12
  const modifierGroup = useCalendarControlModifiers();
13
13
  const onPrev = () => {
14
- const [handleMinus] = modifierGroup[currentMode];
14
+ const modifiers = modifierGroup[currentMode].single;
15
+ if (!modifiers)
16
+ return;
17
+ const [handleMinus] = modifiers;
15
18
  setReferenceDate(handleMinus(referenceDate));
16
19
  };
17
20
  const onNext = () => {
18
- const [, handleAdd] = modifierGroup[currentMode];
21
+ const modifiers = modifierGroup[currentMode].single;
22
+ if (!modifiers)
23
+ return;
24
+ const [, handleAdd] = modifiers;
25
+ setReferenceDate(handleAdd(referenceDate));
26
+ };
27
+ const onDoublePrev = () => {
28
+ const [handleMinus] = modifierGroup[currentMode].double;
29
+ setReferenceDate(handleMinus(referenceDate));
30
+ };
31
+ const onDoubleNext = () => {
32
+ const [, handleAdd] = modifierGroup[currentMode].double;
19
33
  setReferenceDate(handleAdd(referenceDate));
20
34
  };
21
35
  const onMonthControlClick = () => pushModeStack('month');
@@ -25,6 +39,8 @@ function useCalendarControls(referenceDateProp, mode) {
25
39
  onMonthControlClick,
26
40
  onNext,
27
41
  onPrev,
42
+ onDoubleNext,
43
+ onDoublePrev,
28
44
  onYearControlClick,
29
45
  popModeStack,
30
46
  referenceDate,
@@ -0,0 +1,18 @@
1
+ import { DateType, CalendarMode } from '@mezzanine-ui/core/calendar';
2
+ export declare function useRangeCalendarControls(referenceDateProp: DateType, mode?: CalendarMode): {
3
+ currentMode: CalendarMode;
4
+ onMonthControlClick: () => void;
5
+ onFirstNext: () => void;
6
+ onFirstPrev: () => void;
7
+ onFirstDoubleNext: () => void;
8
+ onFirstDoublePrev: () => void;
9
+ onSecondNext: () => void;
10
+ onSecondPrev: () => void;
11
+ onSecondDoubleNext: () => void;
12
+ onSecondDoublePrev: () => void;
13
+ onYearControlClick: () => void;
14
+ popModeStack: () => void;
15
+ referenceDates: [string, string];
16
+ updateFirstReferenceDate: (date: DateType) => void;
17
+ updateSecondReferenceDate: (date: DateType) => void;
18
+ };
@@ -0,0 +1,115 @@
1
+ 'use client';
2
+ import { useState, useCallback, useMemo } from 'react';
3
+ import { calendarHalfYearYearsCount, calendarQuarterYearsCount, calendarYearModuler } from '@mezzanine-ui/core/calendar';
4
+ import { useCalendarContext } from './CalendarContext.js';
5
+ import { useCalendarControlModifiers } from './useCalendarControlModifiers.js';
6
+ import { useCalendarModeStack } from './useCalendarModeStack.js';
7
+
8
+ function useRangeCalendarControls(referenceDateProp, mode) {
9
+ const { addMonth, addYear } = useCalendarContext();
10
+ const [firstReferenceDate, setFirstReferenceDate] = useState(referenceDateProp);
11
+ // Calculate the offset between two calendars based on mode
12
+ const getSecondCalendarDate = useCallback((firstDate) => {
13
+ const currentMode = mode || 'day';
14
+ switch (currentMode) {
15
+ case 'year':
16
+ return addYear(firstDate, calendarYearModuler);
17
+ case 'month':
18
+ return addYear(firstDate, 1);
19
+ case 'quarter':
20
+ return addYear(firstDate, calendarQuarterYearsCount);
21
+ case 'half-year':
22
+ return addYear(firstDate, calendarHalfYearYearsCount);
23
+ case 'week':
24
+ case 'day':
25
+ default:
26
+ return addMonth(firstDate, 1);
27
+ }
28
+ }, [addMonth, addYear, mode]);
29
+ const [secondReferenceDate, setSecondReferenceDate] = useState(() => getSecondCalendarDate(referenceDateProp));
30
+ /**
31
+ * @NOTE referenceDate sync off(為了避免自動跳轉)
32
+ */
33
+ // useEffect(() => {
34
+ // setFirstReferenceDate(referenceDateProp);
35
+ // setSecondReferenceDate(getSecondCalendarDate(referenceDateProp));
36
+ // }, [referenceDateProp, getSecondCalendarDate]);
37
+ const { currentMode, pushModeStack, popModeStack } = useCalendarModeStack(mode || 'day');
38
+ const modifierGroup = useCalendarControlModifiers();
39
+ // First calendar controls
40
+ const onFirstPrev = () => {
41
+ const modifiers = modifierGroup[currentMode].single;
42
+ if (!modifiers)
43
+ return;
44
+ const [handleMinus] = modifiers;
45
+ const newFirst = handleMinus(firstReferenceDate);
46
+ setFirstReferenceDate(newFirst);
47
+ setSecondReferenceDate(getSecondCalendarDate(newFirst));
48
+ };
49
+ const onFirstNext = () => {
50
+ const modifiers = modifierGroup[currentMode].single;
51
+ if (!modifiers)
52
+ return;
53
+ const [, handleAdd] = modifiers;
54
+ const newFirst = handleAdd(firstReferenceDate);
55
+ setFirstReferenceDate(newFirst);
56
+ setSecondReferenceDate(getSecondCalendarDate(newFirst));
57
+ };
58
+ const onFirstDoublePrev = () => {
59
+ const [handleMinus] = modifierGroup[currentMode].double;
60
+ const newFirst = handleMinus(firstReferenceDate);
61
+ setFirstReferenceDate(newFirst);
62
+ setSecondReferenceDate(getSecondCalendarDate(newFirst));
63
+ };
64
+ const onFirstDoubleNext = () => {
65
+ const [, handleAdd] = modifierGroup[currentMode].double;
66
+ const newFirst = handleAdd(firstReferenceDate);
67
+ setFirstReferenceDate(newFirst);
68
+ setSecondReferenceDate(getSecondCalendarDate(newFirst));
69
+ };
70
+ // Second calendar controls (same behavior as first)
71
+ const onSecondPrev = onFirstPrev;
72
+ const onSecondNext = onFirstNext;
73
+ const onSecondDoublePrev = onFirstDoublePrev;
74
+ const onSecondDoubleNext = onFirstDoubleNext;
75
+ const onMonthControlClick = () => {
76
+ setFirstReferenceDate(firstReferenceDate);
77
+ setSecondReferenceDate(addYear(firstReferenceDate, 1));
78
+ pushModeStack('month');
79
+ };
80
+ const onYearControlClick = () => {
81
+ setFirstReferenceDate(firstReferenceDate);
82
+ setSecondReferenceDate(addYear(firstReferenceDate, calendarYearModuler));
83
+ pushModeStack('year');
84
+ };
85
+ // Wrapper functions for updating reference dates
86
+ // These should be used when switching modes (e.g., from month picker back to day mode)
87
+ // They update the target calendar and maintain the offset between calendars
88
+ const updateFirstReferenceDate = useCallback((date) => {
89
+ setFirstReferenceDate(date);
90
+ setSecondReferenceDate(getSecondCalendarDate(date));
91
+ }, [getSecondCalendarDate]);
92
+ const updateSecondReferenceDate = useCallback((date) => {
93
+ setFirstReferenceDate(date);
94
+ setSecondReferenceDate(getSecondCalendarDate(date));
95
+ }, [getSecondCalendarDate]);
96
+ return {
97
+ currentMode,
98
+ onMonthControlClick,
99
+ onFirstNext,
100
+ onFirstPrev,
101
+ onFirstDoubleNext,
102
+ onFirstDoublePrev,
103
+ onSecondNext,
104
+ onSecondPrev,
105
+ onSecondDoubleNext,
106
+ onSecondDoublePrev,
107
+ onYearControlClick,
108
+ popModeStack,
109
+ referenceDates: useMemo(() => [firstReferenceDate, secondReferenceDate], [firstReferenceDate, secondReferenceDate]),
110
+ updateFirstReferenceDate,
111
+ updateSecondReferenceDate,
112
+ };
113
+ }
114
+
115
+ export { useRangeCalendarControls };
@@ -1,13 +1,23 @@
1
- import { ReactElement, ReactNode } from 'react';
2
- import { NativeElementPropsWithoutKeyAndRef } from '../utils/jsx-types';
1
+ import { ReactElement } from 'react';
3
2
  import { CheckboxGroupProps } from './CheckboxGroup';
4
- export interface CheckAllProps extends NativeElementPropsWithoutKeyAndRef<'div'> {
5
- children?: ReactElement<CheckboxGroupProps>;
6
- label?: ReactNode;
3
+ export interface CheckAllProps {
4
+ /**
5
+ * The checkbox group to control.
6
+ */
7
+ children: ReactElement<CheckboxGroupProps>;
8
+ /**
9
+ * Whether the check all checkbox is disabled.
10
+ * @default false
11
+ */
12
+ disabled?: boolean;
13
+ /**
14
+ * The label text for the check all checkbox.
15
+ */
16
+ label?: string;
7
17
  }
8
18
  /**
9
19
  * The react component for `mezzanine` check all.
10
- * Only support controlled.
20
+ * Wraps a CheckboxGroup and provides a "check all" checkbox that controls all checkboxes in the group.
11
21
  */
12
22
  declare const CheckAll: import("react").ForwardRefExoticComponent<CheckAllProps & import("react").RefAttributes<HTMLDivElement>>;
13
23
  export default CheckAll;
@@ -1,36 +1,50 @@
1
+ 'use client';
1
2
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef, Children, useMemo } from 'react';
3
- import { checkboxClasses } from '@mezzanine-ui/core/checkbox';
3
+ import { forwardRef, useId, useMemo } from 'react';
4
4
  import Checkbox from './Checkbox.js';
5
- import cx from 'clsx';
5
+ import { assignCheckboxGroupValuesToEvent } from './CheckboxGroup.js';
6
6
 
7
7
  /**
8
8
  * The react component for `mezzanine` check all.
9
- * Only support controlled.
9
+ * Wraps a CheckboxGroup and provides a "check all" checkbox that controls all checkboxes in the group.
10
10
  */
11
11
  const CheckAll = forwardRef(function CheckAll(props, ref) {
12
- const { children, className, label, ...rest } = props;
13
- const checkboxGroup = children && Children.only(children);
14
- const { disabled, name, onChange, options, size, value } = (checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.props) || {};
15
- const enabledOptions = useMemo(() => options === null || options === void 0 ? void 0 : options.filter((option) => !option.disabled), [options]);
16
- let allChecked = false;
17
- let indeterminate = false;
18
- if (enabledOptions && value) {
19
- allChecked = enabledOptions.length === value.length;
20
- indeterminate = enabledOptions.length > value.length && value.length > 0;
21
- }
22
- return (jsxs("div", { ...rest, ref: ref, className: cx(checkboxClasses.all, className), children: [jsx("div", { children: jsx(Checkbox, { checked: allChecked, disabled: disabled, indeterminate: indeterminate, inputProps: {
23
- name,
24
- }, onChange: (event) => {
25
- if (onChange) {
26
- if (!event.target.checked) {
27
- onChange([], event);
28
- }
29
- else if (enabledOptions) {
30
- onChange(enabledOptions.map((option) => option.value), event);
31
- }
32
- }
33
- }, size: size, children: label }) }), children] }));
12
+ const { children, disabled = false, label = 'Check All', } = props;
13
+ // Generate unique id for the check all checkbox
14
+ // This is important for accessibility
15
+ const checkAllId = useId();
16
+ const checkboxGroupProps = children.props;
17
+ const { options = [], value = [], onChange } = checkboxGroupProps;
18
+ // Calculate checked and indeterminate states
19
+ const { checked, indeterminate } = useMemo(() => {
20
+ const enabledOptions = options.filter((opt) => !opt.disabled);
21
+ const enabledValues = enabledOptions.map((opt) => opt.value);
22
+ const selectedEnabledValues = value.filter((v) => enabledValues.includes(v));
23
+ if (selectedEnabledValues.length === 0) {
24
+ return { checked: false, indeterminate: false };
25
+ }
26
+ if (selectedEnabledValues.length === enabledValues.length) {
27
+ return { checked: true, indeterminate: false };
28
+ }
29
+ return { checked: false, indeterminate: true };
30
+ }, [options, value]);
31
+ const handleCheckAllChange = (event) => {
32
+ var _a;
33
+ if (!onChange)
34
+ return;
35
+ const isChecked = event.target.checked;
36
+ const enabledOptions = options.filter((opt) => !opt.disabled);
37
+ const enabledValues = enabledOptions.map((opt) => opt.value);
38
+ const disabledOptions = options.filter((opt) => opt.disabled);
39
+ const disabledValues = disabledOptions.map((opt) => opt.value);
40
+ const selectedDisabledValues = value.filter((v) => disabledValues.includes(v));
41
+ const newValue = isChecked
42
+ ? [...enabledValues, ...selectedDisabledValues]
43
+ : selectedDisabledValues;
44
+ const syntheticEvent = assignCheckboxGroupValuesToEvent(event, newValue, (_a = checkboxGroupProps.name) !== null && _a !== void 0 ? _a : '');
45
+ onChange(syntheticEvent);
46
+ };
47
+ return (jsxs("div", { ref: ref, children: [jsx(Checkbox, { checked: checked, disabled: disabled, indeterminate: indeterminate, inputProps: { id: checkAllId }, label: label, name: checkboxGroupProps.name || checkAllId, onChange: handleCheckAllChange }), children] }));
34
48
  });
35
49
 
36
50
  export { CheckAll as default };