@gravity-ui/date-components 2.5.0 → 2.6.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.
@@ -1,9 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { DateTime } from '@gravity-ui/date-utils';
3
3
  import type { CalendarProps } from '../Calendar';
4
- import type { AccessibilityProps, DateFieldBase, DomProps, FocusableProps, InputDOMProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
4
+ import type { AccessibilityProps, DomProps, FocusableProps, InputDOMProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
5
+ import type { DatePickerStateOptions } from './hooks/datePickerStateFactory';
5
6
  import './DatePicker.css';
6
- export interface DatePickerProps<T = DateTime> extends DateFieldBase<T>, TextInputProps, FocusableProps, KeyboardEvents, DomProps, InputDOMProps, StyleProps, AccessibilityProps {
7
+ export interface DatePickerProps<T = DateTime> extends DatePickerStateOptions<T>, TextInputProps, FocusableProps, KeyboardEvents, DomProps, InputDOMProps, StyleProps, AccessibilityProps {
7
8
  children?: (props: CalendarProps<T>) => React.ReactNode;
9
+ disablePortal?: boolean;
10
+ disableFocusTrap?: boolean;
8
11
  }
9
12
  export declare function DatePicker({ className, ...props }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import type { DateTime } from '@gravity-ui/date-utils';
2
2
  import type { DateFieldState } from '../../DateField';
3
- import type { DateFieldBase } from '../../types';
3
+ import type { DateFieldBase, PopupTriggerProps } from '../../types';
4
+ type OpenChangeReason = 'EscapeKeyDown' | 'FocusOut' | 'ClickOutside' | 'ValueSelected' | 'TriggerButtonClick' | 'ShortcutKeyDown';
4
5
  export interface DatePickerState<T = DateTime> {
5
6
  /** The currently selected date. */
6
7
  value: T | null;
@@ -36,7 +37,7 @@ export interface DatePickerState<T = DateTime> {
36
37
  /** Whether the calendar popover is currently open. */
37
38
  isOpen: boolean;
38
39
  /** Sets whether the calendar popover is open. */
39
- setOpen: (isOpen: boolean) => void;
40
+ setOpen: (isOpen: boolean, reason: OpenChangeReason) => void;
40
41
  dateFieldState: DateFieldState<T>;
41
42
  }
42
43
  export interface DatePickerStateFactoryOptions<T, O extends DateFieldBase<T>> {
@@ -46,4 +47,7 @@ export interface DatePickerStateFactoryOptions<T, O extends DateFieldBase<T>> {
46
47
  getDateTime: (date: T | null | undefined) => DateTime | undefined;
47
48
  useDateFieldState: (props: O) => DateFieldState<T>;
48
49
  }
49
- export declare function datePickerStateFactory<T, O extends DateFieldBase<T>>({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }: DatePickerStateFactoryOptions<T, O>): (props: O) => DatePickerState<T>;
50
+ export interface DatePickerStateOptions<T> extends DateFieldBase<T>, PopupTriggerProps<[OpenChangeReason]> {
51
+ }
52
+ export declare function datePickerStateFactory<T, O extends DatePickerStateOptions<T>>({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }: DatePickerStateFactoryOptions<T, O>): (props: O) => DatePickerState<T>;
53
+ export {};
@@ -7,10 +7,11 @@ const uikit_1 = require("@gravity-ui/uikit");
7
7
  const useDefaultTimeZone_1 = require("../../utils/useDefaultTimeZone");
8
8
  function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }) {
9
9
  return function useDatePickerState(props) {
10
- var _a;
10
+ var _a, _b;
11
11
  const { disabled, readOnly } = props;
12
- const [isOpen, setOpen] = react_1.default.useState(false);
13
- const [value, setValue] = (0, uikit_1.useControlledState)(props.value, (_a = props.defaultValue) !== null && _a !== void 0 ? _a : null, props.onUpdate);
12
+ const [isOpen, _setOpen] = (0, uikit_1.useControlledState)(props.open, (_a = props.defaultOpen) !== null && _a !== void 0 ? _a : false, props.onOpenChange);
13
+ const setOpen = _setOpen;
14
+ const [value, setValue] = (0, uikit_1.useControlledState)(props.value, (_b = props.defaultValue) !== null && _b !== void 0 ? _b : null, props.onUpdate);
14
15
  const [selectedDateInner, setSelectedDate] = react_1.default.useState(null);
15
16
  const [selectedTimeInner, setSelectedTime] = react_1.default.useState(null);
16
17
  const inputTimeZone = (0, useDefaultTimeZone_1.useDefaultTimeZone)(getDateTime(props.value) || getDateTime(props.defaultValue) || props.placeholderValue);
@@ -65,7 +66,7 @@ function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setTimezone
65
66
  commitValue(newValue, newValue);
66
67
  }
67
68
  if (shouldClose) {
68
- setOpen(false);
69
+ setOpen(false, 'ValueSelected');
69
70
  }
70
71
  };
71
72
  const selectTime = (newValue) => {
@@ -108,11 +109,11 @@ function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setTimezone
108
109
  timeFormat,
109
110
  timeZone,
110
111
  isOpen,
111
- setOpen(newIsOpen) {
112
+ setOpen(newIsOpen, reason) {
112
113
  if (!newIsOpen && !value && selectedDate && dateFieldState.hasTime) {
113
114
  commitValue(selectedDate, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
114
115
  }
115
- setOpen(newIsOpen);
116
+ setOpen(newIsOpen, reason);
116
117
  },
117
118
  dateFieldState,
118
119
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useDatePickerProps = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const date_utils_1 = require("@gravity-ui/date-utils");
6
7
  const uikit_1 = require("@gravity-ui/uikit");
7
8
  const DateField_1 = require("../../DateField");
8
9
  const getButtonSizeForInput_1 = require("../../utils/getButtonSizeForInput");
@@ -12,13 +13,31 @@ const utils_1 = require("../utils");
12
13
  function useDatePickerProps(state, _a) {
13
14
  var { onFocus, onBlur } = _a, props = tslib_1.__rest(_a, ["onFocus", "onBlur"]);
14
15
  const [isActive, setActive] = react_1.default.useState(false);
16
+ const [focusedDate, setFocusedDate] = react_1.default.useState((0, date_utils_1.isDateTime)(state.dateFieldState.displayValue)
17
+ ? state.dateFieldState.displayValue
18
+ : state.dateFieldState.displayValue.start);
19
+ const [prevDateValue, setPrevDateValue] = react_1.default.useState(state.dateFieldState.displayValue);
20
+ if ((0, date_utils_1.isDateTime)(state.dateFieldState.displayValue)) {
21
+ if (!state.dateFieldState.displayValue.isSame(prevDateValue, 'day')) {
22
+ setPrevDateValue(state.dateFieldState.displayValue);
23
+ setFocusedDate(state.dateFieldState.displayValue);
24
+ }
25
+ }
26
+ else if (!state.dateFieldState.displayValue.start.isSame(prevDateValue.start, 'day')) {
27
+ setPrevDateValue(state.dateFieldState.displayValue);
28
+ setFocusedDate(state.dateFieldState.displayValue.start);
29
+ }
30
+ else if (!state.dateFieldState.displayValue.end.isSame(prevDateValue.end, 'day')) {
31
+ setPrevDateValue(state.dateFieldState.displayValue);
32
+ setFocusedDate(state.dateFieldState.displayValue.end);
33
+ }
15
34
  const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
16
35
  onFocusWithin: onFocus,
17
36
  onBlurWithin: onBlur,
18
37
  onFocusWithinChange(isFocusWithin) {
19
38
  setActive(isFocusWithin);
20
39
  if (!isFocusWithin) {
21
- state.setOpen(false);
40
+ state.setOpen(false, 'FocusOut');
22
41
  }
23
42
  },
24
43
  });
@@ -40,7 +59,7 @@ function useDatePickerProps(state, _a) {
40
59
  if (!onlyTime && e.altKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {
41
60
  e.preventDefault();
42
61
  e.stopPropagation();
43
- state.setOpen(true);
62
+ state.setOpen(true, 'ShortcutKeyDown');
44
63
  }
45
64
  } }),
46
65
  fieldProps: (0, mergeProps_1.mergeProps)(inputProps, state.dateFieldState.isEmpty && !isActive && props.placeholder
@@ -58,25 +77,31 @@ function useDatePickerProps(state, _a) {
58
77
  view: 'flat-secondary',
59
78
  onClick: () => {
60
79
  setActive(true);
61
- state.setOpen(!state.isOpen);
80
+ state.setOpen(!state.isOpen, 'TriggerButtonClick');
62
81
  },
63
82
  },
64
83
  popupProps: {
65
84
  open: state.isOpen,
66
85
  onEscapeKeyDown: () => {
67
- state.setOpen(false);
86
+ state.setOpen(false, 'EscapeKeyDown');
68
87
  focusInput();
69
88
  },
70
89
  onOutsideClick: (e) => {
71
90
  var _a;
72
91
  if (e.target !== calendarButtonRef.current) {
73
- state.setOpen(false);
92
+ state.setOpen(false, 'ClickOutside');
74
93
  }
75
94
  if (e.target && ((_a = groupRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
76
95
  focusInput();
77
96
  }
78
97
  },
79
- focusTrap: true,
98
+ onTransitionExited: () => {
99
+ setFocusedDate((0, date_utils_1.isDateTime)(state.dateFieldState.displayValue)
100
+ ? state.dateFieldState.displayValue
101
+ : state.dateFieldState.displayValue.start);
102
+ },
103
+ focusTrap: !props.disableFocusTrap,
104
+ disablePortal: props.disablePortal,
80
105
  },
81
106
  calendarProps: {
82
107
  ref: calendarRef,
@@ -95,6 +120,8 @@ function useDatePickerProps(state, _a) {
95
120
  maxValue: props.maxValue,
96
121
  isDateUnavailable: props.isDateUnavailable,
97
122
  timeZone: state.timeZone,
123
+ focusedValue: focusedDate,
124
+ onFocusUpdate: setFocusedDate,
98
125
  },
99
126
  timeInputProps: {
100
127
  value: state.timeValue,
@@ -55,7 +55,7 @@ function RelativeRangeDatePicker(props) {
55
55
  }), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
56
56
  const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
57
57
  const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
58
- return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [(0, jsx_runtime_1.jsx)(uikit_1.TextInput, { autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
58
+ return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [(0, jsx_runtime_1.jsx)(uikit_1.TextInput, { id: props.id, autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
59
59
  if (!props.readOnly && !v) {
60
60
  state.setValue(null, 'default');
61
61
  }
@@ -17,3 +17,11 @@ export interface DateFieldBase<T = DateTime> extends ValueBase<T | null>, InputB
17
17
  */
18
18
  timeZone?: string;
19
19
  }
20
+ export interface PopupTriggerProps<Args extends unknown[] = []> {
21
+ /** Whether the popup is open (controlled). */
22
+ open?: boolean;
23
+ /** Whether the popup is open by default (uncontrolled). */
24
+ defaultOpen?: boolean;
25
+ /** Handler that is called when the popup's open state changes. */
26
+ onOpenChange?: (open: boolean, ...args: Args) => void;
27
+ }
@@ -1,9 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { DateTime } from '@gravity-ui/date-utils';
3
3
  import type { CalendarProps } from '../Calendar';
4
- import type { AccessibilityProps, DateFieldBase, DomProps, FocusableProps, InputDOMProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
4
+ import type { AccessibilityProps, DomProps, FocusableProps, InputDOMProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
5
+ import type { DatePickerStateOptions } from './hooks/datePickerStateFactory';
5
6
  import './DatePicker.css';
6
- export interface DatePickerProps<T = DateTime> extends DateFieldBase<T>, TextInputProps, FocusableProps, KeyboardEvents, DomProps, InputDOMProps, StyleProps, AccessibilityProps {
7
+ export interface DatePickerProps<T = DateTime> extends DatePickerStateOptions<T>, TextInputProps, FocusableProps, KeyboardEvents, DomProps, InputDOMProps, StyleProps, AccessibilityProps {
7
8
  children?: (props: CalendarProps<T>) => React.ReactNode;
9
+ disablePortal?: boolean;
10
+ disableFocusTrap?: boolean;
8
11
  }
9
12
  export declare function DatePicker({ className, ...props }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import type { DateTime } from '@gravity-ui/date-utils';
2
2
  import type { DateFieldState } from '../../DateField';
3
- import type { DateFieldBase } from '../../types';
3
+ import type { DateFieldBase, PopupTriggerProps } from '../../types';
4
+ type OpenChangeReason = 'EscapeKeyDown' | 'FocusOut' | 'ClickOutside' | 'ValueSelected' | 'TriggerButtonClick' | 'ShortcutKeyDown';
4
5
  export interface DatePickerState<T = DateTime> {
5
6
  /** The currently selected date. */
6
7
  value: T | null;
@@ -36,7 +37,7 @@ export interface DatePickerState<T = DateTime> {
36
37
  /** Whether the calendar popover is currently open. */
37
38
  isOpen: boolean;
38
39
  /** Sets whether the calendar popover is open. */
39
- setOpen: (isOpen: boolean) => void;
40
+ setOpen: (isOpen: boolean, reason: OpenChangeReason) => void;
40
41
  dateFieldState: DateFieldState<T>;
41
42
  }
42
43
  export interface DatePickerStateFactoryOptions<T, O extends DateFieldBase<T>> {
@@ -46,4 +47,7 @@ export interface DatePickerStateFactoryOptions<T, O extends DateFieldBase<T>> {
46
47
  getDateTime: (date: T | null | undefined) => DateTime | undefined;
47
48
  useDateFieldState: (props: O) => DateFieldState<T>;
48
49
  }
49
- export declare function datePickerStateFactory<T, O extends DateFieldBase<T>>({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }: DatePickerStateFactoryOptions<T, O>): (props: O) => DatePickerState<T>;
50
+ export interface DatePickerStateOptions<T> extends DateFieldBase<T>, PopupTriggerProps<[OpenChangeReason]> {
51
+ }
52
+ export declare function datePickerStateFactory<T, O extends DatePickerStateOptions<T>>({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }: DatePickerStateFactoryOptions<T, O>): (props: O) => DatePickerState<T>;
53
+ export {};
@@ -3,10 +3,11 @@ import { useControlledState } from '@gravity-ui/uikit';
3
3
  import { useDefaultTimeZone } from '../../utils/useDefaultTimeZone';
4
4
  export function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setTimezone, getDateTime, useDateFieldState, }) {
5
5
  return function useDatePickerState(props) {
6
- var _a;
6
+ var _a, _b;
7
7
  const { disabled, readOnly } = props;
8
- const [isOpen, setOpen] = React.useState(false);
9
- const [value, setValue] = useControlledState(props.value, (_a = props.defaultValue) !== null && _a !== void 0 ? _a : null, props.onUpdate);
8
+ const [isOpen, _setOpen] = useControlledState(props.open, (_a = props.defaultOpen) !== null && _a !== void 0 ? _a : false, props.onOpenChange);
9
+ const setOpen = _setOpen;
10
+ const [value, setValue] = useControlledState(props.value, (_b = props.defaultValue) !== null && _b !== void 0 ? _b : null, props.onUpdate);
10
11
  const [selectedDateInner, setSelectedDate] = React.useState(null);
11
12
  const [selectedTimeInner, setSelectedTime] = React.useState(null);
12
13
  const inputTimeZone = useDefaultTimeZone(getDateTime(props.value) || getDateTime(props.defaultValue) || props.placeholderValue);
@@ -61,7 +62,7 @@ export function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setT
61
62
  commitValue(newValue, newValue);
62
63
  }
63
64
  if (shouldClose) {
64
- setOpen(false);
65
+ setOpen(false, 'ValueSelected');
65
66
  }
66
67
  };
67
68
  const selectTime = (newValue) => {
@@ -104,11 +105,11 @@ export function datePickerStateFactory({ getPlaceholderTime, mergeDateTime, setT
104
105
  timeFormat,
105
106
  timeZone,
106
107
  isOpen,
107
- setOpen(newIsOpen) {
108
+ setOpen(newIsOpen, reason) {
108
109
  if (!newIsOpen && !value && selectedDate && dateFieldState.hasTime) {
109
110
  commitValue(selectedDate, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
110
111
  }
111
- setOpen(newIsOpen);
112
+ setOpen(newIsOpen, reason);
112
113
  },
113
114
  dateFieldState,
114
115
  };
@@ -1,5 +1,6 @@
1
1
  import { __rest } from "tslib";
2
2
  import React from 'react';
3
+ import { isDateTime } from '@gravity-ui/date-utils';
3
4
  import { useFocusWithin, useForkRef } from '@gravity-ui/uikit';
4
5
  import { useDateFieldProps } from '../../DateField';
5
6
  import { getButtonSizeForInput } from '../../utils/getButtonSizeForInput';
@@ -9,13 +10,31 @@ import { getDateTimeValue } from '../utils';
9
10
  export function useDatePickerProps(state, _a) {
10
11
  var { onFocus, onBlur } = _a, props = __rest(_a, ["onFocus", "onBlur"]);
11
12
  const [isActive, setActive] = React.useState(false);
13
+ const [focusedDate, setFocusedDate] = React.useState(isDateTime(state.dateFieldState.displayValue)
14
+ ? state.dateFieldState.displayValue
15
+ : state.dateFieldState.displayValue.start);
16
+ const [prevDateValue, setPrevDateValue] = React.useState(state.dateFieldState.displayValue);
17
+ if (isDateTime(state.dateFieldState.displayValue)) {
18
+ if (!state.dateFieldState.displayValue.isSame(prevDateValue, 'day')) {
19
+ setPrevDateValue(state.dateFieldState.displayValue);
20
+ setFocusedDate(state.dateFieldState.displayValue);
21
+ }
22
+ }
23
+ else if (!state.dateFieldState.displayValue.start.isSame(prevDateValue.start, 'day')) {
24
+ setPrevDateValue(state.dateFieldState.displayValue);
25
+ setFocusedDate(state.dateFieldState.displayValue.start);
26
+ }
27
+ else if (!state.dateFieldState.displayValue.end.isSame(prevDateValue.end, 'day')) {
28
+ setPrevDateValue(state.dateFieldState.displayValue);
29
+ setFocusedDate(state.dateFieldState.displayValue.end);
30
+ }
12
31
  const { focusWithinProps } = useFocusWithin({
13
32
  onFocusWithin: onFocus,
14
33
  onBlurWithin: onBlur,
15
34
  onFocusWithinChange(isFocusWithin) {
16
35
  setActive(isFocusWithin);
17
36
  if (!isFocusWithin) {
18
- state.setOpen(false);
37
+ state.setOpen(false, 'FocusOut');
19
38
  }
20
39
  },
21
40
  });
@@ -37,7 +56,7 @@ export function useDatePickerProps(state, _a) {
37
56
  if (!onlyTime && e.altKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {
38
57
  e.preventDefault();
39
58
  e.stopPropagation();
40
- state.setOpen(true);
59
+ state.setOpen(true, 'ShortcutKeyDown');
41
60
  }
42
61
  } }),
43
62
  fieldProps: mergeProps(inputProps, state.dateFieldState.isEmpty && !isActive && props.placeholder
@@ -55,25 +74,31 @@ export function useDatePickerProps(state, _a) {
55
74
  view: 'flat-secondary',
56
75
  onClick: () => {
57
76
  setActive(true);
58
- state.setOpen(!state.isOpen);
77
+ state.setOpen(!state.isOpen, 'TriggerButtonClick');
59
78
  },
60
79
  },
61
80
  popupProps: {
62
81
  open: state.isOpen,
63
82
  onEscapeKeyDown: () => {
64
- state.setOpen(false);
83
+ state.setOpen(false, 'EscapeKeyDown');
65
84
  focusInput();
66
85
  },
67
86
  onOutsideClick: (e) => {
68
87
  var _a;
69
88
  if (e.target !== calendarButtonRef.current) {
70
- state.setOpen(false);
89
+ state.setOpen(false, 'ClickOutside');
71
90
  }
72
91
  if (e.target && ((_a = groupRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target))) {
73
92
  focusInput();
74
93
  }
75
94
  },
76
- focusTrap: true,
95
+ onTransitionExited: () => {
96
+ setFocusedDate(isDateTime(state.dateFieldState.displayValue)
97
+ ? state.dateFieldState.displayValue
98
+ : state.dateFieldState.displayValue.start);
99
+ },
100
+ focusTrap: !props.disableFocusTrap,
101
+ disablePortal: props.disablePortal,
77
102
  },
78
103
  calendarProps: {
79
104
  ref: calendarRef,
@@ -92,6 +117,8 @@ export function useDatePickerProps(state, _a) {
92
117
  maxValue: props.maxValue,
93
118
  isDateUnavailable: props.isDateUnavailable,
94
119
  timeZone: state.timeZone,
120
+ focusedValue: focusedDate,
121
+ onFocusUpdate: setFocusedDate,
95
122
  },
96
123
  timeInputProps: {
97
124
  value: state.timeValue,
@@ -51,7 +51,7 @@ export function RelativeRangeDatePicker(props) {
51
51
  }), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
52
52
  const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
53
53
  const errorMessage = (_a = props.errorMessage) !== null && _a !== void 0 ? _a : state.errors.join('\n');
54
- return (_jsxs("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [_jsx(TextInput, { autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
54
+ return (_jsxs("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [_jsx(TextInput, { id: props.id, autoFocus: props.autoFocus, controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
55
55
  if (!props.readOnly && !v) {
56
56
  state.setValue(null, 'default');
57
57
  }
@@ -17,3 +17,11 @@ export interface DateFieldBase<T = DateTime> extends ValueBase<T | null>, InputB
17
17
  */
18
18
  timeZone?: string;
19
19
  }
20
+ export interface PopupTriggerProps<Args extends unknown[] = []> {
21
+ /** Whether the popup is open (controlled). */
22
+ open?: boolean;
23
+ /** Whether the popup is open by default (uncontrolled). */
24
+ defaultOpen?: boolean;
25
+ /** Handler that is called when the popup's open state changes. */
26
+ onOpenChange?: (open: boolean, ...args: Args) => void;
27
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/date-components",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/cjs/index.js",
@@ -61,17 +61,18 @@
61
61
  "@gravity-ui/stylelint-config": "^4.0.1",
62
62
  "@gravity-ui/tsconfig": "^1.0.0",
63
63
  "@gravity-ui/uikit": "^6.15.0",
64
- "@storybook/addon-a11y": "^8.1.3",
65
- "@storybook/addon-essentials": "^8.1.3",
66
- "@storybook/addon-viewport": "^8.1.3",
64
+ "@storybook/addon-a11y": "^8.1.10",
65
+ "@storybook/addon-essentials": "^8.1.10",
66
+ "@storybook/addon-storysource": "8.1.10",
67
+ "@storybook/addon-viewport": "^8.1.10",
67
68
  "@storybook/addon-webpack5-compiler-babel": "^3.0.3",
68
- "@storybook/blocks": "^8.1.3",
69
- "@storybook/manager-api": "^8.1.3",
69
+ "@storybook/blocks": "^8.1.10",
70
+ "@storybook/manager-api": "^8.1.10",
70
71
  "@storybook/preset-scss": "^1.0.3",
71
- "@storybook/react": "^8.1.3",
72
- "@storybook/react-webpack5": "^8.1.3",
73
- "@storybook/theming": "^8.1.3",
74
- "@storybook/types": "^8.1.3",
72
+ "@storybook/react": "^8.1.10",
73
+ "@storybook/react-webpack5": "^8.1.10",
74
+ "@storybook/theming": "^8.1.10",
75
+ "@storybook/types": "^8.1.10",
75
76
  "@testing-library/dom": "^10.1.0",
76
77
  "@testing-library/jest-dom": "^6.4.6",
77
78
  "@testing-library/react": "^16.0.0",
@@ -98,7 +99,7 @@
98
99
  "react-dom": "^18.3.1",
99
100
  "rimraf": "^5.0.7",
100
101
  "sass": "^1.77.1",
101
- "storybook": "^8.1.3",
102
+ "storybook": "^8.1.10",
102
103
  "stylelint": "^15.11.0",
103
104
  "stylelint-use-logical": "^2.1.2",
104
105
  "ts-jest": "^29.1.5",