@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,70 @@
1
+ import type { JSXElementConstructor } from 'react';
2
+ import type { ComponentOverridableForwardRefComponentPropsFactory, NativeElementPropsWithoutKeyAndRef } from '../utils/jsx-types';
3
+ export interface BreadcrumbProps extends Omit<NativeElementPropsWithoutKeyAndRef<'nav'>, 'children'> {
4
+ /**
5
+ * Display only the last two items with an ellipsis dropdown for all previous items
6
+ */
7
+ condensed?: boolean;
8
+ items: Array<BreadcrumbItemProps>;
9
+ }
10
+ export type BreadcrumbItemComponent = 'a' | 'button' | JSXElementConstructor<any>;
11
+ export type BreadcrumbItemProps<C extends BreadcrumbItemComponent = 'button'> = ComponentOverridableForwardRefComponentPropsFactory<BreadcrumbItemComponent, C, BreadcrumbDropdownItemProps | BreadcrumbItemTextProps | BreadcrumbLinkItemProps>;
12
+ export type BreadcrumbDropdownItemProps = Omit<NativeElementPropsWithoutKeyAndRef<'button'>, 'children'> & {
13
+ component?: 'button';
14
+ /**
15
+ * Whether is the current page item.
16
+ */
17
+ current?: boolean;
18
+ /**
19
+ * Whether to expand the dropdown item icon.
20
+ */
21
+ expand?: boolean;
22
+ href?: string;
23
+ label?: string;
24
+ /**
25
+ * The dropdown options.
26
+ */
27
+ options: Array<{
28
+ /**
29
+ * The href of dropdown item.
30
+ */
31
+ href?: string;
32
+ id?: string;
33
+ /**
34
+ * The content of dropdown item.
35
+ */
36
+ label?: string;
37
+ target?: '_blank' | '_parent' | '_self' | '_top' | string;
38
+ }>;
39
+ target?: '_blank' | '_parent' | '_self' | '_top' | string;
40
+ };
41
+ export type BreadcrumbItemTextProps = {
42
+ component?: 'div';
43
+ /**
44
+ * Whether is the current page item.
45
+ */
46
+ current?: boolean;
47
+ expand?: never;
48
+ href?: never;
49
+ /**
50
+ * The content of breadcrumb text.
51
+ */
52
+ label: string;
53
+ options?: never;
54
+ target?: never;
55
+ };
56
+ export type BreadcrumbLinkItemProps = Omit<NativeElementPropsWithoutKeyAndRef<'a'>, 'children'> & {
57
+ component?: 'a';
58
+ current?: boolean;
59
+ expand?: never;
60
+ /**
61
+ * The href of breadcrumb link.
62
+ */
63
+ href: string;
64
+ label: string;
65
+ options?: never;
66
+ /**
67
+ * The target attribute specifies where to open the linked document.
68
+ */
69
+ target?: '_blank' | '_parent' | '_self' | '_top' | string;
70
+ };
package/Button/Button.js CHANGED
@@ -17,14 +17,14 @@ const Button = forwardRef(function Button(props, ref) {
17
17
  const hasLeadingIcon = (icon === null || icon === void 0 ? void 0 : icon.position) === 'leading' && !isIconOnly;
18
18
  const hasTrailingIcon = (icon === null || icon === void 0 ? void 0 : icon.position) === 'trailing' && !isIconOnly;
19
19
  // Loading 狀態下的 icon
20
- const loadingIcon = jsx(Icon, { icon: SpinnerIcon, spin: true });
20
+ const loadingIcon = jsx(Icon, { icon: SpinnerIcon, spin: true, size: 16 });
21
21
  // 渲染 icon 內容
22
22
  const renderIcon = () => {
23
23
  if (loading) {
24
24
  return loadingIcon;
25
25
  }
26
26
  if (icon) {
27
- return jsx(Icon, { icon: icon.src });
27
+ return jsx(Icon, { icon: icon.src, size: 16 });
28
28
  }
29
29
  return null;
30
30
  };
@@ -5,7 +5,10 @@ import { CalendarDaysProps } from './CalendarDays';
5
5
  import { CalendarMonthsProps } from './CalendarMonths';
6
6
  import { CalendarWeeksProps } from './CalendarWeeks';
7
7
  import { CalendarYearsProps } from './CalendarYears';
8
- export interface CalendarProps extends Omit<NativeElementPropsWithoutKeyAndRef<'div'>, 'onChange' | 'children'>, Pick<CalendarDaysProps, 'isDateDisabled' | 'isDateInRange' | 'onDateHover' | 'displayWeekDayLocale'>, Pick<CalendarMonthsProps, 'isMonthDisabled' | 'isMonthInRange' | 'onMonthHover' | 'displayMonthLocale'>, Pick<CalendarWeeksProps, 'isWeekDisabled' | 'isWeekInRange' | 'onWeekHover'>, Pick<CalendarYearsProps, 'isYearDisabled' | 'isYearInRange' | 'onYearHover'>, Pick<CalendarControlsProps, 'disableOnNext' | 'disableOnPrev'> {
8
+ import { CalendarQuartersProps } from './CalendarQuarters';
9
+ import { CalendarHalfYearsProps } from './CalendarHalfYears';
10
+ import { CalendarQuickSelectProps } from './CalendarQuickSelect';
11
+ export interface CalendarProps extends Omit<NativeElementPropsWithoutKeyAndRef<'div'>, 'onChange' | 'children'>, Pick<CalendarDaysProps, 'renderAnnotations' | 'isDateDisabled' | 'isDateInRange' | 'onDateHover' | 'displayWeekDayLocale'>, Pick<CalendarMonthsProps, 'isMonthDisabled' | 'isMonthInRange' | 'onMonthHover' | 'displayMonthLocale'>, Pick<CalendarWeeksProps, 'isWeekDisabled' | 'isWeekInRange' | 'onWeekHover'>, Pick<CalendarYearsProps, 'isYearDisabled' | 'isYearInRange' | 'onYearHover'>, Pick<CalendarQuartersProps, 'isQuarterDisabled' | 'isQuarterInRange' | 'onQuarterHover'>, Pick<CalendarHalfYearsProps, 'isHalfYearDisabled' | 'isHalfYearInRange' | 'onHalfYearHover'>, Pick<CalendarControlsProps, 'disableOnNext' | 'disableOnPrev' | 'disableOnDoubleNext' | 'disableOnDoublePrev'> {
9
12
  /**
10
13
  * Other props you may provide to `CalendarDays`
11
14
  */
@@ -22,6 +25,19 @@ export interface CalendarProps extends Omit<NativeElementPropsWithoutKeyAndRef<'
22
25
  * Other props you may provide to `CalendarYears`
23
26
  */
24
27
  calendarYearsProps?: Omit<CalendarYearsProps, 'onClick' | 'referenceDate' | 'value' | 'isYearDisabled' | 'isYearInRange' | 'onYearHover'>;
28
+ /**
29
+ * Other props you may provide to `CalendarQuarters`
30
+ */
31
+ calendarQuartersProps?: Omit<CalendarQuartersProps, 'onClick' | 'referenceDate' | 'value' | 'isQuarterDisabled' | 'isQuarterInRange' | 'onQuarterHover'>;
32
+ /**
33
+ * Other props you may provide to `CalendarHalfYears`
34
+ */
35
+ calendarHalfYearsProps?: Omit<CalendarHalfYearsProps, 'onClick' | 'referenceDate' | 'value' | 'isHalfYearDisabled' | 'isHalfYearInRange' | 'onHalfYearHover'>;
36
+ /**
37
+ * Disabled footer control element
38
+ * @default false
39
+ */
40
+ disabledFooterControl?: boolean;
25
41
  /**
26
42
  * Disabled `Month` calendar button click
27
43
  * @default false
@@ -49,19 +65,32 @@ export interface CalendarProps extends Omit<NativeElementPropsWithoutKeyAndRef<'
49
65
  * Click handler for control button of next.
50
66
  */
51
67
  onNext?: (currentMode: CalendarMode) => void;
68
+ /**
69
+ * Click handler for control button of next.
70
+ */
71
+ onDoubleNext?: (currentMode: CalendarMode) => void;
52
72
  /**
53
73
  * Click handler for control button of prev.
54
74
  */
55
75
  onPrev?: (currentMode: CalendarMode) => void;
76
+ /**
77
+ * Click handler for control button of double prev.
78
+ */
79
+ onDoublePrev?: (currentMode: CalendarMode) => void;
56
80
  /**
57
81
  * Click handler for control button of year.
58
82
  */
59
83
  onYearControlClick?: VoidFunction;
60
84
  /**
61
- * The refernce date for getting the calendar.
85
+ * The reference date for getting the calendar.
62
86
  * **The type of `referenceDate` should be the same as your declared `DateType`.**
63
87
  */
64
88
  referenceDate: DateType;
89
+ /**
90
+ * Quick select options for calendar.
91
+ * Provide options for users to quickly select specific dates or ranges.
92
+ */
93
+ quickSelect?: Pick<CalendarQuickSelectProps, 'activeId' | 'options'>;
65
94
  /**
66
95
  * The displaying cells will be marked as active
67
96
  * if the single value of it matches any date object in the array. <br />
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
- import { getYearRange, calendarYearModuler, calendarClasses } from '@mezzanine-ui/core/calendar';
3
+ import { getYearRange, calendarYearModuler, calendarQuarterYearsCount, calendarHalfYearYearsCount, calendarClasses } from '@mezzanine-ui/core/calendar';
4
4
  import castArray from 'lodash/castArray';
5
5
  import { forwardRef } from 'react';
6
6
  import { useCalendarContext } from './CalendarContext.js';
@@ -9,6 +9,10 @@ import CalendarDays from './CalendarDays.js';
9
9
  import CalendarMonths from './CalendarMonths.js';
10
10
  import CalendarWeeks from './CalendarWeeks.js';
11
11
  import CalendarYears from './CalendarYears.js';
12
+ import CalendarQuarters from './CalendarQuarters.js';
13
+ import CalendarHalfYears from './CalendarHalfYears.js';
14
+ import CalendarFooterControl from './CalendarFooterControl.js';
15
+ import CalendarQuickSelect from './CalendarQuickSelect.js';
12
16
  import cx from 'clsx';
13
17
 
14
18
  /**
@@ -17,45 +21,95 @@ import cx from 'clsx';
17
21
  * You may use the handlers provided by `useCalendarControls` hook or your own customizd methods.
18
22
  */
19
23
  const Calendar = forwardRef(function Calendar(props, ref) {
20
- const { displayMonthLocale: displayMonthLocaleFromConfig, getMonth, getMonthShortName, getYear, } = useCalendarContext();
21
- const { calendarDaysProps, calendarMonthsProps, calendarWeeksProps, calendarYearsProps, className, disabledMonthSwitch, disableOnNext, disableOnPrev, disabledYearSwitch, displayMonthLocale = displayMonthLocaleFromConfig, displayWeekDayLocale, isDateDisabled, isDateInRange, isMonthDisabled, isMonthInRange, isWeekDisabled, isWeekInRange, isYearDisabled, isYearInRange, mode = 'day', onChange, onDateHover, onMonthControlClick, onMonthHover, onNext, onPrev, onWeekHover, onYearControlClick, onYearHover, referenceDate, value: valueProp, ...restCalendarProps } = props;
24
+ const { locale, getNow, getMonth, getMonthShortName, getYear, getCurrentWeekFirstDate, getCurrentMonthFirstDate, getCurrentYearFirstDate, getCurrentQuarterFirstDate, getCurrentHalfYearFirstDate, setHour, setMinute, setSecond, setMillisecond, } = useCalendarContext();
25
+ const { renderAnnotations, calendarDaysProps, calendarMonthsProps, calendarWeeksProps, calendarYearsProps, calendarQuartersProps, calendarHalfYearsProps, className, disabledFooterControl = false, disabledMonthSwitch, disableOnNext, disableOnPrev, disableOnDoubleNext, disableOnDoublePrev, disabledYearSwitch, displayMonthLocale = locale, displayWeekDayLocale = locale, isDateDisabled, isDateInRange, isMonthDisabled, isMonthInRange, isWeekDisabled, isWeekInRange, isYearDisabled, isYearInRange, isQuarterDisabled, isQuarterInRange, isHalfYearDisabled, isHalfYearInRange, mode = 'day', onChange, onDateHover, onMonthControlClick, onMonthHover, onNext, onDoubleNext, onPrev, onDoublePrev, onWeekHover, onYearControlClick, onYearHover, onQuarterHover, onHalfYearHover, quickSelect, referenceDate, value: valueProp, ...restCalendarProps } = props;
22
26
  const value = valueProp ? castArray(valueProp) : undefined;
23
27
  /** Compute which calendar to use */
24
28
  let displayCalendar;
29
+ let displayFooterControl;
25
30
  if (mode === 'day') {
26
- displayCalendar = (jsx(CalendarDays, { ...calendarDaysProps, isYearDisabled: isYearDisabled, isMonthDisabled: isMonthDisabled, isDateDisabled: isDateDisabled, isDateInRange: isDateInRange, onClick: onChange, onDateHover: onDateHover, referenceDate: referenceDate, displayWeekDayLocale: displayWeekDayLocale, value: value }));
31
+ displayCalendar = (jsx(CalendarDays, { ...calendarDaysProps, renderAnnotations: renderAnnotations, isYearDisabled: isYearDisabled, isMonthDisabled: isMonthDisabled, isDateDisabled: isDateDisabled, isDateInRange: isDateInRange, onClick: onChange, onDateHover: onDateHover, referenceDate: referenceDate, displayWeekDayLocale: displayWeekDayLocale, value: value }));
32
+ if (!disabledFooterControl) {
33
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(setMillisecond(setSecond(setMinute(setHour(getNow(), 0), 0), 0), 0)), children: "Today" }));
34
+ }
27
35
  }
28
36
  else if (mode === 'week') {
29
37
  displayCalendar = (jsx(CalendarWeeks, { ...calendarWeeksProps, isYearDisabled: isYearDisabled, isMonthDisabled: isMonthDisabled, isWeekDisabled: isWeekDisabled, isWeekInRange: isWeekInRange, onClick: onChange, onWeekHover: onWeekHover, referenceDate: referenceDate, displayWeekDayLocale: displayWeekDayLocale, value: value }));
38
+ if (!disabledFooterControl) {
39
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(getCurrentWeekFirstDate(getNow(), displayWeekDayLocale)), children: "This week" }));
40
+ }
30
41
  }
