@clickhouse/click-ui 0.2.0-rc.6 → 0.2.0-rc.8

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 (86) hide show
  1. package/README.md +67 -0
  2. package/dist/cjs/click-ui.css +3861 -0
  3. package/dist/cjs/components/Button/Button.css +261 -0
  4. package/dist/cjs/components/Button/Button.module.css.cjs +38 -0
  5. package/dist/cjs/components/Button/Button.module.css.cjs.map +1 -0
  6. package/dist/cjs/components/Button/index.cjs +42 -126
  7. package/dist/cjs/components/Button/index.cjs.map +1 -1
  8. package/dist/cjs/components/ButtonGroup/index.cjs +1 -1
  9. package/dist/cjs/components/ButtonGroup/index.cjs.map +1 -1
  10. package/dist/cjs/components/DatePicker/Common.cjs +100 -73
  11. package/dist/cjs/components/DatePicker/Common.cjs.map +1 -1
  12. package/dist/cjs/components/DatePicker/DateRangePicker.cjs +24 -24
  13. package/dist/cjs/components/DatePicker/DateRangePicker.cjs.map +1 -1
  14. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs +96 -50
  15. package/dist/cjs/components/DatePicker/DateTimeRangePicker.cjs.map +1 -1
  16. package/dist/cjs/components/DatePicker/index.cjs +29 -18
  17. package/dist/cjs/components/DatePicker/index.cjs.map +1 -1
  18. package/dist/cjs/components/DatePicker/utils.cjs +42 -14
  19. package/dist/cjs/components/DatePicker/utils.cjs.map +1 -1
  20. package/dist/cjs/components/GenericMenu/index.cjs +1 -1
  21. package/dist/cjs/components/GenericMenu/index.cjs.map +1 -1
  22. package/dist/cjs/lib/cva.cjs +15 -0
  23. package/dist/cjs/lib/cva.cjs.map +1 -0
  24. package/dist/cjs/providers/ThemeProvider.cjs +4 -0
  25. package/dist/cjs/providers/ThemeProvider.cjs.map +1 -1
  26. package/dist/cjs/theme/styles/tokens-dark.css +1806 -0
  27. package/dist/cjs/theme/styles/tokens-light.css +1795 -0
  28. package/dist/cjs/theme/theme.config.json.cjs +12 -0
  29. package/dist/cjs/theme/theme.config.json.cjs.map +1 -0
  30. package/dist/cjs/theme/tokens/variables.dark.cjs +2 -4
  31. package/dist/cjs/theme/tokens/variables.dark.cjs.map +1 -1
  32. package/dist/cjs/theme/tokens/variables.light.cjs +1 -6
  33. package/dist/cjs/theme/tokens/variables.light.cjs.map +1 -1
  34. package/dist/cjs/utils/localStorage.cjs +3 -1
  35. package/dist/cjs/utils/localStorage.cjs.map +1 -1
  36. package/dist/esm/click-ui.css +3861 -0
  37. package/dist/esm/components/Button/Button.css +261 -0
  38. package/dist/esm/components/Button/Button.module.css.js +25 -0
  39. package/dist/esm/components/Button/Button.module.css.js.map +1 -0
  40. package/dist/esm/components/Button/index.js +42 -126
  41. package/dist/esm/components/Button/index.js.map +1 -1
  42. package/dist/esm/components/ButtonGroup/index.js +1 -1
  43. package/dist/esm/components/ButtonGroup/index.js.map +1 -1
  44. package/dist/esm/components/DatePicker/Common.js +101 -74
  45. package/dist/esm/components/DatePicker/Common.js.map +1 -1
  46. package/dist/esm/components/DatePicker/DateRangePicker.js +25 -25
  47. package/dist/esm/components/DatePicker/DateRangePicker.js.map +1 -1
  48. package/dist/esm/components/DatePicker/DateTimeRangePicker.js +97 -51
  49. package/dist/esm/components/DatePicker/DateTimeRangePicker.js.map +1 -1
  50. package/dist/esm/components/DatePicker/index.js +30 -19
  51. package/dist/esm/components/DatePicker/index.js.map +1 -1
  52. package/dist/esm/components/DatePicker/utils.js +36 -10
  53. package/dist/esm/components/DatePicker/utils.js.map +1 -1
  54. package/dist/esm/components/GenericMenu/index.js +1 -1
  55. package/dist/esm/components/GenericMenu/index.js.map +1 -1
  56. package/dist/esm/lib/cva.js +7 -0
  57. package/dist/esm/lib/cva.js.map +1 -0
  58. package/dist/esm/providers/ThemeProvider.js +4 -0
  59. package/dist/esm/providers/ThemeProvider.js.map +1 -1
  60. package/dist/esm/theme/styles/tokens-dark.css +1806 -0
  61. package/dist/esm/theme/styles/tokens-light.css +1795 -0
  62. package/dist/esm/theme/theme.config.json.js +7 -0
  63. package/dist/esm/theme/theme.config.json.js.map +1 -0
  64. package/dist/esm/theme/tokens/variables.dark.js +2 -4
  65. package/dist/esm/theme/tokens/variables.dark.js.map +1 -1
  66. package/dist/esm/theme/tokens/variables.light.js +1 -6
  67. package/dist/esm/theme/tokens/variables.light.js.map +1 -1
  68. package/dist/esm/utils/localStorage.js +3 -1
  69. package/dist/esm/utils/localStorage.js.map +1 -1
  70. package/dist/types/components/Button/Button.d.ts +25 -2
  71. package/dist/types/components/DatePicker/Common.d.ts +9 -4
  72. package/dist/types/components/DatePicker/DatePicker.d.ts +11 -2
  73. package/dist/types/components/DatePicker/DateRangePicker.d.ts +3 -2
  74. package/dist/types/components/DatePicker/DateTimeRangePicker.d.ts +7 -3
  75. package/dist/types/components/DatePicker/index.d.ts +3 -2
  76. package/dist/types/components/DatePicker/utils.d.ts +9 -8
  77. package/dist/types/index.d.ts +1 -1
  78. package/dist/types/lib/cva.d.ts +3 -0
  79. package/dist/types/theme/theme.config.json.d.ts +6 -0
  80. package/dist/types/theme/theme.core.d.ts +0 -7
  81. package/dist/types/theme/tokens/variables.dark.d.ts +0 -2
  82. package/dist/types/theme/tokens/variables.light.d.ts +0 -5
  83. package/dist/types/utils/dom.d.ts +1 -1
  84. package/dist/types/utils/localStorage.d.ts +1 -1
  85. package/package.json +26 -10
  86. package/dist/types/components/DatePicker/DatePicker.types.d.ts +0 -9
