@vkontakte/vkui 4.29.1 → 4.30.0

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 (60) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +11 -9
  4. package/.cache/ts/src/components/Calendar/Calendar.d.ts +10 -1
  5. package/.cache/ts/src/components/CalendarHeader/CalendarHeader.d.ts +6 -0
  6. package/.cache/ts/src/components/DateInput/DateInput.d.ts +1 -1
  7. package/.cache/ts/src/hooks/useCalendar.d.ts +4 -3
  8. package/dist/cjs/components/Calendar/Calendar.d.ts +10 -1
  9. package/dist/cjs/components/Calendar/Calendar.js +11 -4
  10. package/dist/cjs/components/Calendar/Calendar.js.map +1 -1
  11. package/dist/cjs/components/CalendarHeader/CalendarHeader.d.ts +6 -0
  12. package/dist/cjs/components/CalendarHeader/CalendarHeader.js.map +1 -1
  13. package/dist/cjs/components/DateInput/DateInput.d.ts +1 -1
  14. package/dist/cjs/components/DateInput/DateInput.js +10 -2
  15. package/dist/cjs/components/DateInput/DateInput.js.map +1 -1
  16. package/dist/cjs/components/PanelHeader/PanelHeader.js +3 -3
  17. package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
  18. package/dist/cjs/hooks/useCalendar.d.ts +4 -3
  19. package/dist/cjs/hooks/useCalendar.js +15 -6
  20. package/dist/cjs/hooks/useCalendar.js.map +1 -1
  21. package/dist/components/Calendar/Calendar.d.ts +10 -1
  22. package/dist/components/Calendar/Calendar.js +11 -4
  23. package/dist/components/Calendar/Calendar.js.map +1 -1
  24. package/dist/components/CalendarHeader/CalendarHeader.d.ts +6 -0
  25. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  26. package/dist/components/DateInput/DateInput.d.ts +1 -1
  27. package/dist/components/DateInput/DateInput.js +10 -2
  28. package/dist/components/DateInput/DateInput.js.map +1 -1
  29. package/dist/components/PanelHeader/PanelHeader.js +3 -3
  30. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  31. package/dist/components.css +1 -1
  32. package/dist/components.css.map +1 -1
  33. package/dist/cssm/components/Calendar/Calendar.d.ts +10 -1
  34. package/dist/cssm/components/Calendar/Calendar.js +11 -4
  35. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  36. package/dist/cssm/components/CalendarHeader/CalendarHeader.d.ts +6 -0
  37. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  38. package/dist/cssm/components/DateInput/DateInput.d.ts +1 -1
  39. package/dist/cssm/components/DateInput/DateInput.js +10 -2
  40. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  41. package/dist/cssm/components/PanelHeader/PanelHeader.css +1 -1
  42. package/dist/cssm/components/PanelHeader/PanelHeader.js +3 -3
  43. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  44. package/dist/cssm/hooks/useCalendar.d.ts +4 -3
  45. package/dist/cssm/hooks/useCalendar.js +15 -6
  46. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  47. package/dist/cssm/styles/components.css +1 -1
  48. package/dist/hooks/useCalendar.d.ts +4 -3
  49. package/dist/hooks/useCalendar.js +15 -6
  50. package/dist/hooks/useCalendar.js.map +1 -1
  51. package/dist/vkui.css +1 -1
  52. package/dist/vkui.css.map +1 -1
  53. package/package.json +1 -1
  54. package/src/components/Calendar/Calendar.tsx +26 -3
  55. package/src/components/CalendarHeader/CalendarHeader.tsx +6 -0
  56. package/src/components/DateInput/DateInput.tsx +12 -0
  57. package/src/components/PanelHeader/PanelHeader.css +13 -5
  58. package/src/components/PanelHeader/PanelHeader.tsx +3 -3
  59. package/src/components/Switch/Readme.md +12 -36
  60. package/src/hooks/useCalendar.ts +25 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/vkui",