31
42
  else if (mode === 'month') {
32
43
  displayCalendar = (jsx(CalendarMonths, { ...calendarMonthsProps, isYearDisabled: isYearDisabled, isMonthDisabled: isMonthDisabled, isMonthInRange: isMonthInRange, onClick: onChange, onMonthHover: onMonthHover, referenceDate: referenceDate, value: value }));
44
+ if (!disabledFooterControl) {
45
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(getCurrentMonthFirstDate(getNow())), children: "This month" }));
46
+ }
33
47
  }
34
48
  else if (mode === 'year') {
35
49
  displayCalendar = (jsx(CalendarYears, { ...calendarYearsProps, isYearDisabled: isYearDisabled, isYearInRange: isYearInRange, onClick: onChange, onYearHover: onYearHover, referenceDate: referenceDate, value: value }));
50
+ if (!disabledFooterControl) {
51
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(getCurrentYearFirstDate(getNow())), children: "This year" }));
52
+ }
53
+ }
54
+ else if (mode === 'quarter') {
55
+ displayCalendar = (jsx(CalendarQuarters, { ...calendarQuartersProps, isQuarterDisabled: isQuarterDisabled, isQuarterInRange: isQuarterInRange, onClick: onChange, onQuarterHover: onQuarterHover, referenceDate: referenceDate, value: value }));
56
+ if (!disabledFooterControl) {
57
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(getCurrentQuarterFirstDate(getNow())), children: "This quarter" }));
58
+ }
59
+ }
60
+ else if (mode === 'half-year') {
61
+ displayCalendar = (jsx(CalendarHalfYears, { ...calendarHalfYearsProps, isHalfYearDisabled: isHalfYearDisabled, isHalfYearInRange: isHalfYearInRange, onClick: onChange, onHalfYearHover: onHalfYearHover, referenceDate: referenceDate, value: value }));
62
+ if (!disabledFooterControl) {
63
+ displayFooterControl = (jsx(CalendarFooterControl, { onClick: () => onChange === null || onChange === void 0 ? void 0 : onChange(getCurrentHalfYearFirstDate(getNow())), children: "This half year" }));
64
+ }
36
65
  }