@@ -16,18 +16,16 @@ const Dropdown = require('../Dropdown/index.cjs');
16
16
  const IconButton = require('../IconButton/index.cjs');
17
17
 
18
18
  const explicitWidth = "250px";
19
- const TXT_ON_MONTH_SELECT = "Month";
20
- const TXT_ON_YEAR_SELECT = "Year";
21
- const VIEW_GRID_MONTHS = {
19
+ const viewGridMonths = {
22
20
  columns: 4,
23
21
  rows: 3
24
22
  };
25
- const VIEW_GRID_YEARS = {
23
+ const viewGridYears = {
26
24
  columns: 3,
27
25
  rows: 3
28
26
  };
29
- const VIEW_TOTAL_YEARS = VIEW_GRID_YEARS.columns * VIEW_GRID_YEARS.rows;
30
- const VIEW_NAVIGATION_OFFSET_YEARS = Math.floor(VIEW_TOTAL_YEARS / 2);
27
+ const totalYears = viewGridYears.columns * viewGridYears.rows;
28
+ const yearsOffset = Math.floor(totalYears / 2);
31
29
  const HighlightedInputWrapper = styledComponents.styled(InputWrapper.InputWrapper).withConfig({
32
30
  componentId: "sc-1m6g9rm-0"
33
31
  })(["", "}"], ({
@@ -40,16 +38,16 @@ const HighlightedInputWrapper = styledComponents.styled(InputWrapper.InputWrappe
40
38
  ${$width && `min-width: ${explicitWidth};`}
41
39
  `;
42
40
  });
43
- const formatPartialDate = (selectedDate, partialYear, partialMonth) => {
41
+ const formatPartialDate = (timezone, selectedDate, partialYear, partialMonth) => {
44
42
  if (typeof partialYear === "number" && typeof partialMonth === "number") {
45
- const date = new Date(partialYear, partialMonth, 1);
46
- return utils.headerDateFormatter.format(date);
43
+ const date = timezone === "UTC" ? new Date(Date.UTC(partialYear, partialMonth, 1)) : new Date(partialYear, partialMonth, 1);
44
+ return utils.formatDateHeader(timezone, date);
47
45
  }
48
46
  if (typeof partialYear === "number") {
49
47
  return String(partialYear);
50
48
  }
51
49
  if (selectedDate instanceof Date) {
52
- return utils.selectedDateFormatter.format(selectedDate);
50
+ return utils.formatSelectedDate(timezone, selectedDate);
53
51
  }
54
52
  return "";
55
53
  };
@@ -60,10 +58,11 @@ const DatePickerInput = ({
60
58
  partialMonth,
61
59
  partialYear,
62
60
  placeholder,
63
- selectedDate
61
+ selectedDate,
62
+ timezone = "system"
64
63
  }) => {
65
64
  const defaultId = react.useId();
66
- const formattedSelectedDate = formatPartialDate(selectedDate, partialYear, partialMonth);
65
+ const formattedSelectedDate = formatPartialDate(timezone, selectedDate, partialYear, partialMonth);
67
66
  return /* @__PURE__ */ jsxRuntime.jsxs(HighlightedInputWrapper, { $isActive: isActive, disabled, id: id ?? defaultId, children: [
68
67
  /* @__PURE__ */ jsxRuntime.jsx(InputWrapper.InputStartContent, { children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { name: "calendar" }) }),
69
68
  /* @__PURE__ */ jsxRuntime.jsx(InputWrapper.InputElement, { $hasStartContent: true, "data-testid": "datepicker-input", placeholder, readOnly: true, value: formattedSelectedDate })
@@ -75,21 +74,22 @@ const DateRangePickerInput = ({
75
74
  id,
76
75
  placeholder,
77
76
  selectedEndDate,
78
- selectedStartDate
77
+ selectedStartDate,
78
+ timezone = "system"
79
79
  }) => {
80
80
  const defaultId = react.useId();
81
81
  let formattedValue = /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: placeholder ?? "" });
82
82
  if (selectedStartDate) {
83
83
  if (selectedEndDate) {
84
84
  formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
85
- utils.selectedDateFormatter.format(selectedStartDate),
85
+ utils.formatSelectedDate(timezone, selectedStartDate),
86
86
  " –",
87
87
  " ",
88
- utils.selectedDateFormatter.format(selectedEndDate)
88
+ utils.formatSelectedDate(timezone, selectedEndDate)
89
89
  ] });
90
90
  } else {
91
91
  formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
92
- utils.selectedDateFormatter.format(selectedStartDate),
92
+ utils.formatSelectedDate(timezone, selectedStartDate),
93
93
  " ",
94
94
  /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: "– end date" })
95
95
  ] });
@@ -107,23 +107,28 @@ const DateTimeRangePickerInput = ({
107
107
  placeholder,
108
108
  selectedEndDate,
109
109
  selectedStartDate,
110
- shouldShowSeconds
110
+ shouldShowSeconds,
111
+ timezone = "system"
111
112
  }) => {
112
113
  const defaultId = react.useId();
113
- const dateTimeFormatter = shouldShowSeconds ? utils.selectedDateTimeFormatterWithSeconds : utils.selectedDateTimeFormatter;
114
+ const formatDateTime = react.useCallback((date) => {
115
+ if (shouldShowSeconds) {
116
+ return utils.formatSelectedDateTimeWithSeconds(timezone, date);
117
+ }
118
+ return utils.formatSelectedDateTime(timezone, date);
119
+ }, [shouldShowSeconds, timezone]);
114
120
  let formattedValue = /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: placeholder ?? "" });
115
121
  if (selectedStartDate) {
116
122
  if (selectedEndDate) {
117
123
  formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
118
- dateTimeFormatter.format(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
119
- " ",
120
- "–",
124
+ formatDateTime(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
125
+ " ",
121
126
  " ",
122
- dateTimeFormatter.format(selectedEndDate).replace("AM", "am").replace("PM", "pm")
127
+ formatDateTime(selectedEndDate).replace("AM", "am").replace("PM", "pm")
123
128
  ] });
124
129
  } else {
125
130
  formattedValue = /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
126
- dateTimeFormatter.format(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
131
+ formatDateTime(selectedStartDate).replace("AM", "am").replace("PM", "pm"),
127
132
  " ",
128
133
  /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { color: "muted", component: "span", children: "– end date" })
129
134
  ] });
@@ -134,7 +139,7 @@ const DateTimeRangePickerInput = ({
134
139
  "start date –",
135
140
  " "
136
141
  ] }),
137
- dateTimeFormatter.format(selectedEndDate).replace("AM", "am").replace("PM", "pm")
142
+ formatDateTime(selectedEndDate).replace("AM", "am").replace("PM", "pm")
138
143
  ] });
139
144
  }
140
145
  return /* @__PURE__ */ jsxRuntime.jsxs(HighlightedInputWrapper, { $isActive: isActive, disabled, id: id ?? defaultId, $width: "max-content", children: [
@@ -149,22 +154,20 @@ const DatePickerContainer = styledComponents.styled(Container.Container).withCon
149
154
  }) => theme.click.datePicker.dateOption.color.background.default);
150
155
  const ClickableTitle = styledComponents.styled.button.withConfig({
151
156
  componentId: "sc-1m6g9rm-2"
152
- })(["", " background:transparent;cursor:pointer;user-select:none;padding:0.25rem 0.5rem;border-radius:", ";outline:none;&:hover{background:", ";}&:focus,&:focus-visible{border-color:", ";}"], ({
157
+ })(["background:transparent;border:1px solid transparent;cursor:pointer;outline:none;padding:0.25rem 0.5rem;user-select:none;", ";&:hover{background:", ";}&:focus,&:focus-visible{border-color:", ";}"], ({
153
158
  theme
154
159
  }) => `
160
+ border-radius: ${theme.click.datePicker.dateOption.radii.default};
155
161
  color: ${theme.click.datePicker.color.title.default};
156
162
  font: ${theme.click.datePicker.typography.title.default};
157
- border: 1px solid transparent;
158
163
  `, ({
159
164
  theme
160
- }) => theme.click.datePicker.dateOption.radii.default, ({
161
- theme
162
165
  }) => theme.click.datePicker.dateOption.color.background.hover, ({
163
166
  theme
164
167
  }) => theme.click.datePicker.dateOption.color.stroke.hover);
165
168
  const UnselectableTitle = styledComponents.styled.h2.withConfig({
166
169
  componentId: "sc-1m6g9rm-3"
167
- })(["", " margin:0;padding:0;user-select:none;"], ({
170
+ })(["margin:0;padding:0;user-select:none;", ""], ({
168
171
  theme
169
172
  }) => `
170
173
  color: ${theme.click.datePicker.color.title.default};
@@ -179,20 +182,20 @@ const GridContainer = styledComponents.styled.div.withConfig({
179
182
  `);
180
183
  const MonthsGrid = styledComponents.styled(GridContainer).withConfig({
181
184
  componentId: "sc-1m6g9rm-5"
182
- })(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], VIEW_GRID_MONTHS.columns, VIEW_GRID_MONTHS.rows);
185
+ })(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], viewGridMonths.columns, viewGridMonths.rows);
183
186
  const YearsGrid = styledComponents.styled(GridContainer).withConfig({
184
187
  componentId: "sc-1m6g9rm-6"
185
- })(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], VIEW_GRID_YEARS.columns, VIEW_GRID_YEARS.rows);
188
+ })(["grid-template-columns:repeat(", ",1fr);grid-template-rows:repeat(", ",1fr);"], viewGridYears.columns, viewGridYears.rows);
186
189
  const GridCell = styledComponents.styled.button.withConfig({
187
190
  componentId: "sc-1m6g9rm-7"
188
- })(["", " ", " ", " display:flex;align-items:center;justify-content:center;padding:8px 4px;cursor:pointer;text-align:center;min-height:26px;", ""], ({
191
+ })(["align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:26px;padding:8px 4px;text-align:center;", " ", " ", " ", ""], ({
189
192
  theme
190
193
  }) => `
194
+ background: ${theme.click.datePicker.dateOption.color.background.default};
191
195
  border: ${theme.click.datePicker.dateOption.stroke} solid ${theme.click.datePicker.dateOption.color.stroke.default};
192
196
  border-radius: ${theme.click.datePicker.dateOption.radii.default};
193
- font: ${theme.click.datePicker.dateOption.typography.label.default};
194
197
  color: ${theme.click.datePicker.dateOption.color.label.default};
195
- background: ${theme.click.datePicker.dateOption.color.background.default};
198
+ font: ${theme.click.datePicker.dateOption.typography.label.default};
196
199
  `, ({
197
200
  $isActive,
198
201
  theme
@@ -311,8 +314,13 @@ const CalendarRenderer = ({
311
314
  onYearSelect,
312
315
  onMonthSelect,
313
316
  selectedDate,
317
+ timezone = "system",
314
318
  ...props
315
319
  }) => {
320
+ const shiftedCalendarOptions = calendarOptions.defaultDate instanceof Date ? {
321
+ ...calendarOptions,
322
+ defaultDate: utils.shiftToTimezone(calendarOptions.defaultDate, timezone)
323
+ } : calendarOptions;
316
324
  const {
317
325
  body,
318
326
  headers,
@@ -321,13 +329,13 @@ const CalendarRenderer = ({
321
329
  year
322
330
  } = calendar.useCalendar({
323
331
  defaultWeekStart: 1,
324
- ...calendarOptions
332
+ ...shiftedCalendarOptions
325
333
  });
326
334
  const [view, setView] = react.useState(date.DAYS);
327
335
  const [selectedYear, setSelectedYear] = react.useState(null);
328
336
  const [yearOffset, setYearOffset] = react.useState(0);
329
337
  const [focusedMonthIndex, setFocusedMonthIndex] = react.useState(month);
330
- const [focusedYearIndex, setFocusedYearIndex] = react.useState(VIEW_NAVIGATION_OFFSET_YEARS);
338
+ const [focusedYearIndex, setFocusedYearIndex] = react.useState(yearsOffset);
331
339
  const monthGridRef = react.useRef([]);
332
340
  const yearGridRef = react.useRef([]);
333
341
  const headerNavRefs = react.useRef([null, null, null]);
@@ -340,14 +348,14 @@ const CalendarRenderer = ({
340
348
  }, [view, focusedYearIndex, focusedMonthIndex]);
341
349
  const onNextClick = react.useCallback(() => {
342
350
  if (view === date.YEARS) {
343
- setYearOffset((prev) => prev + VIEW_TOTAL_YEARS);
351
+ setYearOffset((prev) => prev + totalYears);
344
352
  } else {
345
353
  navigation.toNext();
346
354
  }
347
355
  }, [navigation, view]);
348
356
  const onPreviousClick = react.useCallback(() => {
349
357
  if (view === date.YEARS) {
350
- setYearOffset((prev) => prev - VIEW_TOTAL_YEARS);
358
+ setYearOffset((prev) => prev - totalYears);
351
359
  return;
352
360
  }
353
361
  navigation.toPrev();
@@ -393,30 +401,30 @@ const CalendarRenderer = ({
393
401
  setSelectedYear(null);
394
402
  setYearOffset(0);
395
403
  }, [selectedYear, year, navigation, onMonthSelect]);
396
- const onMonthGridKeyDown = react.useCallback((e, index) => {
397
- const columns = VIEW_GRID_MONTHS.columns;
404
+ const onMonthGridKeyDown = react.useCallback((event, index) => {
405
+ const columns = viewGridMonths.columns;
398
406
  const totalItems = 12;
399
407
  let newIndex = index;
400
- switch (e.key) {
408
+ switch (event.key) {
401
409
  case "ArrowRight":
402
- e.preventDefault();
410
+ event.preventDefault();
403
411
  newIndex = (index + 1) % totalItems;
404
412
  break;
405
413
  case "ArrowLeft":
406
- e.preventDefault();
414
+ event.preventDefault();
407
415
  newIndex = (index - 1 + totalItems) % totalItems;
408
416
  break;
409
417
  case "ArrowDown":
410
- e.preventDefault();
418
+ event.preventDefault();
411
419
  newIndex = (index + columns) % totalItems;
412
420
  break;
413
421
  case "ArrowUp":
414
- e.preventDefault();
422
+ event.preventDefault();
415
423
  newIndex = (index - columns + totalItems) % totalItems;
416
424
  break;
417
425
  case "Enter":
418
426
  case " ":
419
- e.preventDefault();
427
+ event.preventDefault();
420
428
  onMonthSelection(index);
421
429
  return;
422
430
  default:
@@ -425,30 +433,30 @@ const CalendarRenderer = ({
425
433
  setFocusedMonthIndex(newIndex);
426
434
  monthGridRef.current[newIndex]?.focus();
427
435
  }, [onMonthSelection]);
428
- const onYearGridKeyDown = react.useCallback((e, index, yearValue) => {
429
- const columns = VIEW_GRID_YEARS.columns;
430
- const totalItems = VIEW_TOTAL_YEARS;
436
+ const onYearGridKeyDown = react.useCallback((event, index, yearValue) => {
437
+ const columns = viewGridYears.columns;
438
+ const totalItems = totalYears;
431
439
  let newIndex = index;
432
- switch (e.key) {
440
+ switch (event.key) {
433
441
  case "ArrowRight":
434
- e.preventDefault();
442
+ event.preventDefault();
435
443
  newIndex = (index + 1) % totalItems;
436
444
  break;
437
445
  case "ArrowLeft":
438
- e.preventDefault();
446
+ event.preventDefault();
439
447
  newIndex = (index - 1 + totalItems) % totalItems;
440
448
  break;
441
449
  case "ArrowDown":
442
- e.preventDefault();
450
+ event.preventDefault();
443
451
  newIndex = (index + columns) % totalItems;
444
452
  break;
445
453
  case "ArrowUp":
446
- e.preventDefault();
454
+ event.preventDefault();
447
455
  newIndex = (index - columns + totalItems) % totalItems;
448
456
  break;
449
457
  case "Enter":
450
458
  case " ":
451
- e.preventDefault();
459
+ event.preventDefault();
452
460
  onYearSelection(yearValue);
453
461
  return;
454
462
  default:
@@ -462,34 +470,53 @@ const CalendarRenderer = ({
462
470
  headerDate.setFullYear(year);
463
471
  const getHeaderTitle = (view2) => {
464
472
  if (view2 === date.MONTHS) {
465
- return TXT_ON_MONTH_SELECT;
473
+ return "Month";
466
474
  }
467
475
  if (view2 === date.YEARS) {
468
- return TXT_ON_YEAR_SELECT;
476
+ return "Year";
469
477
  }
470
- return utils.headerDateFormatter.format(headerDate);
478
+ return utils.formatDateHeader("system", headerDate);
471
479
  };
472
480
  const renderMonthsGrid = () => {
473
- const today = /* @__PURE__ */ new Date();
474
- const todayMonth = today.getMonth();
475
- const todayYear = today.getFullYear();
476
- const selectedMonth = selectedDate?.getMonth();
477
- const selectedYear2 = selectedDate?.getFullYear();
478
- return /* @__PURE__ */ jsxRuntime.jsx(MonthsGrid, { "data-testid": "months-grid", role: "grid", "aria-label": "Select month", children: monthAbbreviations.map((abbr, index) => /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref: (el) => {
479
- monthGridRef.current[index] = el;
480
- }, $isActive: selectedDate && index === selectedMonth && year === selectedYear2, $isPresent: index === todayMonth && year === todayYear, onClick: () => onMonthSelection(index), onKeyDown: (e) => onMonthGridKeyDown(e, index), "data-testid": `month-cell-${index}`, tabIndex: index === focusedMonthIndex ? 0 : -1, "aria-label": abbr, children: abbr }, abbr)) });
481
+ const today = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone);
482
+ const thisMonth = today.getMonth();
483
+ const thisYear = today.getFullYear();
484
+ const shiftedSelected = selectedDate ? utils.shiftToTimezone(selectedDate, timezone) : void 0;
485
+ const selectedMonth = shiftedSelected?.getMonth();
486
+ const selectedYear2 = shiftedSelected?.getFullYear();
487
+ return /* @__PURE__ */ jsxRuntime.jsx(MonthsGrid, { "data-testid": "months-grid", role: "grid", "aria-label": "Select month", children: monthAbbreviations.map((month2, index) => {
488
+ const handleKeyDown = (event) => {
489
+ onMonthGridKeyDown(event, index);
490
+ };
491
+ const handleClick = () => {
492
+ onMonthSelection(index);
493
+ };
494
+ const ref = (element) => {
495
+ monthGridRef.current[index] = element;
496
+ };
497
+ return /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref, $isActive: selectedDate && index === selectedMonth && year === selectedYear2, $isPresent: index === thisMonth && year === thisYear, onClick: handleClick, onKeyDown: handleKeyDown, "data-testid": `month-cell-${index}`, tabIndex: index === focusedMonthIndex ? 0 : -1, "aria-label": month2, children: month2 }, month2);
498
+ }) });
481
499
  };
482
500
  const renderYearsGrid = () => {
483
501
  const years = [];
484
502
  const baseYear = year + yearOffset;
485
- const todayYear = (/* @__PURE__ */ new Date()).getFullYear();
486
- const selectedYear2 = selectedDate?.getFullYear();
487
- for (let i = -VIEW_NAVIGATION_OFFSET_YEARS; i <= VIEW_NAVIGATION_OFFSET_YEARS; i++) {
503
+ const thisYear = utils.shiftToTimezone(/* @__PURE__ */ new Date(), timezone).getFullYear();
504
+ const selectedYear2 = selectedDate ? utils.shiftToTimezone(selectedDate, timezone).getFullYear() : void 0;
505
+ for (let i = -yearsOffset; i <= yearsOffset; i++) {
488
506
  years.push(baseYear + i);
489
507
  }
490
- return /* @__PURE__ */ jsxRuntime.jsx(YearsGrid, { "data-testid": "years-grid", role: "grid", "aria-label": "Select year", children: years.map((currYear, index) => /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref: (el) => {
491
- yearGridRef.current[index] = el;
492
- }, $isActive: selectedDate && currYear === selectedYear2, $isPresent: currYear === todayYear, onClick: () => onYearSelection(currYear), onKeyDown: (e) => onYearGridKeyDown(e, index, currYear), "data-testid": `year-cell-${currYear}`, tabIndex: index === focusedYearIndex ? 0 : -1, "aria-label": String(currYear), children: currYear }, currYear)) });
508
+ return /* @__PURE__ */ jsxRuntime.jsx(YearsGrid, { "data-testid": "years-grid", role: "grid", "aria-label": "Select year", children: years.map((currentYear, index) => {
509
+ const ref = (element) => {
510
+ yearGridRef.current[index] = element;
511
+ };
512
+ const handleClick = () => {
513
+ onYearSelection(currentYear);
514
+ };
515
+ const handleKeyDown = (event) => {
516
+ onYearGridKeyDown(event, index, currentYear);
517
+ };
518
+ return /* @__PURE__ */ jsxRuntime.jsx(GridCell, { type: "button", ref, $isActive: selectedDate && currentYear === selectedYear2, $isPresent: currentYear === thisYear, onClick: handleClick, onKeyDown: handleKeyDown, "data-testid": `year-cell-${currentYear}`, tabIndex: index === focusedYearIndex ? 0 : -1, "aria-label": String(currentYear), children: currentYear }, currentYear);
519
+ }) });
493
520
  };
494
521
  const renderTableContent = () => {
495
522
  if (view === date.MONTHS) {
@@ -503,7 +530,7 @@ const CalendarRenderer = ({
503
530
  key,
504
531
  value: date
505
532
  }) => {
506
- return /* @__PURE__ */ jsxRuntime.jsx(DateTableHeader, { children: utils.weekdayFormatter.format(date) }, key);
533
+ return /* @__PURE__ */ jsxRuntime.jsx(DateTableHeader, { children: utils.formatWeekday("system", date) }, key);
507
534
  }) }) }),
508
535
  /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: children(body) })
509
536
  ] });