@gravity-ui/date-components 1.0.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/cjs/components/Calendar/Calendar.css +220 -0
  4. package/dist/cjs/components/Calendar/Calendar.d.ts +13 -0
  5. package/dist/cjs/components/Calendar/Calendar.js +15 -0
  6. package/dist/cjs/components/Calendar/CalendarBase.d.ts +18 -0
  7. package/dist/cjs/components/Calendar/CalendarBase.js +89 -0
  8. package/dist/cjs/components/Calendar/RangeCalendar.d.ts +13 -0
  9. package/dist/cjs/components/Calendar/RangeCalendar.js +22 -0
  10. package/dist/cjs/components/Calendar/hooks/types.d.ts +124 -0
  11. package/dist/cjs/components/Calendar/hooks/types.js +2 -0
  12. package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
  13. package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.js +98 -0
  14. package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
  15. package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.js +57 -0
  16. package/dist/cjs/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
  17. package/dist/cjs/components/Calendar/hooks/useCalendarProps.js +110 -0
  18. package/dist/cjs/components/Calendar/hooks/useCalendarState.d.ts +7 -0
  19. package/dist/cjs/components/Calendar/hooks/useCalendarState.js +178 -0
  20. package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
  21. package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.js +82 -0
  22. package/dist/cjs/components/Calendar/i18n/en.json +4 -0
  23. package/dist/cjs/components/Calendar/i18n/index.d.ts +1 -0
  24. package/dist/cjs/components/Calendar/i18n/index.js +11 -0
  25. package/dist/cjs/components/Calendar/i18n/ru.json +4 -0
  26. package/dist/cjs/components/Calendar/index.d.ts +8 -0
  27. package/dist/cjs/components/Calendar/index.js +23 -0
  28. package/dist/cjs/components/Calendar/utils.d.ts +4 -0
  29. package/dist/cjs/components/Calendar/utils.js +40 -0
  30. package/dist/cjs/components/DateField/DateField.css +4 -0
  31. package/dist/cjs/components/DateField/DateField.d.ts +6 -0
  32. package/dist/cjs/components/DateField/DateField.js +38 -0
  33. package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
  34. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +203 -0
  35. package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +67 -0
  36. package/dist/cjs/components/DateField/hooks/useDateFieldState.js +628 -0
  37. package/dist/cjs/components/DateField/i18n/en.json +10 -0
  38. package/dist/cjs/components/DateField/i18n/index.d.ts +1 -0
  39. package/dist/cjs/components/DateField/i18n/index.js +11 -0
  40. package/dist/cjs/components/DateField/i18n/ru.json +10 -0
  41. package/dist/cjs/components/DateField/index.d.ts +3 -0
  42. package/dist/cjs/components/DateField/index.js +19 -0
  43. package/dist/cjs/components/DateField/types.d.ts +67 -0
  44. package/dist/cjs/components/DateField/types.js +2 -0
  45. package/dist/cjs/components/DateField/utils.d.ts +14 -0
  46. package/dist/cjs/components/DateField/utils.js +276 -0
  47. package/dist/cjs/components/DatePicker/DatePicker.css +19 -0
  48. package/dist/cjs/components/DatePicker/DatePicker.d.ts +5 -0
  49. package/dist/cjs/components/DatePicker/DatePicker.js +66 -0
  50. package/dist/cjs/components/DatePicker/DesktopCalendar.d.ts +15 -0
  51. package/dist/cjs/components/DatePicker/DesktopCalendar.js +56 -0
  52. package/dist/cjs/components/DatePicker/MobileCalendar.css +49 -0
  53. package/dist/cjs/components/DatePicker/MobileCalendar.d.ts +14 -0
  54. package/dist/cjs/components/DatePicker/MobileCalendar.js +78 -0
  55. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
  56. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.js +114 -0
  57. package/dist/cjs/components/DatePicker/i18n/en.json +3 -0
  58. package/dist/cjs/components/DatePicker/i18n/index.d.ts +1 -0
  59. package/dist/cjs/components/DatePicker/i18n/index.js +11 -0
  60. package/dist/cjs/components/DatePicker/i18n/ru.json +3 -0
  61. package/dist/cjs/components/DatePicker/index.d.ts +2 -0
  62. package/dist/cjs/components/DatePicker/index.js +18 -0
  63. package/dist/cjs/components/DatePicker/utils.d.ts +1 -0
  64. package/dist/cjs/components/DatePicker/utils.js +5 -0
  65. package/dist/cjs/components/RelativeDateField/RelativeDateField.css +16 -0
  66. package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +11 -0
  67. package/dist/cjs/components/RelativeDateField/RelativeDateField.js +37 -0
  68. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
  69. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +66 -0
  70. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
  71. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +66 -0
  72. package/dist/cjs/components/RelativeDateField/index.d.ts +3 -0
  73. package/dist/cjs/components/RelativeDateField/index.js +19 -0
  74. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
  75. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
  76. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +32 -0
  77. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
  78. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +175 -0
  79. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
  80. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +109 -0
  81. package/dist/cjs/components/RelativeDatePicker/i18n/en.json +4 -0
  82. package/dist/cjs/components/RelativeDatePicker/i18n/index.d.ts +1 -0
  83. package/dist/cjs/components/RelativeDatePicker/i18n/index.js +11 -0
  84. package/dist/cjs/components/RelativeDatePicker/i18n/ru.json +4 -0
  85. package/dist/cjs/components/RelativeDatePicker/index.d.ts +3 -0
  86. package/dist/cjs/components/RelativeDatePicker/index.js +19 -0
  87. package/dist/cjs/components/hooks/useControlledState.d.ts +1 -0
  88. package/dist/cjs/components/hooks/useControlledState.js +30 -0
  89. package/dist/cjs/components/index.d.ts +5 -0
  90. package/dist/cjs/components/index.js +21 -0
  91. package/dist/cjs/components/types/datePicker.d.ts +16 -0
  92. package/dist/cjs/components/types/datePicker.js +2 -0
  93. package/dist/cjs/components/types/events.d.ts +17 -0
  94. package/dist/cjs/components/types/events.js +2 -0
  95. package/dist/cjs/components/types/index.d.ts +4 -0
  96. package/dist/cjs/components/types/index.js +2 -0
  97. package/dist/cjs/components/types/inputs.d.ts +79 -0
  98. package/dist/cjs/components/types/inputs.js +2 -0
  99. package/dist/cjs/components/types/style.d.ts +7 -0
  100. package/dist/cjs/components/types/style.js +2 -0
  101. package/dist/cjs/components/utils/getButtonSizeForInput.d.ts +2 -0
  102. package/dist/cjs/components/utils/getButtonSizeForInput.js +20 -0
  103. package/dist/cjs/components/utils/mergeProps.d.ts +13 -0
  104. package/dist/cjs/components/utils/mergeProps.js +47 -0
  105. package/dist/cjs/components/variables.css +0 -0
  106. package/dist/cjs/index.d.ts +1 -0
  107. package/dist/cjs/index.js +17 -0
  108. package/dist/cjs/utils/cn.d.ts +2 -0
  109. package/dist/cjs/utils/cn.js +6 -0
  110. package/dist/esm/components/Calendar/Calendar.css +220 -0
  111. package/dist/esm/components/Calendar/Calendar.d.ts +13 -0
  112. package/dist/esm/components/Calendar/Calendar.js +9 -0
  113. package/dist/esm/components/Calendar/CalendarBase.d.ts +18 -0
  114. package/dist/esm/components/Calendar/CalendarBase.js +83 -0
  115. package/dist/esm/components/Calendar/RangeCalendar.d.ts +13 -0
  116. package/dist/esm/components/Calendar/RangeCalendar.js +16 -0
  117. package/dist/esm/components/Calendar/hooks/types.d.ts +124 -0
  118. package/dist/esm/components/Calendar/hooks/types.js +1 -0
  119. package/dist/esm/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
  120. package/dist/esm/components/Calendar/hooks/useCalendarCellProps.js +91 -0
  121. package/dist/esm/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
  122. package/dist/esm/components/Calendar/hooks/useCalendarGridProps.js +54 -0
  123. package/dist/esm/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
  124. package/dist/esm/components/Calendar/hooks/useCalendarProps.js +103 -0
  125. package/dist/esm/components/Calendar/hooks/useCalendarState.d.ts +7 -0
  126. package/dist/esm/components/Calendar/hooks/useCalendarState.js +171 -0
  127. package/dist/esm/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
  128. package/dist/esm/components/Calendar/hooks/useRangeCalendarState.js +75 -0
  129. package/dist/esm/components/Calendar/i18n/en.json +4 -0
  130. package/dist/esm/components/Calendar/i18n/index.d.ts +1 -0
  131. package/dist/esm/components/Calendar/i18n/index.js +5 -0
  132. package/dist/esm/components/Calendar/i18n/ru.json +4 -0
  133. package/dist/esm/components/Calendar/index.d.ts +8 -0
  134. package/dist/esm/components/Calendar/index.js +7 -0
  135. package/dist/esm/components/Calendar/utils.d.ts +4 -0
  136. package/dist/esm/components/Calendar/utils.js +34 -0
  137. package/dist/esm/components/DateField/DateField.css +4 -0
  138. package/dist/esm/components/DateField/DateField.d.ts +6 -0
  139. package/dist/esm/components/DateField/DateField.js +31 -0
  140. package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
  141. package/dist/esm/components/DateField/hooks/useDateFieldProps.js +196 -0
  142. package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +67 -0
  143. package/dist/esm/components/DateField/hooks/useDateFieldState.js +621 -0
  144. package/dist/esm/components/DateField/i18n/en.json +10 -0
  145. package/dist/esm/components/DateField/i18n/index.d.ts +1 -0
  146. package/dist/esm/components/DateField/i18n/index.js +5 -0
  147. package/dist/esm/components/DateField/i18n/ru.json +10 -0
  148. package/dist/esm/components/DateField/index.d.ts +3 -0
  149. package/dist/esm/components/DateField/index.js +3 -0
  150. package/dist/esm/components/DateField/types.d.ts +67 -0
  151. package/dist/esm/components/DateField/types.js +1 -0
  152. package/dist/esm/components/DateField/utils.d.ts +14 -0
  153. package/dist/esm/components/DateField/utils.js +268 -0
  154. package/dist/esm/components/DatePicker/DatePicker.css +19 -0
  155. package/dist/esm/components/DatePicker/DatePicker.d.ts +5 -0
  156. package/dist/esm/components/DatePicker/DatePicker.js +59 -0
  157. package/dist/esm/components/DatePicker/DesktopCalendar.d.ts +15 -0
  158. package/dist/esm/components/DatePicker/DesktopCalendar.js +48 -0
  159. package/dist/esm/components/DatePicker/MobileCalendar.css +49 -0
  160. package/dist/esm/components/DatePicker/MobileCalendar.d.ts +14 -0
  161. package/dist/esm/components/DatePicker/MobileCalendar.js +73 -0
  162. package/dist/esm/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
  163. package/dist/esm/components/DatePicker/hooks/useDatePickerState.js +107 -0
  164. package/dist/esm/components/DatePicker/i18n/en.json +3 -0
  165. package/dist/esm/components/DatePicker/i18n/index.d.ts +1 -0
  166. package/dist/esm/components/DatePicker/i18n/index.js +5 -0
  167. package/dist/esm/components/DatePicker/i18n/ru.json +3 -0
  168. package/dist/esm/components/DatePicker/index.d.ts +2 -0
  169. package/dist/esm/components/DatePicker/index.js +2 -0
  170. package/dist/esm/components/DatePicker/utils.d.ts +1 -0
  171. package/dist/esm/components/DatePicker/utils.js +2 -0
  172. package/dist/esm/components/RelativeDateField/RelativeDateField.css +16 -0
  173. package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +11 -0
  174. package/dist/esm/components/RelativeDateField/RelativeDateField.js +30 -0
  175. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
  176. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +59 -0
  177. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
  178. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +59 -0
  179. package/dist/esm/components/RelativeDateField/index.d.ts +3 -0
  180. package/dist/esm/components/RelativeDateField/index.js +3 -0
  181. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
  182. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
  183. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +25 -0
  184. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
  185. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +168 -0
  186. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
  187. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +102 -0
  188. package/dist/esm/components/RelativeDatePicker/i18n/en.json +4 -0
  189. package/dist/esm/components/RelativeDatePicker/i18n/index.d.ts +1 -0
  190. package/dist/esm/components/RelativeDatePicker/i18n/index.js +5 -0
  191. package/dist/esm/components/RelativeDatePicker/i18n/ru.json +4 -0
  192. package/dist/esm/components/RelativeDatePicker/index.d.ts +3 -0
  193. package/dist/esm/components/RelativeDatePicker/index.js +3 -0
  194. package/dist/esm/components/hooks/useControlledState.d.ts +1 -0
  195. package/dist/esm/components/hooks/useControlledState.js +23 -0
  196. package/dist/esm/components/index.d.ts +5 -0
  197. package/dist/esm/components/index.js +5 -0
  198. package/dist/esm/components/types/datePicker.d.ts +16 -0
  199. package/dist/esm/components/types/datePicker.js +1 -0
  200. package/dist/esm/components/types/events.d.ts +17 -0
  201. package/dist/esm/components/types/events.js +1 -0
  202. package/dist/esm/components/types/index.d.ts +4 -0
  203. package/dist/esm/components/types/index.js +1 -0
  204. package/dist/esm/components/types/inputs.d.ts +79 -0
  205. package/dist/esm/components/types/inputs.js +1 -0
  206. package/dist/esm/components/types/style.d.ts +7 -0
  207. package/dist/esm/components/types/style.js +1 -0
  208. package/dist/esm/components/utils/getButtonSizeForInput.d.ts +2 -0
  209. package/dist/esm/components/utils/getButtonSizeForInput.js +16 -0
  210. package/dist/esm/components/utils/mergeProps.d.ts +13 -0
  211. package/dist/esm/components/utils/mergeProps.js +43 -0
  212. package/dist/esm/components/variables.css +0 -0
  213. package/dist/esm/index.d.ts +1 -0
  214. package/dist/esm/index.js +1 -0
  215. package/dist/esm/utils/cn.d.ts +2 -0
  216. package/dist/esm/utils/cn.js +3 -0
  217. package/package.json +119 -0
