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