37
66
  /** Compute controls outcome */
38
- const [start, end] = getYearRange(getYear(referenceDate), calendarYearModuler);
39
- const displayYearRange = `${start} - ${end}`;
40
67
  let controls;
41
68
  if (mode === 'day' || mode === 'week') {
42
- controls = (jsxs(Fragment, { children: [jsx("button", { type: "button", className: cx(calendarClasses.button, calendarClasses.controlsButton, disabledMonthSwitch && calendarClasses.buttonDisabled), disabled: disabledMonthSwitch, "aria-disabled": disabledMonthSwitch, onClick: onMonthControlClick, children: getMonthShortName(getMonth(referenceDate), displayMonthLocale) }), jsx("button", { type: "button", className: cx(calendarClasses.button, calendarClasses.controlsButton, disabledYearSwitch && calendarClasses.buttonDisabled), disabled: disabledYearSwitch, "aria-disabled": disabledYearSwitch, onClick: onYearControlClick, children: getYear(referenceDate) })] }));
69
+ const displayMonth = getMonthShortName(getMonth(referenceDate), displayMonthLocale);
70
+ const displayYear = getYear(referenceDate);
71
+ controls = (jsxs(Fragment, { children: [jsx("button", { type: "button", disabled: disabledMonthSwitch, "aria-disabled": disabledMonthSwitch, "aria-label": `Select month, currently ${displayMonth}`, onClick: onMonthControlClick, children: displayMonth }), jsx("button", { type: "button", disabled: disabledYearSwitch, "aria-disabled": disabledYearSwitch, "aria-label": `Select year, currently ${displayYear}`, onClick: onYearControlClick, children: displayYear })] }));
43
72
  }
