colibri-ui 0.8.67 → 0.8.69

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 (165) hide show
  1. package/Calendar/Calendar.d.ts +43 -0
  2. package/Calendar/Calendar.js +511 -0
  3. package/Calendar/Calendar.module.css +322 -0
  4. package/Calendar/index.d.ts +2 -4
  5. package/Calendar/index.js +3 -376
  6. package/Datepicker/components/DatePicker/index.js +145 -30
  7. package/Datepicker/components/DatePicker/index.module.css +29 -46
  8. package/Datepicker/components/DatePicker/index.props.d.ts +12 -0
  9. package/Datepicker/index.d.ts +1 -1
  10. package/Datepicker/index.js +25 -8
  11. package/Datepicker/index.props.d.ts +15 -2
  12. package/Status/index.d.ts +1 -1
  13. package/Status/index.js +7 -1
  14. package/Status/index.module.css +23 -11
  15. package/Status/index.props.d.ts +3 -0
  16. package/esm/Accordion/index.js +8 -8
  17. package/esm/Avatar/index.js +11 -11
  18. package/esm/Badge/Control/index.js +2 -2
  19. package/esm/Badge/index.js +2 -2
  20. package/esm/Button/index.js +6 -6
  21. package/esm/Calendar/Calendar.d.ts +43 -0
  22. package/esm/Calendar/Calendar.js +499 -0
  23. package/esm/Calendar/Calendar.module.css +322 -0
  24. package/esm/Calendar/index.d.ts +2 -4
  25. package/esm/Card/Card.js +4 -4
  26. package/esm/Checkbox/index.js +7 -7
  27. package/esm/Chip/index.js +6 -6
  28. package/esm/CodeField/CodeField.js +10 -10
  29. package/esm/Counter/index.js +8 -8
  30. package/esm/Datepicker/components/DatePicker/index.js +146 -31
  31. package/esm/Datepicker/components/DatePicker/index.module.css +29 -46
  32. package/esm/Datepicker/components/DatePicker/index.props.d.ts +12 -0
  33. package/esm/Datepicker/index.d.ts +1 -1
  34. package/esm/Datepicker/index.js +27 -10
  35. package/esm/Datepicker/index.props.d.ts +15 -2
  36. package/esm/DotsLoader/index.js +6 -6
  37. package/esm/Drawer/Drawer.js +13 -13
  38. package/esm/Dropdown/index.js +6 -6
  39. package/esm/Dropzone/Dropzone.js +10 -10
  40. package/esm/Editable/Editable.js +7 -7
  41. package/esm/Grid/Item/index.js +2 -2
  42. package/esm/Grid/index.js +2 -2
  43. package/esm/Icons/ArrowNext.js +3 -3
  44. package/esm/Icons/Cart.js +3 -3
  45. package/esm/Icons/Check.js +6 -6
  46. package/esm/Icons/Chevron.js +3 -3
  47. package/esm/Icons/Close.js +3 -3
  48. package/esm/Icons/Cross.js +3 -3
  49. package/esm/Icons/CrossFill.js +3 -3
  50. package/esm/Icons/Edit.js +3 -3
  51. package/esm/Icons/Exit.js +3 -3
  52. package/esm/Icons/EyeClosed.js +3 -3
  53. package/esm/Icons/EyeOpen.js +4 -4
  54. package/esm/Icons/Help.js +3 -3
  55. package/esm/Icons/Info.js +3 -3
  56. package/esm/Icons/Minus.js +3 -3
  57. package/esm/Icons/More.js +5 -5
  58. package/esm/Icons/Plus.js +3 -3
  59. package/esm/Icons/Setting.js +5 -5
  60. package/esm/Icons/Shield.js +3 -3
  61. package/esm/Icons/Trash.js +3 -3
  62. package/esm/Icons/User.js +4 -4
  63. package/esm/Image/index.js +4 -4
  64. package/esm/Input/index.js +4 -4
  65. package/esm/InputRadio/index.js +7 -7
  66. package/esm/Menu/components/MenuItem/index.js +2 -2
  67. package/esm/Menu/index.js +2 -2
  68. package/esm/Modal/components/Close/index.js +3 -3
  69. package/esm/Modal/components/Content/index.js +2 -2
  70. package/esm/Modal/components/Title/index.js +3 -3
  71. package/esm/Modal/index.js +9 -9
  72. package/esm/MultiSelect/components/MenuOverlay/index.js +7 -7
  73. package/esm/MultiSelect/components/MenuOverlayItem/index.js +3 -3
  74. package/esm/MultiSelect/index.js +12 -12
  75. package/esm/Progress/Progress.js +14 -14
  76. package/esm/RadioGroup/Radio.js +2 -2
  77. package/esm/RadioGroup/index.js +3 -3
  78. package/esm/Rating/Rating.js +13 -13
  79. package/esm/Select/components/MenuOverlay/index.js +4 -4
  80. package/esm/Select/components/MenuOverlayItem/index.js +3 -3
  81. package/esm/Select/index.js +10 -10
  82. package/esm/Separator/index.js +2 -2
  83. package/esm/Skeleton/index.js +3 -3
  84. package/esm/Status/index.d.ts +1 -1
  85. package/esm/Status/index.js +9 -3
  86. package/esm/Status/index.module.css +23 -11
  87. package/esm/Status/index.props.d.ts +3 -0
  88. package/esm/Switch/index.js +8 -8
  89. package/esm/TabsMenu/Tab/Tab.js +2 -2
  90. package/esm/TabsMenu/index.js +3 -3
  91. package/esm/TabsPanels/Panel/index.js +2 -2
  92. package/esm/TabsPanels/index.js +3 -3
  93. package/esm/TextArea/index.js +4 -4
  94. package/esm/TimeSelect/Label/index.js +2 -2
  95. package/esm/TimeSelect/index.js +3 -3
  96. package/esm/Tooltip/index.js +5 -5
  97. package/esm/Typography/index.js +2 -2
  98. package/esm/base/BaseInput/index.js +2 -2
  99. package/esm/base/FormField/index.js +4 -4
  100. package/esm/base/InputRoot/index.js +5 -5
  101. package/esm/helpers/date/index.js +3 -53
  102. package/esm/index.d.ts +1 -1
  103. package/esm/index.js +1 -2
  104. package/index.d.ts +1 -1
  105. package/index.js +64 -65
  106. package/package.json +1 -1
  107. package/Calendar/components/ContinueButton/index.d.ts +0 -10
  108. package/Calendar/components/ContinueButton/index.js +0 -42
  109. package/Calendar/components/ContinueButton/index.module.css +0 -4
  110. package/Calendar/components/Month/Month.d.ts +0 -16
  111. package/Calendar/components/Month/Month.js +0 -201
  112. package/Calendar/components/Month/index.module.css +0 -144
  113. package/Calendar/components/Presets/index.d.ts +0 -19
  114. package/Calendar/components/Presets/index.js +0 -61
  115. package/Calendar/components/Presets/index.module.css +0 -28
  116. package/Calendar/index.module.css +0 -97
  117. package/Calendar/index.props.d.ts +0 -22
  118. package/Calendar/utils/getMonthWeeks.d.ts +0 -20
  119. package/Calendar/utils/getMonthWeeks.js +0 -81
  120. package/Calendar/utils/getNumberOfMonthsBetweenDates.d.ts +0 -4
  121. package/Calendar/utils/getNumberOfMonthsBetweenDates.js +0 -21
  122. package/Calendar/utils/getPresets.d.ts +0 -12
  123. package/Calendar/utils/getPresets.js +0 -99
  124. package/Calendar/utils/getStartMonth.d.ts +0 -6
  125. package/Calendar/utils/getStartMonth.js +0 -15
  126. package/Datepicker/components/TimePicker/Label/index.d.ts +0 -8
  127. package/Datepicker/components/TimePicker/Label/index.js +0 -27
  128. package/Datepicker/components/TimePicker/helpers.d.ts +0 -12
  129. package/Datepicker/components/TimePicker/helpers.js +0 -39
  130. package/Datepicker/components/TimePicker/index.d.ts +0 -4
  131. package/Datepicker/components/TimePicker/index.js +0 -69
  132. package/Datepicker/components/TimePicker/index.module.css +0 -64
  133. package/Datepicker/components/TimePicker/index.props.d.ts +0 -8
  134. package/esm/Calendar/components/ContinueButton/index.d.ts +0 -10
  135. package/esm/Calendar/components/ContinueButton/index.js +0 -35
  136. package/esm/Calendar/components/ContinueButton/index.module.css +0 -4
  137. package/esm/Calendar/components/Month/Month.d.ts +0 -16
  138. package/esm/Calendar/components/Month/Month.js +0 -173
  139. package/esm/Calendar/components/Month/index.module.css +0 -144
  140. package/esm/Calendar/components/Presets/index.d.ts +0 -19
  141. package/esm/Calendar/components/Presets/index.js +0 -36
  142. package/esm/Calendar/components/Presets/index.module.css +0 -28
  143. package/esm/Calendar/index.js +0 -371
  144. package/esm/Calendar/index.module.css +0 -97
  145. package/esm/Calendar/index.props.d.ts +0 -22
  146. package/esm/Calendar/utils/getMonthWeeks.d.ts +0 -20
  147. package/esm/Calendar/utils/getMonthWeeks.js +0 -79
  148. package/esm/Calendar/utils/getNumberOfMonthsBetweenDates.d.ts +0 -4
  149. package/esm/Calendar/utils/getNumberOfMonthsBetweenDates.js +0 -19
  150. package/esm/Calendar/utils/getPresets.d.ts +0 -12
  151. package/esm/Calendar/utils/getPresets.js +0 -87
  152. package/esm/Calendar/utils/getStartMonth.d.ts +0 -6
  153. package/esm/Calendar/utils/getStartMonth.js +0 -13
  154. package/esm/Datepicker/components/TimePicker/Label/index.d.ts +0 -8
  155. package/esm/Datepicker/components/TimePicker/Label/index.js +0 -19
  156. package/esm/Datepicker/components/TimePicker/helpers.d.ts +0 -12
  157. package/esm/Datepicker/components/TimePicker/helpers.js +0 -18
  158. package/esm/Datepicker/components/TimePicker/index.d.ts +0 -4
  159. package/esm/Datepicker/components/TimePicker/index.js +0 -58
  160. package/esm/Datepicker/components/TimePicker/index.module.css +0 -64
  161. package/esm/Datepicker/components/TimePicker/index.props.d.ts +0 -8
  162. package/esm/libs/numbers/leadingZeros.js +0 -12
  163. package/esm/libs/requestIdleCallback/index.js +0 -8
  164. package/libs/numbers/leadingZeros.js +0 -14
  165. package/libs/requestIdleCallback/index.js +0 -10
