@rt-tools/ui-kit-v2 0.28.0 → 0.29.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 (49) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +2 -2
  2. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +9 -4
  4. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  5. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +37 -4
  6. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  7. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +2 -2
  8. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  9. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  13. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +2 -2
  14. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  15. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  17. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +2 -2
  18. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  19. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +367 -23
  20. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  21. package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs +2 -2
  22. package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs.map +1 -1
  23. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -2
  24. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  25. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
  26. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
  27. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +2 -2
  28. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/src/lib/components/calendar/rt-calendar.component.scss +3 -2
  31. package/src/lib/components/container/CONTEXT.md +6 -0
  32. package/src/lib/components/container/rt-container.component.scss +4 -0
  33. package/src/lib/components/data-list/toolbar/rt-data-list-toolbar.component.scss +1 -1
  34. package/src/lib/components/dynamic-list/rt-dynamic-list.component.scss +1 -1
  35. package/src/lib/components/filter-control/rt-filter-control.component.scss +4 -2
  36. package/src/lib/components/page-header/CONTEXT.md +12 -0
  37. package/src/lib/components/page-header/more/rt-page-header-more.component.scss +7 -0
  38. package/src/lib/components/page-header/rt-page-header-mobile.scss +24 -0
  39. package/src/lib/components/page-header/rt-page-header.component.scss +25 -3
  40. package/src/lib/components/pdf-viewer/rt-pdf-viewer.component.scss +1 -1
  41. package/src/lib/components/toolbar/rt-toolbar.component.scss +3 -1
  42. package/src/lib/components/workspace/rt-workspace.component.scss +8 -6
  43. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +5 -3
  44. package/src/styles/_breakpoints.scss +19 -0
  45. package/src/styles/_index.scss +4 -0
  46. package/src/styles/_place.scss +7 -0
  47. package/styles/tokens.css +8 -0
  48. package/types/rt-tools-ui-kit-v2-core.d.ts +24 -5
  49. package/types/rt-tools-ui-kit-v2-page-header.d.ts +60 -6
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-date-picker.mjs","names":["MONTH_LEN","BEM_BLOCK","YEAR_LEN"],"sources":["../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-panel.logic.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/panel/rt-date-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/panel/rt-date-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-text.logic.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.html"],"sourcesContent":["import { ERtCalendarDayState, IRtCalendar } from '@rt-tools/ui-kit-v2/calendar';\nimport { IRtDatePicker } from './rt-date-picker.model';\n\n/**\n * Чистая логика панели rt-date-picker: чтение и запись значения, месяц, границы, колонки времени\n * и клавиши сетки. Текущий момент приходит параметром — компонент читает часы на своей границе.\n *\n * Значения — строки формы нативного input'а: `YYYY-MM-DD`, `HH:mm`, `YYYY-MM-DDTHH:mm`. Строки\n * одной формы сравниваются как текст, поэтому границы сравниваются обрезанными до длины значения.\n */\n\nconst DAY_RE: RegExp = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_RE: RegExp = /^(\\d{2}):(\\d{2})$/;\nconst DAY_LENGTH_MS: number = 86_400_000;\nconst WEEK: number = 7;\nconst DAY_LEN: number = 10;\nconst MONTH_LEN: number = 7;\nconst TIME_LEN: number = 5;\n\ninterface IWeekInfo {\n firstDay: number;\n}\n\ntype TLocaleWithWeek = Intl.Locale & { weekInfo?: IWeekInfo; getWeekInfo?: () => IWeekInfo };\n\n/** Числа строки даты или времени: `2026-09-29` → `[2026, 9, 29]`. */\nfunction nums(text: string): number[] {\n return text.split(/\\D/).map(Number);\n}\n\n/**\n * Строка формы значения как число: `2026-09-29T10:05` → `202609291005`. Строки одной формы\n * сравниваются по этому числу так же, как по порядку дат.\n */\nfunction rank(text: string): number {\n return Number(text.replace(/\\D/g, ''));\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction dayToMs(day: string): number {\n const [y, m, d]: number[] = nums(day);\n return Date.UTC(y, m - 1, d);\n}\n\nfunction msToDay(ms: number): string {\n const date: Date = new Date(ms);\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\nfunction isDay(text: string): boolean {\n const match: RegExpExecArray | null = DAY_RE.exec(text);\n if (match === null) {\n return false;\n }\n const month: number = Number(match[2]);\n const day: number = Number(match[3]);\n return month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth(Number(match[1]), month);\n}\n\nfunction isTime(text: string): boolean {\n const match: RegExpExecArray | null = TIME_RE.exec(text);\n return match !== null && Number(match[1]) < 24 && Number(match[2]) < 60;\n}\n\n/** Время `HH:mm` из часа и минуты. */\nexport function rtDateTime(hour: number, minute: number): string {\n return `${pad(hour)}:${pad(minute)}`;\n}\n\n/** Первый день недели локали: 1 — понедельник … 7 — воскресенье. */\nexport function rtDateFirstDay(locale: string): number {\n const info: TLocaleWithWeek = new Intl.Locale(locale);\n return (info.getWeekInfo?.() ?? info.weekInfo)?.firstDay ?? 1;\n}\n\n/** Читает текст формы значения; `null` — текст не значение этого типа. */\nexport function rtDateRead(text: string, type: IRtDatePicker.Type): string | null {\n const value: string = text.trim();\n if (type === 'date') {\n return isDay(value) ? value : null;\n }\n if (type === 'time') {\n return isTime(value) ? value : null;\n }\n const parts: string[] = value.split('T');\n return parts.length === 2 && isDay(parts[0]) && isTime(parts[1]) ? value : null;\n}\n\n/** Собирает значение типа из дня и времени; без нужной части — пустая строка. */\nexport function rtDateWrite(type: IRtDatePicker.Type, day: string | null, time: string | null): string {\n if (type === 'date') {\n return day ?? '';\n }\n if (type === 'time') {\n return time ?? '';\n }\n return day !== null && time !== null ? `${day}T${time}` : '';\n}\n\n/** Разбирает значение на день и время; недостающая часть — `null`. */\nexport function rtDateSplit(value: string, type: IRtDatePicker.Type): { day: string | null; time: string | null } {\n if (value === '') {\n return { day: null, time: null };\n }\n if (type === 'time') {\n return { day: null, time: value };\n }\n return { day: value.slice(0, DAY_LEN), time: type === 'date' ? null : value.slice(DAY_LEN + 1) };\n}\n\n/** Лежит ли значение в границах; граница обрезается до длины значения, `null` — открыта. */\nexport function rtDateInBounds(value: string, min: string | null, max: string | null): boolean {\n const low: string | null = min === null ? null : min.slice(0, value.length);\n const high: string | null = max === null ? null : max.slice(0, value.length);\n return (low === null || rank(value) >= rank(low)) && (high === null || rank(value) <= rank(high));\n}\n\n/** Текущий момент: день и время, округлённое вниз до шага минут. */\nexport function rtDateNow(now: Date, step: number): IRtDatePicker.Moment {\n const minute: number = Math.floor(now.getMinutes() / step) * step;\n return {\n day: `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`,\n time: `${pad(now.getHours())}:${pad(minute)}`,\n };\n}\n\n/** Сдвигает месяц `YYYY-MM` на `delta` месяцев. */\nexport function rtDateAddMonths(month: string, delta: number): string {\n const [y, m]: number[] = nums(month);\n const date: Date = new Date(Date.UTC(y, m - 1 + delta, 1));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}`;\n}\n\n/** Можно ли листать от месяца на `delta`: соседний месяц не лежит за границей. */\nexport function rtDateCanPage(month: string, delta: number, min: string | null, max: string | null): boolean {\n return rtDateInBounds(rtDateAddMonths(month, delta), min, max);\n}\n\nfunction monthTitle(month: string, locale: string): string {\n const [y, m]: number[] = nums(month);\n const name: string = new Intl.DateTimeFormat(locale, { month: 'long', timeZone: 'UTC' }).format(Date.UTC(y, m - 1, 1));\n return `${name.charAt(0).toLocaleUpperCase(locale)}${name.slice(1)} ${y}`;\n}\n\nfunction dayCell(day: string, ctx: IRtDatePicker.MonthContext): IRtCalendar.Day {\n return {\n key: day,\n dayOfMonth: Number(day.slice(8)),\n sublabel: '',\n state: day === ctx.chosen ? ERtCalendarDayState.Chosen : ERtCalendarDayState.Free,\n disabled: !rtDateInBounds(day, ctx.min, ctx.max),\n today: day === ctx.today,\n };\n}\n\n/** Месяц `YYYY-MM` для календаря: подпись по локали, пустые ячейки до первого дня, дни. */\nexport function rtDateMonth(month: string, ctx: IRtDatePicker.MonthContext): IRtCalendar.Month {\n const [y, m]: number[] = nums(month);\n const first: number = Date.UTC(y, m - 1, 1);\n const weekday: number = new Date(first).getUTCDay() || WEEK;\n const blanks: number = (weekday - rtDateFirstDay(ctx.locale) + WEEK) % WEEK;\n const days: IRtCalendar.Day[] = Array.from({ length: daysInMonth(y, m) }, (_: unknown, i: number): IRtCalendar.Day =>\n dayCell(msToDay(first + i * DAY_LENGTH_MS), ctx)\n );\n const leadingBlanks: number[] = Array.from({ length: blanks }, (_: unknown, i: number): number => i);\n return { key: month, label: monthTitle(month, ctx.locale), leadingBlanks, days };\n}\n\n/** Короткие имена дней недели по локали, начиная с её первого дня. */\nexport function rtDateWeekdays(locale: string): string[] {\n const format: Intl.DateTimeFormat = new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' });\n // 2024-01-01 — понедельник.\n const monday: number = Date.UTC(2024, 0, 1);\n const shift: number = rtDateFirstDay(locale) - 1;\n return Array.from({ length: WEEK }, (_: unknown, i: number): string => format.format(monday + ((i + shift) % WEEK) * DAY_LENGTH_MS));\n}\n\n/** Двенадцать месяцев года для выбора месяца; месяц за границей выключен. */\nexport function rtDateMonths(year: number, locale: string, min: string | null, max: string | null): IRtDatePicker.MonthCell[] {\n const format: Intl.DateTimeFormat = new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' });\n return Array.from({ length: 12 }, (_: unknown, i: number): IRtDatePicker.MonthCell => {\n const key: string = `${year}-${pad(i + 1)}`;\n return { key, label: format.format(Date.UTC(year, i, 1)), disabled: !rtDateInBounds(key, min, max) };\n });\n}\n\n/** Граница времени для дня: у даты со временем действует только в день самой границы. */\nfunction timeBound(bound: string | null, day: string | null): string | null {\n if (bound === null || bound.length <= TIME_LEN) {\n return bound;\n }\n return day === bound.slice(0, DAY_LEN) ? bound.slice(DAY_LEN + 1) : null;\n}\n\n/** Колонки часов и минут: минуты идут с шагом, время за границей выключено. */\nexport function rtDateTimeColumns(ctx: IRtDatePicker.TimeContext): IRtDatePicker.TimeColumns {\n const low: string | null = timeBound(ctx.min, ctx.day);\n const high: string | null = timeBound(ctx.max, ctx.day);\n const hours: IRtDatePicker.TimeCell[] = Array.from({ length: 24 }, (_: unknown, h: number): IRtDatePicker.TimeCell => ({\n value: h,\n label: pad(h),\n disabled: (low !== null && rank(`${pad(h)}:59`) < rank(low)) || (high !== null && rank(`${pad(h)}:00`) > rank(high)),\n }));\n const step: number = Math.max(1, Math.floor(ctx.step));\n const minutes: IRtDatePicker.TimeCell[] = Array.from(\n { length: Math.ceil(60 / step) },\n (_: unknown, i: number): IRtDatePicker.TimeCell => {\n const minute: number = i * step;\n const time: string = `${pad(ctx.hour ?? 0)}:${pad(minute)}`;\n return { value: minute, label: pad(minute), disabled: ctx.hour !== null && !rtDateInBounds(time, low, high) };\n }\n );\n return { hours, minutes };\n}\n\nfunction shiftMonth(day: string, delta: number): string {\n const target: string = rtDateAddMonths(day.slice(0, MONTH_LEN), delta);\n const [y, m]: number[] = nums(target);\n return `${target}-${pad(Math.min(Number(day.slice(8)), daysInMonth(y, m)))}`;\n}\n\n/** Клавиши, что двигают фокус на число дней. */\nconst DAY_KEYS: Readonly<Record<string, number>> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -WEEK, ArrowDown: WEEK };\n\n/** Клавиши, что двигают фокус на месяц. */\nconst MONTH_KEYS: Readonly<Record<string, number>> = { PageUp: -1, PageDown: 1 };\n\nfunction keyTarget(key: string, day: string, firstDay: number): string | null {\n const ms: number = dayToMs(day);\n if (key in DAY_KEYS) {\n return msToDay(ms + DAY_KEYS[key] * DAY_LENGTH_MS);\n }\n if (key in MONTH_KEYS) {\n return shiftMonth(day, MONTH_KEYS[key]);\n }\n const offset: number = ((new Date(ms).getUTCDay() || WEEK) - firstDay + WEEK) % WEEK;\n if (key === 'Home') {\n return msToDay(ms - offset * DAY_LENGTH_MS);\n }\n return key === 'End' ? msToDay(ms + (WEEK - 1 - offset) * DAY_LENGTH_MS) : null;\n}\n\n/**\n * Куда клавиша переводит фокус с дня; `null` — клавиша не сеточная. День за границей не\n * достаётся: фокус встаёт на ближний день в границах.\n */\nexport function rtDateGridKey(key: string, day: string, firstDay: number, min: string | null, max: string | null): string | null {\n const target: string | null = keyTarget(key, day, firstDay);\n if (target === null) {\n return null;\n }\n const low: string | null = min === null ? null : min.slice(0, DAY_LEN);\n const high: string | null = max === null ? null : max.slice(0, DAY_LEN);\n if (low !== null && rank(target) < rank(low)) {\n return low;\n }\n return high !== null && rank(target) > rank(high) ? high : target;\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n output,\n signal,\n viewChildren,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_LOCALE, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCalendarComponent } from '@rt-tools/ui-kit-v2/calendar';\nimport { IRtCalendar } from '@rt-tools/ui-kit-v2/calendar';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtToggleButtonGroupComponent } from '@rt-tools/ui-kit-v2/toggle-button-group';\nimport { IRtToggleButtonGroup } from '@rt-tools/ui-kit-v2/toggle-button-group';\nimport {\n rtDateAddMonths,\n rtDateCanPage,\n rtDateFirstDay,\n rtDateGridKey,\n rtDateInBounds,\n rtDateMonth,\n rtDateMonths,\n rtDateNow,\n rtDateSplit,\n rtDateTime,\n rtDateTimeColumns,\n rtDateWeekdays,\n rtDateWrite,\n} from '../rt-date-panel.logic';\nimport { IRtDatePicker } from '../rt-date-picker.model';\n\nconst BEM_BLOCK: string = 'rt-date-panel';\nconst MONTH_LEN: number = 7;\nconst YEAR_LEN: number = 4;\n\ntype TView = 'days' | 'months';\ntype TTab = 'date' | 'time';\n\n/**\n * Панель rt-date-picker: месяц с листанием и выбором месяца и года, колонки часов и минут,\n * подвал с «Сегодня», «Сейчас», «Готово» или «Применить» — по типу значения.\n *\n * Панель не пишет в форму: готовое значение уходит событием `picked`, просьба закрыться —\n * `closed`. Черновик живёт, пока панель открыта; поле создаёт её заново на каждое открытие.\n * Вся арифметика дат — в `rt-date-panel.logic`.\n */\n@Component({\n selector: 'rt-date-panel',\n templateUrl: './rt-date-panel.component.html',\n styleUrl: './rt-date-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtButtonDirective,\n RtCalendarComponent,\n RtIconButtonComponent,\n RtToggleButtonGroupComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-date-panel--sheet]': 'sheet()',\n '[class.rt-date-panel--with-time]': \"type() !== 'date'\",\n '(keydown.escape)': 'closed.emit()',\n },\n})\nexport class RtDatePanelComponent {\n /** Локаль кита: названия месяцев, дней недели и первый день недели идут по ней. */\n readonly #locale: Signal<string> = inject(RT_KIT_LOCALE);\n /** Минута открытия панели: от неё считается «сегодня», когда вход `now` не задан. */\n readonly #openedAt: Date = new Date();\n readonly #firstDay: Signal<number> = computed((): number => rtDateFirstDay(this.#locale()));\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n protected readonly weekdays: Signal<readonly string[]> = computed((): readonly string[] => rtDateWeekdays(this.#locale()));\n\n protected readonly timeCells: Signal<readonly ElementRef<HTMLButtonElement>[]> =\n viewChildren<ElementRef<HTMLButtonElement>>('timeCell');\n\n protected readonly view: WritableSignal<TView> = signal<TView>('days');\n protected readonly tab: WritableSignal<TTab> = signal<TTab>('date');\n protected readonly activeKey: WritableSignal<string | null> = signal<string | null>(null);\n\n protected readonly today: Signal<string> = computed((): string => rtDateNow(this.now() ?? this.#openedAt, 1).day);\n\n protected readonly draftDay: WritableSignal<string | null> = linkedSignal(\n (): string | null => rtDateSplit(this.value(), this.type()).day\n );\n protected readonly draftTime: WritableSignal<string | null> = linkedSignal(\n (): string | null => rtDateSplit(this.value(), this.type()).time\n );\n protected readonly shownMonth: WritableSignal<string> = linkedSignal((): string =>\n (this.draftDay() ?? this.today()).slice(0, MONTH_LEN)\n );\n protected readonly year: WritableSignal<number> = linkedSignal((): number => Number(this.shownMonth().slice(0, YEAR_LEN)));\n\n protected readonly split: Signal<boolean> = computed((): boolean => this.sheet() && this.type() === 'datetime-local');\n protected readonly showDate: Signal<boolean> = computed(\n (): boolean => this.type() !== 'time' && !(this.split() && this.tab() === 'time')\n );\n protected readonly showTime: Signal<boolean> = computed(\n (): boolean => this.type() !== 'date' && !(this.split() && this.tab() === 'date')\n );\n\n protected readonly months: Signal<IRtCalendar.Month[]> = computed((): IRtCalendar.Month[] => [\n rtDateMonth(this.shownMonth(), {\n locale: this.#locale(),\n today: this.today(),\n chosen: this.draftDay(),\n min: this.min(),\n max: this.max(),\n }),\n ]);\n protected readonly canPrev: Signal<boolean> = computed((): boolean => rtDateCanPage(this.shownMonth(), -1, this.min(), this.max()));\n protected readonly canNext: Signal<boolean> = computed((): boolean => rtDateCanPage(this.shownMonth(), 1, this.min(), this.max()));\n\n protected readonly monthCells: Signal<IRtDatePicker.MonthCell[]> = computed((): IRtDatePicker.MonthCell[] =>\n rtDateMonths(this.year(), this.#locale(), this.min(), this.max())\n );\n protected readonly canPrevYear: Signal<boolean> = computed((): boolean =>\n rtDateInBounds(String(this.year() - 1), this.min(), this.max())\n );\n protected readonly canNextYear: Signal<boolean> = computed((): boolean =>\n rtDateInBounds(String(this.year() + 1), this.min(), this.max())\n );\n\n protected readonly draftHour: Signal<number | null> = computed((): number | null => this.#part(0));\n protected readonly draftMinute: Signal<number | null> = computed((): number | null => this.#part(1));\n protected readonly columns: Signal<IRtDatePicker.TimeColumns> = computed((): IRtDatePicker.TimeColumns =>\n rtDateTimeColumns({ step: this.minuteStep(), hour: this.draftHour(), day: this.draftDay(), min: this.min(), max: this.max() })\n );\n\n protected readonly todayOff: Signal<boolean> = computed((): boolean => !rtDateInBounds(this.today(), this.min(), this.max()));\n /** Черновик собирается в значение и лежит в границах. */\n protected readonly canApply: Signal<boolean> = computed((): boolean => this.#draftValue() !== '');\n protected readonly tabs: Signal<IRtToggleButtonGroup.Option<TTab>[]> = computed((): IRtToggleButtonGroup.Option<TTab>[] => [\n { value: 'date', label: this.t().uiDate },\n { value: 'time', label: this.t().uiTime },\n ]);\n\n /** Тип значения: дата, время или дата со временем. */\n public readonly type: InputSignal<IRtDatePicker.Type> = input.required<IRtDatePicker.Type>();\n /** Значение поля в форме нативного input'а; пустая строка — пусто. */\n public readonly value: InputSignal<string> = input<string>('');\n public readonly min: InputSignal<string | null> = input<string | null>(null);\n public readonly max: InputSignal<string | null> = input<string | null>(null);\n /** Шаг колонки минут. */\n public readonly minuteStep: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(5, {\n transform: numberAttribute,\n });\n /** Раскладка нижней шторки: дни под палец, у даты со временем — переключатель «Дата | Время». */\n public readonly sheet: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Момент, от которого считаются «сегодня» и «Сейчас». Поле его не задаёт — панель читает часы\n * сама; задаёт витрина, чтобы кадр не менялся день ото дня.\n */\n public readonly now: InputSignal<Date | null> = input<Date | null>(null);\n\n /** Готовое значение: панель просит поле его записать. */\n public readonly picked: OutputEmitterRef<string> = output<string>();\n /** Панель просит закрыть себя. */\n public readonly closed: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Колонки времени прокручены так, что выбранный час и минута стоят посередине. Прокрутка\n // задаётся самой колонке: `scrollIntoView` двигал бы и страницу под поповером.\n afterRenderEffect((): void => {\n for (const cell of this.timeCells()) {\n const node: HTMLButtonElement = cell.nativeElement;\n const column: HTMLElement | null = node.parentElement;\n if (column !== null && node.getAttribute('aria-pressed') === 'true') {\n column.scrollTop = node.offsetTop - (column.clientHeight - node.offsetHeight) / 2;\n }\n }\n });\n }\n\n protected pickDay(day: IRtCalendar.Day): void {\n this.activeKey.set(day.key);\n if (this.type() === 'date') {\n this.#emit(day.key);\n return;\n }\n this.draftDay.set(day.key);\n }\n\n protected pickToday(): void {\n if (!this.todayOff()) {\n this.#emit(this.today());\n }\n }\n\n protected pickNow(): void {\n const now: IRtDatePicker.Moment = rtDateNow(this.now() ?? new Date(), this.minuteStep());\n this.draftTime.set(now.time);\n if (this.type() === 'datetime-local') {\n this.draftDay.set(now.day);\n }\n }\n\n protected pickHour(hour: number): void {\n this.draftTime.set(rtDateTime(hour, this.draftMinute() ?? 0));\n }\n\n protected pickMinute(minute: number): void {\n this.draftTime.set(rtDateTime(this.draftHour() ?? 0, minute));\n }\n\n protected onGridKey(event: IRtCalendar.GridKey): void {\n const next: string | null = rtDateGridKey(event.key, event.day.key, this.#firstDay(), this.min(), this.max());\n if (next !== null) {\n this.shownMonth.set(next.slice(0, MONTH_LEN));\n this.activeKey.set(next);\n }\n }\n\n protected page(delta: number): void {\n this.shownMonth.set(rtDateAddMonths(this.shownMonth(), delta));\n }\n\n protected openMonths(): void {\n this.year.set(Number(this.shownMonth().slice(0, YEAR_LEN)));\n this.view.set('months');\n }\n\n protected pageYear(delta: number): void {\n this.year.update((year: number): number => year + delta);\n }\n\n protected pickMonth(cell: IRtDatePicker.MonthCell): void {\n this.shownMonth.set(cell.key);\n this.view.set('days');\n }\n\n /** «Готово» и «Применить»: черновик уходит значением, панель закрывается. */\n protected apply(): void {\n const value: string = this.#draftValue();\n if (value !== '') {\n this.#emit(value);\n }\n }\n\n #emit(value: string): void {\n this.picked.emit(value);\n this.closed.emit();\n }\n\n #draftValue(): string {\n const value: string = rtDateWrite(this.type(), this.draftDay(), this.draftTime());\n return value !== '' && rtDateInBounds(value, this.min(), this.max()) ? value : '';\n }\n\n #part(index: number): number | null {\n const time: string | null = this.draftTime();\n return time === null ? null : Number(time.split(':')[index]);\n }\n}\n","<ng-container rtBlock=\"rt-date-panel\">\n @if (split()) {\n <rt-toggle-button-group\n rtElem=\"tabs\"\n qa-dataid=\"date-panel-tabs\"\n fullWidth\n [ariaLabel]=\"t().uiDate + ' | ' + t().uiTime\"\n [options]=\"tabs()\"\n [value]=\"tab()\"\n (valueChange)=\"tab.set($event)\" />\n }\n\n <div rtElem=\"body\">\n @if (showDate()) {\n @if (view() === 'days') {\n <rt-calendar\n rtElem=\"calendar\"\n qa-dataid=\"date-panel-calendar\"\n grid\n titleAction\n headerTitle\n [months]=\"months()\"\n [weekdayLabels]=\"weekdays()\"\n [canPrev]=\"canPrev()\"\n [canNext]=\"canNext()\"\n [activeKey]=\"activeKey()\"\n [prevAriaLabel]=\"t().uiPrevMonth\"\n [nextAriaLabel]=\"t().uiNextMonth\"\n (prevMonth)=\"page(-1)\"\n (nextMonth)=\"page(1)\"\n (dayClick)=\"pickDay($event)\"\n (gridKey)=\"onGridKey($event)\"\n (titleClick)=\"openMonths()\" />\n } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-months\" role=\"group\" [attr.aria-label]=\"t().uiChooseMonth\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-year\"\n icon=\"chevron-left\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYear\"\n [disabled]=\"!canPrevYear()\"\n (clicked)=\"pageYear(-1)\" />\n <span rtElem=\"year\" qa-dataid=\"date-panel-year\">{{ year() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-year\"\n icon=\"chevron-right\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYear\"\n [disabled]=\"!canNextYear()\"\n (clicked)=\"pageYear(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of monthCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-month\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.aria-pressed]=\"cell.key === shownMonth()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickMonth(cell)\">\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n }\n }\n\n @if (showTime()) {\n <div rtElem=\"time\" qa-dataid=\"date-panel-time\">\n <div rtElem=\"column\" qa-dataid=\"date-panel-hours\" role=\"group\" [attr.aria-label]=\"t().uiHours\">\n @for (cell of columns().hours; track cell.value) {\n <button\n #timeCell\n rtElem=\"cell\"\n qa-dataid=\"date-panel-hour\"\n type=\"button\"\n [attr.aria-pressed]=\"cell.value === draftHour()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickHour(cell.value)\">\n {{ cell.label }}\n </button>\n }\n </div>\n <div rtElem=\"column\" qa-dataid=\"date-panel-minutes\" role=\"group\" [attr.aria-label]=\"t().uiMinutes\">\n @for (cell of columns().minutes; track cell.value) {\n <button\n #timeCell\n rtElem=\"cell\"\n qa-dataid=\"date-panel-minute\"\n type=\"button\"\n [attr.aria-pressed]=\"cell.value === draftMinute()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickMinute(cell.value)\">\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <div rtElem=\"footer\">\n @switch (type()) {\n @case ('date') {\n <button\n rtButton\n qa-dataid=\"date-panel-today\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiToday\"\n [attr.aria-label]=\"t().uiToday\"\n [disabled]=\"todayOff()\"\n (click)=\"pickToday()\"></button>\n }\n @case ('time') {\n <button\n rtButton\n qa-dataid=\"date-panel-now\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiNow\"\n [attr.aria-label]=\"t().uiNow\"\n (click)=\"pickNow()\"></button>\n <button\n rtButton\n qa-dataid=\"date-panel-done\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiDone\"\n [attr.aria-label]=\"t().uiDone\"\n [disabled]=\"!canApply()\"\n (click)=\"apply()\"></button>\n }\n @default {\n <button\n rtButton\n qa-dataid=\"date-panel-apply\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiApply\"\n [attr.aria-label]=\"t().uiApply\"\n [disabled]=\"!canApply()\"\n (click)=\"apply()\"></button>\n }\n }\n </div>\n</ng-container>\n","import { rtDateRead } from './rt-date-panel.logic';\nimport { IRtDatePicker } from './rt-date-picker.model';\n\n/**\n * Чистая логика текста в поле даты: как значение пишется по локали и как набранный текст\n * читается обратно. Значение формы — строка ISO (`YYYY-MM-DD`, `HH:mm`, `YYYY-MM-DDTHH:mm`);\n * текст — дата в порядке языка интерфейса (`01.08.2026` под `ru`), время всегда `HH:mm`.\n */\n\n/** День, в котором день, месяц и год различимы: по нему `Intl` называет порядок частей. */\nconst SAMPLE_DAY: Date = new Date(2026, 0, 31);\nconst DEFAULT_LAYOUT: IRtDatePicker.TextLayout = { order: ['day', 'month', 'year'], separator: '.' };\nconst YEAR_LEN: number = 4;\nconst PART_MAX_LEN: number = 2;\nconst DAY_GROUPS: number = 3;\nconst TIME_GROUPS: number = 2;\n/** Знаки, которые встречаются в тексте даты любой локали, кроме цифр. */\nconst TEXT_RE: RegExp = /^[\\d\\s.,/:\\-T]+$/;\n\nfunction isDatePart(type: string): type is IRtDatePicker.DatePart {\n return type === 'day' || type === 'month' || type === 'year';\n}\n\nfunction dayText(day: string, layout: IRtDatePicker.TextLayout): string {\n const [year, month, date]: string[] = day.split('-');\n const parts: Readonly<Record<IRtDatePicker.DatePart, string>> = { day: date, month, year };\n return layout.order.map((part: IRtDatePicker.DatePart): string => parts[part]).join(layout.separator);\n}\n\n/** День ISO из трёх групп цифр в порядке локали; `null` — группы не складываются в день. */\nfunction readDay(groups: readonly string[], layout: IRtDatePicker.TextLayout): string | null {\n const parts: Partial<Record<IRtDatePicker.DatePart, string>> = {};\n layout.order.forEach((part: IRtDatePicker.DatePart, index: number): void => {\n parts[part] = groups[index];\n });\n const { day, month, year }: Partial<Record<IRtDatePicker.DatePart, string>> = parts;\n if (day === undefined || month === undefined || year?.length !== YEAR_LEN) {\n return null;\n }\n if (day.length > PART_MAX_LEN || month.length > PART_MAX_LEN) {\n return null;\n }\n return `${year}-${month.padStart(PART_MAX_LEN, '0')}-${day.padStart(PART_MAX_LEN, '0')}`;\n}\n\n/** Время ISO из двух групп цифр: часы в один или два знака, минуты — ровно два. */\nfunction readTime(groups: readonly string[]): string | null {\n if (groups.length !== TIME_GROUPS) {\n return null;\n }\n const [hour, minute]: readonly string[] = groups;\n if (minute.length !== PART_MAX_LEN || hour.length > PART_MAX_LEN) {\n return null;\n }\n return `${hour.padStart(PART_MAX_LEN, '0')}:${minute}`;\n}\n\n/** Значение типа из групп цифр текста; `null` — группы не складываются в значение. */\nfunction readGroups(groups: readonly string[], type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string | null {\n if (type === 'time') {\n return readTime(groups);\n }\n if (type === 'date') {\n return groups.length === DAY_GROUPS ? readDay(groups, layout) : null;\n }\n if (groups.length !== DAY_GROUPS + TIME_GROUPS) {\n return null;\n }\n const day: string | null = readDay(groups.slice(0, DAY_GROUPS), layout);\n const time: string | null = readTime(groups.slice(DAY_GROUPS));\n return day === null || time === null ? null : `${day}T${time}`;\n}\n\n/** Порядок дня, месяца и года и знак между ними — по локали. */\nexport function rtDateLayout(locale: string): IRtDatePicker.TextLayout {\n const parts: Intl.DateTimeFormatPart[] = new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }).formatToParts(SAMPLE_DAY);\n const order: IRtDatePicker.DatePart[] = parts\n .map((part: Intl.DateTimeFormatPart): string => part.type)\n .filter((type: string): type is IRtDatePicker.DatePart => isDatePart(type));\n const separator: string = parts.find((part: Intl.DateTimeFormatPart): boolean => part.type === 'literal')?.value.trim() ?? '';\n if (order.length !== DAY_GROUPS || separator === '') {\n return DEFAULT_LAYOUT;\n }\n return { order, separator };\n}\n\n/**\n * Текст поля для значения ISO; пустое значение — пустой текст. Строка, которая не читается как\n * значение этого типа, показывается как есть: она пришла из формы мимо поля и не должна пропасть.\n */\nexport function rtDateText(value: string, type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string {\n if (type === 'time' || rtDateRead(value, type) === null) {\n return value;\n }\n if (type === 'date') {\n return dayText(value, layout);\n }\n const [day, time]: string[] = value.split('T');\n return `${dayText(day, layout)} ${time}`;\n}\n\n/** Подсказка формы текста в буквах кита: `дд.мм.гггг`, `чч:мм`, `дд.мм.гггг чч:мм`. */\nexport function rtDateShape(type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout, letters: IRtDatePicker.ShapeLetters): string {\n const time: string = `${letters.hour}:${letters.minute}`;\n if (type === 'time') {\n return time;\n }\n const day: string = layout.order.map((part: IRtDatePicker.DatePart): string => letters[part]).join(layout.separator);\n return type === 'date' ? day : `${day} ${time}`;\n}\n\n/**\n * Читает набранный текст в значение ISO; `null` — текст не значение этого типа. Читается и\n * порядок локали, и сама форма значения: вставленная `2026-08-01` тоже становится значением.\n */\nexport function rtDateParse(text: string, type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string | null {\n const iso: string | null = rtDateRead(text, type);\n if (iso !== null) {\n return iso;\n }\n const value: string = text.trim();\n if (!TEXT_RE.test(value)) {\n return null;\n }\n const candidate: string | null = readGroups(value.match(/\\d+/g) ?? [], type, layout);\n // Кандидат проверяется той же формой значения: 31.02.2026 складывается в строку, но не в день.\n return candidate === null ? null : rtDateRead(candidate, type);\n}\n","import { NumberInput } from '@angular/cdk/coercion';\nimport {\n computed,\n forwardRef,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_LOCALE, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\nimport { RtBottomSheetComponent } from '@rt-tools/ui-kit-v2/bottom-sheet';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtDatePanelComponent } from './panel/rt-date-panel.component';\nimport { rtDateInBounds } from './rt-date-panel.logic';\nimport { IRtDatePicker } from './rt-date-picker.model';\nimport { rtDateLayout, rtDateParse, rtDateShape, rtDateText } from './rt-date-text.logic';\n\nconst BEM_BLOCK: string = 'rt-date-picker';\n\n/**\n * Поле даты, времени или даты со временем со своей панелью кита, визуально и по токенам\n * идентичное rt-input (host — box `--rt-input-*`, input — прозрачный `__field`). Кнопка в конце\n * поля открывает `rt-date-panel`: на широком экране в поповере, на узком — в нижней шторке.\n * CVA через общий `RtFormControlBase`: clearable, авто-подсветка invalid, read-only\n * представление (значение форматируется через Intl).\n *\n * `value` — строка формы нативного input'а (`YYYY-MM-DD`, `YYYY-MM-DDTHH:mm`, `HH:mm`). Текст в\n * поле — дата в порядке языка интерфейса (`01.08.2026` под `ru`), время `HH:mm`; набирается так же,\n * вставленная форма значения тоже читается. Нечитаемый или лежащий за границами текст оставляет\n * значение прежним и помечает поле ошибкой.\n */\n@Component({\n selector: 'rt-date-picker',\n templateUrl: './rt-date-picker.component.html',\n styleUrls: ['./rt-date-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtBottomSheetComponent,\n RtDatePanelComponent,\n RtIconButtonComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtDatePickerComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-date-picker--disabled]': 'isDisabled()',\n '[class.rt-date-picker--invalid]': 'isInvalid() || textInvalid()',\n '[class.rt-date-picker--readonly]': 'isReadonly()',\n '[class.rt-date-picker--borderless]': '!bordered()',\n '[class.rt-date-picker--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-date-picker--size--sm]': \"size() === 'sm'\",\n '[class.rt-date-picker--size--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtDatePickerComponent extends RtFormControlBase<string> {\n /** Локаль кита: приложение, меняющее язык на ходу, меняет её, и текст поля пересчитывается. */\n readonly #locale: Signal<string> = inject(RT_KIT_LOCALE);\n /** Порядок дня, месяца и года в тексте поля — по локали кита. */\n readonly #layout: Signal<IRtDatePicker.TextLayout> = computed((): IRtDatePicker.TextLayout => rtDateLayout(this.#locale()));\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n /** Узкий экран: панель открывается в нижней шторке, а не в поповере. */\n protected readonly narrow: Signal<boolean> = inject(BreakpointsService).narrow;\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n protected readonly popover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n /** Набранный текст не читается как значение в границах: поле помечено ошибкой. */\n protected readonly textInvalid: WritableSignal<boolean> = signal(false);\n protected readonly sheetOpen: WritableSignal<boolean> = signal(false);\n /** Подсказка формы текста буквами кита: `дд.мм.гггг` под русскими метками. */\n protected readonly shape: Signal<string> = computed((): string => {\n const labels: TRtKitLabelMap = this.t();\n return rtDateShape(this.type(), this.#layout(), {\n day: labels.uiShapeDay,\n month: labels.uiShapeMonth,\n year: labels.uiShapeYear,\n hour: labels.uiShapeHour,\n minute: labels.uiShapeMinute,\n });\n });\n /**\n * Текст в поле — значение в порядке языка интерфейса. Не строку форма кладёт мимо контракта\n * (например `Date`), и поле показывает её пустой, как показывало браузерное.\n */\n protected readonly text: Signal<string> = computed((): string => this.#text(this.value()));\n protected readonly openIcon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name =>\n this.type() === 'time' ? 'ico-time' : 'ico-calendar'\n );\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== '');\n /**\n * Ширина поля в знаках — по длине формы значения. Без неё текстовое поле берёт от браузера\n * двадцать знаков и в строке отборов потребителя занимает место вдвое шире значения.\n */\n protected readonly fieldSize: Signal<number> = computed((): number => this.shape().length);\n /** Подсказка обрезается многоточием в узком поле, поэтому шаблон целиком виден при наведении. */\n protected readonly shapeTitle: Signal<string | null> = computed((): string | null => (this.hasValue() ? null : this.shape()));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.#format(this.value(), this.type()));\n\n public readonly type: InputSignal<IRtDatePicker.Type> = input<IRtDatePicker.Type>('date');\n public readonly min: InputSignal<string | null> = input<string | null>(null);\n public readonly max: InputSignal<string | null> = input<string | null>(null);\n /** Шаг колонки минут в панели. */\n public readonly minuteStep: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(5, {\n transform: numberAttribute,\n });\n\n /** Значение из формы снимает ошибку набора: в поле теперь стоит оно. */\n public override writeValue(value: string | null): void {\n super.writeValue(value);\n this.textInvalid.set(false);\n }\n\n protected getEmptyValue(): string {\n return '';\n }\n\n protected focusAfterClear(): void {\n this.fieldEl()?.nativeElement.focus();\n }\n\n protected override clearValue(): void {\n super.clearValue();\n this.#accept('');\n }\n\n /** Набор текста: значение меняется, только когда текст читается как значение в границах. */\n protected onTyped(event: Event): void {\n const text: string = (event.target as HTMLInputElement).value;\n if (text.trim() === '') {\n this.#commit('');\n return;\n }\n const read: string | null = rtDateParse(text, this.type(), this.#layout());\n if (read === null || !rtDateInBounds(read, this.min(), this.max())) {\n this.textInvalid.set(true);\n return;\n }\n this.#commit(read);\n }\n\n /** Кнопка в конце поля: на узком экране открывает шторку, на широком поповер открывает сам. */\n protected openPanel(): void {\n if (this.narrow() && !this.isDisabled()) {\n this.sheetOpen.set(true);\n }\n }\n\n protected closePanel(): void {\n this.sheetOpen.set(false);\n this.popover()?.close();\n }\n\n protected onPicked(value: string): void {\n this.#commit(value);\n this.markTouched();\n }\n\n protected onBlur(): void {\n this.markTouched();\n }\n\n #commit(value: string): void {\n this.value.set(value);\n this.emitChange(value);\n this.#accept(value);\n }\n\n /** Текст в поле — принятое значение, ошибки набора нет. */\n #accept(value: string): void {\n this.textInvalid.set(false);\n const node: HTMLInputElement | undefined = this.fieldEl()?.nativeElement;\n if (node !== undefined) {\n node.value = this.#text(value);\n }\n }\n\n #text(value: unknown): string {\n return typeof value === 'string' ? rtDateText(value, this.type(), this.#layout()) : '';\n }\n\n /**\n * Форматирует ISO-значение нативного input'а в локализованный текст для\n * read-only. Для `time` форматируем как сегодняшнюю дату с временем (нужен\n * валидный Date), показывая только часы/минуты.\n */\n #format(value: string, type: IRtDatePicker.Type): string {\n if (value === '') {\n return '';\n }\n const parsed: number = Date.parse(type === 'time' ? `1970-01-01T${value}` : value);\n if (Number.isNaN(parsed)) {\n return value;\n }\n return new Intl.DateTimeFormat(this.#locale(), this.#formatOptions(type)).format(new Date(parsed));\n }\n\n #formatOptions(type: IRtDatePicker.Type): Intl.DateTimeFormatOptions {\n if (type === 'time') {\n return { hour: '2-digit', minute: '2-digit' };\n }\n if (type === 'datetime-local') {\n return { dateStyle: 'medium', timeStyle: 'short' };\n }\n return { dateStyle: 'medium' };\n }\n}\n","<ng-container rtBlock=\"rt-date-picker\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"date-picker-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"date-picker-control\"\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [value]=\"text()\"\n [disabled]=\"isDisabled()\"\n [attr.placeholder]=\"shape()\"\n [attr.title]=\"shapeTitle()\"\n [attr.size]=\"fieldSize()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || textInvalid() || null\"\n (input)=\"onTyped($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"date-picker-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon-button\n rtElem=\"open\"\n qa-dataid=\"date-picker-open\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n rtPopoverAlign=\"end\"\n [icon]=\"openIcon()\"\n [ariaLabel]=\"t().uiOpenCalendar\"\n [disabled]=\"isDisabled()\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"narrow() || isDisabled()\"\n (clicked)=\"openPanel()\" />\n\n <ng-template #panelTpl>\n <div rtElem=\"popup\" qa-dataid=\"date-picker-popup\">\n <rt-date-panel\n [type]=\"type()\"\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [minuteStep]=\"minuteStep()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n </div>\n </ng-template>\n\n @if (narrow()) {\n <rt-bottom-sheet qa-dataid=\"date-picker-sheet\" [open]=\"sheetOpen()\" (openChange)=\"sheetOpen.set($event)\">\n @if (sheetOpen()) {\n <rt-date-panel\n sheet\n [type]=\"type()\"\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [minuteStep]=\"minuteStep()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n }\n </rt-bottom-sheet>\n }\n }\n</ng-container>\n"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,SAAiB;AACvB,MAAM,UAAkB;AACxB,MAAM,gBAAwB;AAC9B,MAAM,OAAe;AACrB,MAAM,UAAkB;AACxB,MAAMA,cAAoB;AAC1B,MAAM,WAAmB;AASzB,SAAS,KAAK,MAAY;CACtB,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM;AACtC;AAMA,SAAS,KAAK,MAAY;CACtB,OAAO,OAAO,KAAK,QAAQ,OAAO,EAAE,CAAC;AACzC;AAEA,SAAS,IAAI,OAAa;CACtB,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG;AACxC;AAEA,SAAS,QAAQ,KAAW;CACxB,MAAM,CAAC,GAAG,GAAG,KAAe,KAAK,GAAG;CACpC,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AAC/B;AAEA,SAAS,QAAQ,IAAU;CACvB,MAAM,OAAa,IAAI,KAAK,EAAE;CAC9B,OAAO,GAAG,KAAK,eAAc,EAAE,GAAI,IAAI,KAAK,YAAW,IAAK,CAAC,EAAC,GAAI,IAAI,KAAK,WAAU,CAAE;AAC3F;AAEA,SAAS,YAAY,MAAc,OAAa;CAC5C,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,WAAU;AACxD;AAEA,SAAS,MAAM,MAAY;CACvB,MAAM,QAAgC,OAAO,KAAK,IAAI;CACtD,IAAI,UAAU,MACV,OAAO;CAEX,MAAM,QAAgB,OAAO,MAAM,EAAE;CACrC,MAAM,MAAc,OAAO,MAAM,EAAE;CACnC,OAAO,SAAS,KAAK,SAAS,MAAM,OAAO,KAAK,OAAO,YAAY,OAAO,MAAM,EAAE,GAAG,KAAK;AAC9F;AAEA,SAAS,OAAO,MAAY;CACxB,MAAM,QAAgC,QAAQ,KAAK,IAAI;CACvD,OAAO,UAAU,QAAQ,OAAO,MAAM,EAAE,IAAI,MAAM,OAAO,MAAM,EAAE,IAAI;AACzE;AAGA,SAAgB,WAAW,MAAc,QAAc;CACnD,OAAO,GAAG,IAAI,IAAI,EAAC,GAAI,IAAI,MAAM;AACrC;AAGA,SAAgB,eAAe,QAAc;CACzC,MAAM,OAAwB,IAAI,KAAK,OAAO,MAAM;CACpD,QAAQ,KAAK,cAAa,KAAM,KAAK,SAAA,EAAW,YAAY;AAChE;AAGA,SAAgB,WAAW,MAAc,MAAwB;CAC7D,MAAM,QAAgB,KAAK,KAAI;CAC/B,IAAI,SAAS,QACT,OAAO,MAAM,KAAK,IAAI,QAAQ;CAElC,IAAI,SAAS,QACT,OAAO,OAAO,KAAK,IAAI,QAAQ;CAEnC,MAAM,QAAkB,MAAM,MAAM,GAAG;CACvC,OAAO,MAAM,WAAW,KAAK,MAAM,MAAM,EAAE,KAAK,OAAO,MAAM,EAAE,IAAI,QAAQ;AAC/E;AAGA,SAAgB,YAAY,MAA0B,KAAoB,MAAmB;CACzF,IAAI,SAAS,QACT,OAAO,OAAO;CAElB,IAAI,SAAS,QACT,OAAO,QAAQ;CAEnB,OAAO,QAAQ,QAAQ,SAAS,OAAO,GAAG,IAAG,GAAI,SAAS;AAC9D;AAGA,SAAgB,YAAY,OAAe,MAAwB;CAC/D,IAAI,UAAU,IACV,OAAO;EAAE,KAAK;EAAM,MAAM;CAAI;CAElC,IAAI,SAAS,QACT,OAAO;EAAE,KAAK;EAAM,MAAM;CAAK;CAEnC,OAAO;EAAE,KAAK,MAAM,MAAM,GAAG,OAAO;EAAG,MAAM,SAAS,SAAS,OAAO,MAAM,MAAM,EAAW;CAAC;AAClG;AAGA,SAAgB,eAAe,OAAe,KAAoB,KAAkB;CAChF,MAAM,MAAqB,QAAQ,OAAO,OAAO,IAAI,MAAM,GAAG,MAAM,MAAM;CAC1E,MAAM,OAAsB,QAAQ,OAAO,OAAO,IAAI,MAAM,GAAG,MAAM,MAAM;CAC3E,QAAQ,QAAQ,QAAQ,KAAK,KAAK,KAAK,KAAK,GAAG,OAAO,SAAS,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI;AACnG;AAGA,SAAgB,UAAU,KAAW,MAAY;CAC7C,MAAM,SAAiB,KAAK,MAAM,IAAI,WAAU,IAAK,IAAI,IAAI;CAC7D,OAAO;EACH,KAAK,GAAG,IAAI,YAAW,EAAE,GAAI,IAAI,IAAI,SAAQ,IAAK,CAAC,EAAC,GAAI,IAAI,IAAI,QAAO,CAAE;EACzE,MAAM,GAAG,IAAI,IAAI,SAAQ,CAAE,EAAC,GAAI,IAAI,MAAM;CAC7C;AACL;AAGA,SAAgB,gBAAgB,OAAe,OAAa;CACxD,MAAM,CAAC,GAAG,KAAe,KAAK,KAAK;CACnC,MAAM,OAAa,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC;CACzD,OAAO,GAAG,KAAK,eAAc,EAAE,GAAI,IAAI,KAAK,YAAW,IAAK,CAAC;AACjE;AAGA,SAAgB,cAAc,OAAe,OAAe,KAAoB,KAAkB;CAC9F,OAAO,eAAe,gBAAgB,OAAO,KAAK,GAAG,KAAK,GAAG;AACjE;AAEA,SAAS,WAAW,OAAe,QAAc;CAC7C,MAAM,CAAC,GAAG,KAAe,KAAK,KAAK;CACnC,MAAM,OAAe,IAAI,KAAK,eAAe,QAAQ;EAAE,OAAO;EAAQ,UAAU;CAAK,CAAE,CAAC,CAAC,OAAO,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;CACrH,OAAO,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,MAAM,IAAI,KAAK,MAAM,CAAC,EAAC,GAAI;AAC1E;AAEA,SAAS,QAAQ,KAAa,KAA+B;CACzD,OAAO;EACH,KAAK;EACL,YAAY,OAAO,IAAI,MAAM,CAAC,CAAC;EAC/B,UAAU;EACV,OAAO,QAAQ,IAAI,SAAS,oBAAoB,SAAS,oBAAoB;EAC7E,UAAU,CAAC,eAAe,KAAK,IAAI,KAAK,IAAI,GAAG;EAC/C,OAAO,QAAQ,IAAI;CACtB;AACL;AAGA,SAAgB,YAAY,OAAe,KAA+B;CACtE,MAAM,CAAC,GAAG,KAAe,KAAK,KAAK;CACnC,MAAM,QAAgB,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;CAE1C,MAAM,WADkB,IAAI,KAAK,KAAK,CAAC,CAAC,UAAS,KAAM,QACrB,eAAe,IAAI,MAAM,IAAI,QAAQ;CACvE,MAAM,OAA0B,MAAM,KAAK,EAAE,QAAQ,YAAY,GAAG,CAAC,EAAC,IAAK,GAAY,MACnF,QAAQ,QAAQ,QAAQ,IAAI,aAAa,GAAG,GAAG,CAAC;CAEpD,MAAM,gBAA0B,MAAM,KAAK,EAAE,QAAQ,OAAM,IAAK,GAAY,MAAsB,CAAC;CACnG,OAAO;EAAE,KAAK;EAAO,OAAO,WAAW,OAAO,IAAI,MAAM;EAAG;EAAe;CAAI;AAClF;AAGA,SAAgB,eAAe,QAAc;CACzC,MAAM,SAA8B,IAAI,KAAK,eAAe,QAAQ;EAAE,SAAS;EAAS,UAAU;CAAK,CAAE;CAEzG,MAAM,SAAiB,KAAK,IAAI,MAAM,GAAG,CAAC;CAC1C,MAAM,QAAgB,eAAe,MAAM,IAAI;CAC/C,OAAO,MAAM,KAAK,EAAE,QAAQ,KAAI,IAAK,GAAY,MAAsB,OAAO,OAAO,UAAW,IAAI,SAAS,OAAQ,aAAa,CAAC;AACvI;AAGA,SAAgB,aAAa,MAAc,QAAgB,KAAoB,KAAkB;CAC7F,MAAM,SAA8B,IAAI,KAAK,eAAe,QAAQ;EAAE,OAAO;EAAS,UAAU;CAAK,CAAE;CACvG,OAAO,MAAM,KAAK,EAAE,QAAQ,GAAE,IAAK,GAAY,MAAsC;EACjF,MAAM,MAAc,GAAG,KAAI,GAAI,IAAI,IAAI,CAAC;EACxC,OAAO;GAAE;GAAK,OAAO,OAAO,OAAO,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;GAAG,UAAU,CAAC,eAAe,KAAK,KAAK,GAAG;EAAC;CACtG,CAAC;AACL;AAGA,SAAS,UAAU,OAAsB,KAAkB;CACvD,IAAI,UAAU,QAAQ,MAAM,UAAU,UAClC,OAAO;CAEX,OAAO,QAAQ,MAAM,MAAM,GAAG,OAAO,IAAI,MAAM,MAAM,EAAW,IAAI;AACxE;AAGA,SAAgB,kBAAkB,KAA8B;CAC5D,MAAM,MAAqB,UAAU,IAAI,KAAK,IAAI,GAAG;CACrD,MAAM,OAAsB,UAAU,IAAI,KAAK,IAAI,GAAG;CACtD,MAAM,QAAkC,MAAM,KAAK,EAAE,QAAQ,GAAE,IAAK,GAAY,OAAuC;EACnH,OAAO;EACP,OAAO,IAAI,CAAC;EACZ,UAAW,QAAQ,QAAQ,KAAK,GAAG,IAAI,CAAC,EAAC,IAAK,IAAI,KAAK,GAAG,KAAO,SAAS,QAAQ,KAAK,GAAG,IAAI,CAAC,EAAC,IAAK,IAAI,KAAK,IAAI;CACrH,EAAC;CACF,MAAM,OAAe,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC;CASrD,OAAO;EAAE;EAAO,SAR0B,MAAM,KAC5C,EAAE,QAAQ,KAAK,KAAK,KAAK,IAAI,EAAC,IAC7B,GAAY,MAAqC;GAC9C,MAAM,SAAiB,IAAI;GAC3B,MAAM,OAAe,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAC,GAAI,IAAI,MAAM;GACxD,OAAO;IAAE,OAAO;IAAQ,OAAO,IAAI,MAAM;IAAG,UAAU,IAAI,SAAS,QAAQ,CAAC,eAAe,MAAM,KAAK,IAAI;GAAC;EAC/G,CAEY;CAAO;AAC3B;AAEA,SAAS,WAAW,KAAa,OAAa;CAC1C,MAAM,SAAiB,gBAAgB,IAAI,MAAM,GAAGA,WAAS,GAAG,KAAK;CACrE,MAAM,CAAC,GAAG,KAAe,KAAK,MAAM;CACpC,OAAO,GAAG,OAAM,GAAI,IAAI,KAAK,IAAI,OAAO,IAAI,MAAM,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;AAC7E;AAGA,MAAM,WAA6C;CAAE,WAAW;CAAI,YAAY;CAAG,SAAS;CAAO,WAAW;AAAI;AAGlH,MAAM,aAA+C;CAAE,QAAQ;CAAI,UAAU;AAAC;AAE9E,SAAS,UAAU,KAAa,KAAa,UAAgB;CACzD,MAAM,KAAa,QAAQ,GAAG;CAC9B,IAAI,OAAO,UACP,OAAO,QAAQ,KAAK,SAAS,OAAO,aAAa;CAErD,IAAI,OAAO,YACP,OAAO,WAAW,KAAK,WAAW,IAAI;CAE1C,MAAM,WAAmB,IAAI,KAAK,EAAE,CAAC,CAAC,UAAS,KAAM,QAAQ,WAAW,QAAQ;CAChF,IAAI,QAAQ,QACR,OAAO,QAAQ,KAAK,SAAS,aAAa;CAE9C,OAAO,QAAQ,QAAQ,QAAQ,MAAM,IAAW,UAAU,aAAa,IAAI;AAC/E;AAMA,SAAgB,cAAc,KAAa,KAAa,UAAkB,KAAoB,KAAkB;CAC5G,MAAM,SAAwB,UAAU,KAAK,KAAK,QAAQ;CAC1D,IAAI,WAAW,MACX,OAAO;CAEX,MAAM,MAAqB,QAAQ,OAAO,OAAO,IAAI,MAAM,GAAG,OAAO;CACrE,MAAM,OAAsB,QAAQ,OAAO,OAAO,IAAI,MAAM,GAAG,OAAO;CACtE,IAAI,QAAQ,QAAQ,KAAK,MAAM,IAAI,KAAK,GAAG,GACvC,OAAO;CAEX,OAAO,SAAS,QAAQ,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,OAAO;AAC/D;ACvNA,MAAMC,cAAoB;AAC1B,MAAM,YAAoB;AAC1B,MAAMC,aAAmB;AAqCzB,IAAa,uBAAb,MAAa,qBAAoB;CAEpB;CAEA;CACA;CA+FT,cAAA;EAlGS,KAAA,UAA0B,OAAO,aAAa;EAE9C,KAAA,4BAAkB,IAAI,KAAI;EAC1B,KAAA,YAA4B,eAAuB,eAAe,KAAK,QAAO,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAExE,KAAA,IAA4B,OAAO,aAAa;EAChD,KAAA,WAAsC,eAAkC,eAAe,KAAK,QAAO,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEvG,KAAA,YACf,aAA4C,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAExC,KAAA,OAA8B,OAAc,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EACnD,KAAA,MAA4B,OAAa,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAChD,KAAA,YAA2C,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAEtE,KAAA,QAAwB,eAAuB,UAAU,KAAK,IAAG,KAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAE9F,KAAA,WAA0C,mBACpC,YAAY,KAAK,MAAK,GAAI,KAAK,KAAI,CAAE,CAAC,CAAC,KAC/D,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,YAA2C,mBACrC,YAAY,KAAK,MAAK,GAAI,KAAK,KAAI,CAAE,CAAC,CAAC,MAC/D,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,aAAqC,oBACnD,KAAK,SAAQ,KAAM,KAAK,MAAK,EAAA,CAAI,MAAM,GAAG,SAAS,GACvD,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,OAA+B,mBAA2B,OAAO,KAAK,WAAU,CAAE,CAAC,MAAM,GAAGA,UAAQ,CAAC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EAEvG,KAAA,QAAyB,eAAwB,KAAK,MAAK,KAAM,KAAK,KAAI,MAAO,kBAAiB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAClG,KAAA,WAA4B,eAC5B,KAAK,KAAI,MAAO,UAAU,EAAE,KAAK,MAAK,KAAM,KAAK,IAAG,MAAO,SAC7E,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,WAA4B,eAC5B,KAAK,KAAI,MAAO,UAAU,EAAE,KAAK,MAAK,KAAM,KAAK,IAAG,MAAO,SAC7E,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEkB,KAAA,SAAsC,eAAoC,CACzF,YAAY,KAAK,WAAU,GAAI;GAC3B,QAAQ,KAAK,QAAO;GACpB,OAAO,KAAK,MAAK;GACjB,QAAQ,KAAK,SAAQ;GACrB,KAAK,KAAK,IAAG;GACb,KAAK,KAAK,IAAG;EAChB,CAAA,CACJ,GAAC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;EACiB,KAAA,UAA2B,eAAwB,cAAc,KAAK,WAAU,GAAI,IAAI,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAChH,KAAA,UAA2B,eAAwB,cAAc,KAAK,WAAU,GAAI,GAAG,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAE/G,KAAA,aAAgD,eAC/D,aAAa,KAAK,KAAI,GAAI,KAAK,QAAO,GAAI,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GACnE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,cAA+B,eAC9C,eAAe,OAAO,KAAK,KAAI,IAAK,CAAC,GAAG,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GACjE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EACkB,KAAA,cAA+B,eAC9C,eAAe,OAAO,KAAK,KAAI,IAAK,CAAC,GAAG,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GACjE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EAEkB,KAAA,YAAmC,eAA8B,KAAK,MAAM,CAAC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAC/E,KAAA,cAAqC,eAA8B,KAAK,MAAM,CAAC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EACjF,KAAA,UAA6C,eAC5D,kBAAkB;GAAE,MAAM,KAAK,WAAU;GAAI,MAAM,KAAK,UAAS;GAAI,KAAK,KAAK,SAAQ;GAAI,KAAK,KAAK,IAAG;GAAI,KAAK,KAAK,IAAG;EAAE,CAAE,GAChI,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAEkB,KAAA,WAA4B,eAAwB,CAAC,eAAe,KAAK,MAAK,GAAI,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAE1G,KAAA,WAA4B,eAAwB,KAAK,YAAW,MAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAC9E,KAAA,OAAoD,eAAoD,CACvH;GAAE,OAAO;GAAQ,OAAO,KAAK,EAAC,CAAE,CAAC;EAAM,GACvC;GAAE,OAAO;GAAQ,OAAO,KAAK,EAAC,CAAE,CAAC;EAAM,CAC1C,GAAC,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EAGc,KAAA,OAAwC,MAAM,SAA8B,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EAE5E,KAAA,QAA6B,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAC9C,KAAA,MAAkC,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAC5D,KAAA,MAAkC,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAE5D,KAAA,aAA4D,MAA2B,GAAC;GAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;GACpG,WAAW;EAAe,CAAA;EAGd,KAAA,QAAyD,MAA6B,OAAK;GAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;GACvG,WAAW;EAAgB,CAAA;EAOf,KAAA,MAAgC,MAAmB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAGxD,KAAA,SAAmC,OAAM;EAEzC,KAAA,SAAiC,OAAM;EAKnD,wBAA6B;GACzB,KAAK,MAAM,QAAQ,KAAK,UAAS,GAAI;IACjC,MAAM,OAA0B,KAAK;IACrC,MAAM,SAA6B,KAAK;IACxC,IAAI,WAAW,QAAQ,KAAK,aAAa,cAAc,MAAM,QACzD,OAAO,YAAY,KAAK,aAAa,OAAO,eAAe,KAAK,gBAAgB;GAExF;EACJ,CAAC;CACL;CAEU,QAAQ,KAAoB;EAClC,KAAK,UAAU,IAAI,IAAI,GAAG;EAC1B,IAAI,KAAK,KAAI,MAAO,QAAQ;GACxB,KAAK,MAAM,IAAI,GAAG;GAClB;EACJ;EACA,KAAK,SAAS,IAAI,IAAI,GAAG;CAC7B;CAEU,YAAS;EACf,IAAI,CAAC,KAAK,SAAQ,GACd,KAAK,MAAM,KAAK,MAAK,CAAE;CAE/B;CAEU,UAAO;EACb,MAAM,MAA4B,UAAU,KAAK,IAAG,qBAAM,IAAI,KAAI,GAAI,KAAK,WAAU,CAAE;EACvF,KAAK,UAAU,IAAI,IAAI,IAAI;EAC3B,IAAI,KAAK,KAAI,MAAO,kBAChB,KAAK,SAAS,IAAI,IAAI,GAAG;CAEjC;CAEU,SAAS,MAAY;EAC3B,KAAK,UAAU,IAAI,WAAW,MAAM,KAAK,YAAW,KAAM,CAAC,CAAC;CAChE;CAEU,WAAW,QAAc;EAC/B,KAAK,UAAU,IAAI,WAAW,KAAK,UAAS,KAAM,GAAG,MAAM,CAAC;CAChE;CAEU,UAAU,OAA0B;EAC1C,MAAM,OAAsB,cAAc,MAAM,KAAK,MAAM,IAAI,KAAK,KAAK,UAAS,GAAI,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE;EAC5G,IAAI,SAAS,MAAM;GACf,KAAK,WAAW,IAAI,KAAK,MAAM,GAAG,SAAS,CAAC;GAC5C,KAAK,UAAU,IAAI,IAAI;EAC3B;CACJ;CAEU,KAAK,OAAa;EACxB,KAAK,WAAW,IAAI,gBAAgB,KAAK,WAAU,GAAI,KAAK,CAAC;CACjE;CAEU,aAAU;EAChB,KAAK,KAAK,IAAI,OAAO,KAAK,WAAU,CAAE,CAAC,MAAM,GAAGA,UAAQ,CAAC,CAAC;EAC1D,KAAK,KAAK,IAAI,QAAQ;CAC1B;CAEU,SAAS,OAAa;EAC5B,KAAK,KAAK,QAAQ,SAAyB,OAAO,KAAK;CAC3D;CAEU,UAAU,MAA6B;EAC7C,KAAK,WAAW,IAAI,KAAK,GAAG;EAC5B,KAAK,KAAK,IAAI,MAAM;CACxB;CAGU,QAAK;EACX,MAAM,QAAgB,KAAK,YAAW;EACtC,IAAI,UAAU,IACV,KAAK,MAAM,KAAK;CAExB;CAEA,MAAM,OAAa;EACf,KAAK,OAAO,KAAK,KAAK;EACtB,KAAK,OAAO,KAAI;CACpB;CAEA,cAAW;EACP,MAAM,QAAgB,YAAY,KAAK,KAAI,GAAI,KAAK,SAAQ,GAAI,KAAK,UAAS,CAAE;EAChF,OAAO,UAAU,MAAM,eAAe,OAAO,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,IAAI,QAAQ;CACnF;CAEA,MAAM,OAAa;EACf,MAAM,OAAsB,KAAK,UAAS;EAC1C,OAAO,SAAS,OAAO,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM;CAC/D;CAhMS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAoB,MAAA,CAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAApB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAoB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,MAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,OAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,KAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,KAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,OAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,KAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,SAAA;IAAA,QAAA;IAAA,QAAA;GAAA;GAAA,MAAA;IAAA,WAAA,EAAA,kBAAA,gBAAA;IAAA,YAAA;KAAA,8BAAA;KAAA,kCAAA;IAAA;IAAA,gBAAA;GAAA;GAAA,aAAA,CAAA;IAAA,cAAA;IAAA,WAAA,CAAA,UAAA;IAAA,aAAA;IAAA,UAAA;GAAA,CAAA;GAAA,UAAA;GAAA,UCxFjC;GA4JA,QAAA,CAAA,q2FAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDpFQ;KAAc,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAa,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAGb;KAAiB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACjB;KAAmB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACnB;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;KAA4B,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,eAAA,cAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AASvB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAxBhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,iBAGR,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B;IAEL;IACA;IAGA;IACA;IACA;IACA;GACH;GAAA,MACK;IACF,OAAOD;IACP,gCAAgC;IAChC,oCAAoC;IACpC,oBAAoB;GACvB;GAAA,UAAA;GAAA,QAAA,CAAA,q2FAAA;EAAA,CAAA;CAa+C,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,YAAU,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,QAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,QAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AEzF9D,MAAM,aAAmB,IAAI,KAAK,MAAM,GAAG,EAAE;AAC7C,MAAM,iBAA2C;CAAE,OAAO;EAAC;EAAO;EAAS;CAAM;CAAG,WAAW;AAAG;AAClG,MAAM,WAAmB;AACzB,MAAM,eAAuB;AAC7B,MAAM,aAAqB;AAC3B,MAAM,cAAsB;AAE5B,MAAM,UAAkB;AAExB,SAAS,WAAW,MAAY;CAC5B,OAAO,SAAS,SAAS,SAAS,WAAW,SAAS;AAC1D;AAEA,SAAS,QAAQ,KAAa,QAAgC;CAC1D,MAAM,CAAC,MAAM,OAAO,QAAkB,IAAI,MAAM,GAAG;CACnD,MAAM,QAA0D;EAAE,KAAK;EAAM;EAAO;CAAI;CACxF,OAAO,OAAO,MAAM,KAAK,SAAyC,MAAM,KAAK,CAAC,CAAC,KAAK,OAAO,SAAS;AACxG;AAGA,SAAS,QAAQ,QAA2B,QAAgC;CACxE,MAAM,QAAyD,CAAA;CAC/D,OAAO,MAAM,SAAS,MAA8B,UAAuB;EACvE,MAAM,QAAQ,OAAO;CACzB,CAAC;CACD,MAAM,EAAE,KAAK,OAAO,SAA0D;CAC9E,IAAI,QAAQ,UAAa,UAAU,UAAa,MAAM,WAAW,UAC7D,OAAO;CAEX,IAAI,IAAI,SAAS,gBAAgB,MAAM,SAAS,cAC5C,OAAO;CAEX,OAAO,GAAG,KAAI,GAAI,MAAM,SAAS,cAAc,GAAG,EAAC,GAAI,IAAI,SAAS,cAAc,GAAG;AACzF;AAGA,SAAS,SAAS,QAAyB;CACvC,IAAI,OAAO,WAAW,aAClB,OAAO;CAEX,MAAM,CAAC,MAAM,UAA6B;CAC1C,IAAI,OAAO,WAAW,gBAAgB,KAAK,SAAS,cAChD,OAAO;CAEX,OAAO,GAAG,KAAK,SAAS,cAAc,GAAG,EAAC,GAAI;AAClD;AAGA,SAAS,WAAW,QAA2B,MAA0B,QAAgC;CACrG,IAAI,SAAS,QACT,OAAO,SAAS,MAAM;CAE1B,IAAI,SAAS,QACT,OAAO,OAAO,WAAW,aAAa,QAAQ,QAAQ,MAAM,IAAI;CAEpE,IAAI,OAAO,WAAW,GAClB,OAAO;CAEX,MAAM,MAAqB,QAAQ,OAAO,MAAM,GAAG,UAAU,GAAG,MAAM;CACtE,MAAM,OAAsB,SAAS,OAAO,MAAM,UAAU,CAAC;CAC7D,OAAO,QAAQ,QAAQ,SAAS,OAAO,OAAO,GAAG,IAAG,GAAI;AAC5D;AAGA,SAAgB,aAAa,QAAc;CACvC,MAAM,QAAmC,IAAI,KAAK,eAAe,QAAQ;EACrE,KAAK;EACL,OAAO;EACP,MAAM;CACT,CAAA,CAAC,CAAC,cAAc,UAAU;CAC3B,MAAM,QAAkC,MACnC,KAAK,SAA0C,KAAK,IAAI,CAAC,CACzD,QAAQ,SAAiD,WAAW,IAAI,CAAC;CAC9E,MAAM,YAAoB,MAAM,MAAM,SAA2C,KAAK,SAAS,SAAS,CAAC,EAAE,MAAM,KAAI,KAAM;CAC3H,IAAI,MAAM,WAAW,cAAc,cAAc,IAC7C,OAAO;CAEX,OAAO;EAAE;EAAO;CAAS;AAC7B;AAMA,SAAgB,WAAW,OAAe,MAA0B,QAAgC;CAChG,IAAI,SAAS,UAAU,WAAW,OAAO,IAAI,MAAM,MAC/C,OAAO;CAEX,IAAI,SAAS,QACT,OAAO,QAAQ,OAAO,MAAM;CAEhC,MAAM,CAAC,KAAK,QAAkB,MAAM,MAAM,GAAG;CAC7C,OAAO,GAAG,QAAQ,KAAK,MAAM,EAAC,GAAI;AACtC;AAGA,SAAgB,YAAY,MAA0B,QAAkC,SAAmC;CACvH,MAAM,OAAe,GAAG,QAAQ,KAAI,GAAI,QAAQ;CAChD,IAAI,SAAS,QACT,OAAO;CAEX,MAAM,MAAc,OAAO,MAAM,KAAK,SAAyC,QAAQ,KAAK,CAAC,CAAC,KAAK,OAAO,SAAS;CACnH,OAAO,SAAS,SAAS,MAAM,GAAG,IAAG,GAAI;AAC7C;AAMA,SAAgB,YAAY,MAAc,MAA0B,QAAgC;CAChG,MAAM,MAAqB,WAAW,MAAM,IAAI;CAChD,IAAI,QAAQ,MACR,OAAO;CAEX,MAAM,QAAgB,KAAK,KAAI;CAC/B,IAAI,CAAC,QAAQ,KAAK,KAAK,GACnB,OAAO;CAEX,MAAM,YAA2B,WAAW,MAAM,MAAM,MAAM,KAAK,CAAA,GAAI,MAAM,MAAM;CAEnF,OAAO,cAAc,OAAO,OAAO,WAAW,WAAW,IAAI;AACjE;AChGA,MAAM,YAAoB;AA8C1B,IAAa,wBAAb,MAAa,8BAA8B,kBAAyB;CAhCpE,cAAA;;EAkCa,KAAA,UAA0B,OAAO,aAAa;EAE9C,KAAA,UAA4C,eAAyC,aAAa,KAAK,QAAO,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAExG,KAAA,IAA4B,OAAO,aAAa;EAEhD,KAAA,SAA0B,OAAO,kBAAkB,CAAC,CAAC;EAErD,KAAA,UAA4D,UAAwC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAC9G,KAAA,UAAkD,UAAU,oBAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;EAG/E,KAAA,cAAuC,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EACpD,KAAA,YAAqC,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAElD,KAAA,QAAwB,eAAsB;GAC7D,MAAM,SAAyB,KAAK,EAAC;GACrC,OAAO,YAAY,KAAK,KAAI,GAAI,KAAK,QAAO,GAAI;IAC5C,KAAK,OAAO;IACZ,OAAO,OAAO;IACd,MAAM,OAAO;IACb,MAAM,OAAO;IACb,QAAQ,OAAO;GAClB,CAAA;EACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;EAKiB,KAAA,OAAuB,eAAuB,KAAK,MAAM,KAAK,MAAK,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EACvE,KAAA,WAAiC,eAChD,KAAK,KAAI,MAAO,SAAS,aAAa,gBACzC,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAEkB,KAAA,WAA4B,eAAwB,KAAK,MAAK,MAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;EAKxE,KAAA,YAA4B,eAAuB,KAAK,MAAK,CAAE,CAAC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;EAEvE,KAAA,aAAoC,eAA+B,KAAK,SAAQ,IAAK,OAAO,KAAK,MAAK,GAAI,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;EAG7G,KAAA,aAA+C,MAA2B,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;EAEpF,KAAA,cAA8B,eAAuB,KAAK,QAAQ,KAAK,MAAK,GAAI,KAAK,KAAI,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;EAE7F,KAAA,OAAwC,MAA0B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;EACzE,KAAA,MAAkC,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAC5D,KAAA,MAAkC,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;EAE5D,KAAA,aAA4D,MAA2B,GAAC;GAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;GACpG,WAAW;EAAe,CAAA;CAsGjC;CA3JY;CAEA;CAuDO,WAAW,OAAoB;EAC3C,MAAM,WAAW,KAAK;EACtB,KAAK,YAAY,IAAI,KAAK;CAC9B;CAEU,gBAAa;EACnB,OAAO;CACX;CAEU,kBAAe;EACrB,KAAK,QAAO,CAAE,EAAE,cAAc,MAAK;CACvC;CAEmB,aAAU;EACzB,MAAM,WAAU;EAChB,KAAK,QAAQ,EAAE;CACnB;CAGU,QAAQ,OAAY;EAC1B,MAAM,OAAgB,MAAM,OAA4B;EACxD,IAAI,KAAK,KAAI,MAAO,IAAI;GACpB,KAAK,QAAQ,EAAE;GACf;EACJ;EACA,MAAM,OAAsB,YAAY,MAAM,KAAK,KAAI,GAAI,KAAK,QAAO,CAAE;EACzE,IAAI,SAAS,QAAQ,CAAC,eAAe,MAAM,KAAK,IAAG,GAAI,KAAK,IAAG,CAAE,GAAG;GAChE,KAAK,YAAY,IAAI,IAAI;GACzB;EACJ;EACA,KAAK,QAAQ,IAAI;CACrB;CAGU,YAAS;EACf,IAAI,KAAK,OAAM,KAAM,CAAC,KAAK,WAAU,GACjC,KAAK,UAAU,IAAI,IAAI;CAE/B;CAEU,aAAU;EAChB,KAAK,UAAU,IAAI,KAAK;EACxB,KAAK,QAAO,CAAE,EAAE,MAAK;CACzB;CAEU,SAAS,OAAa;EAC5B,KAAK,QAAQ,KAAK;EAClB,KAAK,YAAW;CACpB;CAEU,SAAM;EACZ,KAAK,YAAW;CACpB;CAEA,QAAQ,OAAa;EACjB,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,WAAW,KAAK;EACrB,KAAK,QAAQ,KAAK;CACtB;CAGA,QAAQ,OAAa;EACjB,KAAK,YAAY,IAAI,KAAK;EAC1B,MAAM,OAAqC,KAAK,QAAO,CAAE,EAAE;EAC3D,IAAI,SAAS,QACT,KAAK,QAAQ,KAAK,MAAM,KAAK;CAErC;CAEA,MAAM,OAAc;EAChB,OAAO,OAAO,UAAU,WAAW,WAAW,OAAO,KAAK,KAAI,GAAI,KAAK,QAAO,CAAE,IAAI;CACxF;CAOA,QAAQ,OAAe,MAAwB;EAC3C,IAAI,UAAU,IACV,OAAO;EAEX,MAAM,SAAiB,KAAK,MAAM,SAAS,SAAS,cAAc,UAAU,KAAK;EACjF,IAAI,OAAO,MAAM,MAAM,GACnB,OAAO;EAEX,OAAO,IAAI,KAAK,eAAe,KAAK,QAAO,GAAI,KAAK,eAAe,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,MAAM,CAAC;CACrG;CAEA,eAAe,MAAwB;EACnC,IAAI,SAAS,QACT,OAAO;GAAE,MAAM;GAAW,QAAQ;EAAS;EAE/C,IAAI,SAAS,kBACT,OAAO;GAAE,WAAW;GAAU,WAAW;EAAO;EAEpD,OAAO,EAAE,WAAW,SAAQ;CAChC;CA5JS;EAAA,KAAA,OAAA,GAAA,mBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,UAAA;GAAA,MAAA;GAAqB,MAAA;GAAA,QAAA,GAAA,gBAAA;EAAA,CAAA;CAAA;CAArB;EAAA,KAAA,OAAA,GAAA,qBAAA;GAAA,YAAA;GAAA,SAAA;GAAA,MAAA;GAAqB,cAAA;GAAA,UAAA;GAAA,QAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,MAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,KAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,KAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;IAAA,YAAA;KAAA,mBAAA;KAAA,YAAA;KAAA,UAAA;KAAA,YAAA;KAAA,mBAAA;IAAA;GAAA;GAAA,MAAA;IAAA,YAAA;KAAA,kCAAA;KAAA,iCAAA;KAAA,kCAAA;KAAA,oCAAA;KAAA,0CAAA;KAAA,kCAAA;KAAA,kCAAA;IAAA;IAAA,gBAAA;GAAA;GAAA,WAhBnB,CAEP;IAAE,SAAS;IAAmB,aAAa,iBAAiB,qBAAqB;GAAC,CACrF;GAAA,aAAA,CAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,SAAA;IAAA,aAAA;IAAA,UAAA;GAAA,GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAwB8E;IAAkB,aAAA;IAAA,UAAA;GAAA,CAAA;GAAA,iBAAA;GAAA,gBAAA,CAAA;IAAA,WAAA,GAAA;IAAA,QAAA,CAAA,UAAA,QAAA;GAAA,CAAA;GAAA,UAAA;GAAA,UC5FrG;GA8EA,QAAA,CAAA,kiGAAA;GAAA,cAAA;IAAA;KAAA,MAAA;KAAA,MDrBQ;KAAsB,UAAA;KAAA,QAAA,CAAA,MAAA;KAAA,SAAA,CAAA,YAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACtB;KAAoB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,UAAA,QAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACpB;KAAqB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,SAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACrB;KAAkB,UAAA;KAAA,QAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;KAAA;KAAA,SAAA,CAAA,mBAAA,iBAAA;KAAA,UAAA,CAAA,WAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MAClB;KAAc,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACd;KAAa,UAAA;KAAA,QAAA,CAAA,OAAA;IAAA;IAAA;KAAA,MAAA;KAAA,MACb;KAAY,UAAA;IAAA;GAAA;GAAA,iBAAA,GAAA,wBAAA;GAAA,eAAA,GAAA,kBAAA;EAAA,CAAA;CAAA;;AAkBP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAhCjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,iBAGT,wBAAwB;GAAM,eAChC,kBAAkB;GAAI,SAC5B;IAEL;IACA;IACA;IACA;IACA;IACA;IACA;GACH;GAAA,WACU,CAEP;IAAE,SAAS;IAAmB,aAAa,iBAAgB,qBAAsB;GAAC,CACrF;GAAA,gBACe,CAAC;IAAE,WAAW;IAAmB,QAAQ,CAAC,QAAQ;GAAC,CAAE;GAAC,MAChE;IACF,OAAO;IACP,oCAAoC;IACpC,mCAAmC;IACnC,oCAAoC;IACpC,sCAAsC;IACtC,4CAA4C;IAC5C,oCAAoC;IACpC,oCAAoC;GACvC;GAAA,UAAA;GAAA,QAAA,CAAA,kiGAAA;EAAA,CAAA;CAYsH,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBACjD,kBAAkB,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,KAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-date-picker.mjs","names":["MONTH_LEN","BEM_BLOCK","YEAR_LEN"],"sources":["../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-panel.logic.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/panel/rt-date-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/panel/rt-date-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-text.logic.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.ts","../../../projects/ui-kit-v2/src/lib/components/date-picker/rt-date-picker.component.html"],"sourcesContent":["import { ERtCalendarDayState, IRtCalendar } from '@rt-tools/ui-kit-v2/calendar';\nimport { IRtDatePicker } from './rt-date-picker.model';\n\n/**\n * Чистая логика панели rt-date-picker: чтение и запись значения, месяц, границы, колонки времени\n * и клавиши сетки. Текущий момент приходит параметром — компонент читает часы на своей границе.\n *\n * Значения — строки формы нативного input'а: `YYYY-MM-DD`, `HH:mm`, `YYYY-MM-DDTHH:mm`. Строки\n * одной формы сравниваются как текст, поэтому границы сравниваются обрезанными до длины значения.\n */\n\nconst DAY_RE: RegExp = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_RE: RegExp = /^(\\d{2}):(\\d{2})$/;\nconst DAY_LENGTH_MS: number = 86_400_000;\nconst WEEK: number = 7;\nconst DAY_LEN: number = 10;\nconst MONTH_LEN: number = 7;\nconst TIME_LEN: number = 5;\n\ninterface IWeekInfo {\n firstDay: number;\n}\n\ntype TLocaleWithWeek = Intl.Locale & { weekInfo?: IWeekInfo; getWeekInfo?: () => IWeekInfo };\n\n/** Числа строки даты или времени: `2026-09-29` → `[2026, 9, 29]`. */\nfunction nums(text: string): number[] {\n return text.split(/\\D/).map(Number);\n}\n\n/**\n * Строка формы значения как число: `2026-09-29T10:05` → `202609291005`. Строки одной формы\n * сравниваются по этому числу так же, как по порядку дат.\n */\nfunction rank(text: string): number {\n return Number(text.replace(/\\D/g, ''));\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction dayToMs(day: string): number {\n const [y, m, d]: number[] = nums(day);\n return Date.UTC(y, m - 1, d);\n}\n\nfunction msToDay(ms: number): string {\n const date: Date = new Date(ms);\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\nfunction isDay(text: string): boolean {\n const match: RegExpExecArray | null = DAY_RE.exec(text);\n if (match === null) {\n return false;\n }\n const month: number = Number(match[2]);\n const day: number = Number(match[3]);\n return month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth(Number(match[1]), month);\n}\n\nfunction isTime(text: string): boolean {\n const match: RegExpExecArray | null = TIME_RE.exec(text);\n return match !== null && Number(match[1]) < 24 && Number(match[2]) < 60;\n}\n\n/** Время `HH:mm` из часа и минуты. */\nexport function rtDateTime(hour: number, minute: number): string {\n return `${pad(hour)}:${pad(minute)}`;\n}\n\n/** Первый день недели локали: 1 — понедельник … 7 — воскресенье. */\nexport function rtDateFirstDay(locale: string): number {\n const info: TLocaleWithWeek = new Intl.Locale(locale);\n return (info.getWeekInfo?.() ?? info.weekInfo)?.firstDay ?? 1;\n}\n\n/** Читает текст формы значения; `null` — текст не значение этого типа. */\nexport function rtDateRead(text: string, type: IRtDatePicker.Type): string | null {\n const value: string = text.trim();\n if (type === 'date') {\n return isDay(value) ? value : null;\n }\n if (type === 'time') {\n return isTime(value) ? value : null;\n }\n const parts: string[] = value.split('T');\n return parts.length === 2 && isDay(parts[0]) && isTime(parts[1]) ? value : null;\n}\n\n/** Собирает значение типа из дня и времени; без нужной части — пустая строка. */\nexport function rtDateWrite(type: IRtDatePicker.Type, day: string | null, time: string | null): string {\n if (type === 'date') {\n return day ?? '';\n }\n if (type === 'time') {\n return time ?? '';\n }\n return day !== null && time !== null ? `${day}T${time}` : '';\n}\n\n/** Разбирает значение на день и время; недостающая часть — `null`. */\nexport function rtDateSplit(value: string, type: IRtDatePicker.Type): { day: string | null; time: string | null } {\n if (value === '') {\n return { day: null, time: null };\n }\n if (type === 'time') {\n return { day: null, time: value };\n }\n return { day: value.slice(0, DAY_LEN), time: type === 'date' ? null : value.slice(DAY_LEN + 1) };\n}\n\n/** Лежит ли значение в границах; граница обрезается до длины значения, `null` — открыта. */\nexport function rtDateInBounds(value: string, min: string | null, max: string | null): boolean {\n const low: string | null = min === null ? null : min.slice(0, value.length);\n const high: string | null = max === null ? null : max.slice(0, value.length);\n return (low === null || rank(value) >= rank(low)) && (high === null || rank(value) <= rank(high));\n}\n\n/** Текущий момент: день и время, округлённое вниз до шага минут. */\nexport function rtDateNow(now: Date, step: number): IRtDatePicker.Moment {\n const minute: number = Math.floor(now.getMinutes() / step) * step;\n return {\n day: `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`,\n time: `${pad(now.getHours())}:${pad(minute)}`,\n };\n}\n\n/** Сдвигает месяц `YYYY-MM` на `delta` месяцев. */\nexport function rtDateAddMonths(month: string, delta: number): string {\n const [y, m]: number[] = nums(month);\n const date: Date = new Date(Date.UTC(y, m - 1 + delta, 1));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}`;\n}\n\n/** Можно ли листать от месяца на `delta`: соседний месяц не лежит за границей. */\nexport function rtDateCanPage(month: string, delta: number, min: string | null, max: string | null): boolean {\n return rtDateInBounds(rtDateAddMonths(month, delta), min, max);\n}\n\nfunction monthTitle(month: string, locale: string): string {\n const [y, m]: number[] = nums(month);\n const name: string = new Intl.DateTimeFormat(locale, { month: 'long', timeZone: 'UTC' }).format(Date.UTC(y, m - 1, 1));\n return `${name.charAt(0).toLocaleUpperCase(locale)}${name.slice(1)} ${y}`;\n}\n\nfunction dayCell(day: string, ctx: IRtDatePicker.MonthContext): IRtCalendar.Day {\n return {\n key: day,\n dayOfMonth: Number(day.slice(8)),\n sublabel: '',\n state: day === ctx.chosen ? ERtCalendarDayState.Chosen : ERtCalendarDayState.Free,\n disabled: !rtDateInBounds(day, ctx.min, ctx.max),\n today: day === ctx.today,\n };\n}\n\n/** Месяц `YYYY-MM` для календаря: подпись по локали, пустые ячейки до первого дня, дни. */\nexport function rtDateMonth(month: string, ctx: IRtDatePicker.MonthContext): IRtCalendar.Month {\n const [y, m]: number[] = nums(month);\n const first: number = Date.UTC(y, m - 1, 1);\n const weekday: number = new Date(first).getUTCDay() || WEEK;\n const blanks: number = (weekday - rtDateFirstDay(ctx.locale) + WEEK) % WEEK;\n const days: IRtCalendar.Day[] = Array.from({ length: daysInMonth(y, m) }, (_: unknown, i: number): IRtCalendar.Day =>\n dayCell(msToDay(first + i * DAY_LENGTH_MS), ctx)\n );\n const leadingBlanks: number[] = Array.from({ length: blanks }, (_: unknown, i: number): number => i);\n return { key: month, label: monthTitle(month, ctx.locale), leadingBlanks, days };\n}\n\n/** Короткие имена дней недели по локали, начиная с её первого дня. */\nexport function rtDateWeekdays(locale: string): string[] {\n const format: Intl.DateTimeFormat = new Intl.DateTimeFormat(locale, { weekday: 'short', timeZone: 'UTC' });\n // 2024-01-01 — понедельник.\n const monday: number = Date.UTC(2024, 0, 1);\n const shift: number = rtDateFirstDay(locale) - 1;\n return Array.from({ length: WEEK }, (_: unknown, i: number): string => format.format(monday + ((i + shift) % WEEK) * DAY_LENGTH_MS));\n}\n\n/** Двенадцать месяцев года для выбора месяца; месяц за границей выключен. */\nexport function rtDateMonths(year: number, locale: string, min: string | null, max: string | null): IRtDatePicker.MonthCell[] {\n const format: Intl.DateTimeFormat = new Intl.DateTimeFormat(locale, { month: 'short', timeZone: 'UTC' });\n return Array.from({ length: 12 }, (_: unknown, i: number): IRtDatePicker.MonthCell => {\n const key: string = `${year}-${pad(i + 1)}`;\n return { key, label: format.format(Date.UTC(year, i, 1)), disabled: !rtDateInBounds(key, min, max) };\n });\n}\n\n/** Граница времени для дня: у даты со временем действует только в день самой границы. */\nfunction timeBound(bound: string | null, day: string | null): string | null {\n if (bound === null || bound.length <= TIME_LEN) {\n return bound;\n }\n return day === bound.slice(0, DAY_LEN) ? bound.slice(DAY_LEN + 1) : null;\n}\n\n/** Колонки часов и минут: минуты идут с шагом, время за границей выключено. */\nexport function rtDateTimeColumns(ctx: IRtDatePicker.TimeContext): IRtDatePicker.TimeColumns {\n const low: string | null = timeBound(ctx.min, ctx.day);\n const high: string | null = timeBound(ctx.max, ctx.day);\n const hours: IRtDatePicker.TimeCell[] = Array.from({ length: 24 }, (_: unknown, h: number): IRtDatePicker.TimeCell => ({\n value: h,\n label: pad(h),\n disabled: (low !== null && rank(`${pad(h)}:59`) < rank(low)) || (high !== null && rank(`${pad(h)}:00`) > rank(high)),\n }));\n const step: number = Math.max(1, Math.floor(ctx.step));\n const minutes: IRtDatePicker.TimeCell[] = Array.from(\n { length: Math.ceil(60 / step) },\n (_: unknown, i: number): IRtDatePicker.TimeCell => {\n const minute: number = i * step;\n const time: string = `${pad(ctx.hour ?? 0)}:${pad(minute)}`;\n return { value: minute, label: pad(minute), disabled: ctx.hour !== null && !rtDateInBounds(time, low, high) };\n }\n );\n return { hours, minutes };\n}\n\nfunction shiftMonth(day: string, delta: number): string {\n const target: string = rtDateAddMonths(day.slice(0, MONTH_LEN), delta);\n const [y, m]: number[] = nums(target);\n return `${target}-${pad(Math.min(Number(day.slice(8)), daysInMonth(y, m)))}`;\n}\n\n/** Клавиши, что двигают фокус на число дней. */\nconst DAY_KEYS: Readonly<Record<string, number>> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -WEEK, ArrowDown: WEEK };\n\n/** Клавиши, что двигают фокус на месяц. */\nconst MONTH_KEYS: Readonly<Record<string, number>> = { PageUp: -1, PageDown: 1 };\n\nfunction keyTarget(key: string, day: string, firstDay: number): string | null {\n const ms: number = dayToMs(day);\n if (key in DAY_KEYS) {\n return msToDay(ms + DAY_KEYS[key] * DAY_LENGTH_MS);\n }\n if (key in MONTH_KEYS) {\n return shiftMonth(day, MONTH_KEYS[key]);\n }\n const offset: number = ((new Date(ms).getUTCDay() || WEEK) - firstDay + WEEK) % WEEK;\n if (key === 'Home') {\n return msToDay(ms - offset * DAY_LENGTH_MS);\n }\n return key === 'End' ? msToDay(ms + (WEEK - 1 - offset) * DAY_LENGTH_MS) : null;\n}\n\n/**\n * Куда клавиша переводит фокус с дня; `null` — клавиша не сеточная. День за границей не\n * достаётся: фокус встаёт на ближний день в границах.\n */\nexport function rtDateGridKey(key: string, day: string, firstDay: number, min: string | null, max: string | null): string | null {\n const target: string | null = keyTarget(key, day, firstDay);\n if (target === null) {\n return null;\n }\n const low: string | null = min === null ? null : min.slice(0, DAY_LEN);\n const high: string | null = max === null ? null : max.slice(0, DAY_LEN);\n if (low !== null && rank(target) < rank(low)) {\n return low;\n }\n return high !== null && rank(target) > rank(high) ? high : target;\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n output,\n signal,\n viewChildren,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_LOCALE, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCalendarComponent } from '@rt-tools/ui-kit-v2/calendar';\nimport { IRtCalendar } from '@rt-tools/ui-kit-v2/calendar';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtToggleButtonGroupComponent } from '@rt-tools/ui-kit-v2/toggle-button-group';\nimport { IRtToggleButtonGroup } from '@rt-tools/ui-kit-v2/toggle-button-group';\nimport {\n rtDateAddMonths,\n rtDateCanPage,\n rtDateFirstDay,\n rtDateGridKey,\n rtDateInBounds,\n rtDateMonth,\n rtDateMonths,\n rtDateNow,\n rtDateSplit,\n rtDateTime,\n rtDateTimeColumns,\n rtDateWeekdays,\n rtDateWrite,\n} from '../rt-date-panel.logic';\nimport { IRtDatePicker } from '../rt-date-picker.model';\n\nconst BEM_BLOCK: string = 'rt-date-panel';\nconst MONTH_LEN: number = 7;\nconst YEAR_LEN: number = 4;\n\ntype TView = 'days' | 'months';\ntype TTab = 'date' | 'time';\n\n/**\n * Панель rt-date-picker: месяц с листанием и выбором месяца и года, колонки часов и минут,\n * подвал с «Сегодня», «Сейчас», «Готово» или «Применить» — по типу значения.\n *\n * Панель не пишет в форму: готовое значение уходит событием `picked`, просьба закрыться —\n * `closed`. Черновик живёт, пока панель открыта; поле создаёт её заново на каждое открытие.\n * Вся арифметика дат — в `rt-date-panel.logic`.\n */\n@Component({\n selector: 'rt-date-panel',\n templateUrl: './rt-date-panel.component.html',\n styleUrl: './rt-date-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n\n // components\n RtButtonDirective,\n RtCalendarComponent,\n RtIconButtonComponent,\n RtToggleButtonGroupComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-date-panel--sheet]': 'sheet()',\n '[class.rt-date-panel--with-time]': \"type() !== 'date'\",\n '(keydown.escape)': 'closed.emit()',\n },\n})\nexport class RtDatePanelComponent {\n /** Локаль кита: названия месяцев, дней недели и первый день недели идут по ней. */\n readonly #locale: Signal<string> = inject(RT_KIT_LOCALE);\n /** Минута открытия панели: от неё считается «сегодня», когда вход `now` не задан. */\n readonly #openedAt: Date = new Date();\n readonly #firstDay: Signal<number> = computed((): number => rtDateFirstDay(this.#locale()));\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n protected readonly weekdays: Signal<readonly string[]> = computed((): readonly string[] => rtDateWeekdays(this.#locale()));\n\n protected readonly timeCells: Signal<readonly ElementRef<HTMLButtonElement>[]> =\n viewChildren<ElementRef<HTMLButtonElement>>('timeCell');\n\n protected readonly view: WritableSignal<TView> = signal<TView>('days');\n protected readonly tab: WritableSignal<TTab> = signal<TTab>('date');\n protected readonly activeKey: WritableSignal<string | null> = signal<string | null>(null);\n\n protected readonly today: Signal<string> = computed((): string => rtDateNow(this.now() ?? this.#openedAt, 1).day);\n\n protected readonly draftDay: WritableSignal<string | null> = linkedSignal(\n (): string | null => rtDateSplit(this.value(), this.type()).day\n );\n protected readonly draftTime: WritableSignal<string | null> = linkedSignal(\n (): string | null => rtDateSplit(this.value(), this.type()).time\n );\n protected readonly shownMonth: WritableSignal<string> = linkedSignal((): string =>\n (this.draftDay() ?? this.today()).slice(0, MONTH_LEN)\n );\n protected readonly year: WritableSignal<number> = linkedSignal((): number => Number(this.shownMonth().slice(0, YEAR_LEN)));\n\n protected readonly split: Signal<boolean> = computed((): boolean => this.sheet() && this.type() === 'datetime-local');\n protected readonly showDate: Signal<boolean> = computed(\n (): boolean => this.type() !== 'time' && !(this.split() && this.tab() === 'time')\n );\n protected readonly showTime: Signal<boolean> = computed(\n (): boolean => this.type() !== 'date' && !(this.split() && this.tab() === 'date')\n );\n\n protected readonly months: Signal<IRtCalendar.Month[]> = computed((): IRtCalendar.Month[] => [\n rtDateMonth(this.shownMonth(), {\n locale: this.#locale(),\n today: this.today(),\n chosen: this.draftDay(),\n min: this.min(),\n max: this.max(),\n }),\n ]);\n protected readonly canPrev: Signal<boolean> = computed((): boolean => rtDateCanPage(this.shownMonth(), -1, this.min(), this.max()));\n protected readonly canNext: Signal<boolean> = computed((): boolean => rtDateCanPage(this.shownMonth(), 1, this.min(), this.max()));\n\n protected readonly monthCells: Signal<IRtDatePicker.MonthCell[]> = computed((): IRtDatePicker.MonthCell[] =>\n rtDateMonths(this.year(), this.#locale(), this.min(), this.max())\n );\n protected readonly canPrevYear: Signal<boolean> = computed((): boolean =>\n rtDateInBounds(String(this.year() - 1), this.min(), this.max())\n );\n protected readonly canNextYear: Signal<boolean> = computed((): boolean =>\n rtDateInBounds(String(this.year() + 1), this.min(), this.max())\n );\n\n protected readonly draftHour: Signal<number | null> = computed((): number | null => this.#part(0));\n protected readonly draftMinute: Signal<number | null> = computed((): number | null => this.#part(1));\n protected readonly columns: Signal<IRtDatePicker.TimeColumns> = computed((): IRtDatePicker.TimeColumns =>\n rtDateTimeColumns({ step: this.minuteStep(), hour: this.draftHour(), day: this.draftDay(), min: this.min(), max: this.max() })\n );\n\n protected readonly todayOff: Signal<boolean> = computed((): boolean => !rtDateInBounds(this.today(), this.min(), this.max()));\n /** Черновик собирается в значение и лежит в границах. */\n protected readonly canApply: Signal<boolean> = computed((): boolean => this.#draftValue() !== '');\n protected readonly tabs: Signal<IRtToggleButtonGroup.Option<TTab>[]> = computed((): IRtToggleButtonGroup.Option<TTab>[] => [\n { value: 'date', label: this.t().uiDate },\n { value: 'time', label: this.t().uiTime },\n ]);\n\n /** Тип значения: дата, время или дата со временем. */\n public readonly type: InputSignal<IRtDatePicker.Type> = input.required<IRtDatePicker.Type>();\n /** Значение поля в форме нативного input'а; пустая строка — пусто. */\n public readonly value: InputSignal<string> = input<string>('');\n public readonly min: InputSignal<string | null> = input<string | null>(null);\n public readonly max: InputSignal<string | null> = input<string | null>(null);\n /** Шаг колонки минут. */\n public readonly minuteStep: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(5, {\n transform: numberAttribute,\n });\n /** Раскладка нижней шторки: дни под палец, у даты со временем — переключатель «Дата | Время». */\n public readonly sheet: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Момент, от которого считаются «сегодня» и «Сейчас». Поле его не задаёт — панель читает часы\n * сама; задаёт витрина, чтобы кадр не менялся день ото дня.\n */\n public readonly now: InputSignal<Date | null> = input<Date | null>(null);\n\n /** Готовое значение: панель просит поле его записать. */\n public readonly picked: OutputEmitterRef<string> = output<string>();\n /** Панель просит закрыть себя. */\n public readonly closed: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Колонки времени прокручены так, что выбранный час и минута стоят посередине. Прокрутка\n // задаётся самой колонке: `scrollIntoView` двигал бы и страницу под поповером.\n afterRenderEffect((): void => {\n for (const cell of this.timeCells()) {\n const node: HTMLButtonElement = cell.nativeElement;\n const column: HTMLElement | null = node.parentElement;\n if (column !== null && node.getAttribute('aria-pressed') === 'true') {\n column.scrollTop = node.offsetTop - (column.clientHeight - node.offsetHeight) / 2;\n }\n }\n });\n }\n\n protected pickDay(day: IRtCalendar.Day): void {\n this.activeKey.set(day.key);\n if (this.type() === 'date') {\n this.#emit(day.key);\n return;\n }\n this.draftDay.set(day.key);\n }\n\n protected pickToday(): void {\n if (!this.todayOff()) {\n this.#emit(this.today());\n }\n }\n\n protected pickNow(): void {\n const now: IRtDatePicker.Moment = rtDateNow(this.now() ?? new Date(), this.minuteStep());\n this.draftTime.set(now.time);\n if (this.type() === 'datetime-local') {\n this.draftDay.set(now.day);\n }\n }\n\n protected pickHour(hour: number): void {\n this.draftTime.set(rtDateTime(hour, this.draftMinute() ?? 0));\n }\n\n protected pickMinute(minute: number): void {\n this.draftTime.set(rtDateTime(this.draftHour() ?? 0, minute));\n }\n\n protected onGridKey(event: IRtCalendar.GridKey): void {\n const next: string | null = rtDateGridKey(event.key, event.day.key, this.#firstDay(), this.min(), this.max());\n if (next !== null) {\n this.shownMonth.set(next.slice(0, MONTH_LEN));\n this.activeKey.set(next);\n }\n }\n\n protected page(delta: number): void {\n this.shownMonth.set(rtDateAddMonths(this.shownMonth(), delta));\n }\n\n protected openMonths(): void {\n this.year.set(Number(this.shownMonth().slice(0, YEAR_LEN)));\n this.view.set('months');\n }\n\n protected pageYear(delta: number): void {\n this.year.update((year: number): number => year + delta);\n }\n\n protected pickMonth(cell: IRtDatePicker.MonthCell): void {\n this.shownMonth.set(cell.key);\n this.view.set('days');\n }\n\n /** «Готово» и «Применить»: черновик уходит значением, панель закрывается. */\n protected apply(): void {\n const value: string = this.#draftValue();\n if (value !== '') {\n this.#emit(value);\n }\n }\n\n #emit(value: string): void {\n this.picked.emit(value);\n this.closed.emit();\n }\n\n #draftValue(): string {\n const value: string = rtDateWrite(this.type(), this.draftDay(), this.draftTime());\n return value !== '' && rtDateInBounds(value, this.min(), this.max()) ? value : '';\n }\n\n #part(index: number): number | null {\n const time: string | null = this.draftTime();\n return time === null ? null : Number(time.split(':')[index]);\n }\n}\n","<ng-container rtBlock=\"rt-date-panel\">\n @if (split()) {\n <rt-toggle-button-group\n rtElem=\"tabs\"\n qa-dataid=\"date-panel-tabs\"\n fullWidth\n [ariaLabel]=\"t().uiDate + ' | ' + t().uiTime\"\n [options]=\"tabs()\"\n [value]=\"tab()\"\n (valueChange)=\"tab.set($event)\" />\n }\n\n <div rtElem=\"body\">\n @if (showDate()) {\n @if (view() === 'days') {\n <rt-calendar\n rtElem=\"calendar\"\n qa-dataid=\"date-panel-calendar\"\n grid\n titleAction\n headerTitle\n [months]=\"months()\"\n [weekdayLabels]=\"weekdays()\"\n [canPrev]=\"canPrev()\"\n [canNext]=\"canNext()\"\n [activeKey]=\"activeKey()\"\n [prevAriaLabel]=\"t().uiPrevMonth\"\n [nextAriaLabel]=\"t().uiNextMonth\"\n (prevMonth)=\"page(-1)\"\n (nextMonth)=\"page(1)\"\n (dayClick)=\"pickDay($event)\"\n (gridKey)=\"onGridKey($event)\"\n (titleClick)=\"openMonths()\" />\n } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-months\" role=\"group\" [attr.aria-label]=\"t().uiChooseMonth\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-year\"\n icon=\"chevron-left\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYear\"\n [disabled]=\"!canPrevYear()\"\n (clicked)=\"pageYear(-1)\" />\n <span rtElem=\"year\" qa-dataid=\"date-panel-year\">{{ year() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-year\"\n icon=\"chevron-right\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYear\"\n [disabled]=\"!canNextYear()\"\n (clicked)=\"pageYear(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of monthCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-month\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.aria-pressed]=\"cell.key === shownMonth()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickMonth(cell)\">\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n }\n }\n\n @if (showTime()) {\n <div rtElem=\"time\" qa-dataid=\"date-panel-time\">\n <div rtElem=\"column\" qa-dataid=\"date-panel-hours\" role=\"group\" [attr.aria-label]=\"t().uiHours\">\n @for (cell of columns().hours; track cell.value) {\n <button\n #timeCell\n rtElem=\"cell\"\n qa-dataid=\"date-panel-hour\"\n type=\"button\"\n [attr.aria-pressed]=\"cell.value === draftHour()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickHour(cell.value)\">\n {{ cell.label }}\n </button>\n }\n </div>\n <div rtElem=\"column\" qa-dataid=\"date-panel-minutes\" role=\"group\" [attr.aria-label]=\"t().uiMinutes\">\n @for (cell of columns().minutes; track cell.value) {\n <button\n #timeCell\n rtElem=\"cell\"\n qa-dataid=\"date-panel-minute\"\n type=\"button\"\n [attr.aria-pressed]=\"cell.value === draftMinute()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickMinute(cell.value)\">\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <div rtElem=\"footer\">\n @switch (type()) {\n @case ('date') {\n <button\n rtButton\n qa-dataid=\"date-panel-today\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiToday\"\n [attr.aria-label]=\"t().uiToday\"\n [disabled]=\"todayOff()\"\n (click)=\"pickToday()\"></button>\n }\n @case ('time') {\n <button\n rtButton\n qa-dataid=\"date-panel-now\"\n theme=\"secondary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiNow\"\n [attr.aria-label]=\"t().uiNow\"\n (click)=\"pickNow()\"></button>\n <button\n rtButton\n qa-dataid=\"date-panel-done\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiDone\"\n [attr.aria-label]=\"t().uiDone\"\n [disabled]=\"!canApply()\"\n (click)=\"apply()\"></button>\n }\n @default {\n <button\n rtButton\n qa-dataid=\"date-panel-apply\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiApply\"\n [attr.aria-label]=\"t().uiApply\"\n [disabled]=\"!canApply()\"\n (click)=\"apply()\"></button>\n }\n }\n </div>\n</ng-container>\n","import { rtDateRead } from './rt-date-panel.logic';\nimport { IRtDatePicker } from './rt-date-picker.model';\n\n/**\n * Чистая логика текста в поле даты: как значение пишется по локали и как набранный текст\n * читается обратно. Значение формы — строка ISO (`YYYY-MM-DD`, `HH:mm`, `YYYY-MM-DDTHH:mm`);\n * текст — дата в порядке языка интерфейса (`01.08.2026` под `ru`), время всегда `HH:mm`.\n */\n\n/** День, в котором день, месяц и год различимы: по нему `Intl` называет порядок частей. */\nconst SAMPLE_DAY: Date = new Date(2026, 0, 31);\nconst DEFAULT_LAYOUT: IRtDatePicker.TextLayout = { order: ['day', 'month', 'year'], separator: '.' };\nconst YEAR_LEN: number = 4;\nconst PART_MAX_LEN: number = 2;\nconst DAY_GROUPS: number = 3;\nconst TIME_GROUPS: number = 2;\n/** Знаки, которые встречаются в тексте даты любой локали, кроме цифр. */\nconst TEXT_RE: RegExp = /^[\\d\\s.,/:\\-T]+$/;\n\nfunction isDatePart(type: string): type is IRtDatePicker.DatePart {\n return type === 'day' || type === 'month' || type === 'year';\n}\n\nfunction dayText(day: string, layout: IRtDatePicker.TextLayout): string {\n const [year, month, date]: string[] = day.split('-');\n const parts: Readonly<Record<IRtDatePicker.DatePart, string>> = { day: date, month, year };\n return layout.order.map((part: IRtDatePicker.DatePart): string => parts[part]).join(layout.separator);\n}\n\n/** День ISO из трёх групп цифр в порядке локали; `null` — группы не складываются в день. */\nfunction readDay(groups: readonly string[], layout: IRtDatePicker.TextLayout): string | null {\n const parts: Partial<Record<IRtDatePicker.DatePart, string>> = {};\n layout.order.forEach((part: IRtDatePicker.DatePart, index: number): void => {\n parts[part] = groups[index];\n });\n const { day, month, year }: Partial<Record<IRtDatePicker.DatePart, string>> = parts;\n if (day === undefined || month === undefined || year?.length !== YEAR_LEN) {\n return null;\n }\n if (day.length > PART_MAX_LEN || month.length > PART_MAX_LEN) {\n return null;\n }\n return `${year}-${month.padStart(PART_MAX_LEN, '0')}-${day.padStart(PART_MAX_LEN, '0')}`;\n}\n\n/** Время ISO из двух групп цифр: часы в один или два знака, минуты — ровно два. */\nfunction readTime(groups: readonly string[]): string | null {\n if (groups.length !== TIME_GROUPS) {\n return null;\n }\n const [hour, minute]: readonly string[] = groups;\n if (minute.length !== PART_MAX_LEN || hour.length > PART_MAX_LEN) {\n return null;\n }\n return `${hour.padStart(PART_MAX_LEN, '0')}:${minute}`;\n}\n\n/** Значение типа из групп цифр текста; `null` — группы не складываются в значение. */\nfunction readGroups(groups: readonly string[], type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string | null {\n if (type === 'time') {\n return readTime(groups);\n }\n if (type === 'date') {\n return groups.length === DAY_GROUPS ? readDay(groups, layout) : null;\n }\n if (groups.length !== DAY_GROUPS + TIME_GROUPS) {\n return null;\n }\n const day: string | null = readDay(groups.slice(0, DAY_GROUPS), layout);\n const time: string | null = readTime(groups.slice(DAY_GROUPS));\n return day === null || time === null ? null : `${day}T${time}`;\n}\n\n/** Порядок дня, месяца и года и знак между ними — по локали. */\nexport function rtDateLayout(locale: string): IRtDatePicker.TextLayout {\n const parts: Intl.DateTimeFormatPart[] = new Intl.DateTimeFormat(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }).formatToParts(SAMPLE_DAY);\n const order: IRtDatePicker.DatePart[] = parts\n .map((part: Intl.DateTimeFormatPart): string => part.type)\n .filter((type: string): type is IRtDatePicker.DatePart => isDatePart(type));\n const separator: string = parts.find((part: Intl.DateTimeFormatPart): boolean => part.type === 'literal')?.value.trim() ?? '';\n if (order.length !== DAY_GROUPS || separator === '') {\n return DEFAULT_LAYOUT;\n }\n return { order, separator };\n}\n\n/**\n * Текст поля для значения ISO; пустое значение — пустой текст. Строка, которая не читается как\n * значение этого типа, показывается как есть: она пришла из формы мимо поля и не должна пропасть.\n */\nexport function rtDateText(value: string, type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string {\n if (type === 'time' || rtDateRead(value, type) === null) {\n return value;\n }\n if (type === 'date') {\n return dayText(value, layout);\n }\n const [day, time]: string[] = value.split('T');\n return `${dayText(day, layout)} ${time}`;\n}\n\n/** Подсказка формы текста в буквах кита: `дд.мм.гггг`, `чч:мм`, `дд.мм.гггг чч:мм`. */\nexport function rtDateShape(type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout, letters: IRtDatePicker.ShapeLetters): string {\n const time: string = `${letters.hour}:${letters.minute}`;\n if (type === 'time') {\n return time;\n }\n const day: string = layout.order.map((part: IRtDatePicker.DatePart): string => letters[part]).join(layout.separator);\n return type === 'date' ? day : `${day} ${time}`;\n}\n\n/**\n * Читает набранный текст в значение ISO; `null` — текст не значение этого типа. Читается и\n * порядок локали, и сама форма значения: вставленная `2026-08-01` тоже становится значением.\n */\nexport function rtDateParse(text: string, type: IRtDatePicker.Type, layout: IRtDatePicker.TextLayout): string | null {\n const iso: string | null = rtDateRead(text, type);\n if (iso !== null) {\n return iso;\n }\n const value: string = text.trim();\n if (!TEXT_RE.test(value)) {\n return null;\n }\n const candidate: string | null = readGroups(value.match(/\\d+/g) ?? [], type, layout);\n // Кандидат проверяется той же формой значения: 31.02.2026 складывается в строку, но не в день.\n return candidate === null ? null : rtDateRead(candidate, type);\n}\n","import { NumberInput } from '@angular/cdk/coercion';\nimport {\n computed,\n forwardRef,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_LOCALE, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\nimport { RtBottomSheetComponent } from '@rt-tools/ui-kit-v2/bottom-sheet';\nimport { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtDatePanelComponent } from './panel/rt-date-panel.component';\nimport { rtDateInBounds } from './rt-date-panel.logic';\nimport { IRtDatePicker } from './rt-date-picker.model';\nimport { rtDateLayout, rtDateParse, rtDateShape, rtDateText } from './rt-date-text.logic';\n\nconst BEM_BLOCK: string = 'rt-date-picker';\n\n/**\n * Поле даты, времени или даты со временем со своей панелью кита, визуально и по токенам\n * идентичное rt-input (host — box `--rt-input-*`, input — прозрачный `__field`). Кнопка в конце\n * поля открывает `rt-date-panel`: на широком экране в поповере, на узком — в нижней шторке.\n * CVA через общий `RtFormControlBase`: clearable, авто-подсветка invalid, read-only\n * представление (значение форматируется через Intl).\n *\n * `value` — строка формы нативного input'а (`YYYY-MM-DD`, `YYYY-MM-DDTHH:mm`, `HH:mm`). Текст в\n * поле — дата в порядке языка интерфейса (`01.08.2026` под `ru`), время `HH:mm`; набирается так же,\n * вставленная форма значения тоже читается. Нечитаемый или лежащий за границами текст оставляет\n * значение прежним и помечает поле ошибкой.\n */\n@Component({\n selector: 'rt-date-picker',\n templateUrl: './rt-date-picker.component.html',\n styleUrls: ['./rt-date-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtBottomSheetComponent,\n RtDatePanelComponent,\n RtIconButtonComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtDatePickerComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-date-picker--disabled]': 'isDisabled()',\n '[class.rt-date-picker--invalid]': 'isInvalid() || textInvalid()',\n '[class.rt-date-picker--readonly]': 'isReadonly()',\n '[class.rt-date-picker--borderless]': '!bordered()',\n '[class.rt-date-picker--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-date-picker--size--sm]': \"size() === 'sm'\",\n '[class.rt-date-picker--size--lg]': \"size() === 'lg'\",\n },\n})\nexport class RtDatePickerComponent extends RtFormControlBase<string> {\n /** Локаль кита: приложение, меняющее язык на ходу, меняет её, и текст поля пересчитывается. */\n readonly #locale: Signal<string> = inject(RT_KIT_LOCALE);\n /** Порядок дня, месяца и года в тексте поля — по локали кита. */\n readonly #layout: Signal<IRtDatePicker.TextLayout> = computed((): IRtDatePicker.TextLayout => rtDateLayout(this.#locale()));\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n /** Узкий экран: панель открывается в нижней шторке, а не в поповере. */\n protected readonly narrow: Signal<boolean> = inject(BreakpointsService).viewportNarrow;\n\n protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined> = viewChild<ElementRef<HTMLInputElement>>('fieldEl');\n protected readonly popover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n /** Набранный текст не читается как значение в границах: поле помечено ошибкой. */\n protected readonly textInvalid: WritableSignal<boolean> = signal(false);\n protected readonly sheetOpen: WritableSignal<boolean> = signal(false);\n /** Подсказка формы текста буквами кита: `дд.мм.гггг` под русскими метками. */\n protected readonly shape: Signal<string> = computed((): string => {\n const labels: TRtKitLabelMap = this.t();\n return rtDateShape(this.type(), this.#layout(), {\n day: labels.uiShapeDay,\n month: labels.uiShapeMonth,\n year: labels.uiShapeYear,\n hour: labels.uiShapeHour,\n minute: labels.uiShapeMinute,\n });\n });\n /**\n * Текст в поле — значение в порядке языка интерфейса. Не строку форма кладёт мимо контракта\n * (например `Date`), и поле показывает её пустой, как показывало браузерное.\n */\n protected readonly text: Signal<string> = computed((): string => this.#text(this.value()));\n protected readonly openIcon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name =>\n this.type() === 'time' ? 'ico-time' : 'ico-calendar'\n );\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== '');\n /**\n * Ширина поля в знаках — по длине формы значения. Без неё текстовое поле берёт от браузера\n * двадцать знаков и в строке отборов потребителя занимает место вдвое шире значения.\n */\n protected readonly fieldSize: Signal<number> = computed((): number => this.shape().length);\n /** Подсказка обрезается многоточием в узком поле, поэтому шаблон целиком виден при наведении. */\n protected readonly shapeTitle: Signal<string | null> = computed((): string | null => (this.hasValue() ? null : this.shape()));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.#format(this.value(), this.type()));\n\n public readonly type: InputSignal<IRtDatePicker.Type> = input<IRtDatePicker.Type>('date');\n public readonly min: InputSignal<string | null> = input<string | null>(null);\n public readonly max: InputSignal<string | null> = input<string | null>(null);\n /** Шаг колонки минут в панели. */\n public readonly minuteStep: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(5, {\n transform: numberAttribute,\n });\n\n /** Значение из формы снимает ошибку набора: в поле теперь стоит оно. */\n public override writeValue(value: string | null): void {\n super.writeValue(value);\n this.textInvalid.set(false);\n }\n\n protected getEmptyValue(): string {\n return '';\n }\n\n protected focusAfterClear(): void {\n this.fieldEl()?.nativeElement.focus();\n }\n\n protected override clearValue(): void {\n super.clearValue();\n this.#accept('');\n }\n\n /** Набор текста: значение меняется, только когда текст читается как значение в границах. */\n protected onTyped(event: Event): void {\n const text: string = (event.target as HTMLInputElement).value;\n if (text.trim() === '') {\n this.#commit('');\n return;\n }\n const read: string | null = rtDateParse(text, this.type(), this.#layout());\n if (read === null || !rtDateInBounds(read, this.min(), this.max())) {\n this.textInvalid.set(true);\n return;\n }\n this.#commit(read);\n }\n\n /** Кнопка в конце поля: на узком экране открывает шторку, на широком поповер открывает сам. */\n protected openPanel(): void {\n if (this.narrow() && !this.isDisabled()) {\n this.sheetOpen.set(true);\n }\n }\n\n protected closePanel(): void {\n this.sheetOpen.set(false);\n this.popover()?.close();\n }\n\n protected onPicked(value: string): void {\n this.#commit(value);\n this.markTouched();\n }\n\n protected onBlur(): void {\n this.markTouched();\n }\n\n #commit(value: string): void {\n this.value.set(value);\n this.emitChange(value);\n this.#accept(value);\n }\n\n /** Текст в поле — принятое значение, ошибки набора нет. */\n #accept(value: string): void {\n this.textInvalid.set(false);\n const node: HTMLInputElement | undefined = this.fieldEl()?.nativeElement;\n if (node !== undefined) {\n node.value = this.#text(value);\n }\n }\n\n #text(value: unknown): string {\n return typeof value === 'string' ? rtDateText(value, this.type(), this.#layout()) : '';\n }\n\n /**\n * Форматирует ISO-значение нативного input'а в локализованный текст для\n * read-only. Для `time` форматируем как сегодняшнюю дату с временем (нужен\n * валидный Date), показывая только часы/минуты.\n */\n #format(value: string, type: IRtDatePicker.Type): string {\n if (value === '') {\n return '';\n }\n const parsed: number = Date.parse(type === 'time' ? `1970-01-01T${value}` : value);\n if (Number.isNaN(parsed)) {\n return value;\n }\n return new Intl.DateTimeFormat(this.#locale(), this.#formatOptions(type)).format(new Date(parsed));\n }\n\n #formatOptions(type: IRtDatePicker.Type): Intl.DateTimeFormatOptions {\n if (type === 'time') {\n return { hour: '2-digit', minute: '2-digit' };\n }\n if (type === 'datetime-local') {\n return { dateStyle: 'medium', timeStyle: 'short' };\n }\n return { dateStyle: 'medium' };\n }\n}\n","<ng-container rtBlock=\"rt-date-picker\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"date-picker-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n } @else {\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"date-picker-control\"\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [value]=\"text()\"\n [disabled]=\"isDisabled()\"\n [attr.placeholder]=\"shape()\"\n [attr.title]=\"shapeTitle()\"\n [attr.size]=\"fieldSize()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || textInvalid() || null\"\n (input)=\"onTyped($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"date-picker-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon-button\n rtElem=\"open\"\n qa-dataid=\"date-picker-open\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n rtPopoverAlign=\"end\"\n [icon]=\"openIcon()\"\n [ariaLabel]=\"t().uiOpenCalendar\"\n [disabled]=\"isDisabled()\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"narrow() || isDisabled()\"\n (clicked)=\"openPanel()\" />\n\n <ng-template #panelTpl>\n <div rtElem=\"popup\" qa-dataid=\"date-picker-popup\">\n <rt-date-panel\n [type]=\"type()\"\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [minuteStep]=\"minuteStep()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n </div>\n </ng-template>\n\n @if (narrow()) {\n <rt-bottom-sheet qa-dataid=\"date-picker-sheet\" [open]=\"sheetOpen()\" (openChange)=\"sheetOpen.set($event)\">\n @if (sheetOpen()) {\n <rt-date-panel\n sheet\n [type]=\"type()\"\n [value]=\"value()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [minuteStep]=\"minuteStep()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n }\n </rt-bottom-sheet>\n }\n }\n</ng-container>\n"],"mappings":"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"}
@@ -525,7 +525,7 @@ var RtDateRangeComponent = class RtDateRangeComponent extends RtFormControlBase
525
525
  this.#locale = inject(RT_KIT_LOCALE);
526
526
  this.#layout = computed(() => rtDateLayout(this.#locale()), ...ngDevMode ? [{ debugName: "#layout" }] : /* istanbul ignore next */ []);
527
527
  this.t = inject(RT_KIT_LABELS);
528
- this.narrow = inject(BreakpointsService).narrow;
528
+ this.narrow = inject(BreakpointsService).viewportNarrow;
529
529
  this.fieldEl = viewChild("fieldEl", ...ngDevMode ? [{ debugName: "fieldEl" }] : /* istanbul ignore next */ []);
530
530
  this.popover = viewChild(RtPopoverDirective, ...ngDevMode ? [{ debugName: "popover" }] : /* istanbul ignore next */ []);
531
531
  this.textInvalid = signal(false, ...ngDevMode ? [{ debugName: "textInvalid" }] : /* istanbul ignore next */ []);