@alphakits/ui 2.0.0 → 2.0.1

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 (39) hide show
  1. package/dist/calendar/component.js +1 -1
  2. package/dist/calendar/component.js.map +1 -1
  3. package/dist/calendar/components/days-table/component.d.ts +1 -1
  4. package/dist/calendar/components/days-table/component.js +40 -44
  5. package/dist/calendar/components/days-table/component.js.map +1 -1
  6. package/dist/calendar/components/months-table//321/201omponent.d.ts +1 -1
  7. package/dist/calendar/components/months-table//321/201omponent.js +1 -1
  8. package/dist/calendar/components/months-table//321/201omponent.js.map +1 -1
  9. package/dist/calendar/components/years-table//321/201omponent.js +1 -1
  10. package/dist/calendar/components/years-table//321/201omponent.js.map +1 -1
  11. package/dist/calendar/use-calendar.js +1 -1
  12. package/dist/calendar/use-calendar.js.map +1 -1
  13. package/dist/calendar/utils.d.ts +2 -2
  14. package/dist/calendar/utils.js +54 -54
  15. package/dist/calendar/utils.js.map +1 -1
  16. package/dist/calendar-input/component.js +2 -3
  17. package/dist/calendar-input/component.js.map +1 -1
  18. package/dist/calendar-input/utils.js +5 -5
  19. package/dist/calendar-input/utils.js.map +1 -1
  20. package/dist/date-switcher/component.js +1 -1
  21. package/dist/date-switcher/component.js.map +1 -1
  22. package/dist/form/component.js +79 -92
  23. package/dist/form/component.js.map +1 -1
  24. package/dist/formik/index.d.ts +5 -0
  25. package/dist/formik/index.js +15 -0
  26. package/dist/formik/index.js.map +1 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +321 -270
  29. package/dist/index.js.map +1 -1
  30. package/dist/utils/date/index.d.ts +73 -0
  31. package/dist/utils/date/index.js +224 -0
  32. package/dist/utils/date/index.js.map +1 -0
  33. package/dist/utils/format-date/index.d.ts +16 -16
  34. package/dist/utils/format-date/index.js +36 -42
  35. package/dist/utils/format-date/index.js.map +1 -1
  36. package/dist/utils/index.d.ts +1 -0
  37. package/dist/utils/index.js +51 -12
  38. package/dist/utils/index.js.map +1 -1
  39. package/package.json +1 -3
@@ -1,88 +1,88 @@
1
- import { useRef as y, useEffect as g } from "react";
2
- import { format as v, startOfDay as k, startOfMonth as D, startOfISOWeek as p, endOfISOWeek as S, lastDayOfMonth as T, eachDayOfInterval as I, isSameDay as h, eachMonthOfInterval as E, endOfYear as L, startOfYear as u, eachYearOfInterval as x, max as l, min as m, addDays as d, isBefore as M, isAfter as b, isSameMonth as A, endOfWeek as N, startOfWeek as Y, addMonths as _, subMonths as R, subDays as O } from "date-fns";
3
- const W = 7, j = 12, K = 6;
1
+ import { useRef as g, useEffect as y } from "react";
2
+ import { startOfDay as k, startOfMonth as m, startOfISOWeek as v, endOfISOWeek as p, lastDayOfMonth as T, eachDayOfInterval as I, isSameDay as h, eachMonthOfInterval as S, endOfYear as E, startOfYear as u, eachYearOfInterval as x, max as d, min as D, addDays as l, isBefore as M, isAfter as b, isSameMonth as A, endOfWeek as N, startOfWeek as Y, addMonths as _, subMonths as R, subDays as O } from "../utils/date/index.js";
3
+ const w = 7, X = 12, K = 6;
4
4
  function B(e) {
5
5
  const n = e.getDay();
6
- return n === 0 ? W - 1 : n - 1;
6
+ return n === 0 ? w - 1 : n - 1;
7
7
  }