44
73
  else if (mode === 'month') {
45
- controls = (jsx("button", { type: "button", className: cx(calendarClasses.button, calendarClasses.controlsButton, disabledYearSwitch && calendarClasses.buttonDisabled), disabled: disabledYearSwitch, "aria-disabled": disabledYearSwitch, onClick: onYearControlClick, children: getYear(referenceDate) }));
74
+ const displayYear = getYear(referenceDate);
75
+ controls = (jsx("button", { type: "button", disabled: disabledYearSwitch, "aria-disabled": disabledYearSwitch, "aria-label": `Select year, currently ${displayYear}`, onClick: onYearControlClick, children: displayYear }));
46
76
  }
47
77
  else if (mode === 'year') {
48
- controls = (jsx("button", { type: "button", className: cx(calendarClasses.button, calendarClasses.controlsButton, calendarClasses.buttonDisabled), disabled: true, "aria-disabled": true, children: displayYearRange }));
49
- }
50
- return (jsxs("div", { ...restCalendarProps, ref: ref, className: cx(calendarClasses.host, className), children: [jsx(CalendarControls, { disableOnNext: disableOnNext, disableOnPrev: disableOnPrev, onNext: onNext
51
- ? () => {
52
- onNext(mode);
53
- }
54
- : undefined, onPrev: onPrev
55
- ? () => {
56
- onPrev(mode);
57
- }
58
- : undefined, children: controls }), displayCalendar] }));
78
+ const [start, end] = getYearRange(getYear(referenceDate), calendarYearModuler);
79
+ const displayYearRange = `${start} - ${end}`;
80
+ controls = (jsx("button", { type: "button", disabled: true, "aria-disabled": true, "aria-label": `Year range ${displayYearRange}`, children: displayYearRange }));
81
+ }
82
+ else if (mode === 'quarter') {
83
+ const [start, end] = getYearRange(getYear(referenceDate), calendarQuarterYearsCount);
84
+ const displayQuarterYearRange = `${start} - ${end}`;
85
+ controls = (jsx("button", { type: "button", disabled: true, "aria-disabled": true, "aria-label": `Quarter year range ${displayQuarterYearRange}`, children: displayQuarterYearRange }));
86
+ }
87
+ else if (mode === 'half-year') {
88
+ const [start, end] = getYearRange(getYear(referenceDate), calendarHalfYearYearsCount);
89
+ const displayHalfYearYearRange = `${start} - ${end}`;
90
+ controls = (jsx("button", { type: "button", disabled: true, "aria-disabled": true, "aria-label": `Half-year range ${displayHalfYearYearRange}`, children: displayHalfYearYearRange }));
91
+ }
92
+ return (jsxs("div", { ...restCalendarProps, ref: ref, role: "application", "aria-label": `Calendar, ${mode} view`, className: cx(calendarClasses.host, calendarClasses.mode(mode), className), children: [quickSelect && (jsx(CalendarQuickSelect, { activeId: quickSelect.activeId, options: quickSelect.options })), jsxs("div", { className: calendarClasses.mainWithFooter, children: [jsxs("div", { className: calendarClasses.main, children: [jsx(CalendarControls, { disableOnNext: disableOnNext, disableOnPrev: disableOnPrev, disableOnDoubleNext: disableOnDoubleNext, disableOnDoublePrev: disableOnDoublePrev, onDoubleNext: onDoubleNext
93
+ ? () => {
94
+ onDoubleNext(mode);
95
+ }
96
+ : undefined, onNext:
97
+ // Only day and week modes have single next/prev (for month navigation)
98
+ onNext && (mode === 'day' || mode === 'week')
99
+ ? () => {
100
+ onNext(mode);
101
+ }
102
+ : undefined, onDoublePrev: onDoublePrev
103
+ ? () => {
104
+ onDoublePrev(mode);
105
+ }
106
+ : undefined, onPrev:
107
+ // Only day and week modes have single next/prev (for month navigation)
108
+ onPrev && (mode === 'day' || mode === 'week')
109
+ ? () => {
110
+ onPrev(mode);
111
+ }
112
+ : undefined, children: controls }), displayCalendar] }), displayFooterControl] })] }));
59
113
  });