3
- "version": "4.29.1",
3
+ "version": "4.30.0",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -28,6 +28,8 @@ export interface CalendarProps
28
28
  | "nextMonthAriaLabel"
29
29
  | "changeMonthAriaLabel"
30
30
  | "changeYearAriaLabel"
31
+ | "onNextMonth"
32
+ | "onPrevMonth"
31
33
  >,
32
34
  HasRootRef<HTMLDivElement> {
33
35
  value?: Date;
@@ -43,6 +45,15 @@ export interface CalendarProps
43
45
  onChange?(value?: Date): void;
44
46
  shouldDisableDate?(value: Date): boolean;
45
47
  onClose?(): void;
48
+ /**
49
+ * Дата отображаемого месяца.
50
+ * При использовании обновление даты должно происходить вне компонента.
51
+ */
52
+ viewDate?: Date;
53
+ /**
54
+ * Изменение даты в шапке календаря.
55
+ */
56
+ onHeaderChange?(value: Date): void;
46
57
  }
47
58
 
48
59
  const warn = warnOnce("Calendar");
@@ -68,6 +79,10 @@ export const Calendar: React.FC<CalendarProps> = ({
68
79
  showNeighboringMonth,
69
80
  changeDayAriaLabel = "Изменить день",
70
81
  size = "m",
82
+ viewDate: externalViewDate,
83
+ onHeaderChange,
84
+ onNextMonth,
85
+ onPrevMonth,
71
86
  ...props
72
87
  }) => {
73
88
  const {
@@ -80,7 +95,15 @@ export const Calendar: React.FC<CalendarProps> = ({
80
95
  isDayFocused,
81
96
  isDayDisabled,
82
97
  resetSelectedDay,
83
- } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });
98
+ } = useCalendar({
99
+ value,
100
+ disableFuture,
101
+ disablePast,
102
+ shouldDisableDate,
103
+ onHeaderChange,
104
+ onNextMonth,
105
+ onPrevMonth,
106
+ });
84
107
 