@@ -0,0 +1,43 @@
1
+ import React from "react";
2
+ import type { HTMLAttributes, ReactNode } from "react";
3
+ export type CalendarSize = "xs" | "s" | "m" | "l" | "xl";
4
+ export type CalendarSelectionMode = "single" | "range";
5
+ export type CalendarView = "days" | "months" | "years";
6
+ export interface CalendarEvent {
7
+ date: Date;
8
+ color?: string;
9
+ label?: ReactNode;
10
+ }
11
+ interface CalendarCommonProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
12
+ defaultVisibleMonth?: Date;
13
+ defaultView?: CalendarView;
14
+ disabledDates?: Date[] | ((date: Date) => boolean);
15
+ events?: CalendarEvent[];
16
+ locale?: string;
17
+ maxDate?: Date;
18
+ minDate?: Date;
19
+ monthLabel?: string;
20
+ monthsToShow?: 1 | 2;
21
+ nextMonthLabel?: string;
22
+ onVisibleMonthChange?: (month: Date) => void;
23
+ previousMonthLabel?: string;
24
+ showOutsideDays?: boolean;
25
+ size?: CalendarSize;
26
+ visibleMonth?: Date;
27
+ weekStartsOn?: 0 | 1;
28
+ yearLabel?: string;
29
+ yearRange?: [number, number];
30
+ }
31
+ export interface CalendarSingleProps extends CalendarCommonProps {
32
+ onChange: (value: Date) => void;
33
+ selectionMode?: "single";
34
+ value: Date | null;
35
+ }
36
+ export interface CalendarRangeProps extends CalendarCommonProps {
37
+ onChange: (value: [Date | null, Date | null]) => void;
38
+ selectionMode: "range";
39
+ value: [Date | null, Date | null];
40
+ }
41
+ export type CalendarProps = CalendarSingleProps | CalendarRangeProps;
42
+ declare const Calendar: (props: CalendarProps) => React.JSX.Element;
43
+ export default Calendar;
@@ -0,0 +1,511 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
6
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
7
+ var tslib = require('tslib');
8
+ var React = require('react');
9
+ var index = require('../Button/index.js');
10
+ require('../Icons/index.js');
11
+ var styles = require('./Calendar.module.css');
12
+ var Chevron = require('../Icons/Chevron.js');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefault(_toConsumableArray);
17
+ var _slicedToArray__default = /*#__PURE__*/_interopDefault(_slicedToArray);
18
+ var React__default = /*#__PURE__*/_interopDefault(React);
19
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
20
+
21
+ var cx = function cx() {
22
+ for (var _len = arguments.length, classNames = new Array(_len), _key = 0; _key < _len; _key++) {
23
+ classNames[_key] = arguments[_key];
24
+ }
25
+ return classNames.filter(Boolean).join(" ");
26
+ };
27
+ var startOfDay = function startOfDay(date) {
28
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
29
+ };
30
+ var startOfMonth = function startOfMonth(date) {
31
+ return new Date(date.getFullYear(), date.getMonth(), 1);
32
+ };
33
+ var addMonths = function addMonths(date, amount) {
34
+ return new Date(date.getFullYear(), date.getMonth() + amount, 1);
35
+ };
36
+ var addDays = function addDays(date, amount) {
37
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);
38
+ };
39
+ var dayKey = function dayKey(date) {
40
+ return "".concat(date.getFullYear(), "-").concat(date.getMonth(), "-").concat(date.getDate());
41
+ };
42
+ var alignYearPage = function alignYearPage(year) {
43
+ return year - year % 12;
44
+ };
45
+ var isSameDay = function isSameDay(left, right) {
46
+ return Boolean(left && right && dayKey(left) === dayKey(right));
47
+ };
48
+ var isBefore = function isBefore(left, right) {
49
+ return startOfDay(left).getTime() < startOfDay(right).getTime();
50
+ };
51
+ var isMonthBefore = function isMonthBefore(left, right) {
52
+ return startOfMonth(left).getTime() < startOfMonth(right).getTime();
53
+ };
54
+ var getMonthDays = function getMonthDays(month, weekStartsOn) {
55
+ var first = startOfMonth(month);
56
+ var offset = (first.getDay() - weekStartsOn + 7) % 7;
57
+ var gridStart = addDays(first, -offset);
58
+ return Array.from({
59
+ length: 42
60
+ }, function (_, index) {
61
+ return addDays(gridStart, index);
62
+ });
63
+ };
64
+ var isDateDisabled = function isDateDisabled(date, minDate, maxDate, disabledDates) {
65
+ var _a;
66
+ if (minDate && isBefore(date, minDate)) return true;
67
+ if (maxDate && isBefore(maxDate, date)) return true;
68
+ if (typeof disabledDates === "function") return disabledDates(date);
69
+ return (_a = disabledDates === null || disabledDates === void 0 ? void 0 : disabledDates.some(function (item) {
70
+ return isSameDay(item, date);
71
+ })) !== null && _a !== void 0 ? _a : false;
72
+ };
73
+ var getButtonSize = function getButtonSize(size) {
74
+ return size === "xl" ? "l" : size;
75
+ };
76
+ var NextIcon = function NextIcon(props) {
77
+ return /*#__PURE__*/React__default.default.createElement("svg", Object.assign({
78
+ width: "100%",
79
+ xmlns: "http://www.w3.org/2000/svg",
80
+ fill: "none",
81
+ viewBox: "0 0 24 24",
82
+ strokeWidth: "1.5",
83
+ stroke: "currentColor"
84
+ }, props), /*#__PURE__*/React__default.default.createElement("path", {
85
+ strokeLinecap: "round",
86
+ strokeLinejoin: "round",
87
+ d: "m8.25 4.5 7.5 7.5-7.5 7.5"
88
+ }));
89
+ };
90
+ var PreviousIcon = function PreviousIcon(props) {
91
+ return /*#__PURE__*/React__default.default.createElement("svg", Object.assign({
92
+ width: "100%",
93
+ xmlns: "http://www.w3.org/2000/svg",
94
+ fill: "none",
95
+ viewBox: "0 0 24 24",
96
+ strokeWidth: "1.5",
97
+ stroke: "currentColor"
98
+ }, props), /*#__PURE__*/React__default.default.createElement("path", {
99
+ strokeLinecap: "round",
100
+ strokeLinejoin: "round",
101
+ d: "M15.75 19.5 8.25 12l7.5-7.5"
102
+ }));
103
+ };
104
+ var Calendar = function Calendar(props) {
105
+ var _a, _b;
106
+ var _props$selectionMode = props.selectionMode,
107
+ selectionMode = _props$selectionMode === void 0 ? "single" : _props$selectionMode,
108
+ value = props.value,
109
+ onChange = props.onChange,
110
+ _props$locale = props.locale,
111
+ locale = _props$locale === void 0 ? "en-US" : _props$locale,
112
+ _props$weekStartsOn = props.weekStartsOn,
113
+ weekStartsOn = _props$weekStartsOn === void 0 ? 1 : _props$weekStartsOn,
114
+ _props$monthsToShow = props.monthsToShow,
115
+ monthsToShow = _props$monthsToShow === void 0 ? 1 : _props$monthsToShow,
116
+ _props$size = props.size,
117
+ size = _props$size === void 0 ? "m" : _props$size,
118
+ visibleMonth = props.visibleMonth,
119
+ defaultVisibleMonth = props.defaultVisibleMonth,
120
+ _props$defaultView = props.defaultView,
121
+ defaultView = _props$defaultView === void 0 ? "days" : _props$defaultView,
122
+ onVisibleMonthChange = props.onVisibleMonthChange,
123
+ minDate = props.minDate,
124
+ maxDate = props.maxDate,
125
+ _props$monthLabel = props.monthLabel,
126
+ monthLabel = _props$monthLabel === void 0 ? "Month" : _props$monthLabel,
127
+ disabledDates = props.disabledDates,
128
+ _props$events = props.events,
129
+ events = _props$events === void 0 ? [] : _props$events,
130
+ _props$showOutsideDay = props.showOutsideDays,
131
+ showOutsideDays = _props$showOutsideDay === void 0 ? true : _props$showOutsideDay,
132
+ _props$previousMonthL = props.previousMonthLabel,
133
+ previousMonthLabel = _props$previousMonthL === void 0 ? "Previous month" : _props$previousMonthL,
134
+ _props$nextMonthLabel = props.nextMonthLabel,
135
+ nextMonthLabel = _props$nextMonthLabel === void 0 ? "Next month" : _props$nextMonthLabel,
136
+ _props$yearLabel = props.yearLabel,
137
+ yearLabel = _props$yearLabel === void 0 ? "Year" : _props$yearLabel,
138
+ yearRange = props.yearRange,
139
+ className = props.className,
140
+ rest = tslib.__rest(props, ["selectionMode", "value", "onChange", "locale", "weekStartsOn", "monthsToShow", "size", "visibleMonth", "defaultVisibleMonth", "defaultView", "onVisibleMonthChange", "minDate", "maxDate", "monthLabel", "disabledDates", "events", "showOutsideDays", "previousMonthLabel", "nextMonthLabel", "yearLabel", "yearRange", "className"]);
141
+ var initialDate = Array.isArray(value) ? value[0] : value;
142
+ var initialVisibleMonth = startOfMonth((_a = defaultVisibleMonth !== null && defaultVisibleMonth !== void 0 ? defaultVisibleMonth : initialDate) !== null && _a !== void 0 ? _a : new Date());
143
+ var _useState = React.useState(initialVisibleMonth),
144
+ _useState2 = _slicedToArray__default.default(_useState, 2),
145
+ internalMonth = _useState2[0],
146
+ setInternalMonth = _useState2[1];
147
+ var _useState3 = React.useState(defaultView),
148
+ _useState4 = _slicedToArray__default.default(_useState3, 2),
149
+ calendarView = _useState4[0],
150
+ setCalendarView = _useState4[1];
151
+ var _useState5 = React.useState(alignYearPage(initialVisibleMonth.getFullYear())),
152
+ _useState6 = _slicedToArray__default.default(_useState5, 2),
153
+ yearPageStart = _useState6[0],
154
+ setYearPageStart = _useState6[1];
155
+ var _useState7 = React.useState(null),
156
+ _useState8 = _slicedToArray__default.default(_useState7, 2),
157
+ hoveredDate = _useState8[0],
158
+ setHoveredDate = _useState8[1];
159
+ var _useState9 = React.useState(function () {
160
+ return startOfDay(initialDate !== null && initialDate !== void 0 ? initialDate : new Date());
161
+ }),
162
+ _useState0 = _slicedToArray__default.default(_useState9, 2),
163
+ focusedDate = _useState0[0],
164
+ setFocusedDate = _useState0[1];
165
+ var rootRef = React.useRef(null);
166
+ var currentMonth = startOfMonth(visibleMonth !== null && visibleMonth !== void 0 ? visibleMonth : internalMonth);
167
+ var buttonSize = getButtonSize(size);
168
+ var today = React.useMemo(function () {
169
+ return startOfDay(new Date());
170
+ }, []);
171
+ var monthNames = React.useMemo(function () {
172
+ return Array.from({
173
+ length: 12
174
+ }, function (_, monthIndex) {
175
+ return new Intl.DateTimeFormat(locale, {
176
+ month: "long"
177
+ }).format(new Date(2024, monthIndex, 1));
178
+ });
179
+ }, [locale]);
180
+ var yearBounds = React.useMemo(function () {
181
+ var _a, _b, _c, _d;
182
+ var currentYear = currentMonth.getFullYear();
183
+ var minYear = (_b = (_a = yearRange === null || yearRange === void 0 ? void 0 : yearRange[0]) !== null && _a !== void 0 ? _a : minDate === null || minDate === void 0 ? void 0 : minDate.getFullYear()) !== null && _b !== void 0 ? _b : currentYear - 50;
184
+ var maxYear = (_d = (_c = yearRange === null || yearRange === void 0 ? void 0 : yearRange[1]) !== null && _c !== void 0 ? _c : maxDate === null || maxDate === void 0 ? void 0 : maxDate.getFullYear()) !== null && _d !== void 0 ? _d : currentYear + 50;
185
+ return {
186
+ max: Math.max(minYear, maxYear),
187
+ min: Math.min(minYear, maxYear)
188
+ };
189
+ }, [currentMonth, maxDate, minDate, yearRange]);
190
+ var visibleYears = React.useMemo(function () {
191
+ return Array.from({
192
+ length: 12
193
+ }, function (_, index) {
194
+ return yearPageStart + index;
195
+ });
196
+ }, [yearPageStart]);
197
+ var rangeValue = selectionMode === "range" ? value : [null, null];
198
+ var singleValue = selectionMode === "single" ? value : null;
199
+ var clampMonth = function clampMonth(month) {
200
+ if (minDate && isMonthBefore(month, minDate)) return startOfMonth(minDate);
201
+ if (maxDate && isMonthBefore(maxDate, month)) return startOfMonth(maxDate);
202
+ return startOfMonth(month);
203
+ };
204
+ var setMonth = function setMonth(nextMonth) {
205
+ var normalized = clampMonth(nextMonth);
206
+ if (visibleMonth === undefined) setInternalMonth(normalized);
207
+ onVisibleMonthChange === null || onVisibleMonthChange === void 0 ? void 0 : onVisibleMonthChange(normalized);
208
+ };
209
+ var isVisibleMonthDisabled = function isVisibleMonthDisabled(year, monthIndex) {
210
+ var optionMonth = new Date(year, monthIndex, 1);
211
+ return Boolean(minDate && isMonthBefore(optionMonth, minDate) || maxDate && isMonthBefore(maxDate, optionMonth));
212
+ };
213
+ var isVisibleYearDisabled = function isVisibleYearDisabled(year) {
214
+ return year < yearBounds.min || year > yearBounds.max;
215
+ };
216
+ var handleHeaderClick = function handleHeaderClick() {
217
+ if (calendarView === "days") {
218
+ setCalendarView("months");
219
+ return;
220
+ }
221
+ if (calendarView === "months") {
222
+ setYearPageStart(alignYearPage(currentMonth.getFullYear()));
223
+ setCalendarView("years");
224
+ }
225
+ };
226
+ var handlePreviousClick = function handlePreviousClick() {
227
+ if (calendarView === "days") {
228
+ setMonth(addMonths(currentMonth, -1));
229
+ } else if (calendarView === "months") {
230
+ setMonth(addMonths(currentMonth, -12));
231
+ } else {
232
+ setYearPageStart(function (year) {
233
+ return year - 12;
234
+ });
235
+ }
236
+ };
237
+ var handleNextClick = function handleNextClick() {
238
+ if (calendarView === "days") {
239
+ setMonth(addMonths(currentMonth, 1));
240
+ } else if (calendarView === "months") {
241
+ setMonth(addMonths(currentMonth, 12));
242
+ } else {
243
+ setYearPageStart(function (year) {
244
+ return year + 12;
245
+ });
246
+ }
247
+ };
248
+ var handleMonthSelect = function handleMonthSelect(monthIndex) {
249
+ setMonth(new Date(currentMonth.getFullYear(), monthIndex, 1));
250
+ setCalendarView("days");
251
+ };
252
+ var handleYearSelect = function handleYearSelect(year) {
253
+ setMonth(new Date(year, currentMonth.getMonth(), 1));
254
+ setCalendarView("months");
255
+ };
256
+ var headerTitle = React.useMemo(function () {
257
+ if (calendarView === "months") return String(currentMonth.getFullYear());
258
+ if (calendarView === "years") {
259
+ return "".concat(yearPageStart, "-").concat(yearPageStart + visibleYears.length - 1);
260
+ }
261
+ return new Intl.DateTimeFormat(locale, {
262
+ month: "long",
263
+ year: "numeric"
264
+ }).format(currentMonth);
265
+ }, [calendarView, currentMonth, locale, visibleYears.length, yearPageStart]);
266
+ var isPreviousDisabled = Boolean(calendarView === "days" ? minDate && !isMonthBefore(startOfMonth(minDate), currentMonth) : calendarView === "months" ? yearBounds.min >= currentMonth.getFullYear() : yearPageStart <= yearBounds.min);
267
+ var isNextDisabled = Boolean(calendarView === "days" ? maxDate && !isMonthBefore(addMonths(currentMonth, monthsToShow - 1), startOfMonth(maxDate)) : calendarView === "months" ? yearBounds.max <= currentMonth.getFullYear() : yearPageStart + visibleYears.length - 1 >= yearBounds.max);
268
+ var headerLabel = calendarView === "days" ? monthLabel : yearLabel;
269
+ var canDrillUp = calendarView !== "years";
270
+ var renderPeriodGrid = function renderPeriodGrid() {
271
+ if (calendarView === "months") {
272
+ return /*#__PURE__*/React__default.default.createElement("div", {
273
+ className: styles__default.default["period-grid"]
274
+ }, monthNames.map(function (monthName, monthIndex) {
275
+ var selected = monthIndex === currentMonth.getMonth();
276
+ return /*#__PURE__*/React__default.default.createElement("button", {
277
+ key: monthName,
278
+ type: "button",
279
+ className: cx(styles__default.default["period-button"], selected && styles__default.default["period-button-selected"]),
280
+ disabled: isVisibleMonthDisabled(currentMonth.getFullYear(), monthIndex),
281
+ onClick: function onClick() {
282
+ return handleMonthSelect(monthIndex);
283
+ }
284
+ }, monthName);
285
+ }));
286
+ }
287
+ if (calendarView === "years") {
288
+ return /*#__PURE__*/React__default.default.createElement("div", {
289
+ className: styles__default.default["period-grid"]
290
+ }, visibleYears.map(function (year) {
291
+ var selected = year === currentMonth.getFullYear();
292
+ return /*#__PURE__*/React__default.default.createElement("button", {
293
+ key: year,
294
+ type: "button",
295
+ className: cx(styles__default.default["period-button"], selected && styles__default.default["period-button-selected"]),
296
+ disabled: isVisibleYearDisabled(year),
297
+ onClick: function onClick() {
298
+ return handleYearSelect(year);
299
+ }
300
+ }, year);
301
+ }));
302
+ }
303
+ return null;
304
+ };
305
+ var selectDate = function selectDate(date) {
306
+ if (selectionMode === "single") {
307
+ onChange(date);
308
+ return;
309
+ }
310
+ var _rangeValue = _slicedToArray__default.default(rangeValue, 2),
311
+ start = _rangeValue[0],
312
+ end = _rangeValue[1];
313
+ var changeRange = onChange;
314
+ if (!start || end) {
315
+ changeRange([date, null]);
316
+ } else if (isBefore(date, start)) {
317
+ changeRange([date, start]);
318
+ } else {
319
+ changeRange([start, date]);
320
+ }
321
+ };
322
+ var focusDay = function focusDay(date) {
323
+ setFocusedDate(date);
324
+ var firstVisible = currentMonth;
325
+ var lastVisible = addMonths(currentMonth, monthsToShow);
326
+ if (isBefore(date, firstVisible)) {
327
+ setMonth(startOfMonth(date));
328
+ } else if (!isBefore(date, lastVisible)) {
329
+ setMonth(addMonths(startOfMonth(date), 1 - monthsToShow));
330
+ }
331
+ window.requestAnimationFrame(function () {
332
+ var _a, _b;
333
+ (_b = (_a = rootRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("[data-day=\"".concat(dayKey(date), "\"]"))) === null || _b === void 0 ? void 0 : _b.focus();
334
+ });
335
+ };
336
+ var handleDayKeyDown = function handleDayKeyDown(event, date) {
337
+ var offsets = {
338
+ ArrowLeft: -1,
339
+ ArrowRight: 1,
340
+ ArrowUp: -7,
341
+ ArrowDown: 7
342
+ };
343
+ if (event.key in offsets) {
344
+ event.preventDefault();
345
+ focusDay(addDays(date, offsets[event.key]));
346
+ } else if (event.key === "Home" || event.key === "End") {
347
+ event.preventDefault();
348
+ var weekdayOffset = (date.getDay() - weekStartsOn + 7) % 7;
349
+ focusDay(addDays(date, event.key === "Home" ? -weekdayOffset : 6 - weekdayOffset));
350
+ } else if (event.key === "PageUp" || event.key === "PageDown") {
351
+ event.preventDefault();
352
+ focusDay(addMonths(date, event.key === "PageUp" ? -1 : 1));
353
+ }
354
+ };
355
+ var weekdayNames = React.useMemo(function () {
356
+ var sunday = new Date(2024, 0, 7);
357
+ return Array.from({
358
+ length: 7
359
+ }, function (_, index) {
360
+ var day = addDays(sunday, (index + weekStartsOn) % 7);
361
+ return {
362
+ isWeekend: day.getDay() === 0 || day.getDay() === 6,
363
+ name: new Intl.DateTimeFormat(locale, {
364
+ weekday: "short"
365
+ }).format(day).replace(".", "")
366
+ };
367
+ });
368
+ }, [locale, weekStartsOn]);
369
+ var eventMap = React.useMemo(function () {
370
+ var map = new Map();
371
+ events.forEach(function (event) {
372
+ var _a;
373
+ return map.set(dayKey(event.date), [].concat(_toConsumableArray__default.default((_a = map.get(dayKey(event.date))) !== null && _a !== void 0 ? _a : []), [event]));
374
+ });
375
+ return map;
376
+ }, [events]);
377
+ var rangePreviewEnd = rangeValue[0] && !rangeValue[1] ? hoveredDate : null;
378
+ var rangeStart = rangeValue[0];
379
+ var rangeEnd = (_b = rangeValue[1]) !== null && _b !== void 0 ? _b : rangePreviewEnd;
380
+ var rangeLower = rangeStart && rangeEnd && isBefore(rangeEnd, rangeStart) ? rangeEnd : rangeStart;
381
+ var rangeUpper = rangeStart && rangeEnd && isBefore(rangeEnd, rangeStart) ? rangeStart : rangeEnd;
382
+ return /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, rest, {
383
+ ref: rootRef,
384
+ className: cx(styles__default.default.root, styles__default.default[size], monthsToShow === 2 && styles__default.default["double"], className)
385
+ }), /*#__PURE__*/React__default.default.createElement("div", {
386
+ className: styles__default.default.header
387
+ }, /*#__PURE__*/React__default.default.createElement("div", {
388
+ className: styles__default.default["header-side"]
389
+ }, /*#__PURE__*/React__default.default.createElement(index.default, {
390
+ variant: "outline",
391
+ size: buttonSize,
392
+ type: "button",
393
+ className: cx(styles__default.default["title-button"], !canDrillUp && styles__default.default["title-button-static"]),
394
+ "aria-label": headerLabel,
395
+ "aria-expanded": calendarView !== "days",
396
+ "aria-disabled": !canDrillUp,
397
+ tabIndex: canDrillUp ? undefined : -1,
398
+ onClick: canDrillUp ? handleHeaderClick : undefined,
399
+ iconEnd: canDrillUp ? (/*#__PURE__*/React__default.default.createElement(Chevron.default, {
400
+ className: styles__default.default["title-icon"],
401
+ "aria-hidden": "true"
402
+ })) : undefined
403
+ }, headerTitle)), /*#__PURE__*/React__default.default.createElement("div", {
404
+ className: styles__default.default["header-side"]
405
+ }, /*#__PURE__*/React__default.default.createElement(index.default, {
406
+ variant: "outline",
407
+ size: buttonSize,
408
+ type: "button",
409
+ className: styles__default.default["nav-button"],
410
+ "aria-label": previousMonthLabel,
411
+ onClick: handlePreviousClick,
412
+ disabled: isPreviousDisabled,
413
+ icon: /*#__PURE__*/React__default.default.createElement(PreviousIcon, {
414
+ className: styles__default.default["nav-icon"],
415
+ "aria-hidden": "true"
416
+ })
417
+ }), /*#__PURE__*/React__default.default.createElement(index.default, {
418
+ variant: "outline",
419
+ size: buttonSize,
420
+ type: "button",
421
+ className: styles__default.default["nav-button"],
422
+ "aria-label": nextMonthLabel,
423
+ onClick: handleNextClick,
424
+ disabled: isNextDisabled,
425
+ icon: /*#__PURE__*/React__default.default.createElement(NextIcon, {
426
+ className: styles__default.default["nav-icon"],
427
+ "aria-hidden": "true"
428
+ })
429
+ }))), /*#__PURE__*/React__default.default.createElement("div", {
430
+ className: styles__default.default.content
431
+ }, calendarView !== "days" && renderPeriodGrid(), /*#__PURE__*/React__default.default.createElement("div", {
432
+ className: cx(styles__default.default.calendars, calendarView !== "days" && styles__default.default.hidden)
433
+ }, Array.from({
434
+ length: monthsToShow
435
+ }, function (_, monthIndex) {
436
+ var month = addMonths(currentMonth, monthIndex);
437
+ var days = getMonthDays(month, weekStartsOn);
438
+ var heading = new Intl.DateTimeFormat(locale, {
439
+ month: "long",
440
+ year: "numeric"
441
+ }).format(month);
442
+ return /*#__PURE__*/React__default.default.createElement("section", {
443
+ className: styles__default.default.month,
444
+ key: dayKey(month),
445
+ "aria-label": heading
446
+ }, monthsToShow === 2 && (/*#__PURE__*/React__default.default.createElement("h2", {
447
+ className: styles__default.default.heading
448
+ }, heading)), /*#__PURE__*/React__default.default.createElement("div", {
449
+ className: styles__default.default.weekdays,
450
+ "aria-hidden": "true"
451
+ }, weekdayNames.map(function (name) {
452
+ return /*#__PURE__*/React__default.default.createElement("span", {
453
+ key: name.name,
454
+ className: cx(name.isWeekend && styles__default.default.weekend)
455
+ }, name.name);
456
+ })), /*#__PURE__*/React__default.default.createElement("div", {
457
+ className: styles__default.default.days
458
+ }, days.map(function (date) {
459
+ var _a;
460
+ var outside = date.getMonth() !== month.getMonth();
461
+ var disabled = isDateDisabled(date, minDate, maxDate, disabledDates);
462
+ var selected = isSameDay(singleValue, date) || isSameDay(rangeStart, date) || isSameDay(rangeValue[1], date);
463
+ var inRange = Boolean(rangeLower && rangeUpper && !isBefore(date, rangeLower) && !isBefore(rangeUpper, date));
464
+ var dateEvents = (_a = eventMap.get(dayKey(date))) !== null && _a !== void 0 ? _a : [];
465
+ var dateLabel = new Intl.DateTimeFormat(locale, {
466
+ dateStyle: "full"
467
+ }).format(date);
468
+ return /*#__PURE__*/React__default.default.createElement("button", {
469
+ type: "button",
470
+ key: dayKey(date),
471
+ "data-day": dayKey(date),
472
+ className: cx(styles__default.default.day, outside && styles__default.default.outside, isSameDay(today, date) && styles__default.default.today, inRange && styles__default.default["in-range"], selected && styles__default.default.selected, isSameDay(rangeStart, date) && styles__default.default["range-start"], isSameDay(rangeValue[1], date) && styles__default.default["range-end"]),
473
+ disabled: disabled || outside && !showOutsideDays,
474
+ "aria-label": dateLabel,
475
+ "aria-pressed": selected,
476
+ tabIndex: isSameDay(focusedDate, date) ? 0 : -1,
477
+ onClick: function onClick() {
478
+ selectDate(date);
479
+ if (outside) setMonth(startOfMonth(date));
480
+ },
481
+ onFocus: function onFocus() {
482
+ return setFocusedDate(date);
483
+ },
484
+ onMouseEnter: function onMouseEnter() {
485
+ return setHoveredDate(date);
486
+ },
487
+ onMouseLeave: function onMouseLeave() {
488
+ return setHoveredDate(null);
489
+ },
490
+ onKeyDown: function onKeyDown(event) {
491
+ return handleDayKeyDown(event, date);
492
+ }
493
+ }, /*#__PURE__*/React__default.default.createElement("span", null, outside && !showOutsideDays ? "" : date.getDate()), dateEvents.length > 0 && (/*#__PURE__*/React__default.default.createElement("span", {
494
+ className: styles__default.default.events,
495
+ title: dateEvents.map(function (item) {
496
+ var _a;
497
+ return String((_a = item.label) !== null && _a !== void 0 ? _a : "");
498
+ }).join(", ")
499
+ }, dateEvents.slice(0, 3).map(function (item, index) {
500
+ return /*#__PURE__*/React__default.default.createElement("i", {
501
+ key: index,
502
+ style: {
503
+ backgroundColor: item.color
504
+ }
505
+ });
506
+ }))));
507
+ })));
508
+ }))));
509
+ };
510
+
511
+ exports.default = Calendar;