@uzum-tech/ui 1.12.21 → 1.13.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 (95) hide show
  1. package/dist/index.js +2789 -510
  2. package/dist/index.prod.js +4 -4
  3. package/es/_styles/common/dark.js +1 -1
  4. package/es/_styles/common/light.d.ts +1 -0
  5. package/es/_styles/common/light.js +1 -1
  6. package/es/chat/src/ChatMessages.js +6 -1
  7. package/es/chat/src/styles/index.cssr.js +5 -1
  8. package/es/components.d.ts +1 -0
  9. package/es/components.js +1 -0
  10. package/es/config-provider/src/internal-interface.d.ts +3 -0
  11. package/es/date-picker-v2/index.d.ts +5 -0
  12. package/es/date-picker-v2/index.js +2 -0
  13. package/es/date-picker-v2/src/DatePickerV2.d.ts +4765 -0
  14. package/es/date-picker-v2/src/DatePickerV2.js +750 -0
  15. package/es/date-picker-v2/src/composables/useCalendarScroll.d.ts +1133 -0
  16. package/es/date-picker-v2/src/composables/useCalendarScroll.js +61 -0
  17. package/es/date-picker-v2/src/config.d.ts +14 -0
  18. package/es/date-picker-v2/src/config.js +34 -0
  19. package/es/date-picker-v2/src/interface.d.ts +42 -0
  20. package/es/date-picker-v2/src/interface.js +1 -0
  21. package/es/date-picker-v2/src/panel/CalendarPanel.d.ts +1222 -0
  22. package/es/date-picker-v2/src/panel/CalendarPanel.js +186 -0
  23. package/es/date-picker-v2/src/panel/CalendarRangePanel.d.ts +1246 -0
  24. package/es/date-picker-v2/src/panel/CalendarRangePanel.js +205 -0
  25. package/es/date-picker-v2/src/styles/index.cssr.d.ts +2 -0
  26. package/es/date-picker-v2/src/styles/index.cssr.js +190 -0
  27. package/es/date-picker-v2/src/utils.d.ts +12 -0
  28. package/es/date-picker-v2/src/utils.js +92 -0
  29. package/es/date-picker-v2/styles/dark.d.ts +447 -0
  30. package/es/date-picker-v2/styles/dark.js +19 -0
  31. package/es/date-picker-v2/styles/index.d.ts +3 -0
  32. package/es/date-picker-v2/styles/index.js +2 -0
  33. package/es/date-picker-v2/styles/light.d.ts +477 -0
  34. package/es/date-picker-v2/styles/light.js +56 -0
  35. package/es/dialog/src/DialogProvider.d.ts +2 -0
  36. package/es/header/src/Header.js +4 -1
  37. package/es/header/src/HeaderSearchDesktop.d.ts +12 -0
  38. package/es/header/src/HeaderSearchDesktop.js +21 -4
  39. package/es/header/src/HeaderSearchMobile.d.ts +12 -0
  40. package/es/header/src/HeaderSearchMobile.js +8 -2
  41. package/es/header/src/mobile/HeaderMobile.js +18 -3
  42. package/es/locales/common/enUS.js +1 -1
  43. package/es/theme-editor/src/ThemeEditor.d.ts +1 -0
  44. package/es/themes/dark.js +2 -0
  45. package/es/themes/light.js +2 -0
  46. package/es/version.d.ts +1 -1
  47. package/es/version.js +1 -1
  48. package/lib/_styles/common/dark.js +1 -1
  49. package/lib/_styles/common/light.d.ts +1 -0
  50. package/lib/_styles/common/light.js +1 -1
  51. package/lib/chat/src/ChatMessages.js +6 -1
  52. package/lib/chat/src/styles/index.cssr.js +5 -1
  53. package/lib/components.d.ts +1 -0
  54. package/lib/components.js +1 -0
  55. package/lib/config-provider/src/internal-interface.d.ts +3 -0
  56. package/lib/date-picker-v2/index.d.ts +5 -0
  57. package/lib/date-picker-v2/index.js +11 -0
  58. package/lib/date-picker-v2/src/DatePickerV2.d.ts +4765 -0
  59. package/lib/date-picker-v2/src/DatePickerV2.js +756 -0
  60. package/lib/date-picker-v2/src/composables/useCalendarScroll.d.ts +1133 -0
  61. package/lib/date-picker-v2/src/composables/useCalendarScroll.js +64 -0
  62. package/lib/date-picker-v2/src/config.d.ts +14 -0
  63. package/lib/date-picker-v2/src/config.js +37 -0
  64. package/lib/date-picker-v2/src/interface.d.ts +42 -0
  65. package/lib/date-picker-v2/src/interface.js +4 -0
  66. package/lib/date-picker-v2/src/panel/CalendarPanel.d.ts +1222 -0
  67. package/lib/date-picker-v2/src/panel/CalendarPanel.js +188 -0
  68. package/lib/date-picker-v2/src/panel/CalendarRangePanel.d.ts +1246 -0
  69. package/lib/date-picker-v2/src/panel/CalendarRangePanel.js +207 -0
  70. package/lib/date-picker-v2/src/styles/index.cssr.d.ts +2 -0
  71. package/lib/date-picker-v2/src/styles/index.cssr.js +195 -0
  72. package/lib/date-picker-v2/src/utils.d.ts +12 -0
  73. package/lib/date-picker-v2/src/utils.js +101 -0
  74. package/lib/date-picker-v2/styles/dark.d.ts +447 -0
  75. package/lib/date-picker-v2/styles/dark.js +21 -0
  76. package/lib/date-picker-v2/styles/index.d.ts +3 -0
  77. package/lib/date-picker-v2/styles/index.js +10 -0
  78. package/lib/date-picker-v2/styles/light.d.ts +477 -0
  79. package/lib/date-picker-v2/styles/light.js +60 -0
  80. package/lib/dialog/src/DialogProvider.d.ts +2 -0
  81. package/lib/header/src/Header.js +4 -1
  82. package/lib/header/src/HeaderSearchDesktop.d.ts +12 -0
  83. package/lib/header/src/HeaderSearchDesktop.js +20 -3
  84. package/lib/header/src/HeaderSearchMobile.d.ts +12 -0
  85. package/lib/header/src/HeaderSearchMobile.js +7 -1
  86. package/lib/header/src/mobile/HeaderMobile.js +18 -3
  87. package/lib/locales/common/enUS.js +1 -1
  88. package/lib/theme-editor/src/ThemeEditor.d.ts +1 -0
  89. package/lib/themes/dark.js +2 -0
  90. package/lib/themes/light.js +2 -0
  91. package/lib/version.d.ts +1 -1
  92. package/lib/version.js +1 -1
  93. package/package.json +1 -1
  94. package/volar.d.ts +1 -0
  95. package/web-types.json +161 -1
