@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,36 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { DateFieldState } from '../../DateField';
3
+ import type { DatePickerState } from '../../DatePicker';
4
+ import type { RelativeDateFieldState } from '../../RelativeDateField';
5
+ import type { DateFieldBase } from '../../types';
6
+ export type Value = {
7
+ type: 'absolute';
8
+ value: DateTime;
9
+ } | {
10
+ type: 'relative';
11
+ value: string;
12
+ };
13
+ export type RelativeDatePickerMode = Value['type'];
14
+ export interface RelativeDatePickerStateOptions extends DateFieldBase<Value> {
15
+ }
16
+ export interface RelativeDatePickerState {
17
+ value: Value | null;
18
+ setValue: (value: Value | null) => void;
19
+ mode: RelativeDatePickerMode;
20
+ setMode: (mode: RelativeDatePickerMode) => void;
21
+ datePickerState: DatePickerState;
22
+ dateFieldState: DateFieldState;
23
+ relativeDateState: RelativeDateFieldState;
24
+ selectedDate: DateTime | null;
25
+ /**
26
+ * Whether the field is disabled.
27
+ */
28
+ disabled?: boolean;
29
+ /**
30
+ * Whether the value is immutable.
31
+ */
32
+ readOnly?: boolean;
33
+ isActive: boolean;
34
+ setActive: (isActive: boolean) => void;
35
+ }
36
+ export declare function useRelativeDatePickerState(props: RelativeDatePickerStateOptions): RelativeDatePickerState;
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import { useDateFieldState } from '../../DateField';
3
+ import { useDatePickerState } from '../../DatePicker';
4
+ import { useRelativeDateFieldState } from '../../RelativeDateField';
5
+ import { useControlledState } from '../../hooks/useControlledState';
6
+ export function useRelativeDatePickerState(props) {
7
+ const [value, setValue] = useControlledState(props.value, props.defaultValue, props.onUpdate);
8
+ const [mode, setMode] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? 'relative' : 'absolute');
9
+ const [prevValue, setPrevValue] = React.useState(value);
10
+ if (value !== prevValue) {
11
+ setPrevValue(value);
12
+ if (value) {
13
+ setMode(value.type);
14
+ }
15
+ }
16
+ const [valueDate, setValueDate] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'absolute' ? value.value : null);
17
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && value.value !== valueDate) {
18
+ setValueDate(value.value);
19
+ }
20
+ const datePickerState = useDatePickerState({
21
+ value: valueDate,
22
+ onUpdate: (date) => {
23
+ setValueDate(date);
24
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && (date === null || date === void 0 ? void 0 : date.isSame(value.value))) {
25
+ return;
26
+ }
27
+ setValue(date ? { type: 'absolute', value: date } : null);
28
+ },
29
+ format: props.format,
30
+ placeholderValue: props.placeholderValue,
31
+ timeZone: props.timeZone,
32
+ disabled: props.disabled,
33
+ readOnly: props.readOnly,
34
+ });
35
+ const dateFieldState = useDateFieldState({
36
+ value: valueDate,
37
+ onUpdate: datePickerState.setValue,
38
+ format: props.format,
39
+ placeholderValue: props.placeholderValue,
40
+ timeZone: props.timeZone,
41
+ disabled: props.disabled,
42
+ readOnly: props.readOnly,
43
+ });
44
+ const [valueRelative, setValueRelative] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? value.value : null);
45
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && value.value !== valueRelative) {
46
+ setValueRelative(value.value);
47
+ }
48
+ const relativeDateState = useRelativeDateFieldState({
49
+ value: valueRelative,
50
+ onUpdate: (v) => {
51
+ setValueRelative(v);
52
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && v === value.value) {
53
+ return;
54
+ }
55
+ setValue(v ? { type: 'relative', value: v } : null);
56
+ },
57
+ disabled: props.disabled,
58
+ readOnly: props.readOnly,
59
+ });
60
+ if (!value) {
61
+ if (mode === 'absolute' && valueDate) {
62
+ setValueDate(null);
63
+ }
64
+ else if (mode === 'relative' && valueRelative) {
65
+ setValueRelative(null);
66
+ }
67
+ }
68
+ const selectedDate = mode === 'relative' ? relativeDateState.parsedDate : datePickerState.dateValue;
69
+ const [isActive, setActive] = React.useState(false);
70
+ return {
71
+ value: value !== null && value !== void 0 ? value : null,
72
+ setValue(v) {
73
+ if (props.readOnly || props.disabled) {
74
+ return;
75
+ }
76
+ setValue(v);
77
+ },
78
+ disabled: props.disabled,
79
+ readOnly: props.readOnly,
80
+ mode,
81
+ setMode(newMode) {
82
+ if (props.readOnly || props.disabled || newMode === mode) {
83
+ return;
84
+ }
85
+ setMode(newMode);
86
+ if (newMode === 'relative') {
87
+ if ((!value && valueRelative) || value) {
88
+ setValue(valueRelative ? { type: 'relative', value: valueRelative } : null);
89
+ }
90
+ }
91
+ else if ((!value && valueDate) || value) {
92
+ setValue(valueDate ? { type: 'absolute', value: valueDate } : null);
93
+ }
94
+ },
95
+ datePickerState,
96
+ dateFieldState,
97
+ relativeDateState,
98
+ selectedDate,
99
+ isActive,
100
+ setActive,
101
+ };
102
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "Calendar": "Calendar",
3
+ "Formula input mode": "Formula input mode"
4
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "Calendar" | "Formula input mode", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,5 @@
1
+ import { addComponentKeysets } from '@gravity-ui/uikit/i18n';
2
+ import { NAMESPACE } from '../../../utils/cn';
3
+ import en from './en.json';
4
+ import ru from './ru.json';
5
+ export const i18n = addComponentKeysets({ en, ru }, `${NAMESPACE}relative-date-picker`);
@@ -0,0 +1,4 @@
1
+ {
2
+ "Calendar": "Календарь",
3
+ "Formula input mode": "Режим ввода формулы"
4
+ }
@@ -0,0 +1,3 @@
1
+ export * from './RelativeDatePicker';
2
+ export * from './hooks/useRelativeDatePickerState';
3
+ export * from './hooks/useRelativeDatePickerProps';
@@ -0,0 +1,3 @@
1
+ export * from './RelativeDatePicker';
2
+ export * from './hooks/useRelativeDatePickerState';
3
+ export * from './hooks/useRelativeDatePickerProps';
@@ -0,0 +1 @@
1
+ export declare function useControlledState<T, C extends T = T>(value: T, defaultValue: T, onUpdate?: (value: C, ...args: any[]) => void): readonly [T, (newValue: C, ...args: any[]) => void];
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ export function useControlledState(value, defaultValue, onUpdate) {
3
+ const [innerValue, setInnerValue] = React.useState(defaultValue);
4
+ const [wasControlled] = React.useState(value !== undefined);
5
+ const isControlled = value !== undefined;
6
+ if (wasControlled !== isControlled) {
7
+ console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);
8
+ }
9
+ const currentValueRef = React.useRef(isControlled ? value : defaultValue);
10
+ React.useEffect(() => {
11
+ currentValueRef.current = value;
12
+ }, [value]);
13
+ const setState = React.useCallback((newValue, ...args) => {
14
+ if (!Object.is(currentValueRef.current, newValue)) {
15
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(newValue, ...args);
16
+ }
17
+ if (!isControlled) {
18
+ currentValueRef.current = newValue;
19
+ setInnerValue(newValue);
20
+ }
21
+ }, [isControlled, onUpdate]);
22
+ return [isControlled ? value : innerValue, setState];
23
+ }
@@ -0,0 +1,5 @@
1
+ export * from './Calendar';
2
+ export * from './DateField';
3
+ export * from './DatePicker';
4
+ export * from './RelativeDateField';
5
+ export * from './RelativeDatePicker';
@@ -0,0 +1,5 @@
1
+ export * from './Calendar';
2
+ export * from './DateField';
3
+ export * from './DatePicker';
4
+ export * from './RelativeDateField';
5
+ export * from './RelativeDatePicker';
@@ -0,0 +1,16 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { InputBase, Validation, ValueBase } from './inputs';
3
+ export interface DateFieldBase<T = DateTime> extends ValueBase<T, T | null>, InputBase, Validation {
4
+ /** The minimum allowed date that a user may select. */
5
+ minValue?: DateTime;
6
+ /** The maximum allowed date that a user may select. */
7
+ maxValue?: DateTime;
8
+ /** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
9
+ isDateUnavailable?: (date: DateTime) => boolean;
10
+ /** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
11
+ format?: string;
12
+ /** A placeholder date that controls the default values of each segment when the user first interacts with them. Defaults to today's date at midnight. */
13
+ placeholderValue?: DateTime;
14
+ /** */
15
+ timeZone?: string;
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ /// <reference types="react" />
2
+ export interface KeyboardEvents {
3
+ /** Handler that is called when a key is pressed. */
4
+ onKeyDown?: (e: React.KeyboardEvent) => void;
5
+ /** Handler that is called when a key is released. */
6
+ onKeyUp?: (e: React.KeyboardEvent) => void;
7
+ }
8
+ export interface FocusEvents<Target = Element> {
9
+ /** Handler that is called when the element receives focus. */
10
+ onFocus?: (e: React.FocusEvent<Target>) => void;
11
+ /** Handler that is called when the element loses focus. */
12
+ onBlur?: (e: React.FocusEvent<Target>) => void;
13
+ }
14
+ export interface FocusableProps<Target = Element> extends FocusEvents<Target> {
15
+ /** Whether the element should receive focus on render. */
16
+ autoFocus?: boolean;
17
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export type * from './datePicker';
2
+ export type * from './inputs';
3
+ export type * from './style';
4
+ export type * from './events';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ /// <reference types="react" />
2
+ import type { TextInputProps as TextInputBaseProps, TextInputPin, TextInputSize, TextInputView } from '@gravity-ui/uikit';
3
+ export type ValidationState = 'invalid';
4
+ export interface AccessibilityProps {
5
+ /** Defines a string value that labels the current element. */
6
+ 'aria-label'?: string;
7
+ /** Identifies the element (or elements) that labels the current element. */
8
+ 'aria-labelledby'?: string;
9
+ /** Identifies the element (or elements) that describes the object. */
10
+ 'aria-describedby'?: string;
11
+ /** Identifies the element (or elements) that provide a detailed, extended description for the object. */
12
+ 'aria-details'?: string;
13
+ }
14
+ export interface ValueBase<T, C = T> {
15
+ /** The current value (controlled). */
16
+ value?: T | null;
17
+ /** The default value (uncontrolled). */
18
+ defaultValue?: T;
19
+ /** Handler that is called when the value changes. */
20
+ onUpdate?: (value: C) => void;
21
+ }
22
+ export interface Validation {
23
+ /** Whether the input should display its "invalid" visual styling */
24
+ validationState?: ValidationState;
25
+ /** An error message for the field */
26
+ errorMessage?: React.ReactNode;
27
+ }
28
+ export interface DomProps {
29
+ /** The element's unique identifier. */
30
+ id?: string;
31
+ }
32
+ export interface InputBase {
33
+ /**
34
+ * Whether the field is disabled.
35
+ * @default false
36
+ */
37
+ disabled?: boolean;
38
+ /**
39
+ * Whether the calendar value is immutable.
40
+ * @default false
41
+ */
42
+ readOnly?: boolean;
43
+ }
44
+ export interface TextInputProps {
45
+ /** The size of the element */
46
+ size?: TextInputSize;
47
+ /**
48
+ * Corner rounding
49
+ * @default 'round-round'
50
+ */
51
+ pin?: TextInputPin;
52
+ /** Control view */
53
+ view?: TextInputView;
54
+ /** Inner field label */
55
+ label?: TextInputBaseProps['label'];
56
+ /** Text that appears in the field when it has no value set */
57
+ placeholder?: string;
58
+ /**
59
+ * Show clear button
60
+ * @default false
61
+ */
62
+ hasClear?: boolean;
63
+ }
64
+ export interface TextInputExtendProps {
65
+ /**
66
+ * User`s node rendered before label and input
67
+ */
68
+ leftContent?: TextInputBaseProps['leftContent'];
69
+ /**
70
+ * User`s node rendered after input and clear button
71
+ */
72
+ rightContent?: TextInputBaseProps['rightContent'];
73
+ }
74
+ export interface RangeValue<T> {
75
+ /** The start value of the range. */
76
+ start: T;
77
+ /** The end value of the range. */
78
+ end: T;
79
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface StyleProps {
3
+ /** Sets inline style for the element. */
4
+ style?: React.CSSProperties;
5
+ /** Sets the CSS className for the element. */
6
+ className?: string;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { TextInputSize } from '@gravity-ui/uikit';
2
+ export declare function getButtonSizeForInput(size: TextInputSize | undefined): "s" | "m" | "l" | "xs";
@@ -0,0 +1,16 @@
1
+ export function getButtonSizeForInput(size) {
2
+ switch (size) {
3
+ case 'xl': {
4
+ return 'l';
5
+ }
6
+ case 'l': {
7
+ return 'm';
8
+ }
9
+ case 's': {
10
+ return 'xs';
11
+ }
12
+ default: {
13
+ return 's';
14
+ }
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ [key: string]: any;
3
+ }
4
+ type PropsArgs = Props | undefined | null;
5
+ type TupleTypes<T> = {
6
+ [P in keyof T]: T[P];
7
+ } extends {
8
+ [key: number]: infer V;
9
+ } ? NullToObject<V> : never;
10
+ type NullToObject<T> = T extends null | undefined ? {} : T;
11
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
12
+ export declare function mergeProps<T extends PropsArgs[]>(...args: T): UnionToIntersection<TupleTypes<T>>;
13
+ export {};
@@ -0,0 +1,43 @@
1
+ export function mergeProps(...args) {
2
+ const result = Object.assign({}, args[0]);
3
+ for (let i = 1; i < args.length; i++) {
4
+ const props = args[i];
5
+ if (!props) {
6
+ continue;
7
+ }
8
+ for (const key of Object.keys(props)) {
9
+ const left = result[key];
10
+ const right = props[key];
11
+ if (typeof left === 'function' &&
12
+ typeof right === 'function' &&
13
+ key.startsWith('on') &&
14
+ key.charCodeAt(2) >= /* A */ 65 &&
15
+ key.charCodeAt(2) <= /* Z */ 90) {
16
+ result[key] = chain(left, right);
17
+ }
18
+ else if (key === 'className' &&
19
+ typeof left === 'string' &&
20
+ typeof right === 'string') {
21
+ result[key] = left + ' ' + right;
22
+ }
23
+ else if (key === 'controlProps' &&
24
+ typeof left === 'object' &&
25
+ typeof right === 'object') {
26
+ result[key] = mergeProps(left, right);
27
+ }
28
+ else {
29
+ result[key] = right === undefined ? left : right;
30
+ }
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ function chain(...fns) {
36
+ return (...args) => {
37
+ for (const callback of fns) {
38
+ if (typeof callback === 'function') {
39
+ callback(...args);
40
+ }
41
+ }
42
+ };
43
+ }
File without changes
@@ -0,0 +1 @@
1
+ export * from './components';
@@ -0,0 +1 @@
1
+ export * from './components';
@@ -0,0 +1,2 @@
1
+ export declare const NAMESPACE = "g-date-";
2
+ export declare const block: import("@bem-react/classname").ClassNameInitilizer;
@@ -0,0 +1,3 @@
1
+ import { withNaming } from '@bem-react/classname';
2
+ export const NAMESPACE = 'g-date-';
3
+ export const block = withNaming({ n: NAMESPACE, e: '__', m: '_' });
package/package.json ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "@gravity-ui/date-components",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "license": "MIT",
6
+ "main": "dist/cjs/index.js",
7
+ "module": "./dist/esm/index.js",
8
+ "types": "./dist/esm/index.d.ts",
9
+ "exports": {
10
+ "./package.json": "./package.json",
11
+ ".": {
12
+ "types": "./dist/esm/index.d.js",
13
+ "import": "./dist/esm/index.js",
14
+ "default": "./dist/cjs/index.js"
15
+ }
16
+ },
17
+ "sideEffects": [
18
+ "*.css",
19
+ "*.scss"
20
+ ],
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/gravity-ui/date-components.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/gravity-ui/date-components/issues"
30
+ },
31
+ "homepage": "https://github.com/gravity-ui/date-components#readme",
32
+ "scripts": {
33
+ "prepare": "husky install",
34
+ "lint": "run-p lint:*",
35
+ "lint:js": "eslint --ext .js,.jsx,.ts,.tsx .",
36
+ "lint:styles": "stylelint 'src/**/*.scss'",
37
+ "lint:other": "npm run prettier -- --check",
38
+ "prettier": "prettier '**/*.{md,yaml,yml,json}'",
39
+ "typecheck": "tsc --noEmit",
40
+ "test": "jest",
41
+ "clean": "gulp clean",
42
+ "build": "gulp",
43
+ "start": "storybook dev",
44
+ "build-storybook": "storybook build -c .storybook -o storybook-static",
45
+ "prepublishOnly": "npm run build"
46
+ },
47
+ "dependencies": {
48
+ "@bem-react/classname": "^1.6.0",
49
+ "@gravity-ui/date-utils": "^1.4.1",
50
+ "@gravity-ui/icons": "^2.2.0"
51
+ },
52
+ "devDependencies": {
53
+ "@babel/preset-env": "^7.22.9",
54
+ "@babel/preset-react": "^7.22.5",
55
+ "@babel/preset-typescript": "^7.22.5",
56
+ "@commitlint/cli": "^17.6.7",
57
+ "@commitlint/config-conventional": "^17.6.7",
58
+ "@gravity-ui/eslint-config": "^2.1.1",
59
+ "@gravity-ui/prettier-config": "^1.0.1",
60
+ "@gravity-ui/stylelint-config": "^2.0.0",
61
+ "@gravity-ui/tsconfig": "^1.0.0",
62
+ "@gravity-ui/uikit": "^5.0.0",
63
+ "@storybook/addon-a11y": "^7.2.1",
64
+ "@storybook/addon-essentials": "^7.2.1",
65
+ "@storybook/api": "^7.2.1",
66
+ "@storybook/preset-scss": "^1.0.3",
67
+ "@storybook/react": "^7.2.1",
68
+ "@storybook/react-webpack5": "^7.2.1",
69
+ "@testing-library/jest-dom": "^5.17.0",
70
+ "@testing-library/react": "^14.0.0",
71
+ "@testing-library/user-event": "^14.4.3",
72
+ "@types/jest": "^29.5.3",
73
+ "@types/react": "^18.2.15",
74
+ "@types/react-dom": "^18.2.7",
75
+ "cross-env": "^7.0.3",
76
+ "eslint": "^8.45.0",
77
+ "eslint-plugin-testing-library": "^5.11.0",
78
+ "gulp": "^4.0.2",
79
+ "gulp-cli": "^2.3.0",
80
+ "gulp-dart-sass": "^1.1.0",
81
+ "gulp-replace": "^1.1.4",
82
+ "gulp-typescript": "^5.0.1",
83
+ "husky": "^8.0.3",
84
+ "jest": "^29.5.0",
85
+ "jest-environment-jsdom": "^29.5.0",
86
+ "jest-transform-css": "^6.0.1",
87
+ "nano-staged": "^0.8.0",
88
+ "npm-run-all": "^4.1.5",
89
+ "prettier": "^2.8.8",
90
+ "react": "^18.2.0",
91
+ "react-dom": "^18.2.0",
92
+ "sass": "^1.64.1",
93
+ "sass-loader": "^13.3.2",
94
+ "storybook": "^7.2.1",
95
+ "style-loader": "^3.3.3",
96
+ "stylelint": "^15.10.2",
97
+ "ts-jest": "^29.1.1",
98
+ "typescript": "^5.1.6"
99
+ },
100
+ "peerDependencies": {
101
+ "@gravity-ui/uikit": "^5.0.0",
102
+ "react": "^17.0.0 || ^18.0.0",
103
+ "react-dom": "^17.0.0 || ^18.0.0"
104
+ },
105
+ "overrides": {
106
+ "stylelint": "^15.10.2"
107
+ },
108
+ "nano-staged": {
109
+ "*.{scss}": [
110
+ "stylelint --fix --quiet"
111
+ ],
112
+ "*.{js,jsx,ts,tsx}": [
113
+ "eslint --fix --quiet"
114
+ ],
115
+ "*.{md,json,yml,yaml}": [
116
+ "prettier --write"
117
+ ]
118
+ }
119
+ }