8
- function q(e, t) {
9
- const n = () => Array(W).fill(null), r = D(e), a = p(D(e)), i = S(T(e));
8
+ function j(e, t) {
9
+ const n = () => Array(w).fill(null), r = m(e), i = v(m(e)), a = p(T(e));
10
10
  let s = n();
11
- return I({ start: a, end: i }).reduce((o, f) => {
11
+ return I({ start: i, end: a }).reduce((o, f) => {
12
12
  const c = B(f);
13
- return s[c] = F(f, r, t), (c === K || h(f, i)) && (o.push(s), s = n()), o;
13
+ return s[c] = H(f, r, t), (c === K || h(f, a)) && (o.push(s), s = n()), o;
14
14
  }, []);
15
15
  }
16
- function z(e, t) {
17
- return E({ start: u(e), end: L(e) }).map((n) => H(n, t));
16
+ function q(e, t) {
17
+ return S({ start: u(e), end: E(e) }).map((n) => U(n, t));
18
18
  }
19
- function C(e, t) {
19
+ function z(e, t) {
20
20
  return x({
21
- start: m([u(t), u(e)]),
22
- end: l([u(t), u(e)])
21
+ start: D([u(t), u(e)]),
22
+ end: d([u(t), u(e)])
23
23
  }).reverse();
24
24
  }
25
- function F(e, t, n) {
25
+ function H(e, t, n) {
26
26
  const {
27
27
  minDate: r,
28
- maxDate: a,
29
- selected: i,
28
+ maxDate: i,
29
+ selected: a,
30
30
  eventsMap: s = {},
31
31
  offDaysMap: o = {}
32
- } = n, f = o[e.getTime()], c = r && M(e, r) || a && b(e, a);
32
+ } = n, f = o[e.getTime()], c = r && M(e, r) || i && b(e, i);
33
33
  return {
34
34
  date: e,
35
35
  disabled: c || f,
36
36
  event: s[e.getTime()],
37
- selected: i && h(e, i),
37
+ selected: a && h(e, a),
38
38
  muted: !A(e, t)
39
39
  };
40
40
  }
41
- function H(e, t) {
41
+ function U(e, t) {
42
42
  const { minMonth: n, maxMonth: r } = t;
43
43
  return {
44
44
  date: e,
45
45
  disabled: n && M(e, n) || r && b(e, r)
46
46
  };
47
47
  }
48
- function w(e, t, n) {
48
+ function W(e, t, n) {
49
49
  let r = e;
50
- return t && (r = l([t, r])), n && (r = m([n, r])), new Date(r);
50
+ return t && (r = d([t, r])), n && (r = D([n, r])), new Date(r);
51
51
  }
52
- function G(e, t, n) {
53
- return e && w(e, t, n).getTime() === new Date(e).getTime();
52
+ function C(e, t, n) {
53
+ return e && W(e, t, n).getTime() === new Date(e).getTime();
54
54
  }
55
- function J(e, t, n) {
56
- return v(e, "LLL", { locale: t });
55
+ function G(e, t, n) {
56
+ return new Intl.DateTimeFormat(t, { month: n ? "short" : "long" }).format(e);
57
57
  }
58
- function P(e) {
58
+ function J(e) {
59
59
  return e.reduce((t, n) => (t[k(n).getTime()] = !0, t), {});
60
60
  }
61
- function Q(e, t, n) {
61
+ function P(e, t, n) {
62
62
  const r = t || n;
63
63
  return e && r && e !== r ? {
64
- start: m([e, r]),
65
- end: l([e, r])
64
+ start: D([e, r]),
65
+ end: d([e, r])
66
66
  } : null;
67
67
  }
68
- function V(e, t, n, r, a = {}) {
68
+ function Q(e, t, n, r, i = {}) {
69
69
  let s = {
70
70
  prev: () => O(t, 1),
71
71
  prevWeek: () => O(t, 7),
72
72
  prevMonth: () => R(t, 1),
73
- next: () => d(t, 1),
74
- nextWeek: () => d(t, 7),
73
+ next: () => l(t, 1),
74
+ nextWeek: () => l(t, 7),
75
75
  nextMonth: () => _(t, 1),
76
76
  startOfWeek: () => Y(t, { weekStartsOn: 1 }),
77
77
  endOfWeek: () => k(N(t, { weekStartsOn: 1 }))
78
78
  }[e]();
79
- for (; a[s.getTime()]; ) {
79
+ for (; i[s.getTime()]; ) {
80
80
  let o = s < t ? -1 : 1;
81
- e === "endOfWeek" && (o = -1), e === "startOfWeek" && (o = 1), s = d(s, o);
81
+ e === "endOfWeek" && (o = -1), e === "startOfWeek" && (o = 1), s = l(s, o);
82
82
  }
83
- return w(s, n, r);
83
+ return W(s, n, r);
84
84
  }
85
- function Z(e) {
85
+ function V(e) {
86
86
  if (window.KeyboardEvent) {
87
87
  const t = new window.KeyboardEvent("keydown", {
88
88
  bubbles: !0,
@@ -91,29 +91,29 @@ function Z(e) {
91
91
  e.dispatchEvent(t);
92
92
  }
93
93
  }
94
- function $(e, t) {
95
- const n = y(!1);
96
- g(() => {
94
+ function Z(e, t) {
95
+ const n = g(!1);
96
+ y(() => {
97
97
  n.current ? e() : n.current = !0;
98
98
  }, t);
99
99
  }
100
100
  export {
101
- W as DAYS_IN_WEEK,
102
- j as MONTHS_IN_YEAR,
101
+ w as DAYS_IN_WEEK,
102
+ X as MONTHS_IN_YEAR,
103
103
  K as SUNDAY_INDEX,
104
- F as buildDay,
105
- H as buildMonth,
106
- P as dateArrayToHashTable,
107
- G as dateInLimits,
108
- z as generateMonths,
109
- q as generateWeeks,
110
- C as generateYears,
111
- Q as getSelectionRange,
112
- w as limitDate,
113
- V as modifyDateByShift,
114
- J as monthName,
104
+ H as buildDay,
105
+ U as buildMonth,
106
+ J as dateArrayToHashTable,
107
+ C as dateInLimits,
108
+ q as generateMonths,
109
+ j as generateWeeks,
110
+ z as generateYears,
111
+ P as getSelectionRange,
112
+ W as limitDate,
113
+ Q as modifyDateByShift,
114
+ G as monthName,
115
115
  B as russianWeekDay,
116
- Z as simulateTab,
117
- $ as useDidUpdateEffect
116
+ V as simulateTab,
117
+ Z as useDidUpdateEffect
118
118
  };
119
119
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/calendar/utils.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n addDays, addMonths, eachDayOfInterval, eachMonthOfInterval, eachYearOfInterval, endOfISOWeek, endOfWeek, endOfYear, format, isAfter, isBefore, isSameDay, isSameMonth, lastDayOfMonth, max, min, startOfDay, startOfISOWeek, startOfMonth, startOfWeek, startOfYear, subDays, subMonths,\n} from 'date-fns';\n\nimport {\n DateShift, Day, Month, SpecialDays,\n} from './typings';\n\nexport const DAYS_IN_WEEK = 7;\nexport const MONTHS_IN_YEAR = 12;\nexport const SUNDAY_INDEX = 6;\n\n// export const WEEKDAYS = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];\n// export const MONTHS = [\n// 'Январь',\n// 'Февраль',\n// 'Март',\n// 'Апрель',\n// 'Май',\n// 'Июнь',\n// 'Июль',\n// 'Август',\n// 'Сентябрь',\n// 'Октябрь',\n// 'Ноябрь',\n// 'Декабрь',\n// ];\n\n/**\n * Возвращает «правильный» индекс дня недели, 0 - пн, 1 - вт и так далее.\n */\nexport function russianWeekDay(date: Date): number {\n const sunday = 0;\n const foreignWeekDayIndex = date.getDay();\n\n return foreignWeekDayIndex === sunday ? DAYS_IN_WEEK - 1 : foreignWeekDayIndex - 1;\n}\n\n/**\n * Возвращает таблицу-календарь с заполненными датами для переданного месяца\n */\nexport function generateWeeks(\n month: Date,\n options: {\n minDate?: Date;\n maxDate?: Date;\n selected?: Date;\n eventsMap?: SpecialDays;\n offDaysMap?: SpecialDays;\n },\n) {\n const newWeek = () => Array(DAYS_IN_WEEK).fill(null);\n\n const startDay = startOfMonth(month);\n\n const start = startOfISOWeek(startOfMonth(month));\n const end = endOfISOWeek(lastDayOfMonth(month));\n\n let week = newWeek();\n\n return eachDayOfInterval({ start, end }).reduce((weeks: Day[][], day: Date) => {\n const weekDay = russianWeekDay(day);\n\n week[weekDay] = buildDay(day, startDay, options);\n\n if (weekDay === SUNDAY_INDEX || isSameDay(day, end)) {\n weeks.push(week);\n week = newWeek();\n }\n\n return weeks;\n }, []);\n}\n\n/**\n * Возвращает массив с месяцами для переданного года\n */\nexport function generateMonths(year: Date, options: { minMonth?: Date; maxMonth?: Date }) {\n return eachMonthOfInterval({ start: startOfYear(year), end: endOfYear(year) }).map((month) =>\n buildMonth(month, options));\n}\n\n/**\n * Возвращает массив лет от minYear до maxYear\n */\nexport function generateYears(minYear: Date, maxYear: Date) {\n return eachYearOfInterval({\n start: min([startOfYear(maxYear), startOfYear(minYear)]),\n end: max([startOfYear(maxYear), startOfYear(minYear)]),\n }).reverse();\n}\n\n/**\n * Добавляет метаданные для переданного дня\n */\nexport function buildDay(\n day: Date,\n firstDay: Date,\n options: {\n minDate?: Date;\n maxDate?: Date;\n selected?: Date;\n eventsMap?: SpecialDays;\n offDaysMap?: SpecialDays;\n },\n): Day {\n const {\n minDate, maxDate, selected, eventsMap = {}, offDaysMap = {},\n } = options;\n const off = offDaysMap[day.getTime()];\n const disabled = (minDate && isBefore(day, minDate)) || (maxDate && isAfter(day, maxDate));\n\n return {\n date: day,\n disabled: disabled || off,\n event: eventsMap[day.getTime()],\n selected: selected && isSameDay(day, selected),\n muted: !isSameMonth(day, firstDay),\n };\n}\n\n/**\n * Добавляет метаданные для переданного месяца\n */\nexport function buildMonth(month: Date, options: { minMonth?: Date; maxMonth?: Date }): Month {\n const { minMonth, maxMonth } = options;\n\n return {\n date: month,\n disabled: (minMonth && isBefore(month, minMonth)) || (maxMonth && isAfter(month, maxMonth)),\n };\n}\n\n/**\n * Ограничивает дату на отрезке [minDate, maxDate]\n */\nexport function limitDate(date: Date | number, minDate?: Date | number, maxDate?: Date | number) {\n let limitedDate = date;\n\n if (minDate) limitedDate = max([minDate, limitedDate]);\n if (maxDate) limitedDate = min([maxDate, limitedDate]);\n\n return new Date(limitedDate);\n}\n\n/**\n * Проверяет, находится ли переданная дата в указанных границах\n */\nexport function dateInLimits(\n date?: Date | number | null,\n minDate?: Date | number,\n maxDate?: Date | number,\n) {\n return date && limitDate(date, minDate, maxDate).getTime() === new Date(date).getTime();\n}\n\n/**\n * Возвращает русское название месяца с большой буквы\n */\nexport function monthName(month: Date, locale: Locale, shortNames: boolean) {\n const monthFormat = shortNames ? 'LLL' : 'LLL';\n\n return format(month, monthFormat, { locale });\n}\n\n/**\n * Превращает массив в объект, у которого ключи составляются из элементов массива\n */\nexport function dateArrayToHashTable(arr: Array<Date | number>) {\n return arr.reduce((acc: Record<number, boolean>, v) => {\n acc[startOfDay(v).getTime()] = true;\n\n return acc;\n }, {});\n}\n\n/**\n * Возвращает корректный отрезок дат для выделения\n */\nexport function getSelectionRange(\n from?: Date | number,\n to?: Date | number,\n highlighted?: Date | number,\n) {\n const end = to || highlighted;\n\n if (from && end && from !== end) {\n return {\n start: min([from, end]),\n end: max([from, end]),\n };\n }\n\n return null;\n}\n\n// Меняет дату одним из способов с учетом границ и выходных дней\nexport function modifyDateByShift(\n shift: DateShift,\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n offDaysMap: Record<number, boolean> = {},\n) {\n const modifiers: Record<DateShift, () => Date> = {\n prev: () => subDays(date, 1),\n prevWeek: () => subDays(date, 7),\n prevMonth: () => subMonths(date, 1),\n next: () => addDays(date, 1),\n nextWeek: () => addDays(date, 7),\n nextMonth: () => addMonths(date, 1),\n startOfWeek: () => startOfWeek(date, { weekStartsOn: 1 }),\n endOfWeek: () => startOfDay(endOfWeek(date, { weekStartsOn: 1 })),\n };\n\n let newDate = modifiers[shift]();\n\n while (offDaysMap[newDate.getTime()]) {\n // Перескакиваем через выходные дни, кроме случаев с концами недели\n let amount = newDate < date ? -1 : 1;\n\n if (shift === 'endOfWeek') amount = -1;\n if (shift === 'startOfWeek') amount = 1;\n newDate = addDays(newDate, amount);\n }\n\n return limitDate(newDate, minDate, maxDate);\n}\n\n/**\n * Если дата была выбрана мышкой — фокусную обводку не видно\n * TODO: добавить в useFocus возможность переключать метод ввода программно\n */\nexport function simulateTab(node: HTMLElement) {\n if (window.KeyboardEvent) {\n const event = new window.KeyboardEvent('keydown', {\n bubbles: true,\n key: 'Tab',\n });\n\n node.dispatchEvent(event);\n }\n}\n\n// TODO: перенести в @alfalab/hooks?\nexport function useDidUpdateEffect(fn: () => void, deps: unknown[]) {\n const didMountRef = useRef(false);\n\n useEffect(() => {\n if (didMountRef.current) {\n fn();\n } else {\n didMountRef.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n"],"names":["DAYS_IN_WEEK","MONTHS_IN_YEAR","SUNDAY_INDEX","russianWeekDay","date","foreignWeekDayIndex","generateWeeks","month","options","newWeek","startDay","startOfMonth","start","startOfISOWeek","end","endOfISOWeek","lastDayOfMonth","week","eachDayOfInterval","weeks","day","weekDay","buildDay","isSameDay","generateMonths","year","eachMonthOfInterval","startOfYear","endOfYear","buildMonth","generateYears","minYear","maxYear","eachYearOfInterval","min","max","firstDay","minDate","maxDate","selected","eventsMap","offDaysMap","off","disabled","isBefore","isAfter","isSameMonth","minMonth","maxMonth","limitDate","limitedDate","dateInLimits","monthName","locale","shortNames","format","dateArrayToHashTable","arr","acc","v","startOfDay","getSelectionRange","from","to","highlighted","modifyDateByShift","shift","newDate","subDays","subMonths","addDays","addMonths","startOfWeek","endOfWeek","amount","simulateTab","node","event","useDidUpdateEffect","fn","deps","didMountRef","useRef","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/calendar/utils.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport {\n addDays,\n addMonths,\n eachDayOfInterval,\n eachMonthOfInterval,\n eachYearOfInterval,\n endOfISOWeek,\n endOfWeek,\n endOfYear,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n lastDayOfMonth,\n max,\n min,\n startOfDay,\n startOfISOWeek,\n startOfMonth,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n} from '../utils/date';\n\nimport {\n DateShift, Day, Month, SpecialDays,\n} from './typings';\n\nexport const DAYS_IN_WEEK = 7;\nexport const MONTHS_IN_YEAR = 12;\nexport const SUNDAY_INDEX = 6;\n\n// export const WEEKDAYS = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];\n// export const MONTHS = [\n// 'Январь',\n// 'Февраль',\n// 'Март',\n// 'Апрель',\n// 'Май',\n// 'Июнь',\n// 'Июль',\n// 'Август',\n// 'Сентябрь',\n// 'Октябрь',\n// 'Ноябрь',\n// 'Декабрь',\n// ];\n\n/**\n * Возвращает «правильный» индекс дня недели, 0 - пн, 1 - вт и так далее.\n */\nexport function russianWeekDay(date: Date): number {\n const sunday = 0;\n const foreignWeekDayIndex = date.getDay();\n\n return foreignWeekDayIndex === sunday ? DAYS_IN_WEEK - 1 : foreignWeekDayIndex - 1;\n}\n\n/**\n * Возвращает таблицу-календарь с заполненными датами для переданного месяца\n */\nexport function generateWeeks(\n month: Date,\n options: {\n minDate?: Date;\n maxDate?: Date;\n selected?: Date;\n eventsMap?: SpecialDays;\n offDaysMap?: SpecialDays;\n },\n) {\n const newWeek = () => Array(DAYS_IN_WEEK).fill(null);\n\n const startDay = startOfMonth(month);\n\n const start = startOfISOWeek(startOfMonth(month));\n const end = endOfISOWeek(lastDayOfMonth(month));\n\n let week = newWeek();\n\n return eachDayOfInterval({ start, end }).reduce((weeks: Day[][], day: Date) => {\n const weekDay = russianWeekDay(day);\n\n week[weekDay] = buildDay(day, startDay, options);\n\n if (weekDay === SUNDAY_INDEX || isSameDay(day, end)) {\n weeks.push(week);\n week = newWeek();\n }\n\n return weeks;\n }, []);\n}\n\n/**\n * Возвращает массив с месяцами для переданного года\n */\nexport function generateMonths(year: Date, options: { minMonth?: Date; maxMonth?: Date }) {\n return eachMonthOfInterval({ start: startOfYear(year), end: endOfYear(year) }).map((month) =>\n buildMonth(month, options));\n}\n\n/**\n * Возвращает массив лет от minYear до maxYear\n */\nexport function generateYears(minYear: Date, maxYear: Date) {\n return eachYearOfInterval({\n start: min([startOfYear(maxYear), startOfYear(minYear)]),\n end: max([startOfYear(maxYear), startOfYear(minYear)]),\n }).reverse();\n}\n\n/**\n * Добавляет метаданные для переданного дня\n */\nexport function buildDay(\n day: Date,\n firstDay: Date,\n options: {\n minDate?: Date;\n maxDate?: Date;\n selected?: Date;\n eventsMap?: SpecialDays;\n offDaysMap?: SpecialDays;\n },\n): Day {\n const {\n minDate, maxDate, selected, eventsMap = {}, offDaysMap = {},\n } = options;\n const off = offDaysMap[day.getTime()];\n const disabled = (minDate && isBefore(day, minDate)) || (maxDate && isAfter(day, maxDate));\n\n return {\n date: day,\n disabled: disabled || off,\n event: eventsMap[day.getTime()],\n selected: selected && isSameDay(day, selected),\n muted: !isSameMonth(day, firstDay),\n };\n}\n\n/**\n * Добавляет метаданные для переданного месяца\n */\nexport function buildMonth(month: Date, options: { minMonth?: Date; maxMonth?: Date }): Month {\n const { minMonth, maxMonth } = options;\n\n return {\n date: month,\n disabled: (minMonth && isBefore(month, minMonth)) || (maxMonth && isAfter(month, maxMonth)),\n };\n}\n\n/**\n * Ограничивает дату на отрезке [minDate, maxDate]\n */\nexport function limitDate(date: Date | number, minDate?: Date | number, maxDate?: Date | number) {\n let limitedDate = date;\n\n if (minDate) limitedDate = max([minDate, limitedDate]);\n if (maxDate) limitedDate = min([maxDate, limitedDate]);\n\n return new Date(limitedDate);\n}\n\n/**\n * Проверяет, находится ли переданная дата в указанных границах\n */\nexport function dateInLimits(\n date?: Date | number | null,\n minDate?: Date | number,\n maxDate?: Date | number,\n) {\n return date && limitDate(date, minDate, maxDate).getTime() === new Date(date).getTime();\n}\n\n/**\n * Локализованное название месяца (Intl).\n */\nexport function monthName(month: Date, localeTag: string, shortNames: boolean) {\n return new Intl.DateTimeFormat(localeTag, { month: shortNames ? 'short' : 'long' }).format(month);\n}\n\n/**\n * Превращает массив в объект, у которого ключи составляются из элементов массива\n */\nexport function dateArrayToHashTable(arr: Array<Date | number>) {\n return arr.reduce((acc: Record<number, boolean>, v) => {\n acc[startOfDay(v).getTime()] = true;\n\n return acc;\n }, {});\n}\n\n/**\n * Возвращает корректный отрезок дат для выделения\n */\nexport function getSelectionRange(\n from?: Date | number,\n to?: Date | number,\n highlighted?: Date | number,\n) {\n const end = to || highlighted;\n\n if (from && end && from !== end) {\n return {\n start: min([from, end]),\n end: max([from, end]),\n };\n }\n\n return null;\n}\n\n// Меняет дату одним из способов с учетом границ и выходных дней\nexport function modifyDateByShift(\n shift: DateShift,\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n offDaysMap: Record<number, boolean> = {},\n) {\n const modifiers: Record<DateShift, () => Date> = {\n prev: () => subDays(date, 1),\n prevWeek: () => subDays(date, 7),\n prevMonth: () => subMonths(date, 1),\n next: () => addDays(date, 1),\n nextWeek: () => addDays(date, 7),\n nextMonth: () => addMonths(date, 1),\n startOfWeek: () => startOfWeek(date, { weekStartsOn: 1 }),\n endOfWeek: () => startOfDay(endOfWeek(date, { weekStartsOn: 1 })),\n };\n\n let newDate = modifiers[shift]();\n\n while (offDaysMap[newDate.getTime()]) {\n // Перескакиваем через выходные дни, кроме случаев с концами недели\n let amount = newDate < date ? -1 : 1;\n\n if (shift === 'endOfWeek') amount = -1;\n if (shift === 'startOfWeek') amount = 1;\n newDate = addDays(newDate, amount);\n }\n\n return limitDate(newDate, minDate, maxDate);\n}\n\n/**\n * Если дата была выбрана мышкой — фокусную обводку не видно\n * TODO: добавить в useFocus возможность переключать метод ввода программно\n */\nexport function simulateTab(node: HTMLElement) {\n if (window.KeyboardEvent) {\n const event = new window.KeyboardEvent('keydown', {\n bubbles: true,\n key: 'Tab',\n });\n\n node.dispatchEvent(event);\n }\n}\n\n// TODO: перенести в @alfalab/hooks?\nexport function useDidUpdateEffect(fn: () => void, deps: unknown[]) {\n const didMountRef = useRef(false);\n\n useEffect(() => {\n if (didMountRef.current) {\n fn();\n } else {\n didMountRef.current = true;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n"],"names":["DAYS_IN_WEEK","MONTHS_IN_YEAR","SUNDAY_INDEX","russianWeekDay","date","foreignWeekDayIndex","generateWeeks","month","options","newWeek","startDay","startOfMonth","start","startOfISOWeek","end","endOfISOWeek","lastDayOfMonth","week","eachDayOfInterval","weeks","day","weekDay","buildDay","isSameDay","generateMonths","year","eachMonthOfInterval","startOfYear","endOfYear","buildMonth","generateYears","minYear","maxYear","eachYearOfInterval","min","max","firstDay","minDate","maxDate","selected","eventsMap","offDaysMap","off","disabled","isBefore","isAfter","isSameMonth","minMonth","maxMonth","limitDate","limitedDate","dateInLimits","monthName","localeTag","shortNames","dateArrayToHashTable","arr","acc","v","startOfDay","getSelectionRange","from","to","highlighted","modifyDateByShift","shift","newDate","subDays","subMonths","addDays","addMonths","startOfWeek","endOfWeek","amount","simulateTab","node","event","useDidUpdateEffect","fn","deps","didMountRef","useRef","useEffect"],"mappings":"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"}
@@ -4,14 +4,13 @@ import T from "react-merge-refs";
4
4
  import me from "classnames";
5
5
  import { Calendar as he } from "../calendar/component.js";
6
6
  import { dateInLimits as ve } from "../calendar/utils.js";
7
- import "date-fns";
8
7
  import { MaskedInput as ye } from "../masked-input/component.js";
9
8
  import { Popover as Re } from "../popover/component.js";
10
9
  import "../toast-notifier/component.js";
11
10
  import { formatDate as H } from "../utils/format-date/index.js";
12
11
  import { parseDateString as I, isCompleteDateInput as ge, DATE_MASK as we, SUPPORTS_INPUT_TYPE_DATE as De, NATIVE_DATE_FORMAT as Te } from "./utils.js";
13
12
  import p from "./index.module.css.js";
14
- const je = de(
13
+ const be = de(
15
14
  ({
16
15
  block: L = !1,
17
16
  className: Y,
@@ -183,6 +182,6 @@ const je = de(
183
182
  }
184
183
  );
185
184
  export {
186
- je as CalendarInput
185
+ be as CalendarInput
187
186
  };
188
187
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../src/calendar-input/component.tsx"],"sourcesContent":["/* eslint-disable multiline-comment-style */\nimport React, {\n ChangeEvent,\n FocusEvent,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Calendar, CalendarProps, dateInLimits } from '../calendar';\nimport { MaskedInput, MaskedInputProps } from '../masked-input';\nimport { Popover } from '../popover';\nimport { formatDate } from '../utils';\n\nimport {\n DATE_MASK,\n isCompleteDateInput,\n NATIVE_DATE_FORMAT,\n parseDateString,\n SUPPORTS_INPUT_TYPE_DATE,\n} from './utils';\n\nimport styles from './index.module.css';\n\nexport type CalendarInputProps = Omit<\n MaskedInputProps,\n 'mask' | 'value' | 'onChange' | 'rightAddons' | 'onBeforeDisplay'\n> & {\n /**\n * Растягивает компонент на ширину контейнера\n */\n block?: boolean;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для инпута\n */\n inputClassName?: string;\n\n /**\n * required - индикатор * лейбла для обязательного заполнения поля\n */\n required?: boolean;\n\n /**\n * Доп. пропсы для календаря\n */\n calendarProps?: CalendarProps;\n\n /**\n * Значение инпута (используется и для календаря)\n */\n value?: string;\n\n /**\n * Начальное значение инпута\n */\n defaultValue?: string;\n\n /**\n * Состояние открытия по умолчанию\n */\n defaultOpen?: boolean;\n\n /**\n * Месяц в календаре по умолчанию (timestamp)\n */\n defaultMonth?: number;\n\n /**\n * Минимальная дата, доступная для выбора (timestamp)\n */\n minDate?: number;\n\n /**\n * Максимальная дата, доступная для выбора (timestamp)\n */\n maxDate?: number;\n\n /**\n * Определяет, как рендерить календарь — в поповере или снизу инпута\n */\n calendarPosition?: 'static' | 'popover';\n\n /**\n * Запрещает поповеру менять свою позицию.\n * Например, если места снизу недостаточно,то он все равно будет показан снизу\n */\n preventFlip?: boolean;\n\n /**\n * Управление нативным режимом на мобильных устройствах\n */\n mobileMode?: 'native' | 'popover' | 'input';\n\n /**\n * Обработчик изменения значения\n */\n onChange?: (\n event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement> | null,\n payload: { date: Date; value: string },\n ) => void;\n\n /**\n * Обработчик ввода в инпут\n */\n onInputChange?: (\n event: ChangeEvent<HTMLInputElement>,\n payload: { value: string; date: Date },\n ) => void;\n\n /**\n * Обработчик изменения календаря\n */\n onCalendarChange?: CalendarProps['onChange'];\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n};\n\nexport const CalendarInput = forwardRef<HTMLInputElement, CalendarInputProps>(\n (\n {\n block = false,\n className,\n inputClassName,\n defaultOpen = false,\n defaultMonth,\n defaultValue = '',\n calendarPosition = 'popover',\n value,\n dataTestId,\n minDate,\n required,\n maxDate,\n calendarProps = {},\n preventFlip,\n mobileMode = 'popover',\n wrapperRef = null,\n disabled,\n onChange,\n onInputChange,\n onCalendarChange,\n readOnly,\n ...restProps\n },\n ref,\n ) => {\n value = value && value.split('-').length ? value.split('-').reverse().join('.') : value;\n\n const uncontrolled = value === undefined;\n const shouldRenderNative = SUPPORTS_INPUT_TYPE_DATE && mobileMode === 'native';\n const shouldRenderOnlyInput = mobileMode === 'input';\n const shouldRenderStatic = calendarPosition === 'static' && !shouldRenderOnlyInput;\n const shouldRenderPopover =\n calendarPosition === 'popover' && !shouldRenderNative && !shouldRenderOnlyInput;\n\n const [open, setOpen] = useState(false);\n\n const [stateValue, setStateValue] = useState(defaultValue);\n\n const inputValue = uncontrolled ? stateValue : value;\n const calendarValue = inputValue ? parseDateString(inputValue).getTime() : undefined;\n\n const isCalendarValueValid = dateInLimits(calendarValue, minDate, maxDate);\n\n const inputDisabled = disabled || readOnly;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const componentRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }, []);\n\n const handleClick = useCallback(() => {\n if (!open) setOpen(true);\n }, [open]);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n setOpen(true);\n\n if (!open && event.target.tagName !== 'INPUT' && calendarRef.current) {\n calendarRef.current.focus();\n }\n },\n [open],\n );\n\n const handleBlur = useCallback((event: FocusEvent<HTMLDivElement>) => {\n if (\n calendarRef.current &&\n calendarRef.current.contains(event.relatedTarget as HTMLElement) === false\n ) {\n setOpen(false);\n }\n }, []);\n\n const handleInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (['ArrowDown', 'ArrowUp'].includes(event.key) && calendarRef.current) {\n event.preventDefault();\n calendarRef.current.focus();\n }\n }, []);\n\n const changeHandler = useCallback(\n (\n event: ChangeEvent<HTMLInputElement> | null,\n newValue: string,\n newDate: Date,\n initiator: 'input' | 'calendar' = 'input',\n shouldChange = true,\n ) => {\n if (initiator === 'input' && event && onInputChange) {\n onInputChange(event, { value: newValue, date: newDate });\n }\n\n if (initiator === 'calendar' && onCalendarChange) {\n onCalendarChange(newDate.getTime());\n }\n\n if (shouldChange) {\n if (uncontrolled) {\n setStateValue(newValue);\n }\n\n if (onChange) {\n onChange(event, {\n date: newDate,\n value: newValue.split('.').reverse().join('-'),\n });\n }\n }\n },\n [onCalendarChange, onChange, onInputChange, uncontrolled],\n );\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value;\n const newDate = parseDateString(newValue);\n\n changeHandler(event, newValue, newDate, 'input', isCompleteDateInput(newValue));\n },\n [changeHandler],\n );\n\n const handleNativeInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const newDate = parseDateString(event.target.value, NATIVE_DATE_FORMAT);\n const newValue =\n event.target.value === '' ? '' : formatDate(newDate, { format: 'dd.MM.yyyy' });\n\n changeHandler(event, newValue, newDate);\n },\n [changeHandler],\n );\n\n const handleCalendarChange = useCallback(\n (date: number) => {\n changeHandler(\n null,\n formatDate(date, { format: 'dd.MM.yyyy' }),\n new Date(date),\n 'calendar',\n );\n setOpen(false);\n },\n [changeHandler],\n );\n\n const handleCalendarWrapperMouseDown = useCallback((event: MouseEvent<HTMLDivElement>) => {\n // Не дает инпуту терять фокус при выборе даты\n event.preventDefault();\n }, []);\n\n useEffect(() => {\n setOpen(defaultOpen);\n }, [defaultOpen]);\n\n const renderCalendar = useCallback(\n () => (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onMouseDown={ handleCalendarWrapperMouseDown }>\n <Calendar\n { ...calendarProps }\n ref={ calendarRef }\n defaultMonth={ defaultMonth }\n value={ isCalendarValueValid ? calendarValue : undefined }\n onChange={ handleCalendarChange }\n minDate={ minDate }\n maxDate={ maxDate }\n />\n </div>\n ),\n [\n calendarProps,\n calendarValue,\n defaultMonth,\n handleCalendarChange,\n handleCalendarWrapperMouseDown,\n isCalendarValueValid,\n maxDate,\n minDate,\n ],\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={ componentRef }\n className={ cn(styles.component, className, {\n [styles.block]: block,\n }) }\n tabIndex={ -1 }\n onKeyDown={ inputDisabled ? undefined : handleKeyDown }\n onClick={ inputDisabled ? undefined : handleClick }\n onFocus={ inputDisabled ? undefined : handleFocus }\n onBlur={ handleBlur }\n data-test-id={ dataTestId }\n >\n <MaskedInput\n { ...restProps }\n ref={ mergeRefs([ref, inputRef]) }\n wrapperRef={ mergeRefs([wrapperRef, inputWrapperRef]) }\n className={ inputClassName }\n value={ inputValue }\n required={ required }\n defaultValue={ defaultValue }\n disabled={ disabled }\n readOnly={ readOnly }\n mask={ DATE_MASK }\n rightAddons={ (\n <React.Fragment>\n <span className={ styles.calendarIcon } />\n { shouldRenderNative && (\n <input\n type=\"date\"\n ref={ mergeRefs([ref, inputRef]) }\n defaultValue={ defaultValue }\n onChange={ handleNativeInputChange }\n className={ styles.nativeInput }\n />\n ) }\n </React.Fragment>\n ) }\n onKeyDown={ handleInputKeyDown }\n onChange={ handleInputChange }\n block={ true }\n inputMode=\"numeric\"\n pattern=\"[0-9\\.]*\"\n />\n { shouldRenderStatic && renderCalendar() }\n\n { shouldRenderPopover && (\n <Popover\n open={ open }\n anchorElement={ inputWrapperRef.current as HTMLElement }\n popperClassName={ styles.calendarContainer }\n position=\"bottom-start\"\n offset={ [0, 8] }\n withTransition={ false }\n preventFlip={ preventFlip }\n >\n { renderCalendar() }\n </Popover>\n ) }\n </div>\n );\n },\n);\n"],"names":["CalendarInput","forwardRef","block","className","inputClassName","defaultOpen","defaultMonth","defaultValue","calendarPosition","value","dataTestId","minDate","required","maxDate","calendarProps","preventFlip","mobileMode","wrapperRef","disabled","onChange","onInputChange","onCalendarChange","readOnly","restProps","ref","uncontrolled","shouldRenderNative","SUPPORTS_INPUT_TYPE_DATE","shouldRenderOnlyInput","shouldRenderStatic","shouldRenderPopover","open","setOpen","useState","stateValue","setStateValue","inputValue","calendarValue","parseDateString","isCalendarValueValid","dateInLimits","inputDisabled","inputRef","useRef","inputWrapperRef","componentRef","calendarRef","handleKeyDown","useCallback","event","handleClick","handleFocus","handleBlur","handleInputKeyDown","changeHandler","newValue","newDate","initiator","shouldChange","handleInputChange","isCompleteDateInput","handleNativeInputChange","NATIVE_DATE_FORMAT","formatDate","handleCalendarChange","date","handleCalendarWrapperMouseDown","useEffect","renderCalendar","jsx","Calendar","jsxs","cn","styles","MaskedInput","mergeRefs","DATE_MASK","React","Popover"],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sources":["../../src/calendar-input/component.tsx"],"sourcesContent":["/* eslint-disable multiline-comment-style */\nimport React, {\n ChangeEvent,\n FocusEvent,\n forwardRef,\n KeyboardEvent,\n MouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Calendar, CalendarProps, dateInLimits } from '../calendar';\nimport { MaskedInput, MaskedInputProps } from '../masked-input';\nimport { Popover } from '../popover';\nimport { formatDate } from '../utils';\n\nimport {\n DATE_MASK,\n isCompleteDateInput,\n NATIVE_DATE_FORMAT,\n parseDateString,\n SUPPORTS_INPUT_TYPE_DATE,\n} from './utils';\n\nimport styles from './index.module.css';\n\nexport type CalendarInputProps = Omit<\n MaskedInputProps,\n 'mask' | 'value' | 'onChange' | 'rightAddons' | 'onBeforeDisplay'\n> & {\n /**\n * Растягивает компонент на ширину контейнера\n */\n block?: boolean;\n\n /**\n * Дополнительный класс\n */\n className?: string;\n\n /**\n * Дополнительный класс для инпута\n */\n inputClassName?: string;\n\n /**\n * required - индикатор * лейбла для обязательного заполнения поля\n */\n required?: boolean;\n\n /**\n * Доп. пропсы для календаря\n */\n calendarProps?: CalendarProps;\n\n /**\n * Значение инпута (используется и для календаря)\n */\n value?: string;\n\n /**\n * Начальное значение инпута\n */\n defaultValue?: string;\n\n /**\n * Состояние открытия по умолчанию\n */\n defaultOpen?: boolean;\n\n /**\n * Месяц в календаре по умолчанию (timestamp)\n */\n defaultMonth?: number;\n\n /**\n * Минимальная дата, доступная для выбора (timestamp)\n */\n minDate?: number;\n\n /**\n * Максимальная дата, доступная для выбора (timestamp)\n */\n maxDate?: number;\n\n /**\n * Определяет, как рендерить календарь — в поповере или снизу инпута\n */\n calendarPosition?: 'static' | 'popover';\n\n /**\n * Запрещает поповеру менять свою позицию.\n * Например, если места снизу недостаточно,то он все равно будет показан снизу\n */\n preventFlip?: boolean;\n\n /**\n * Управление нативным режимом на мобильных устройствах\n */\n mobileMode?: 'native' | 'popover' | 'input';\n\n /**\n * Обработчик изменения значения\n */\n onChange?: (\n event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement> | null,\n payload: { date: Date; value: string },\n ) => void;\n\n /**\n * Обработчик ввода в инпут\n */\n onInputChange?: (\n event: ChangeEvent<HTMLInputElement>,\n payload: { value: string; date: Date },\n ) => void;\n\n /**\n * Обработчик изменения календаря\n */\n onCalendarChange?: CalendarProps['onChange'];\n\n /**\n * Идентификатор для систем автоматизированного тестирования\n */\n dataTestId?: string;\n};\n\nexport const CalendarInput = forwardRef<HTMLInputElement, CalendarInputProps>(\n (\n {\n block = false,\n className,\n inputClassName,\n defaultOpen = false,\n defaultMonth,\n defaultValue = '',\n calendarPosition = 'popover',\n value,\n dataTestId,\n minDate,\n required,\n maxDate,\n calendarProps = {},\n preventFlip,\n mobileMode = 'popover',\n wrapperRef = null,\n disabled,\n onChange,\n onInputChange,\n onCalendarChange,\n readOnly,\n ...restProps\n },\n ref,\n ) => {\n value = value && value.split('-').length ? value.split('-').reverse().join('.') : value;\n\n const uncontrolled = value === undefined;\n const shouldRenderNative = SUPPORTS_INPUT_TYPE_DATE && mobileMode === 'native';\n const shouldRenderOnlyInput = mobileMode === 'input';\n const shouldRenderStatic = calendarPosition === 'static' && !shouldRenderOnlyInput;\n const shouldRenderPopover =\n calendarPosition === 'popover' && !shouldRenderNative && !shouldRenderOnlyInput;\n\n const [open, setOpen] = useState(false);\n\n const [stateValue, setStateValue] = useState(defaultValue);\n\n const inputValue = uncontrolled ? stateValue : value;\n const calendarValue = inputValue ? parseDateString(inputValue).getTime() : undefined;\n\n const isCalendarValueValid = dateInLimits(calendarValue, minDate, maxDate);\n\n const inputDisabled = disabled || readOnly;\n\n const inputRef = useRef<HTMLInputElement>(null);\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n const componentRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }, []);\n\n const handleClick = useCallback(() => {\n if (!open) setOpen(true);\n }, [open]);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n setOpen(true);\n\n if (!open && event.target.tagName !== 'INPUT' && calendarRef.current) {\n calendarRef.current.focus();\n }\n },\n [open],\n );\n\n const handleBlur = useCallback((event: FocusEvent<HTMLDivElement>) => {\n if (\n calendarRef.current &&\n calendarRef.current.contains(event.relatedTarget as HTMLElement) === false\n ) {\n setOpen(false);\n }\n }, []);\n\n const handleInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (['ArrowDown', 'ArrowUp'].includes(event.key) && calendarRef.current) {\n event.preventDefault();\n calendarRef.current.focus();\n }\n }, []);\n\n const changeHandler = useCallback(\n (\n event: ChangeEvent<HTMLInputElement> | null,\n newValue: string,\n newDate: Date,\n initiator: 'input' | 'calendar' = 'input',\n shouldChange = true,\n ) => {\n if (initiator === 'input' && event && onInputChange) {\n onInputChange(event, { value: newValue, date: newDate });\n }\n\n if (initiator === 'calendar' && onCalendarChange) {\n onCalendarChange(newDate.getTime());\n }\n\n if (shouldChange) {\n if (uncontrolled) {\n setStateValue(newValue);\n }\n\n if (onChange) {\n onChange(event, {\n date: newDate,\n value: newValue.split('.').reverse().join('-'),\n });\n }\n }\n },\n [onCalendarChange, onChange, onInputChange, uncontrolled],\n );\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value;\n const newDate = parseDateString(newValue);\n\n changeHandler(event, newValue, newDate, 'input', isCompleteDateInput(newValue));\n },\n [changeHandler],\n );\n\n const handleNativeInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const newDate = parseDateString(event.target.value, NATIVE_DATE_FORMAT);\n const newValue =\n event.target.value === '' ? '' : formatDate(newDate, { format: 'dd.MM.yyyy' });\n\n changeHandler(event, newValue, newDate);\n },\n [changeHandler],\n );\n\n const handleCalendarChange = useCallback(\n (date: number) => {\n changeHandler(\n null,\n formatDate(date, { format: 'dd.MM.yyyy' }),\n new Date(date),\n 'calendar',\n );\n setOpen(false);\n },\n [changeHandler],\n );\n\n const handleCalendarWrapperMouseDown = useCallback((event: MouseEvent<HTMLDivElement>) => {\n // Не дает инпуту терять фокус при выборе даты\n event.preventDefault();\n }, []);\n\n useEffect(() => {\n setOpen(defaultOpen);\n }, [defaultOpen]);\n\n const renderCalendar = useCallback(\n () => (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onMouseDown={ handleCalendarWrapperMouseDown }>\n <Calendar\n { ...calendarProps }\n ref={ calendarRef }\n defaultMonth={ defaultMonth }\n value={ isCalendarValueValid ? calendarValue : undefined }\n onChange={ handleCalendarChange }\n minDate={ minDate }\n maxDate={ maxDate }\n />\n </div>\n ),\n [\n calendarProps,\n calendarValue,\n defaultMonth,\n handleCalendarChange,\n handleCalendarWrapperMouseDown,\n isCalendarValueValid,\n maxDate,\n minDate,\n ],\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={ componentRef }\n className={ cn(styles.component, className, {\n [styles.block]: block,\n }) }\n tabIndex={ -1 }\n onKeyDown={ inputDisabled ? undefined : handleKeyDown }\n onClick={ inputDisabled ? undefined : handleClick }\n onFocus={ inputDisabled ? undefined : handleFocus }\n onBlur={ handleBlur }\n data-test-id={ dataTestId }\n >\n <MaskedInput\n { ...restProps }\n ref={ mergeRefs([ref, inputRef]) }\n wrapperRef={ mergeRefs([wrapperRef, inputWrapperRef]) }\n className={ inputClassName }\n value={ inputValue }\n required={ required }\n defaultValue={ defaultValue }\n disabled={ disabled }\n readOnly={ readOnly }\n mask={ DATE_MASK }\n rightAddons={ (\n <React.Fragment>\n <span className={ styles.calendarIcon } />\n { shouldRenderNative && (\n <input\n type=\"date\"\n ref={ mergeRefs([ref, inputRef]) }\n defaultValue={ defaultValue }\n onChange={ handleNativeInputChange }\n className={ styles.nativeInput }\n />\n ) }\n </React.Fragment>\n ) }\n onKeyDown={ handleInputKeyDown }\n onChange={ handleInputChange }\n block={ true }\n inputMode=\"numeric\"\n pattern=\"[0-9\\.]*\"\n />\n { shouldRenderStatic && renderCalendar() }\n\n { shouldRenderPopover && (\n <Popover\n open={ open }\n anchorElement={ inputWrapperRef.current as HTMLElement }\n popperClassName={ styles.calendarContainer }\n position=\"bottom-start\"\n offset={ [0, 8] }\n withTransition={ false }\n preventFlip={ preventFlip }\n >\n { renderCalendar() }\n </Popover>\n ) }\n </div>\n );\n },\n);\n"],"names":["CalendarInput","forwardRef","block","className","inputClassName","defaultOpen","defaultMonth","defaultValue","calendarPosition","value","dataTestId","minDate","required","maxDate","calendarProps","preventFlip","mobileMode","wrapperRef","disabled","onChange","onInputChange","onCalendarChange","readOnly","restProps","ref","uncontrolled","shouldRenderNative","SUPPORTS_INPUT_TYPE_DATE","shouldRenderOnlyInput","shouldRenderStatic","shouldRenderPopover","open","setOpen","useState","stateValue","setStateValue","inputValue","calendarValue","parseDateString","isCalendarValueValid","dateInLimits","inputDisabled","inputRef","useRef","inputWrapperRef","componentRef","calendarRef","handleKeyDown","useCallback","event","handleClick","handleFocus","handleBlur","handleInputKeyDown","changeHandler","newValue","newDate","initiator","shouldChange","handleInputChange","isCompleteDateInput","handleNativeInputChange","NATIVE_DATE_FORMAT","formatDate","handleCalendarChange","date","handleCalendarWrapperMouseDown","useEffect","renderCalendar","jsx","Calendar","jsxs","cn","styles","MaskedInput","mergeRefs","DATE_MASK","React","Popover"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { parse as n } from "date-fns";
2
- const d = "dd.MM.yyyy", a = "yyyy-MM-dd", o = [/\d/, /\d/, ".", /\d/, /\d/, ".", /\d/, /\d/, /\d/, /\d/], s = typeof window != "undefined", c = s && u(), r = (t) => t.length === o.length, i = (t, e = d) => n(t, e, /* @__PURE__ */ new Date());
1
+ import { parse as n } from "../utils/date/index.js";
2
+ const d = "dd.MM.yyyy", c = "yyyy-MM-dd", o = [/\d/, /\d/, ".", /\d/, /\d/, ".", /\d/, /\d/, /\d/, /\d/], s = typeof window != "undefined", r = s && u(), a = (t) => t.length === o.length, i = (t, e = d) => n(t, e);
3
3
  function u() {
4
4
  const t = document.createElement("input"), e = "a";
5
5
  return t.setAttribute("type", "date"), t.setAttribute("value", e), t.value !== e;
@@ -8,9 +8,9 @@ export {
8
8
  d as DATE_FORMAT,
9
9
  o as DATE_MASK,
10
10
  s as IS_BROWSER,
11
- a as NATIVE_DATE_FORMAT,
12
- c as SUPPORTS_INPUT_TYPE_DATE,
13
- r as isCompleteDateInput,
11
+ c as NATIVE_DATE_FORMAT,
12
+ r as SUPPORTS_INPUT_TYPE_DATE,
13
+ a as isCompleteDateInput,
14
14
  u as isInputDateSupported,
15
15
  i as parseDateString
16
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/calendar-input/utils.ts"],"sourcesContent":["import { parse } from 'date-fns';\n\nexport const DATE_FORMAT = 'dd.MM.yyyy';\nexport const NATIVE_DATE_FORMAT = 'yyyy-MM-dd';\nexport const DATE_MASK = [/\\d/, /\\d/, '.', /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, /\\d/];\nexport const IS_BROWSER = typeof window !== 'undefined';\nexport const SUPPORTS_INPUT_TYPE_DATE = IS_BROWSER && isInputDateSupported();\n\nexport const isCompleteDateInput = (input: string) => input.length === DATE_MASK.length;\n\nexport const parseDateString = (value: string, dateFormat = DATE_FORMAT) =>\n parse(value, dateFormat, new Date());\n\n/**\n * Возвращает `true`, если поддерживается `input[type=\"date\"]`\n */\nexport function isInputDateSupported() {\n const input = document.createElement('input');\n const value = 'a';\n\n input.setAttribute('type', 'date');\n input.setAttribute('value', value);\n\n return input.value !== value;\n}\n"],"names":["DATE_FORMAT","NATIVE_DATE_FORMAT","DATE_MASK","IS_BROWSER","SUPPORTS_INPUT_TYPE_DATE","isInputDateSupported","isCompleteDateInput","input","parseDateString","value","dateFormat","parse"],"mappings":";AAEO,MAAMA,IAAc,cACdC,IAAqB,cACrBC,IAAY,CAAC,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,GACrEC,IAAa,OAAO,UAAW,aAC/BC,IAA2BD,KAAcE,EAAA,GAEzCC,IAAsB,CAACC,MAAkBA,EAAM,WAAWL,EAAU,QAEpEM,IAAkB,CAACC,GAAeC,IAAaV,MACxDW,EAAMF,GAAOC,GAAY,oBAAI,KAAA,CAAM;AAKhC,SAASL,IAAuB;AACnC,QAAME,IAAQ,SAAS,cAAc,OAAO,GACtCE,IAAQ;AAEd,SAAAF,EAAM,aAAa,QAAQ,MAAM,GACjCA,EAAM,aAAa,SAASE,CAAK,GAE1BF,EAAM,UAAUE;AAC3B;"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/calendar-input/utils.ts"],"sourcesContent":["import { parse } from '../utils/date';\n\nexport const DATE_FORMAT = 'dd.MM.yyyy';\nexport const NATIVE_DATE_FORMAT = 'yyyy-MM-dd';\nexport const DATE_MASK = [/\\d/, /\\d/, '.', /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, /\\d/];\nexport const IS_BROWSER = typeof window !== 'undefined';\nexport const SUPPORTS_INPUT_TYPE_DATE = IS_BROWSER && isInputDateSupported();\n\nexport const isCompleteDateInput = (input: string) => input.length === DATE_MASK.length;\n\nexport const parseDateString = (value: string, dateFormat = DATE_FORMAT) =>\n parse(value, dateFormat, new Date());\n\n/**\n * Возвращает `true`, если поддерживается `input[type=\"date\"]`\n */\nexport function isInputDateSupported() {\n const input = document.createElement('input');\n const value = 'a';\n\n input.setAttribute('type', 'date');\n input.setAttribute('value', value);\n\n return input.value !== value;\n}\n"],"names":["DATE_FORMAT","NATIVE_DATE_FORMAT","DATE_MASK","IS_BROWSER","SUPPORTS_INPUT_TYPE_DATE","isInputDateSupported","isCompleteDateInput","input","parseDateString","value","dateFormat","parse"],"mappings":";AAEO,MAAMA,IAAc,cACdC,IAAqB,cACrBC,IAAY,CAAC,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,GACrEC,IAAa,OAAO,UAAW,aAC/BC,IAA2BD,KAAcE,EAAA,GAEzCC,IAAsB,CAACC,MAAkBA,EAAM,WAAWL,EAAU,QAEpEM,IAAkB,CAACC,GAAeC,IAAaV,MACxDW,EAAMF,GAAOC,CAAsB;AAKhC,SAASL,IAAuB;AACnC,QAAME,IAAQ,SAAS,cAAc,OAAO,GACtCE,IAAQ;AAEd,SAAAF,EAAM,aAAa,QAAQ,MAAM,GACjCA,EAAM,aAAa,SAASE,CAAK,GAE1BF,EAAM,UAAUE;AAC3B;"}
@@ -2,7 +2,7 @@ import { jsxs as A, jsx as e } from "react/jsx-runtime";
2
2
  import D from "@alphakits/icons/dist/ChevronBackM";
3
3
  import B from "@alphakits/icons/dist/ChevronForwardM";
4
4
  import F from "classnames";
5
- import { startOfISOWeek as x, parseISO as i, isAfter as N, isBefore as R, isToday as S, format as t, subDays as C, subWeeks as E, add as c } from "date-fns";
5
+ import { startOfISOWeek as x, parseISO as i, isAfter as N, isBefore as R, isToday as S, format as t, subDays as C, subWeeks as E, add as c } from "../utils/date/index.js";
6
6
  import { Button as I } from "../button/component.js";
7
7
  import { IconButton as m } from "../icon-button/component.js";
8
8
  import { Typography as W } from "../typography/component.js";
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../src/date-switcher/component.tsx"],"sourcesContent":["import React from 'react';\nimport ChevronBackM from '@alphakits/icons/dist/ChevronBackM';\nimport ChevronForwardM from '@alphakits/icons/dist/ChevronForwardM';\nimport cn from 'classnames';\nimport {\n add, format, isAfter, isBefore, isToday, parseISO, startOfISOWeek, subDays, subWeeks,\n} from 'date-fns';\n\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Typography } from '../typography';\n\nimport styles from './index.module.css';\n\nexport interface DateSwitcherProps {\n view?: 'day' | 'week';\n startDate: string;\n onChange: (date: string) => void;\n /** format yyyy-MM-dd */\n minDate?: string;\n /** format yyyy-MM-dd */\n maxDate?: string;\n\n todayLabel: string;\n}\n\nconst FORMAT_OF_RETURN_DATE = 'yyyy-MM-dd';\nconst FORMAT_OF_DATE = 'dd.MM.yy';\n\nexport const DateSwitcher = ({\n view = 'day', startDate, onChange, minDate, maxDate, todayLabel,\n}: DateSwitcherProps) => {\n const firstDayOfWeek = startOfISOWeek(parseISO(startDate));\n const date = view === 'day' ? parseISO(startDate) : firstDayOfWeek;\n\n const minimalDate = minDate ? parseISO(minDate) : new Date();\n\n const handleAdd = () => {\n if (view === 'day') onChange(format(add(date, { days: 1 }), FORMAT_OF_RETURN_DATE));\n if (view === 'week') onChange(format(add(date, { days: 7 }), FORMAT_OF_RETURN_DATE));\n };\n const handleSub = () => {\n if (view === 'day') onChange(format(subDays(date, 1), FORMAT_OF_RETURN_DATE));\n if (view === 'week') onChange(format(subWeeks(date, 1), FORMAT_OF_RETURN_DATE));\n };\n\n const handleToday = () => {\n onChange(format(new Date(), FORMAT_OF_RETURN_DATE));\n };\n\n const formatDateByView = () => {\n if (view === 'day') return format(date, FORMAT_OF_DATE);\n\n return `${format(date, FORMAT_OF_DATE)} - ${format(\n add(date, { days: 6 }),\n FORMAT_OF_DATE,\n )}`;\n };\n\n const canClickOnPrev = isAfter(date, minimalDate);\n const canClickOnNext = maxDate ? isBefore(date, parseISO(maxDate)) : true;\n const isTodayDay = isToday(date);\n\n return (\n <div className={ styles.date_switcher }>\n <IconButton\n disabled={ !!minDate && !canClickOnPrev }\n onClick={ handleSub }\n icon={ ChevronBackM }\n />\n <div className={ cn(styles.date_wrap, styles[view]) }>\n <Typography.Text tag=\"div\" view=\"title\" color=\"secondary\" weight=\"bold\">\n { formatDateByView() }\n </Typography.Text>\n </div>\n <IconButton disabled={ !canClickOnNext } onClick={ handleAdd } icon={ ChevronForwardM } />\n <Button disabled={ isTodayDay } onClick={ handleToday } view=\"ghost\">\n { todayLabel }\n </Button>\n </div>\n );\n};\n"],"names":["FORMAT_OF_RETURN_DATE","FORMAT_OF_DATE","DateSwitcher","view","startDate","onChange","minDate","maxDate","todayLabel","firstDayOfWeek","startOfISOWeek","parseISO","date","minimalDate","handleAdd","format","add","handleSub","subDays","subWeeks","handleToday","formatDateByView","canClickOnPrev","isAfter","canClickOnNext","isBefore","isTodayDay","isToday","jsxs","styles","jsx","IconButton","ChevronBackM","cn","Typography","ChevronForwardM","Button"],"mappings":";;;;;;;;;AA0BA,MAAMA,IAAwB,cACxBC,IAAiB,YAEVC,IAAe,CAAC;AAAA,EACzB,MAAAC,IAAO;AAAA,EAAO,WAAAC;AAAA,EAAW,UAAAC;AAAA,EAAU,SAAAC;AAAA,EAAS,SAAAC;AAAA,EAAS,YAAAC;AACzD,MAAyB;AACrB,QAAMC,IAAiBC,EAAeC,EAASP,CAAS,CAAC,GACnDQ,IAAOT,MAAS,QAAQQ,EAASP,CAAS,IAAIK,GAE9CI,IAAcP,IAAUK,EAASL,CAAO,wBAAQ,KAAA,GAEhDQ,IAAY,MAAM;AACpB,IAAIX,MAAS,SAAOE,EAASU,EAAOC,EAAIJ,GAAM,EAAE,MAAM,GAAG,GAAGZ,CAAqB,CAAC,GAC9EG,MAAS,UAAQE,EAASU,EAAOC,EAAIJ,GAAM,EAAE,MAAM,GAAG,GAAGZ,CAAqB,CAAC;AAAA,EACvF,GACMiB,IAAY,MAAM;AACpB,IAAId,MAAS,SAAOE,EAASU,EAAOG,EAAQN,GAAM,CAAC,GAAGZ,CAAqB,CAAC,GACxEG,MAAS,UAAQE,EAASU,EAAOI,EAASP,GAAM,CAAC,GAAGZ,CAAqB,CAAC;AAAA,EAClF,GAEMoB,IAAc,MAAM;AACtB,IAAAf,EAASU,EAAO,oBAAI,KAAA,GAAQf,CAAqB,CAAC;AAAA,EACtD,GAEMqB,IAAmB,MACjBlB,MAAS,QAAcY,EAAOH,GAAMX,CAAc,IAE/C,GAAGc,EAAOH,GAAMX,CAAc,CAAC,MAAMc;AAAA,IACxCC,EAAIJ,GAAM,EAAE,MAAM,GAAG;AAAA,IACrBX;AAAA,EAAA,CACH,IAGCqB,IAAiBC,EAAQX,GAAMC,CAAW,GAC1CW,IAAiBjB,IAAUkB,EAASb,GAAMD,EAASJ,CAAO,CAAC,IAAI,IAC/DmB,IAAaC,EAAQf,CAAI;AAE/B,SACI,gBAAAgB,EAAC,OAAA,EAAI,WAAYC,EAAO,eACpB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,UAAW,CAAC,CAACzB,KAAW,CAACgB;AAAA,QACzB,SAAUL;AAAA,QACV,MAAOe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,gBAAAF,EAAC,OAAA,EAAI,WAAYG,EAAGJ,EAAO,WAAWA,EAAO1B,CAAI,CAAC,GAC9C,UAAA,gBAAA2B,EAACI,EAAW,MAAX,EAAgB,KAAI,OAAM,MAAK,SAAQ,OAAM,aAAY,QAAO,QAC3D,UAAAb,EAAA,EAAiB,CACvB,EAAA,CACJ;AAAA,IACA,gBAAAS,EAACC,KAAW,UAAW,CAACP,GAAiB,SAAUV,GAAY,MAAOqB,GAAkB;AAAA,IACxF,gBAAAL,EAACM,KAAO,UAAWV,GAAa,SAAUN,GAAc,MAAK,SACvD,UAAAZ,EAAA,CACN;AAAA,EAAA,GACJ;AAER;"}
1
+ {"version":3,"file":"component.js","sources":["../../src/date-switcher/component.tsx"],"sourcesContent":["import React from 'react';\nimport ChevronBackM from '@alphakits/icons/dist/ChevronBackM';\nimport ChevronForwardM from '@alphakits/icons/dist/ChevronForwardM';\nimport cn from 'classnames';\nimport {\n add,\n format,\n isAfter,\n isBefore,\n isToday,\n parseISO,\n startOfISOWeek,\n subDays,\n subWeeks,\n} from '../utils/date';\n\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Typography } from '../typography';\n\nimport styles from './index.module.css';\n\nexport interface DateSwitcherProps {\n view?: 'day' | 'week';\n startDate: string;\n onChange: (date: string) => void;\n /** format yyyy-MM-dd */\n minDate?: string;\n /** format yyyy-MM-dd */\n maxDate?: string;\n\n todayLabel: string;\n}\n\nconst FORMAT_OF_RETURN_DATE = 'yyyy-MM-dd';\nconst FORMAT_OF_DATE = 'dd.MM.yy';\n\nexport const DateSwitcher = ({\n view = 'day', startDate, onChange, minDate, maxDate, todayLabel,\n}: DateSwitcherProps) => {\n const firstDayOfWeek = startOfISOWeek(parseISO(startDate));\n const date = view === 'day' ? parseISO(startDate) : firstDayOfWeek;\n\n const minimalDate = minDate ? parseISO(minDate) : new Date();\n\n const handleAdd = () => {\n if (view === 'day') onChange(format(add(date, { days: 1 }), FORMAT_OF_RETURN_DATE));\n if (view === 'week') onChange(format(add(date, { days: 7 }), FORMAT_OF_RETURN_DATE));\n };\n const handleSub = () => {\n if (view === 'day') onChange(format(subDays(date, 1), FORMAT_OF_RETURN_DATE));\n if (view === 'week') onChange(format(subWeeks(date, 1), FORMAT_OF_RETURN_DATE));\n };\n\n const handleToday = () => {\n onChange(format(new Date(), FORMAT_OF_RETURN_DATE));\n };\n\n const formatDateByView = () => {\n if (view === 'day') return format(date, FORMAT_OF_DATE);\n\n return `${format(date, FORMAT_OF_DATE)} - ${format(\n add(date, { days: 6 }),\n FORMAT_OF_DATE,\n )}`;\n };\n\n const canClickOnPrev = isAfter(date, minimalDate);\n const canClickOnNext = maxDate ? isBefore(date, parseISO(maxDate)) : true;\n const isTodayDay = isToday(date);\n\n return (\n <div className={ styles.date_switcher }>\n <IconButton\n disabled={ !!minDate && !canClickOnPrev }\n onClick={ handleSub }\n icon={ ChevronBackM }\n />\n <div className={ cn(styles.date_wrap, styles[view]) }>\n <Typography.Text tag=\"div\" view=\"title\" color=\"secondary\" weight=\"bold\">\n { formatDateByView() }\n </Typography.Text>\n </div>\n <IconButton disabled={ !canClickOnNext } onClick={ handleAdd } icon={ ChevronForwardM } />\n <Button disabled={ isTodayDay } onClick={ handleToday } view=\"ghost\">\n { todayLabel }\n </Button>\n </div>\n );\n};\n"],"names":["FORMAT_OF_RETURN_DATE","FORMAT_OF_DATE","DateSwitcher","view","startDate","onChange","minDate","maxDate","todayLabel","firstDayOfWeek","startOfISOWeek","parseISO","date","minimalDate","handleAdd","format","add","handleSub","subDays","subWeeks","handleToday","formatDateByView","canClickOnPrev","isAfter","canClickOnNext","isBefore","isTodayDay","isToday","jsxs","styles","jsx","IconButton","ChevronBackM","cn","Typography","ChevronForwardM","Button"],"mappings":";;;;;;;;;AAkCA,MAAMA,IAAwB,cACxBC,IAAiB,YAEVC,IAAe,CAAC;AAAA,EACzB,MAAAC,IAAO;AAAA,EAAO,WAAAC;AAAA,EAAW,UAAAC;AAAA,EAAU,SAAAC;AAAA,EAAS,SAAAC;AAAA,EAAS,YAAAC;AACzD,MAAyB;AACrB,QAAMC,IAAiBC,EAAeC,EAASP,CAAS,CAAC,GACnDQ,IAAOT,MAAS,QAAQQ,EAASP,CAAS,IAAIK,GAE9CI,IAAcP,IAAUK,EAASL,CAAO,wBAAQ,KAAA,GAEhDQ,IAAY,MAAM;AACpB,IAAIX,MAAS,SAAOE,EAASU,EAAOC,EAAIJ,GAAM,EAAE,MAAM,GAAG,GAAGZ,CAAqB,CAAC,GAC9EG,MAAS,UAAQE,EAASU,EAAOC,EAAIJ,GAAM,EAAE,MAAM,GAAG,GAAGZ,CAAqB,CAAC;AAAA,EACvF,GACMiB,IAAY,MAAM;AACpB,IAAId,MAAS,SAAOE,EAASU,EAAOG,EAAQN,GAAM,CAAC,GAAGZ,CAAqB,CAAC,GACxEG,MAAS,UAAQE,EAASU,EAAOI,EAASP,GAAM,CAAC,GAAGZ,CAAqB,CAAC;AAAA,EAClF,GAEMoB,IAAc,MAAM;AACtB,IAAAf,EAASU,EAAO,oBAAI,KAAA,GAAQf,CAAqB,CAAC;AAAA,EACtD,GAEMqB,IAAmB,MACjBlB,MAAS,QAAcY,EAAOH,GAAMX,CAAc,IAE/C,GAAGc,EAAOH,GAAMX,CAAc,CAAC,MAAMc;AAAA,IACxCC,EAAIJ,GAAM,EAAE,MAAM,GAAG;AAAA,IACrBX;AAAA,EAAA,CACH,IAGCqB,IAAiBC,EAAQX,GAAMC,CAAW,GAC1CW,IAAiBjB,IAAUkB,EAASb,GAAMD,EAASJ,CAAO,CAAC,IAAI,IAC/DmB,IAAaC,EAAQf,CAAI;AAE/B,SACI,gBAAAgB,EAAC,OAAA,EAAI,WAAYC,EAAO,eACpB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,UAAW,CAAC,CAACzB,KAAW,CAACgB;AAAA,QACzB,SAAUL;AAAA,QACV,MAAOe;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,gBAAAF,EAAC,OAAA,EAAI,WAAYG,EAAGJ,EAAO,WAAWA,EAAO1B,CAAI,CAAC,GAC9C,UAAA,gBAAA2B,EAACI,EAAW,MAAX,EAAgB,KAAI,OAAM,MAAK,SAAQ,OAAM,aAAY,QAAO,QAC3D,UAAAb,EAAA,EAAiB,CACvB,EAAA,CACJ;AAAA,IACA,gBAAAS,EAACC,KAAW,UAAW,CAACP,GAAiB,SAAUV,GAAY,MAAOqB,GAAkB;AAAA,IACxF,gBAAAL,EAACM,KAAO,UAAWV,GAAa,SAAUN,GAAc,MAAK,SACvD,UAAAZ,EAAA,CACN;AAAA,EAAA,GACJ;AAER;"}