85
108
  useIsomorphicLayoutEffect(() => {
86
109
  if (value) {
@@ -140,7 +163,7 @@ export const Calendar: React.FC<CalendarProps> = ({
140
163
  vkuiClass={classNames("Calendar", `Calendar--size-${size}`)}
141
164
  >
142
165
  <CalendarHeader
143
- viewDate={viewDate}
166
+ viewDate={externalViewDate || viewDate}
144
167
  onChange={setViewDate}
145
168
  onNextMonth={setNextMonth}
146
169
  onPrevMonth={setPrevMonth}
@@ -152,7 +175,7 @@ export const Calendar: React.FC<CalendarProps> = ({
152
175
  changeYearAriaLabel={changeYearAriaLabel}
153
176
  />
154
177
  <CalendarDays
155
- viewDate={viewDate}
178
+ viewDate={externalViewDate || viewDate}
156
179
  value={value}
157
180
  weekStartsOn={weekStartsOn}
158
181
  isDayFocused={isDayFocused}
@@ -30,7 +30,13 @@ export interface CalendarHeaderProps
30
30
  changeMonthAriaLabel?: string;
31
31
  changeYearAriaLabel?: string;
32
32
  onChange(viewDate: Date): void;
33
+ /**
34
+ * Нажатие на кнопку переключения на следующий месяц.
35
+ */
33
36
  onNextMonth?(): void;
37
+ /**
38
+ * Нажатие на кнопку переключения на предыдущий месяц.
39
+ */
34
40
  onPrevMonth?(): void;
35
41
  }
36
42
 
@@ -40,6 +40,10 @@ export interface DateInputProps
40
40
  | "changeDayAriaLabel"
41
41
  | "showNeighboringMonth"
42
42
  | "size"
43
+ | "viewDate"
44
+ | "onHeaderChange"
45
+ | "onNextMonth"
46
+ | "onPrevMonth"
43
47
  >,
44
48
  HasRootRef<HTMLDivElement> {
45
49
  calendarPlacement?: Placement;
@@ -118,6 +122,10 @@ export const DateInput: React.FC<DateInputProps> = ({
118
122
  changeMinutesAriaLabel = "Изменить минуту",
119
123
  clearFieldAriaLabel = "Очистить поле",
120
124
  showCalendarAriaLabel = "Показать календарь",
125
+ viewDate,
126
+ onHeaderChange,
127
+ onNextMonth,
128
+ onPrevMonth,
121
129
  ...props
122
130
  }) => {
123
131
  const daysRef = React.useRef<HTMLSpanElement>(null);
@@ -309,6 +317,10 @@ export const DateInput: React.FC<DateInputProps> = ({
309
317
  changeDayAriaLabel={changeDayAriaLabel}
310
318
  showNeighboringMonth={showNeighboringMonth}
311
319
  size={size}
320
+ viewDate={viewDate}
321
+ onHeaderChange={onCalendarChange}
322
+ onNextMonth={onNextMonth}
323
+ onPrevMonth={onPrevMonth}
312
324
  />
313
325
  </Popper>
314
326
  )}
@@ -66,10 +66,6 @@
66
66
  min-width: 90px;
67
67
  }
68
68
 
69
- .PanelHeader--sizeX-compact .PanelHeader__separator {
70
- padding-top: 4px;
71
- }
72
-
73
69
  /**
74
70
  * iOS
75
71
  */
@@ -234,13 +230,25 @@
234
230
  top: calc(var(--panelheader_height_vkcom) + var(--safe-area-inset-top));
235
231
  }
236
232
 
237
- .PanelHeader--vkcom.PanelHeader--sep .PanelHeader__in {
233
+ /* TODO: v5.0.0 новая адаптивность */
234
+ .PanelHeader--vkcom.PanelHeader--sizeX-regular:not(.ModalPageHeader__in)
235
+ .PanelHeader__in {
238
236
  border-top-left-radius: 8px;
239
237
  border-top-right-radius: 8px;
240
238
  box-shadow: 0 0 0 var(--thin-border) var(--input_border) inset;
241
239
  border-bottom: none;
242
240
  }
243
241
 
242
+ .PanelHeader--vkcom.PanelHeader--sizeX-regular:not(.ModalPageHeader__in)::after {
243
+ position: absolute;
244
+ left: var(--thin-border);
245
+ right: var(--thin-border);
246
+ bottom: 0;
247
+ height: var(--thin-border);
248
+ background-color: var(--header_background);
249
+ content: "";
250
+ }
251
+
244
252
  .PanelHeader--vkcom .PanelHeader__content {
245
253
  text-align: center;
246
254
  }
@@ -120,10 +120,10 @@ const PanelHeader: React.FC<PanelHeaderProps> = (props: PanelHeaderProps) => {
120
120
  ) : (
121
121
  <PanelHeaderIn {...props} />
122
122
  )}
123
- {separator && visor && platform !== VKCOM && (
123
+ {separator && visor && (
124
124
  <Separator
125
- vkuiClass="PanelHeader__separator"
126
- expanded={sizeX === SizeType.REGULAR}
125
+ expanded={sizeX === SizeType.REGULAR && platform !== VKCOM}
126
+ wide={platform === VKCOM}
127
127
  />
128
128
  )}
129
129
  </div>
@@ -5,51 +5,27 @@
5
5
  <Panel id="switch">
6
6
  <PanelHeader>Switch</PanelHeader>
7
7
  <Group>
8
- <Cell
9
- role={null}
10
- disabled
11
- after={<Switch aria-label="Комментарии к записям" />}
12
- >
8
+ <SimpleCell Component="label" after={<Switch />}>
13
9
  Комментарии к записям
14
- </Cell>
15
- <Cell
16
- role={null}
17
- disabled
18
- after={<Switch defaultChecked aria-label="Ссылки" />}
19
- >
10
+ </SimpleCell>
11
+ <SimpleCell Component="label" after={<Switch defaultChecked />}>
20
12
  Ссылки
21
- </Cell>
22
- <Cell
23
- role={null}
24
- disabled
25
- after={<Switch disabled aria-label="Фотоальбомы" />}
26
- >
13
+ </SimpleCell>
14
+ <SimpleCell Component="label" disabled after={<Switch disabled />}>
27
15
  Фотоальбомы
28
- </Cell>
16
+ </SimpleCell>
29
17
  </Group>
30
18
  <Group header={<Header mode="secondary">Компактный вид</Header>}>
31
19
  <AdaptivityProvider sizeY="compact">
32
- <Cell
33
- role={null}
34
- disabled
35
- after={<Switch aria-label="Комментарии к записям" />}
36
- >
20
+ <SimpleCell Component="label" after={<Switch />}>
37
21
  Комментарии к записям
38
- </Cell>
39
- <Cell
40
- role={null}
41
- disabled
42
- after={<Switch defaultChecked aria-label="Ссылки" />}
43
- >
22
+ </SimpleCell>
23
+ <SimpleCell Component="label" after={<Switch defaultChecked />}>
44
24
  Ссылки
45
- </Cell>
46
- <Cell
47
- role={null}
48
- disabled
49
- after={<Switch disabled aria-label="Фотоальбомы" />}
50
- >
25
+ </SimpleCell>
26
+ <SimpleCell Component="label" disabled after={<Switch disabled />}>
51
27
  Фотоальбомы
52
- </Cell>
28
+ </SimpleCell>
53
29
  </AdaptivityProvider>
54
30
  </Group>
55
31
  </Panel>
@@ -8,8 +8,13 @@ import {
8
8
  isAfter,
9
9
  startOfDay,
10
10
  } from "../lib/date";
11
+ import { CalendarProps } from "../components/Calendar/Calendar";
11
12
 
12
- export interface UseCalendarDependencies {
13
+ export interface UseCalendarDependencies
14
+ extends Pick<
15
+ CalendarProps,
16
+ "onHeaderChange" | "onNextMonth" | "onPrevMonth"
17
+ > {
13
18
  value?: Array<Date | null> | Date;
14
19
  disablePast?: boolean;
15
20
  disableFuture?: boolean;
@@ -21,19 +26,30 @@ export function useCalendar({
21
26
  disablePast,
22
27
  disableFuture,
23
28
  shouldDisableDate,
29
+ onHeaderChange,
30
+ onNextMonth,
31
+ onPrevMonth,
24
32
  }: UseCalendarDependencies) {
25
33
  const [viewDate, setViewDate] = React.useState(
26
34
  (Array.isArray(value) ? value[0] : value) ?? new Date()
27
35
  );
28
36
  const [focusedDay, setFocusedDay] = React.useState<Date>();
29
37
 
30
- const setPrevMonth = React.useCallback(
31
- () => setViewDate(subMonths(viewDate, 1)),
32
- [viewDate]
33
- );
34
- const setNextMonth = React.useCallback(
35
- () => setViewDate(addMonths(viewDate, 1)),
36
- [viewDate]
38
+ const setPrevMonth = React.useCallback(() => {
39
+ onPrevMonth?.();
40
+ setViewDate(subMonths(viewDate, 1));
41
+ }, [viewDate, onPrevMonth]);
42
+ const setNextMonth = React.useCallback(() => {
43
+ onNextMonth?.();
44
+ setViewDate(addMonths(viewDate, 1));
45
+ }, [viewDate, onNextMonth]);
46
+
47
+ const handleSetViewDate = React.useCallback(
48
+ (value: Date) => {
49
+ onHeaderChange?.(value);
50
+ setViewDate(value);
51
+ },
52
+ [onHeaderChange]
37
53
  );
38
54
 
39
55
  const isDayFocused = React.useCallback(
@@ -66,7 +82,7 @@ export function useCalendar({
66
82
 
67
83
  return {
68
84
  viewDate,
69
- setViewDate,
85
+ setViewDate: handleSetViewDate,
70
86
  setPrevMonth,
71
87
  setNextMonth,
72
88
  focusedDay,