@@ -0,0 +1,4 @@
1
+ .g-date-date-field {
2
+ display: inline-block;
3
+ width: auto;
4
+ }
@@ -0,0 +1,6 @@
1
+ import type { AccessibilityProps, DomProps, FocusableProps, KeyboardEvents, StyleProps, TextInputExtendProps, TextInputProps } from '../types';
2
+ import type { DateFieldStateOptions } from './hooks/useDateFieldState';
3
+ import './DateField.css';
4
+ export interface DateFieldProps extends DateFieldStateOptions, TextInputProps, TextInputExtendProps, DomProps, FocusableProps, KeyboardEvents, StyleProps, AccessibilityProps {
5
+ }
6
+ export declare function DateField({ className, ...props }: DateFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DateField = void 0;
18
+ const jsx_runtime_1 = require("react/jsx-runtime");
19
+ const react_1 = __importDefault(require("react"));
20
+ const uikit_1 = require("@gravity-ui/uikit");
21
+ const cn_1 = require("../../utils/cn");
22
+ const useDateFieldProps_1 = require("./hooks/useDateFieldProps");
23
+ const useDateFieldState_1 = require("./hooks/useDateFieldState");
24
+ require("./DateField.css");
25
+ const b = (0, cn_1.block)('date-field');
26
+ function DateField(_a) {
27
+ var { className } = _a, props = __rest(_a, ["className"]);
28
+ const state = (0, useDateFieldState_1.useDateFieldState)(props);
29
+ const { inputProps } = (0, useDateFieldProps_1.useDateFieldProps)(state, props);
30
+ const [isActive, setActive] = react_1.default.useState(false);
31
+ const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
32
+ onFocusWithinChange(isFocusWithin) {
33
+ setActive(isFocusWithin);
34
+ },
35
+ });
36
+ return ((0, jsx_runtime_1.jsx)("div", Object.assign({ className: b(null, className), style: props.style }, focusWithinProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, inputProps, { value: state.isEmpty && !isActive && props.placeholder ? '' : inputProps.value })) })));
37
+ }
38
+ exports.DateField = DateField;
@@ -0,0 +1,6 @@
1
+ import type { TextInputProps } from '@gravity-ui/uikit';
2
+ import type { DateFieldProps } from '../DateField';
3
+ import type { DateFieldState } from './useDateFieldState';
4
+ export declare function useDateFieldProps(state: DateFieldState, props: DateFieldProps): {
5
+ inputProps: TextInputProps;
6
+ };
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useDateFieldProps = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const utils_1 = require("../utils");
9
+ function useDateFieldProps(state, props) {
10
+ const inputRef = react_1.default.useRef(null);
11
+ const [, setInnerState] = react_1.default.useState({});
12
+ function setSelectedSections(section) {
13
+ state.setSelectedSections(section);
14
+ setInnerState({});
15
+ }
16
+ react_1.default.useLayoutEffect(() => {
17
+ const inputElement = inputRef.current;
18
+ if (!inputElement) {
19
+ return;
20
+ }
21
+ if (state.selectedSectionIndexes === null) {
22
+ if (inputElement.scrollLeft) {
23
+ // Ensure that input content is not marked as selected.
24
+ // setting selection range to 0 causes issues in Safari.
25
+ // https://bugs.webkit.org/show_bug.cgi?id=224425
26
+ inputElement.scrollLeft = 0;
27
+ }
28
+ return;
29
+ }
30
+ const firstSelectedSection = state.sections[state.selectedSectionIndexes.startIndex];
31
+ const lastSelectedSection = state.sections[state.selectedSectionIndexes.endIndex];
32
+ const selectionStart = firstSelectedSection.start;
33
+ const selectionEnd = lastSelectedSection.end;
34
+ if (selectionStart !== inputElement.selectionStart ||
35
+ selectionEnd !== inputElement.selectionEnd) {
36
+ inputElement.setSelectionRange(selectionStart, selectionEnd);
37
+ }
38
+ });
39
+ function syncSelectionFromDOM() {
40
+ var _a, _b;
41
+ if (state.readOnly) {
42
+ setSelectedSections(-1);
43
+ return;
44
+ }
45
+ state.focusSectionInPosition((_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.selectionStart) !== null && _b !== void 0 ? _b : 0);
46
+ setInnerState({});
47
+ }
48
+ const inputMode = react_1.default.useMemo(() => {
49
+ if (!state.selectedSectionIndexes) {
50
+ return 'text';
51
+ }
52
+ const activeSection = state.sections[state.selectedSectionIndexes.startIndex];
53
+ if (!activeSection || activeSection.contentType === 'letter') {
54
+ return 'text';
55
+ }
56
+ return 'tel';
57
+ }, [state.selectedSectionIndexes, state.sections]);
58
+ return {
59
+ inputProps: {
60
+ value: state.text,
61
+ view: props.view,
62
+ size: props.size,
63
+ disabled: state.disabled,
64
+ hasClear: !state.readOnly && !state.isEmpty && props.hasClear,
65
+ placeholder: props.placeholder,
66
+ id: props.id,
67
+ label: props.label,
68
+ leftContent: props.leftContent,
69
+ rightContent: props.rightContent,
70
+ pin: props.pin,
71
+ autoFocus: props.autoFocus,
72
+ controlRef: inputRef,
73
+ autoComplete: 'off',
74
+ type: 'text',
75
+ // @ts-expect-error
76
+ error: (state.validationState === 'invalid' && props.errorMessage) ||
77
+ state.validationState === 'invalid',
78
+ onUpdate(value) {
79
+ if (!value) {
80
+ state.clearAll();
81
+ }
82
+ },
83
+ onFocus(e) {
84
+ var _a;
85
+ (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
86
+ if (state.selectedSectionIndexes !== null) {
87
+ return;
88
+ }
89
+ const input = inputRef.current;
90
+ setTimeout(() => {
91
+ if (!input || input !== inputRef.current) {
92
+ return;
93
+ }
94
+ if (
95
+ // avoid selecting all sections when focusing empty field without value
96
+ input.value.length &&
97
+ Number(input.selectionEnd) - Number(input.selectionStart) ===
98
+ input.value.length) {
99
+ setSelectedSections('all');
100
+ }
101
+ else {
102
+ syncSelectionFromDOM();
103
+ }
104
+ });
105
+ },
106
+ onBlur(e) {
107
+ var _a;
108
+ (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
109
+ setSelectedSections(-1);
110
+ },
111
+ onKeyDown(e) {
112
+ var _a;
113
+ (_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
114
+ if (e.key === 'ArrowLeft') {
115
+ e.preventDefault();
116
+ state.focusPreviousSection();
117
+ }
118
+ else if (e.key === 'ArrowRight') {
119
+ e.preventDefault();
120
+ state.focusNextSection();
121
+ }
122
+ else if (e.key === 'Home') {
123
+ e.preventDefault();
124
+ state.focusFirstSection();
125
+ }
126
+ else if (e.key === 'End') {
127
+ e.preventDefault();
128
+ state.focusLastSection();
129
+ }
130
+ else if (e.key === 'ArrowUp' && !e.altKey) {
131
+ e.preventDefault();
132
+ state.increment();
133
+ }
134
+ else if (e.key === 'ArrowDown' && !e.altKey) {
135
+ e.preventDefault();
136
+ state.decrement();
137
+ }
138
+ else if (e.key === 'PageUp') {
139
+ e.preventDefault();
140
+ state.incrementPage();
141
+ }
142
+ else if (e.key === 'PageDown') {
143
+ e.preventDefault();
144
+ state.decrementPage();
145
+ }
146
+ else if (e.key === 'Backspace' || e.key === 'Delete') {
147
+ e.preventDefault();
148
+ state.clearSection();
149
+ }
150
+ else if (e.key === 'a' && e[utils_1.CtrlCmd]) {
151
+ e.preventDefault();
152
+ setSelectedSections('all');
153
+ }
154
+ },
155
+ onKeyUp: props.onKeyUp,
156
+ controlProps: {
157
+ 'aria-label': props['aria-label'] || undefined,
158
+ 'aria-labelledby': props['aria-labelledby'] || undefined,
159
+ 'aria-describedby': props['aria-describedby'] || undefined,
160
+ 'aria-details': props['aria-details'] || undefined,
161
+ 'aria-disabled': state.disabled || undefined,
162
+ inputMode,
163
+ onClick() {
164
+ syncSelectionFromDOM();
165
+ },
166
+ onMouseUp(e) {
167
+ e.preventDefault();
168
+ },
169
+ onBeforeInput(e) {
170
+ e.preventDefault();
171
+ // @ts-expect-error
172
+ const key = e.nativeEvent.data;
173
+ // eslint-disable-next-line no-eq-null, eqeqeq
174
+ if (key != null) {
175
+ state.onInput(key);
176
+ }
177
+ },
178
+ onPaste(e) {
179
+ if (state.readOnly) {
180
+ e.preventDefault();
181
+ return;
182
+ }
183
+ const pastedValue = e.clipboardData.getData('text');
184
+ if (state.setValueFromString(pastedValue)) {
185
+ e.preventDefault();
186
+ }
187
+ else if (state.selectedSectionIndexes &&
188
+ state.selectedSectionIndexes.startIndex ===
189
+ state.selectedSectionIndexes.endIndex) {
190
+ const activeSection = state.sections[state.selectedSectionIndexes.startIndex];
191
+ const isValidValue = Boolean(activeSection) &&
192
+ ((activeSection.contentType === 'digit' && /^\d+$/.test(pastedValue)) ||
193
+ activeSection.contentType === 'letter');
194
+ if (!isValidValue) {
195
+ e.preventDefault();
196
+ }
197
+ }
198
+ },
199
+ },
200
+ },
201
+ };
202
+ }
203
+ exports.useDateFieldProps = useDateFieldProps;
@@ -0,0 +1,67 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { DateFieldBase } from '../../types/datePicker';
3
+ import type { ValidationState } from '../../types/inputs';
4
+ import type { DateFieldSection } from '../types';
5
+ export interface DateFieldStateOptions extends DateFieldBase {
6
+ }
7
+ export type DateFieldState = {
8
+ /** The current field value. */
9
+ value: DateTime | null;
10
+ /** Is no part of value is filled. */
11
+ isEmpty: boolean;
12
+ /** The current used value. value or placeholderValue */
13
+ displayValue: DateTime;
14
+ /** Sets the field's value. */
15
+ setValue: (value: DateTime) => void;
16
+ /** Formatted value */
17
+ text: string;
18
+ /** Whether the field is read only. */
19
+ readOnly?: boolean;
20
+ /** Whether the field is disabled. */
21
+ disabled?: boolean;
22
+ /** A list of segments for the current value. */
23
+ sections: DateFieldSection[];
24
+ /** Selected sections */
25
+ selectedSectionIndexes: {
26
+ startIndex: number;
27
+ endIndex: number;
28
+ } | null;
29
+ /** The current validation state of the date field, based on the `validationState`, `minValue`, and `maxValue` props. */
30
+ validationState?: ValidationState;
31
+ /** Sets selection for segment in position. */
32
+ setSelectedSections: (position: number | 'all') => void;
33
+ /** Focuses segment in position */
34
+ focusSectionInPosition: (position: number) => void;
35
+ /** Focuses the next segment if present */
36
+ focusNextSection: () => void;
37
+ /** Focuses the previous segment if present */
38
+ focusPreviousSection: () => void;
39
+ /** Focuses the first segment */
40
+ focusFirstSection: () => void;
41
+ /** Focuses the last segment */
42
+ focusLastSection: () => void;
43
+ /** Increments the currently selected segment. Upon reaching the minimum or maximum value, the value wraps around to the opposite limit. */
44
+ increment: () => void;
45
+ /** Decrements the currently selected segment. Upon reaching the minimum or maximum value, the value wraps around to the opposite limit. */
46
+ decrement: () => void;
47
+ /**
48
+ * Increments the currently selected segment by a larger amount, rounding it to the nearest increment.
49
+ * The amount to increment by depends on the field, for example 15 minutes, 7 days, and 5 years.
50
+ * Upon reaching the minimum or maximum value, the value wraps around to the opposite limit.
51
+ */
52
+ incrementPage: () => void;
53
+ /**
54
+ * Decrements the currently selected segment by a larger amount, rounding it to the nearest decrement.
55
+ * The amount to increment by depends on the field, for example 15 minutes, 7 days, and 5 years.
56
+ * Upon reaching the minimum or maximum value, the value wraps around to the opposite limit.
57
+ */
58
+ decrementPage: () => void;
59
+ /** Clears the value of the currently selected segment, reverting it to the placeholder. */
60
+ clearSection: () => void;
61
+ /** Clears all segments, reverting them to the placeholder. */
62
+ clearAll: () => void;
63
+ /** Handles input key in the currently selected segment */
64
+ onInput: (key: string) => void;
65
+ setValueFromString: (str: string) => boolean;
66
+ };
67
+ export declare function useDateFieldState(props: DateFieldStateOptions): DateFieldState;