60
114
 
61
115
  export { Calendar as default };
@@ -12,6 +12,10 @@ export interface CalendarCellProps extends NativeElementPropsWithoutKeyAndRef<'d
12
12
  * Apply today styles if true.
13
13
  */
14
14
  today?: boolean;
15
+ /**
16
+ * The role attribute for accessibility
17
+ */
18
+ role?: string;
15
19
  }
16
20
  /**
17
21
  * The react component for `mezzanine` calendar cell.
@@ -7,11 +7,11 @@ import cx from 'clsx';
7
7
  * You may use it to compose your own calendar.
8
8
  */
9
9
  function CalendarCell(props) {
10
- const { active, children, className, disabled, today, ...restCalendarCellProps } = props;
11
- return (jsx("div", { className: cx(calendarClasses.cell, {
10
+ const { active, children, className, disabled, today, role, ...restCalendarCellProps } = props;
11
+ return (jsx("div", { role: role, className: cx(calendarClasses.cell, {
12
+ [calendarClasses.cellToday]: today,
12
13
  [calendarClasses.cellActive]: active,
13
14
  [calendarClasses.cellDisabled]: disabled,
14
- [calendarClasses.cellToday]: today,
15
15
  }, className), ...restCalendarCellProps, children: jsx("span", { className: calendarClasses.cellInner, children: children }) }));
16
16
  }
17
17
 
@@ -1,21 +1,28 @@
1
1
  import { ReactNode } from 'react';
2
- import { CalendarMethods } from '@mezzanine-ui/core/calendar';
2
+ import { CalendarLocale, CalendarLocaleValue, CalendarMethods } from '@mezzanine-ui/core/calendar';
3
3
  export interface CalendarConfigs extends CalendarMethods {
4
4
  defaultDateFormat: string;
5
5
  defaultTimeFormat: string;
6
- displayMonthLocale: string;
7
- displayWeekDayLocale: string;
8
- valueLocale: string;
6
+ /**
7
+ * The unified locale for all calendar display and value processing.
8
+ */
9
+ locale: string;
9
10
  }
10
11
  export type CalendarConfigProviderProps = {
11
12
  children?: ReactNode;
12
13
  defaultDateFormat?: string;
13
14
  defaultTimeFormat?: string;
14
- displayMonthLocale?: string;
15
- displayWeekDayLocale?: string;
15
+ /**
16
+ * The unified locale for all calendar display and value processing.
17
+ * This determines the first day of week, month names, weekday names, etc.
18
+ * Use CalendarLocale enum for type-safe locale values.
19
+ * @example CalendarLocale.EN_US, CalendarLocale.ZH_TW, CalendarLocale.DE_DE
20
+ * @default CalendarLocale.EN_US
21
+ */
22
+ locale?: CalendarLocaleValue;
16
23
  methods: CalendarMethods;
17
- valueLocale?: string;
18
24
  };
25
+ export { CalendarLocale };
19
26
  export declare const CalendarContext: import("react").Context<CalendarConfigs | undefined>;
20
27
  export declare function useCalendarContext(): CalendarConfigs;
21
28
  declare function CalendarConfigProvider(props: CalendarConfigProviderProps): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
  import { jsx } from 'react/jsx-runtime';
3
- import { createContext, useContext, useMemo } from 'react';
3
+ import { createContext, useMemo, useContext } from 'react';
4
+ import { CalendarLocale, normalizeLocale } from '@mezzanine-ui/core/calendar';
5
+ export { CalendarLocale } from '@mezzanine-ui/core/calendar';
4
6
 
5
7
  const CalendarContext = createContext(undefined);
6
8
  function useCalendarContext() {
@@ -13,22 +15,14 @@ function useCalendarContext() {
13
15
  return configs;
14
16
  }
15
17
  function CalendarConfigProvider(props) {
16
- const { children, defaultDateFormat = 'YYYY-MM-DD', defaultTimeFormat = 'HH:mm:ss', displayMonthLocale = 'en-us', displayWeekDayLocale = 'en-us', methods, valueLocale = 'en-us', } = props;
18
+ const { children, defaultDateFormat = 'YYYY-MM-DD', defaultTimeFormat = 'HH:mm:ss', locale = CalendarLocale.EN_US, methods, } = props;
19
+ const resolvedLocale = normalizeLocale(locale);
17
20
  const context = useMemo(() => ({
18
21
  ...methods,
19
22
  defaultDateFormat,
20
23
  defaultTimeFormat,
21
- displayMonthLocale,
22
- displayWeekDayLocale,
23
- valueLocale,
24
- }), [
25
- methods,
26
- defaultDateFormat,
27
- defaultTimeFormat,
28
- displayMonthLocale,
29
- displayWeekDayLocale,
30
- valueLocale,
31
- ]);
24
+ locale: resolvedLocale,
25
+ }), [methods, defaultDateFormat, defaultTimeFormat, resolvedLocale]);
32
26
  return (jsx(CalendarContext.Provider, { value: context, children: children }));
33
27
  }
34
28
 
@@ -4,18 +4,34 @@ export interface CalendarControlsProps extends Omit<NativeElementPropsWithoutKey
4
4
  * Disable the next controller if true.
5
5
  */
6
6
  disableOnNext?: boolean;
7
+ /**
8
+ * Disable the double next controller if true.
9
+ */
10
+ disableOnDoubleNext?: boolean;
7
11
  /**
8
12
  * Disable the prev controller if true.
9
13
  */
10
14
  disableOnPrev?: boolean;
15
+ /**
16
+ * Disable the double prev controller if true.
17
+ */
18
+ disableOnDoublePrev?: boolean;
11
19
  /**
12
20
  * Click handler for next controller.
13
21
  */
14
22
  onNext?: VoidFunction;
23
+ /**
24
+ * Click handler for double next controller.
25
+ */
26
+ onDoubleNext?: VoidFunction;
15
27
  /**
16
28
  * Click handler for prev controller.
17
29
  */
18
30
  onPrev?: VoidFunction;
31
+ /**
32
+ * Click handler for double prev controller.
33
+ */
34
+ onDoublePrev?: VoidFunction;
19
35
  }
20
36
  /**
21
37
  * The react component for `mezzanine` calendar controls.
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { calendarClasses } from '@mezzanine-ui/core/calendar';
3
- import { ChevronLeftIcon, ChevronRightIcon } from '@mezzanine-ui/icons';
3
+ import { DoubleChevronLeftIcon, ChevronLeftIcon, ChevronRightIcon, DoubleChevronRightIcon } from '@mezzanine-ui/icons';
4
4
  import Icon from '../Icon/Icon.js';
5
5
  import cx from 'clsx';
6
6
 
@@ -9,12 +9,8 @@ import cx from 'clsx';
9
9
  * You may use it to compose your own calendar.
10
10
  */
11
11
  function CalendarControls(props) {
12
- const { children, className, disableOnNext, disableOnPrev, onNext, onPrev, ...restElementProps } = props;
13
- return (jsxs("div", { ...restElementProps, className: cx(calendarClasses.controls, className), children: [onPrev && (jsx("button", { type: "button", "aria-disabled": disableOnPrev, disabled: disableOnPrev, onClick: onPrev, className: cx(calendarClasses.button, calendarClasses.controlsIconButton, calendarClasses.controlsPrev, {
14
- [calendarClasses.buttonDisabled]: disableOnPrev,
15
- }), children: jsx(Icon, { icon: ChevronLeftIcon }) })), children, onNext && (jsx("button", { type: "button", "aria-disabled": disableOnNext, disabled: disableOnNext, onClick: onNext, className: cx(calendarClasses.button, calendarClasses.controlsIconButton, calendarClasses.controlsNext, {
16
- [calendarClasses.buttonDisabled]: disableOnNext,
17
- }), children: jsx(Icon, { icon: ChevronRightIcon }) }))] }));
12
+ const { children, className, disableOnNext, disableOnDoubleNext, disableOnPrev, disableOnDoublePrev, onPrev, onNext, onDoubleNext, onDoublePrev, ...restElementProps } = props;
13
+ return (jsxs("div", { ...restElementProps, className: cx(calendarClasses.controls, className), children: [jsxs("div", { className: cx(calendarClasses.controlsActions), children: [onDoublePrev && (jsx("button", { type: "button", "aria-disabled": disableOnDoublePrev, disabled: disableOnDoublePrev, onClick: onDoublePrev, "aria-label": "Go to previous year", title: "Previous Year", className: cx(calendarClasses.controlsButton), children: jsx(Icon, { icon: DoubleChevronLeftIcon, "aria-hidden": "true" }) })), onPrev && (jsx("button", { type: "button", "aria-disabled": disableOnPrev, disabled: disableOnPrev, onClick: onPrev, "aria-label": "Go to previous month", title: "Previous Month", className: cx(calendarClasses.controlsButton), children: jsx(Icon, { icon: ChevronLeftIcon, "aria-hidden": "true" }) }))] }), jsx("div", { className: cx(calendarClasses.controlsMain), children: children }), jsxs("div", { className: cx(calendarClasses.controlsActions), children: [onNext && (jsx("button", { type: "button", "aria-disabled": disableOnNext, disabled: disableOnNext, onClick: onNext, "aria-label": "Go to next month", title: "Next Month", className: cx(calendarClasses.controlsButton), children: jsx(Icon, { icon: ChevronRightIcon, "aria-hidden": "true" }) })), onDoubleNext && (jsx("button", { type: "button", "aria-disabled": disableOnDoubleNext, disabled: disableOnDoubleNext, onClick: onDoubleNext, "aria-label": "Go to next year", title: "Next Year", className: cx(calendarClasses.controlsButton), children: jsx(Icon, { icon: DoubleChevronRightIcon, "aria-hidden": "true" }) }))] })] }));
18
14
  }
19
15
 
20
16
  export { CalendarControls as default };
@@ -10,10 +10,10 @@ import cx from 'clsx';
10
10
  * You may use it to compose your own calendar.
11
11
  */
12
12
  function CalendarDayOfWeek(props) {
13
- const { getWeekDayNames, displayWeekDayLocale: displayWeekDayLocaleFromConfig, } = useCalendarContext();
14
- const { displayWeekDayLocale = displayWeekDayLocaleFromConfig, className, ...restRowProps } = props;
13
+ const { getWeekDayNames, locale } = useCalendarContext();
14
+ const { displayWeekDayLocale = locale, className, ...restRowProps } = props;
15
15
  const weekDayNames = getWeekDayNames(displayWeekDayLocale);
16
- return (jsx("div", { className: cx(calendarClasses.row, className), ...restRowProps, children: weekDayNames.map((name) => (jsx(CalendarCell, { children: name }, `CALENDAR_DAY_OF_WEEK/${name}`))) }));
16
+ return (jsx("div", { className: cx(calendarClasses.row, className), role: "row", "aria-label": "Days of the week", ...restRowProps, children: weekDayNames.map((name, idx) => (jsx(CalendarCell, { role: "columnheader", children: name }, `CALENDAR_DAY_OF_WEEK/${name}-${idx}`))) }));
17
17
  }
18
18
 
19
19
  export { CalendarDayOfWeek as default };
@@ -3,6 +3,7 @@ import { NativeElementPropsWithoutKeyAndRef } from '../utils/jsx-types';
3
3
  import { CalendarDayOfWeekProps } from './CalendarDayOfWeek';
4
4
  import type { CalendarYearsProps } from './CalendarYears';
5
5
  import type { CalendarMonthsProps } from './CalendarMonths';
6
+ import { TypographyColor } from '../Typography';
6
7
  export interface CalendarDaysProps extends Pick<CalendarDayOfWeekProps, 'displayWeekDayLocale'>, Pick<CalendarYearsProps, 'isYearDisabled'>, Pick<CalendarMonthsProps, 'isMonthDisabled'>, Omit<NativeElementPropsWithoutKeyAndRef<'div'>, 'onClick' | 'children'> {
7
8
  /**
8
9
  * Provide if you have a custom disabling logic. The method takes the date object as its parameter.
@@ -22,7 +23,14 @@ export interface CalendarDaysProps extends Pick<CalendarDayOfWeekProps, 'display
22
23
  */
23
24
  onDateHover?: (date: DateType) => void;
24
25
  /**
25
- * The refernce date for getting the month of the calendar.
26
+ * The extra annotations for specific dates.
27
+ */
28
+ renderAnnotations?: (date: DateType) => {
29
+ value: string;
30
+ color?: TypographyColor;
31
+ };
32
+ /**
33
+ * The reference date for getting the month of the calendar.
26
34
  */
27
35
  referenceDate: DateType;
28
36
  /**
@@ -1,10 +1,11 @@
1
1
  'use client';
2
- import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
3
  import { calendarClasses } from '@mezzanine-ui/core/calendar';
4
4
  import { useMemo } from 'react';
5
5
  import CalendarCell from './CalendarCell.js';
6
6
  import CalendarDayOfWeek from './CalendarDayOfWeek.js';
7
7
  import { useCalendarContext } from './CalendarContext.js';
8
+ import Typography from '../Typography/Typography.js';
8
9
  import cx from 'clsx';
9
10
 
10
11
  /**
@@ -13,42 +14,66 @@ import cx from 'clsx';
13
14
  * You may use it to compose your own calendar.
14
15
  */
15
16
  function CalendarDays(props) {
16
- const { displayWeekDayLocale: displayWeekDayLocaleFromConfig, getCalendarGrid, getDate, getMonth, getNow, isDateIncluded, isSameDate, setDate, setMonth, } = useCalendarContext();
17
- const { className, displayWeekDayLocale = displayWeekDayLocaleFromConfig, isYearDisabled, isMonthDisabled, isDateDisabled, isDateInRange, onClick: onClickProp, onDateHover, referenceDate, value, ...rest } = props;
18
- const daysGrid = useMemo(() => getCalendarGrid(referenceDate), [getCalendarGrid, referenceDate]);
19
- return (jsxs("div", { ...rest, className: cx(calendarClasses.board, className), children: [jsx(CalendarDayOfWeek, { displayWeekDayLocale: displayWeekDayLocale }), daysGrid.map((week, index) => (jsx("div", { className: calendarClasses.row, children: week.map((dateNum) => {
20
- const isPrevMonth = index === 0 && dateNum > 7;
21
- const isNextMonth = index > 3 && dateNum <= 14;
22
- const thisMonth = getMonth(referenceDate);
23
- const month = isPrevMonth
24
- ? thisMonth - 1
25
- : isNextMonth
26
- ? thisMonth + 1
27
- : thisMonth;
28
- const date = setDate(setMonth(referenceDate, month), dateNum);
29
- const disabled = (isYearDisabled === null || isYearDisabled === void 0 ? void 0 : isYearDisabled(date)) ||
30
- (isMonthDisabled === null || isMonthDisabled === void 0 ? void 0 : isMonthDisabled(date)) ||
31
- (isDateDisabled === null || isDateDisabled === void 0 ? void 0 : isDateDisabled(date)) ||
32
- false;
33
- const inactive = !disabled && (isPrevMonth || isNextMonth);
34
- const inRange = !inactive && isDateInRange && isDateInRange(date);
35
- const active = !disabled && !inactive && value && isDateIncluded(date, value);
36
- const onMouseEnter = onDateHover
37
- ? () => {
38
- onDateHover(date);
39
- }
40
- : undefined;
41
- const onClick = onClickProp
42
- ? () => {
43
- onClickProp(date);
44
- }
45
- : undefined;
46
- return (jsx(CalendarCell, { today: isSameDate(date, getNow()), active: active, disabled: isPrevMonth || isNextMonth, children: jsx("button", { type: "button", "aria-disabled": disabled, disabled: disabled, onMouseEnter: onMouseEnter, className: cx(calendarClasses.button, {
47
- [calendarClasses.buttonInRange]: inRange,
48
- [calendarClasses.buttonActive]: active,
49
- [calendarClasses.buttonDisabled]: disabled,
50
- }), onClick: onClick, children: dateNum }) }, `${getMonth(date)}/${getDate(date)}`));
51
- }) }, `CALENDAR_DAYS/WEEK_OF/${index}`)))] }));
17
+ const { locale, getCalendarGrid, getDate, getMonth, getNow, isDateIncluded, isSameDate, setDate, setMonth, setHour, setMinute, setSecond, setMillisecond, } = useCalendarContext();
18
+ const { className, displayWeekDayLocale = locale, isYearDisabled, isMonthDisabled, isDateDisabled, isDateInRange, onClick: onClickProp, onDateHover, renderAnnotations, referenceDate, value, ...rest } = props;
19
+ const daysGrid = useMemo(() => getCalendarGrid(referenceDate, displayWeekDayLocale), [getCalendarGrid, displayWeekDayLocale, referenceDate]);
20
+ return (jsx("div", { ...rest, className: cx(calendarClasses.board, className), children: jsxs("div", { className: calendarClasses.daysGrid, children: [jsx(CalendarDayOfWeek, { displayWeekDayLocale: displayWeekDayLocale }), daysGrid.map((week, index) => (jsx("div", { className: calendarClasses.row, children: week.map((dateNum) => {
21
+ const isPrevMonth = index === 0 && dateNum > 7;
22
+ const isNextMonth = index > 3 && dateNum <= 14;
23
+ const thisMonth = getMonth(referenceDate);
24
+ const month = isPrevMonth
25
+ ? thisMonth - 1
26
+ : isNextMonth
27
+ ? thisMonth + 1
28
+ : thisMonth;
29
+ const date = setMillisecond(setSecond(setMinute(setHour(setDate(setMonth(referenceDate, month), dateNum), 0), 0), 0), 0);
30
+ const disabled = (isYearDisabled === null || isYearDisabled === void 0 ? void 0 : isYearDisabled(date)) ||
31
+ (isMonthDisabled === null || isMonthDisabled === void 0 ? void 0 : isMonthDisabled(date)) ||
32
+ (isDateDisabled === null || isDateDisabled === void 0 ? void 0 : isDateDisabled(date)) ||
33
+ false;
34
+ const inactive = !disabled && (isPrevMonth || isNextMonth);
35
+ const inRange = !inactive && isDateInRange && isDateInRange(date);
36
+ const active = !disabled && !inactive && value && isDateIncluded(date, value);
37
+ const onMouseEnter = onDateHover
38
+ ? () => {
39
+ onDateHover(date);
40
+ }
41
+ : undefined;
42
+ const onClick = onClickProp
43
+ ? () => {
44
+ onClickProp(date);
45
+ }
46
+ : undefined;
47
+ // Accessible date label for screen readers
48
+ const dateObj = new Date(date);
49
+ const dayName = dateObj.toLocaleDateString(displayWeekDayLocale, {
50
+ weekday: 'long',
51
+ });
52
+ const monthName = dateObj.toLocaleDateString(displayWeekDayLocale, { month: 'long' });
53
+ const year = dateObj.getFullYear();
54
+ const day = dateObj.getDate();
55
+ const isToday = isSameDate(date, getNow());
56
+ const ariaLabel = [
57
+ `${dayName}, ${monthName} ${day}, ${year}`,
58
+ isToday && 'Today',
59
+ active && 'Selected',
60
+ disabled && 'Not available',
61
+ inactive && 'Outside current month',
62
+ ]
63
+ .filter(Boolean)
64
+ .join(', ');
65
+ return (jsx(CalendarCell, { today: isSameDate(date, getNow()), active: active, disabled: isPrevMonth || isNextMonth, children: jsxs("button", { type: "button", "aria-disabled": disabled, disabled: disabled, "aria-label": ariaLabel, "aria-pressed": active, "aria-current": isToday ? 'date' : undefined, onMouseEnter: onMouseEnter, className: cx(calendarClasses.button, {
66
+ [calendarClasses.buttonInRange]: inRange,
67
+ [calendarClasses.buttonActive]: active,
68
+ [calendarClasses.buttonDisabled]: disabled,
69
+ }), onClick: onClick, children: [dateNum, typeof renderAnnotations === 'function'
70
+ ? (() => {
71
+ var _a, _b;
72
+ const annotation = renderAnnotations(date);
73
+ return (jsx(Typography, { variant: "annotation", color: (_a = annotation === null || annotation === void 0 ? void 0 : annotation.color) !== null && _a !== void 0 ? _a : 'text-neutral', children: (_b = annotation === null || annotation === void 0 ? void 0 : annotation.value) !== null && _b !== void 0 ? _b : '' }));
74
+ })()
75
+ : null] }) }, `${getMonth(date)}/${getDate(date)}`));
76
+ }) }, `CALENDAR_DAYS/WEEK_OF/${index}`)))] }) }));
52
77
  }
53
78
 
54
79
  export { CalendarDays as default };