@@ -0,0 +1,756 @@
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.datePickerV2Props = void 0;
7
+ const vue_1 = require("vue");
8
+ const vueuc_1 = require("vueuc");
9
+ const vdirs_1 = require("vdirs");
10
+ const date_fns_1 = require("date-fns");
11
+ const vooks_1 = require("vooks");
12
+ const seemly_1 = require("seemly");
13
+ const icons_1 = require("../../_internal/icons");
14
+ const input_1 = require("../../input");
15
+ const _internal_1 = require("../../_internal");
16
+ const _mixins_1 = require("../../_mixins");
17
+ const _utils_1 = require("../../_utils");
18
+ const button_1 = require("../../button");
19
+ const styles_1 = require("../styles");
20
+ const interface_1 = require("./interface");
21
+ const CalendarPanel_1 = __importDefault(require("./panel/CalendarPanel"));
22
+ const CalendarRangePanel_1 = __importDefault(require("./panel/CalendarRangePanel"));
23
+ const index_cssr_1 = __importDefault(require("./styles/index.cssr"));
24
+ exports.datePickerV2Props = Object.assign(Object.assign({}, _mixins_1.useTheme.props), { to: _utils_1.useAdjustedTo.propTo, type: {
25
+ type: String,
26
+ default: 'date'
27
+ }, bordered: {
28
+ type: Boolean,
29
+ default: undefined
30
+ }, round: Boolean, clearable: Boolean, defaultValue: [Number, Array], disabled: {
31
+ type: Boolean,
32
+ default: undefined
33
+ }, placement: {
34
+ type: String,
35
+ default: 'bottom-start'
36
+ }, value: [Number, Array], size: String, placeholder: String, startPlaceholder: String, endPlaceholder: String, separator: String, format: {
37
+ type: String,
38
+ default: 'DD.MM.YYYY'
39
+ }, triggerPreset: {
40
+ type: String,
41
+ default: 'input'
42
+ }, isDateDisabled: Function, show: {
43
+ type: Boolean,
44
+ default: undefined
45
+ }, status: String, inputReadonly: Boolean, 'onUpdate:show': [Function, Array], onUpdateShow: [Function, Array], 'onUpdate:value': [Function, Array], onUpdateValue: [Function, Array], onFocus: [Function, Array], onBlur: [Function, Array] });
46
+ exports.default = (0, vue_1.defineComponent)({
47
+ name: 'DatePickerV2',
48
+ props: exports.datePickerV2Props,
49
+ setup(props) {
50
+ var _a;
51
+ const { localeRef, dateLocaleRef } = (0, _mixins_1.useLocale)('DatePicker');
52
+ const formItem = (0, _mixins_1.useFormItem)(props);
53
+ const { mergedSizeRef, mergedDisabledRef, mergedStatusRef } = formItem;
54
+ const { mergedClsPrefixRef, mergedBorderedRef, namespaceRef, inlineThemeDisabled } = (0, _mixins_1.useConfig)(props);
55
+ const triggerElRef = (0, vue_1.ref)(null);
56
+ const inputInstRef = (0, vue_1.ref)(null);
57
+ const panelRef = (0, vue_1.ref)(null);
58
+ const uncontrolledShowRef = (0, vue_1.ref)(false);
59
+ const controlledShowRef = (0, vue_1.toRef)(props, 'show');
60
+ const mergedShowRef = (0, vooks_1.useMergedState)(controlledShowRef, uncontrolledShowRef);
61
+ const isRange = (0, vue_1.computed)(() => props.type === 'daterange');
62
+ const dateFnsOptionsRef = (0, vue_1.computed)(() => {
63
+ return {
64
+ locale: dateLocaleRef.value.locale
65
+ };
66
+ });
67
+ function normalizeFormat(format) {
68
+ return format
69
+ .replace(/Y{4}/g, 'yyyy')
70
+ .replace(/Y{2}/g, 'yy')
71
+ .replace(/D{2}/g, 'dd')
72
+ .replace(/D{1}/g, 'd');
73
+ }
74
+ const mergedFormatRef = (0, vue_1.computed)(() => normalizeFormat(props.format));
75
+ const uncontrolledValueRef = (0, vue_1.ref)((_a = props.defaultValue) !== null && _a !== void 0 ? _a : null);
76
+ const controlledValueRef = (0, vue_1.toRef)(props, 'value');
77
+ const mergedValueRef = (0, vooks_1.useMergedState)(controlledValueRef, uncontrolledValueRef);
78
+ // Состояние панели календаря
79
+ const now = Date.now();
80
+ const initialDate = (0, vue_1.computed)(() => {
81
+ const value = mergedValueRef.value;
82
+ if (value === null || value === undefined)
83
+ return now;
84
+ return Array.isArray(value) ? value[0] : value;
85
+ });
86
+ const displayYearRef = (0, vue_1.ref)((0, date_fns_1.getYear)(initialDate.value));
87
+ const displayMonthRef = (0, vue_1.ref)((0, date_fns_1.getMonth)(initialDate.value));
88
+ const showYearDropdownRef = (0, vue_1.ref)(false);
89
+ const singleInputValueRef = (0, vue_1.ref)('');
90
+ const rangeStartInputValueRef = (0, vue_1.ref)('');
91
+ const rangeEndInputValueRef = (0, vue_1.ref)('');
92
+ const skipInputSyncRef = (0, vue_1.ref)(false);
93
+ const rangeEditedPartRef = (0, vue_1.ref)(null);
94
+ // Состояние для range
95
+ const isSelectingRef = (0, vue_1.ref)(false);
96
+ const startDateRef = (0, vue_1.ref)(null);
97
+ const endDateRef = (0, vue_1.ref)(null);
98
+ const hoverDateRef = (0, vue_1.ref)(null);
99
+ // Инициализация range из value
100
+ if (isRange.value && Array.isArray(mergedValueRef.value)) {
101
+ startDateRef.value = mergedValueRef.value[0];
102
+ endDateRef.value = mergedValueRef.value[1];
103
+ }
104
+ // Вычисляем текущий rangeValue для отображения (с preview)
105
+ const currentRangeValueRef = (0, vue_1.computed)(() => {
106
+ var _a;
107
+ if (!isRange.value)
108
+ return null;
109
+ if (isSelectingRef.value && startDateRef.value !== null) {
110
+ // В процессе выбора - показываем preview
111
+ const start = startDateRef.value;
112
+ const end = (_a = hoverDateRef.value) !== null && _a !== void 0 ? _a : startDateRef.value;
113
+ return [Math.min(start, end), Math.max(start, end)];
114
+ }
115
+ if (startDateRef.value !== null && endDateRef.value !== null) {
116
+ return [startDateRef.value, endDateRef.value];
117
+ }
118
+ return null;
119
+ });
120
+ const singlePlaceholderRef = (0, vue_1.computed)(() => {
121
+ var _a;
122
+ return (_a = props.placeholder) !== null && _a !== void 0 ? _a : localeRef.value.selectDate;
123
+ });
124
+ const startPlaceholderRef = (0, vue_1.computed)(() => {
125
+ var _a;
126
+ return (_a = props.startPlaceholder) !== null && _a !== void 0 ? _a : localeRef.value.startDatePlaceholder;
127
+ });
128
+ const endPlaceholderRef = (0, vue_1.computed)(() => {
129
+ var _a;
130
+ return (_a = props.endPlaceholder) !== null && _a !== void 0 ? _a : localeRef.value.endDatePlaceholder;
131
+ });
132
+ function syncInputValue(value) {
133
+ if (Array.isArray(value)) {
134
+ rangeStartInputValueRef.value =
135
+ value[0] === null || value[0] === undefined
136
+ ? ''
137
+ : (0, date_fns_1.format)(value[0], mergedFormatRef.value);
138
+ rangeEndInputValueRef.value =
139
+ value[1] === null || value[1] === undefined
140
+ ? ''
141
+ : (0, date_fns_1.format)(value[1], mergedFormatRef.value);
142
+ }
143
+ else {
144
+ singleInputValueRef.value =
145
+ value === null || value === undefined
146
+ ? ''
147
+ : (0, date_fns_1.format)(value, mergedFormatRef.value);
148
+ }
149
+ }
150
+ (0, vue_1.watch)(mergedValueRef, (value) => {
151
+ const skipSync = skipInputSyncRef.value;
152
+ if (skipSync) {
153
+ skipInputSyncRef.value = false;
154
+ }
155
+ else {
156
+ syncInputValue(value);
157
+ }
158
+ if (isRange.value &&
159
+ Array.isArray(value) &&
160
+ value.length >= 2 &&
161
+ value[0] != null &&
162
+ value[1] != null) {
163
+ startDateRef.value = value[0];
164
+ endDateRef.value = value[1];
165
+ }
166
+ else if (value === null ||
167
+ value === undefined ||
168
+ !Array.isArray(value)) {
169
+ startDateRef.value = null;
170
+ endDateRef.value = null;
171
+ }
172
+ if (value === null || value === undefined)
173
+ return;
174
+ const target = Array.isArray(value)
175
+ ? rangeEditedPartRef.value === 'end' &&
176
+ value[1] !== null &&
177
+ value[1] !== undefined
178
+ ? value[1]
179
+ : value[0]
180
+ : value;
181
+ if (target === null || target === undefined)
182
+ return;
183
+ displayYearRef.value = (0, date_fns_1.getYear)(target);
184
+ displayMonthRef.value = (0, date_fns_1.getMonth)(target);
185
+ if (mergedShowRef.value) {
186
+ setTimeout(() => {
187
+ if (panelRef.value) {
188
+ if (!showYearDropdownRef.value) {
189
+ panelRef.value.scrollToMonthInMonthList(displayYearRef.value, displayMonthRef.value);
190
+ }
191
+ panelRef.value.scrollToMonthInCalendar(displayMonthRef.value);
192
+ }
193
+ }, 50);
194
+ }
195
+ }, { immediate: true });
196
+ // merged isDateDisabled для одиночного режима (type='date')
197
+ function mergedIsDateDisabledSingle(ts) {
198
+ const fn = props.isDateDisabled;
199
+ if (!fn)
200
+ return false;
201
+ return fn(ts);
202
+ }
203
+ // merged isDateDisabled для диапазона (type='daterange')
204
+ function mergedIsDateDisabledRange(ts) {
205
+ var _a;
206
+ const fn = props.isDateDisabled;
207
+ if (!fn)
208
+ return false;
209
+ // если передали (date) => boolean — ведём себя как в single
210
+ if (fn.length <= 1) {
211
+ return fn(ts);
212
+ }
213
+ const rangeFn = fn;
214
+ const mergedValue = mergedValueRef.value;
215
+ if (!Array.isArray(mergedValue)) {
216
+ return rangeFn(ts, 'start', null);
217
+ }
218
+ if (!isSelectingRef.value) {
219
+ // как selectingPhaseRef === 'start' в старом компоненте
220
+ return rangeFn(ts, 'start', null);
221
+ }
222
+ const memorizedStart = (_a = startDateRef.value) !== null && _a !== void 0 ? _a : mergedValue[0];
223
+ if (memorizedStart == null) {
224
+ return rangeFn(ts, 'start', null);
225
+ }
226
+ if (ts < memorizedStart) {
227
+ return rangeFn(ts, 'start', [memorizedStart, memorizedStart]);
228
+ }
229
+ return rangeFn(ts, 'end', [memorizedStart, memorizedStart]);
230
+ }
231
+ const displayValueRef = (0, vue_1.computed)(() => {
232
+ const value = mergedValueRef.value;
233
+ if (value === null || value === undefined)
234
+ return '';
235
+ if (Array.isArray(value))
236
+ return '';
237
+ return (0, date_fns_1.format)(value, mergedFormatRef.value);
238
+ });
239
+ const displayStartValueRef = (0, vue_1.computed)(() => {
240
+ const value = mergedValueRef.value;
241
+ if (!Array.isArray(value) || value === null || value === undefined) {
242
+ return '';
243
+ }
244
+ return (0, date_fns_1.format)(value[0], mergedFormatRef.value);
245
+ });
246
+ const displayEndValueRef = (0, vue_1.computed)(() => {
247
+ const value = mergedValueRef.value;
248
+ if (!Array.isArray(value) || value === null || value === undefined) {
249
+ return '';
250
+ }
251
+ return (0, date_fns_1.format)(value[1], mergedFormatRef.value);
252
+ });
253
+ const triggerDisplayValueRef = (0, vue_1.computed)(() => {
254
+ if (isRange.value) {
255
+ const start = displayStartValueRef.value || startPlaceholderRef.value;
256
+ const end = displayEndValueRef.value || endPlaceholderRef.value;
257
+ return `${start} — ${end}`;
258
+ }
259
+ return displayValueRef.value || singlePlaceholderRef.value;
260
+ });
261
+ const hasDisplayValueRef = (0, vue_1.computed)(() => {
262
+ const value = mergedValueRef.value;
263
+ if (isRange.value) {
264
+ return Array.isArray(value) && (value[0] !== null || value[1] !== null);
265
+ }
266
+ return value !== null && value !== undefined;
267
+ });
268
+ const themeRef = (0, _mixins_1.useTheme)('DatePickerV2', '-date-picker-v2', index_cssr_1.default, styles_1.datePickerV2Light, props, mergedClsPrefixRef);
269
+ (0, vue_1.provide)(interface_1.datePickerV2InjectionKey, {
270
+ mergedClsPrefixRef,
271
+ mergedThemeRef: themeRef,
272
+ localeRef,
273
+ dateLocaleRef,
274
+ isDateDisabledRef: (0, vue_1.toRef)(props, 'isDateDisabled')
275
+ });
276
+ function doUpdateShow(show) {
277
+ const { 'onUpdate:show': _onUpdateShow, onUpdateShow } = props;
278
+ if (_onUpdateShow)
279
+ (0, _utils_1.call)(_onUpdateShow, show);
280
+ if (onUpdateShow)
281
+ (0, _utils_1.call)(onUpdateShow, show);
282
+ uncontrolledShowRef.value = show;
283
+ }
284
+ function doUpdateValue(value) {
285
+ const { 'onUpdate:value': _onUpdateValue, onUpdateValue } = props;
286
+ const { triggerFormChange, triggerFormInput } = formItem;
287
+ if (_onUpdateValue)
288
+ (0, _utils_1.call)(_onUpdateValue, value);
289
+ if (onUpdateValue)
290
+ (0, _utils_1.call)(onUpdateValue, value);
291
+ uncontrolledValueRef.value = value;
292
+ triggerFormChange();
293
+ triggerFormInput();
294
+ }
295
+ function doFocus(e) {
296
+ const { onFocus } = props;
297
+ const { triggerFormFocus } = formItem;
298
+ if (onFocus)
299
+ (0, _utils_1.call)(onFocus, e);
300
+ triggerFormFocus();
301
+ }
302
+ function doBlur(e) {
303
+ const { onBlur } = props;
304
+ const { triggerFormBlur } = formItem;
305
+ if (onBlur)
306
+ (0, _utils_1.call)(onBlur, e);
307
+ triggerFormBlur();
308
+ }
309
+ function handleTriggerClick() {
310
+ if (mergedDisabledRef.value)
311
+ return;
312
+ if (!mergedShowRef.value) {
313
+ doUpdateShow(true);
314
+ }
315
+ }
316
+ function handleInputFocus(e) {
317
+ if (mergedDisabledRef.value)
318
+ return;
319
+ doFocus(e);
320
+ }
321
+ function handleInputBlur(e) {
322
+ doBlur(e);
323
+ }
324
+ function handleClickOutside(e) {
325
+ var _a;
326
+ if (mergedShowRef.value &&
327
+ !((_a = triggerElRef.value) === null || _a === void 0 ? void 0 : _a.contains((0, seemly_1.getPreciseEventTarget)(e)))) {
328
+ doUpdateShow(false);
329
+ }
330
+ }
331
+ function handleClear() {
332
+ doUpdateValue(null);
333
+ doUpdateShow(false);
334
+ singleInputValueRef.value = '';
335
+ rangeStartInputValueRef.value = '';
336
+ rangeEndInputValueRef.value = '';
337
+ // Сброс состояния range
338
+ if (isRange.value) {
339
+ isSelectingRef.value = false;
340
+ startDateRef.value = null;
341
+ endDateRef.value = null;
342
+ hoverDateRef.value = null;
343
+ }
344
+ }
345
+ function handleSelect(value) {
346
+ doUpdateValue(value);
347
+ doUpdateShow(false);
348
+ }
349
+ function handleKeydown(e) {
350
+ if (e.key === 'Escape' && mergedShowRef.value) {
351
+ doUpdateShow(false);
352
+ }
353
+ }
354
+ function strictParse(string, pattern, backup, option) {
355
+ const result = (0, date_fns_1.parse)(string, pattern, backup, option);
356
+ if (!(0, date_fns_1.isValid)(result))
357
+ return result;
358
+ if ((0, date_fns_1.format)(result, pattern, option) === string)
359
+ return result;
360
+ return new Date(NaN);
361
+ }
362
+ function handleSingleUpdateValue(v) {
363
+ singleInputValueRef.value = v;
364
+ if (v === '') {
365
+ doUpdateValue(null);
366
+ return;
367
+ }
368
+ const parsedDate = strictParse(v, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
369
+ if ((0, date_fns_1.isValid)(parsedDate)) {
370
+ skipInputSyncRef.value = true;
371
+ doUpdateValue((0, date_fns_1.getTime)((0, date_fns_1.startOfDay)(parsedDate)));
372
+ }
373
+ else {
374
+ singleInputValueRef.value = v;
375
+ }
376
+ }
377
+ function focusRangeInputAndMoveCursorToEnd(which) {
378
+ void (0, vue_1.nextTick)(() => {
379
+ var _a;
380
+ const inst = inputInstRef.value;
381
+ const ref = which === 'start' ? inst === null || inst === void 0 ? void 0 : inst.inputElRef : inst === null || inst === void 0 ? void 0 : inst.inputEl2Ref;
382
+ const el = ref
383
+ ? typeof ref === 'object' && ref !== null && 'value' in ref
384
+ ? ref.value
385
+ : ref
386
+ : undefined;
387
+ if (el === null || el === void 0 ? void 0 : el.focus) {
388
+ el.focus();
389
+ const len = (el.value || '').length;
390
+ (_a = el.setSelectionRange) === null || _a === void 0 ? void 0 : _a.call(el, len, len);
391
+ }
392
+ });
393
+ }
394
+ function handleRangeUpdateValue(v) {
395
+ const prevStart = rangeStartInputValueRef.value;
396
+ const prevEnd = rangeEndInputValueRef.value;
397
+ if (v[0] === '' && v[1] === '') {
398
+ doUpdateValue(null);
399
+ rangeStartInputValueRef.value = '';
400
+ rangeEndInputValueRef.value = '';
401
+ return;
402
+ }
403
+ const [startStr, endStr] = v;
404
+ const startDate = strictParse(startStr, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
405
+ const endDate = strictParse(endStr, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
406
+ const startValid = (0, date_fns_1.isValid)(startDate);
407
+ const endValid = (0, date_fns_1.isValid)(endDate);
408
+ const changedStart = startStr !== prevStart;
409
+ const changedEnd = endStr !== prevEnd;
410
+ if (changedStart)
411
+ rangeEditedPartRef.value = 'start';
412
+ if (changedEnd)
413
+ rangeEditedPartRef.value = 'end';
414
+ const startTs = startValid ? (0, date_fns_1.getTime)((0, date_fns_1.startOfDay)(startDate)) : 0;
415
+ const endTs = endValid ? (0, date_fns_1.getTime)((0, date_fns_1.startOfDay)(endDate)) : 0;
416
+ const rangeInvalid = startValid && endValid && endTs < startTs;
417
+ if (changedEnd && endValid && !rangeInvalid) {
418
+ displayYearRef.value = (0, date_fns_1.getYear)(endTs);
419
+ displayMonthRef.value = (0, date_fns_1.getMonth)(endTs);
420
+ }
421
+ else if (changedStart && startValid && !rangeInvalid) {
422
+ displayYearRef.value = (0, date_fns_1.getYear)(startTs);
423
+ displayMonthRef.value = (0, date_fns_1.getMonth)(startTs);
424
+ }
425
+ if (startValid && endValid && !rangeInvalid) {
426
+ ;
427
+ [rangeStartInputValueRef.value, rangeEndInputValueRef.value] = v;
428
+ skipInputSyncRef.value = true;
429
+ doUpdateValue([startTs, endTs]);
430
+ if (mergedShowRef.value) {
431
+ setTimeout(() => {
432
+ if (panelRef.value) {
433
+ if (!showYearDropdownRef.value) {
434
+ panelRef.value.scrollToMonthInMonthList(displayYearRef.value, displayMonthRef.value);
435
+ }
436
+ panelRef.value.scrollToMonthInCalendar(displayMonthRef.value);
437
+ }
438
+ }, 50);
439
+ }
440
+ }
441
+ else if (rangeInvalid) {
442
+ const currentValue = mergedValueRef.value;
443
+ const restoredStart = Array.isArray(currentValue) && currentValue[0] != null
444
+ ? (0, date_fns_1.format)(currentValue[0], mergedFormatRef.value)
445
+ : '';
446
+ const restoredEnd = Array.isArray(currentValue) && currentValue[1] != null
447
+ ? (0, date_fns_1.format)(currentValue[1], mergedFormatRef.value)
448
+ : '';
449
+ if (changedEnd) {
450
+ rangeEndInputValueRef.value = restoredEnd;
451
+ rangeStartInputValueRef.value = startStr;
452
+ focusRangeInputAndMoveCursorToEnd('end');
453
+ }
454
+ else {
455
+ rangeStartInputValueRef.value = restoredStart;
456
+ rangeEndInputValueRef.value = endStr;
457
+ focusRangeInputAndMoveCursorToEnd('start');
458
+ }
459
+ }
460
+ else {
461
+ ;
462
+ [rangeStartInputValueRef.value, rangeEndInputValueRef.value] = v;
463
+ }
464
+ }
465
+ // Обработчик ввода в инпут
466
+ function handleInputUpdateValue(value) {
467
+ if (isRange.value) {
468
+ if (!Array.isArray(value))
469
+ return;
470
+ handleRangeUpdateValue(value);
471
+ }
472
+ else {
473
+ if (typeof value !== 'string')
474
+ return;
475
+ handleSingleUpdateValue(value);
476
+ }
477
+ }
478
+ // Обработчики для панели календаря
479
+ function handleDateClick(ts) {
480
+ // Не даём кликать по disabled датам (учитываем single/range логику)
481
+ if (isRange.value) {
482
+ if (mergedIsDateDisabledRange(ts))
483
+ return;
484
+ // Логика для range
485
+ const normalizedTs = (0, date_fns_1.getTime)((0, date_fns_1.startOfDay)(ts));
486
+ if (!isSelectingRef.value) {
487
+ // Первый клик - начинаем выбор
488
+ isSelectingRef.value = true;
489
+ startDateRef.value = normalizedTs;
490
+ endDateRef.value = null;
491
+ hoverDateRef.value = null;
492
+ }
493
+ else {
494
+ // Второй клик - завершаем выбор
495
+ isSelectingRef.value = false;
496
+ const start = startDateRef.value;
497
+ if (start === null)
498
+ return;
499
+ const end = normalizedTs;
500
+ // Устанавливаем правильный порядок
501
+ if (start <= end) {
502
+ startDateRef.value = start;
503
+ endDateRef.value = end;
504
+ }
505
+ else {
506
+ startDateRef.value = end;
507
+ endDateRef.value = start;
508
+ }
509
+ hoverDateRef.value = null;
510
+ // Обновляем значение и закрываем
511
+ if (startDateRef.value !== null && endDateRef.value !== null) {
512
+ rangeEditedPartRef.value = 'end';
513
+ handleSelect([startDateRef.value, endDateRef.value]);
514
+ }
515
+ }
516
+ }
517
+ else {
518
+ if (mergedIsDateDisabledSingle(ts))
519
+ return;
520
+ // Логика для single date
521
+ handleSelect(ts);
522
+ }
523
+ }
524
+ function handleDateMouseEnter(ts) {
525
+ if (isRange.value && isSelectingRef.value) {
526
+ hoverDateRef.value = (0, date_fns_1.getTime)((0, date_fns_1.startOfDay)(ts));
527
+ }
528
+ }
529
+ function handleMonthSelect(year, month) {
530
+ displayYearRef.value = year;
531
+ displayMonthRef.value = month;
532
+ // Скроллим к выбранному месяцу в календаре (ждём пока DOM обновится после смены года)
533
+ setTimeout(() => {
534
+ if (panelRef.value) {
535
+ panelRef.value.scrollToMonthInCalendar(month);
536
+ }
537
+ }, 50);
538
+ }
539
+ function handleYearSelect(year) {
540
+ displayYearRef.value = year;
541
+ showYearDropdownRef.value = false;
542
+ // После закрытия dropdown нужно проскроллить к выбранному году и месяцу
543
+ setTimeout(() => {
544
+ if (panelRef.value) {
545
+ panelRef.value.scrollToMonthInMonthList(year, displayMonthRef.value);
546
+ panelRef.value.scrollToMonthInCalendar(displayMonthRef.value);
547
+ }
548
+ }, 50);
549
+ }
550
+ function handleToggleYearDropdown() {
551
+ showYearDropdownRef.value = !showYearDropdownRef.value;
552
+ // При открытии dropdown скроллим к текущему году
553
+ setTimeout(() => {
554
+ if (panelRef.value) {
555
+ panelRef.value.scrollToYear(displayYearRef.value);
556
+ panelRef.value.scrollToMonthInMonthList(displayYearRef.value, displayMonthRef.value);
557
+ }
558
+ }, 50);
559
+ }
560
+ function handleMonthScroll(year) {
561
+ displayYearRef.value = year;
562
+ }
563
+ // Watch для открытия панели - скроллим к выбранному году и месяцу
564
+ (0, vue_1.watch)(mergedShowRef, (newShow) => {
565
+ if (newShow) {
566
+ // Обновляем displayYear и displayMonth из выбранной даты (или текущей)
567
+ const targetDate = initialDate.value;
568
+ displayYearRef.value = (0, date_fns_1.getYear)(targetDate);
569
+ displayMonthRef.value = (0, date_fns_1.getMonth)(targetDate);
570
+ // Используем setTimeout чтобы дать время панели отрендериться
571
+ setTimeout(() => {
572
+ if (panelRef.value) {
573
+ // Скроллим к месяцу в списке месяцев (левая колонка)
574
+ if (!showYearDropdownRef.value) {
575
+ panelRef.value.scrollToMonthInMonthList(displayYearRef.value, displayMonthRef.value);
576
+ }
577
+ // Скроллим к месяцу в календаре (правая колонка - только 12 месяцев)
578
+ panelRef.value.scrollToMonthInCalendar(displayMonthRef.value);
579
+ }
580
+ }, 50);
581
+ }
582
+ });
583
+ const cssVarsRef = (0, vue_1.computed)(() => {
584
+ const theme = themeRef.value;
585
+ const { common: { cubicBezierEaseInOut }, self: { panelColor, panelBoxShadow, panelBorderRadius, panelTextColor, dividerColor, itemTextColor, itemTextColorOtherMonth, itemTextColorDisabled, itemColorHover, itemColorActive, itemTextColorActive, itemColorIncluded, itemBorderRadius, iconColor, iconColorDisabled, weekdayTextColor, weekendTextColor, monthItemHeight, monthItemColorHover, monthItemColorActive, monthItemTextColorActive, yearTriggerColor, yearTriggerColorHover, yearTriggerTextColor, currentDateIndicatorColor } } = theme;
586
+ return {
587
+ '--u-bezier': cubicBezierEaseInOut,
588
+ '--u-panel-color': panelColor,
589
+ '--u-panel-box-shadow': panelBoxShadow,
590
+ '--u-panel-border-radius': panelBorderRadius,
591
+ '--u-panel-text-color': panelTextColor,
592
+ '--u-divider-color': dividerColor,
593
+ '--u-item-text-color': itemTextColor,
594
+ '--u-item-text-color-other-month': itemTextColorOtherMonth,
595
+ '--u-item-text-color-disabled': itemTextColorDisabled,
596
+ '--u-item-color-hover': itemColorHover,
597
+ '--u-item-color-active': itemColorActive,
598
+ '--u-item-text-color-active': itemTextColorActive,
599
+ '--u-item-color-included': itemColorIncluded,
600
+ '--u-item-border-radius': itemBorderRadius,
601
+ '--u-icon-color': iconColor,
602
+ '--u-icon-color-disabled': iconColorDisabled,
603
+ '--u-weekday-text-color': weekdayTextColor,
604
+ '--u-weekend-text-color': weekendTextColor,
605
+ '--u-month-item-height': monthItemHeight,
606
+ '--u-month-item-color-hover': monthItemColorHover,
607
+ '--u-month-item-color-active': monthItemColorActive,
608
+ '--u-month-item-text-color-active': monthItemTextColorActive,
609
+ '--u-year-trigger-color': yearTriggerColor,
610
+ '--u-year-trigger-color-hover': yearTriggerColorHover,
611
+ '--u-year-trigger-text-color': yearTriggerTextColor,
612
+ '--u-current-date-indicator-color': currentDateIndicatorColor
613
+ };
614
+ });
615
+ const themeClassHandle = inlineThemeDisabled
616
+ ? (0, _mixins_1.useThemeClass)('date-picker-v2', undefined, cssVarsRef, props)
617
+ : undefined;
618
+ return {
619
+ mergedClsPrefix: mergedClsPrefixRef,
620
+ mergedBordered: mergedBorderedRef,
621
+ mergedDisabled: mergedDisabledRef,
622
+ mergedStatus: mergedStatusRef,
623
+ mergedSize: mergedSizeRef,
624
+ mergedShow: mergedShowRef,
625
+ mergedValue: mergedValueRef,
626
+ isRange,
627
+ displayValue: displayValueRef,
628
+ displayStartValue: displayStartValueRef,
629
+ displayEndValue: displayEndValueRef,
630
+ namespace: namespaceRef,
631
+ adjustedTo: (0, _utils_1.useAdjustedTo)(props),
632
+ isMounted: (0, vooks_1.useIsMounted)(),
633
+ triggerElRef,
634
+ inputInstRef,
635
+ panelRef,
636
+ mergedTheme: themeRef,
637
+ displayYear: displayYearRef,
638
+ displayMonth: displayMonthRef,
639
+ showYearDropdown: showYearDropdownRef,
640
+ currentRangeValue: currentRangeValueRef,
641
+ isSelecting: isSelectingRef,
642
+ handleTriggerClick,
643
+ handleInputFocus,
644
+ handleInputBlur,
645
+ handleClickOutside,
646
+ handleClear,
647
+ handleSelect,
648
+ handleKeydown,
649
+ handleInputUpdateValue,
650
+ handleSingleUpdateValue,
651
+ handleRangeUpdateValue,
652
+ handleDateClick,
653
+ handleDateMouseEnter,
654
+ handleMonthSelect,
655
+ handleYearSelect,
656
+ handleToggleYearDropdown,
657
+ handleMonthScroll,
658
+ mergedIsDateDisabledSingle,
659
+ mergedIsDateDisabledRange,
660
+ triggerDisplayValue: triggerDisplayValueRef,
661
+ hasDisplayValue: hasDisplayValueRef,
662
+ singlePlaceholder: singlePlaceholderRef,
663
+ startPlaceholder: startPlaceholderRef,
664
+ endPlaceholder: endPlaceholderRef,
665
+ singleInputValue: singleInputValueRef,
666
+ rangeStartInputValue: rangeStartInputValueRef,
667
+ rangeEndInputValue: rangeEndInputValueRef,
668
+ cssVars: inlineThemeDisabled ? undefined : cssVarsRef,
669
+ themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,
670
+ onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender
671
+ };
672
+ },
673
+ render() {
674
+ var _a;
675
+ const { mergedClsPrefix, clearable, isRange } = this;
676
+ (_a = this.onRender) === null || _a === void 0 ? void 0 : _a.call(this);
677
+ const commonInputProps = {
678
+ bordered: this.mergedBordered,
679
+ round: this.round,
680
+ size: this.mergedSize,
681
+ passivelyActivated: true,
682
+ disabled: this.mergedDisabled,
683
+ readonly: this.inputReadonly || this.mergedDisabled,
684
+ clearable,
685
+ onClear: this.handleClear,
686
+ onClick: this.handleTriggerClick,
687
+ onFocus: this.handleInputFocus,
688
+ onBlur: this.handleInputBlur,
689
+ onUpdateValue: this.handleInputUpdateValue
690
+ };
691
+ return ((0, vue_1.h)("div", { ref: "triggerElRef", class: [
692
+ `${mergedClsPrefix}-date-picker-v2`,
693
+ this.mergedDisabled && `${mergedClsPrefix}-date-picker-v2--disabled`,
694
+ isRange && `${mergedClsPrefix}-date-picker-v2--range`,
695
+ this.themeClass
696
+ ], style: this.cssVars, onKeydown: this.handleKeydown },
697
+ (0, vue_1.h)(vueuc_1.VBinder, null, {
698
+ default: () => [
699
+ (0, vue_1.h)(vueuc_1.VTarget, null, {
700
+ default: () => {
701
+ var _a, _b, _c, _d, _e, _f, _g, _h;
702
+ if (this.$slots.trigger) {
703
+ return this.$slots.trigger({
704
+ open: this.handleTriggerClick,
705
+ value: this.triggerDisplayValue
706
+ });
707
+ }
708
+ if (this.triggerPreset === 'select') {
709
+ return ((0, vue_1.h)(_internal_1.UInternalSelection, { ref: "inputInstRef", selectedOption: this.hasDisplayValue
710
+ ? {
711
+ label: this.triggerDisplayValue,
712
+ value: this.triggerDisplayValue
713
+ }
714
+ : null, round: this.round, status: this.mergedStatus, clsPrefix: mergedClsPrefix, bordered: this.mergedBordered, size: this.mergedSize, theme: (_b = (_a = this.mergedTheme) === null || _a === void 0 ? void 0 : _a.peers) === null || _b === void 0 ? void 0 : _b.Select, themeOverrides: (_d = (_c = this.mergedTheme) === null || _c === void 0 ? void 0 : _c.peerOverrides) === null || _d === void 0 ? void 0 : _d.Select, placeholder: isRange
715
+ ? `${this.startPlaceholder} — ${this.endPlaceholder}`
716
+ : this.singlePlaceholder, active: this.mergedShow, clearable: this.clearable, disabled: this.mergedDisabled, onFocus: this.handleInputFocus, onBlur: this.handleInputBlur, onClick: this.handleTriggerClick, onClear: this.handleClear }, {
717
+ arrow: () => { var _a, _b; return (_b = (_a = this.$slots).arrow) === null || _b === void 0 ? void 0 : _b.call(_a); }
718
+ }));
719
+ }
720
+ if (this.triggerPreset === 'button') {
721
+ return ((0, vue_1.h)(button_1.UButton, { round: this.round, size: this.mergedSize, theme: (_f = (_e = this.mergedTheme) === null || _e === void 0 ? void 0 : _e.peers) === null || _f === void 0 ? void 0 : _f.Button, themeOverrides: (_h = (_g = this.mergedTheme) === null || _g === void 0 ? void 0 : _g.peerOverrides) === null || _h === void 0 ? void 0 : _h.Button, onClick: this.handleTriggerClick }, this.triggerDisplayValue));
722
+ }
723
+ return isRange ? ((0, vue_1.h)(input_1.UInput, Object.assign({ ref: "inputInstRef", status: this.mergedStatus, value: [
724
+ this.rangeStartInputValue,
725
+ this.rangeEndInputValue
726
+ ], placeholder: [
727
+ this.startPlaceholder,
728
+ this.endPlaceholder
729
+ ], pair: true, theme: this.mergedTheme.peers.Input, themeOverrides: this.mergedTheme.peerOverrides.Input, internalForceFocus: this.mergedShow }, commonInputProps), {
730
+ separator: () => this.separator === undefined ? ((0, vue_1.h)("span", { class: `${mergedClsPrefix}-date-picker-v2__separator` }, "\u2014")) : (this.separator),
731
+ [clearable ? 'clear-icon-placeholder' : 'suffix']: () => ((0, vue_1.h)(_internal_1.UBaseIcon, { clsPrefix: mergedClsPrefix, class: `${mergedClsPrefix}-date-picker-v2-icon` }, { default: () => (0, vue_1.h)(icons_1.DateIcon, null) }))
732
+ })) : ((0, vue_1.h)(input_1.UInput, Object.assign({ ref: "inputInstRef", status: this.mergedStatus, value: this.singleInputValue, placeholder: this.singlePlaceholder, theme: this.mergedTheme.peers.Input, themeOverrides: this.mergedTheme.peerOverrides.Input, internalForceFocus: this.mergedShow }, commonInputProps), {
733
+ [clearable ? 'clear-icon-placeholder' : 'suffix']: () => ((0, vue_1.h)(_internal_1.UBaseIcon, { clsPrefix: mergedClsPrefix, class: `${mergedClsPrefix}-date-picker-v2-icon` }, { default: () => (0, vue_1.h)(icons_1.DateIcon, null) }))
734
+ }));
735
+ }
736
+ }),
737
+ (0, vue_1.h)(vueuc_1.VFollower, { show: this.mergedShow, containerClass: this.namespace, to: this.adjustedTo, teleportDisabled: this.adjustedTo === _utils_1.useAdjustedTo.tdkey, placement: this.placement }, {
738
+ default: () => ((0, vue_1.h)(vue_1.Transition, { name: "fade-in-scale-up-transition", appear: this.isMounted }, {
739
+ default: () => {
740
+ if (!this.mergedShow)
741
+ return null;
742
+ return (0, vue_1.withDirectives)(isRange ? ((0, vue_1.h)(CalendarRangePanel_1.default, { ref: "panelRef", value: this.currentRangeValue, displayYear: this.displayYear, displayMonth: this.displayMonth, showYearDropdown: this.showYearDropdown, isSelecting: this.isSelecting, isDateDisabled: this.mergedIsDateDisabledRange, onDateClick: this.handleDateClick, onDateMouseEnter: this.handleDateMouseEnter, onMonthSelect: this.handleMonthSelect, onYearSelect: this.handleYearSelect, onToggleYearDropdown: this.handleToggleYearDropdown, onMonthScroll: this.handleMonthScroll, style: this.cssVars, themeClass: this.themeClass })) : ((0, vue_1.h)(CalendarPanel_1.default, { ref: "panelRef", value: this.mergedValue, displayYear: this.displayYear, displayMonth: this.displayMonth, showYearDropdown: this.showYearDropdown, isDateDisabled: this.mergedIsDateDisabledSingle, onDateClick: this.handleDateClick, onMonthSelect: this.handleMonthSelect, onYearSelect: this.handleYearSelect, onToggleYearDropdown: this.handleToggleYearDropdown, onMonthScroll: this.handleMonthScroll, style: this.cssVars, themeClass: this.themeClass })), [
743
+ [
744
+ vdirs_1.clickoutside,
745
+ this.handleClickOutside,
746
+ undefined,
747
+ { capture: true }
748
+ ]
749
+ ]);
750
+ }
751
+ }))
752
+ })
753
+ ]
754
+ })));
755
+ }
756
+ });