@rt-tools/ui-kit-v2 0.40.0 → 0.42.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 (28) hide show
  1. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +4 -4
  2. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
  3. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +13 -5
  5. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +155 -100
  7. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  8. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  9. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +51 -24
  11. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  12. package/package.json +1 -1
  13. package/src/lib/components/calendar/CONTEXT.md +4 -2
  14. package/src/lib/components/calendar/rt-calendar.component.scss +29 -2
  15. package/src/lib/components/data-table/CONTEXT.md +5 -0
  16. package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +15 -0
  17. package/src/lib/components/data-table/stories/component/test-data-table-matrix.component.scss +10 -0
  18. package/src/lib/components/date-picker/CONTEXT.md +5 -0
  19. package/src/lib/components/date-picker/panel/CONTEXT.md +42 -0
  20. package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +55 -2
  21. package/src/rich-editor/lib/components/chat/CONTEXT.md +13 -1
  22. package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +28 -14
  23. package/src/rich-editor/lib/components/chat/rt-chat.component.scss +21 -0
  24. package/types/rt-tools-ui-kit-v2-calendar.d.ts +13 -1
  25. package/types/rt-tools-ui-kit-v2-core.d.ts +7 -0
  26. package/types/rt-tools-ui-kit-v2-data-table.d.ts +11 -1
  27. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +157 -5
  28. package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +14 -1
@@ -2,15 +2,15 @@ import * as i0 from "@angular/core";
2
2
  import { ChangeDetectionStrategy, Component, ViewEncapsulation, afterRenderEffect, booleanAttribute, computed, forwardRef, inject, input, linkedSignal, numberAttribute, output, signal, viewChild, viewChildren } from "@angular/core";
3
3
  import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
4
4
  import { BreakpointsService, RT_KIT_LABELS, RT_KIT_LOCALE } from "@rt-tools/ui-kit-v2/core";
5
+ import { RtButtonDirective } from "@rt-tools/ui-kit-v2/button";
6
+ import { ERtCalendarDayState, RtCalendarComponent } from "@rt-tools/ui-kit-v2/calendar";
7
+ import { RtIconButtonComponent } from "@rt-tools/ui-kit-v2/icon-button";
8
+ import { RtToggleButtonGroupComponent } from "@rt-tools/ui-kit-v2/toggle-button-group";
5
9
  import { RtBottomSheetComponent } from "@rt-tools/ui-kit-v2/bottom-sheet";
6
10
  import { RtFormControlBase } from "@rt-tools/ui-kit-v2/form-control";
7
- import { RtIconButtonComponent } from "@rt-tools/ui-kit-v2/icon-button";
8
11
  import { RtPopoverDirective } from "@rt-tools/ui-kit-v2/popover";
9
12
  import * as i1 from "@rt-tools/ui-kit-v2/radius";
10
13
  import { RtRadiusDirective } from "@rt-tools/ui-kit-v2/radius";
11
- import { RtButtonDirective } from "@rt-tools/ui-kit-v2/button";
12
- import { ERtCalendarDayState, RtCalendarComponent } from "@rt-tools/ui-kit-v2/calendar";
13
- import { RtToggleButtonGroupComponent } from "@rt-tools/ui-kit-v2/toggle-button-group";
14
14
  const DAY_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
15
15
  const TIME_RE = /^(\d{2}):(\d{2})$/;
16
16
  const DAY_LENGTH_MS = 864e5;
@@ -133,6 +133,30 @@ function rtDateMonth(month, ctx) {
133
133
  days
134
134
  };
135
135
  }
136
+ function outsideDay(ms, min, max) {
137
+ const key = msToDay(ms);
138
+ return {
139
+ key,
140
+ dayOfMonth: Number(key.slice(8)),
141
+ crossed: !rtDateInBounds(key, min, max)
142
+ };
143
+ }
144
+ function rtDatePanelMonth(month, ctx) {
145
+ const base = rtDateMonth(month, ctx);
146
+ const first = dayToMs(base.days[0].key);
147
+ const last = dayToMs(base.days[base.days.length - 1].key);
148
+ const lead = base.leadingBlanks.length;
149
+ const tail = (WEEK - (lead + base.days.length) % WEEK) % WEEK;
150
+ return {
151
+ ...base,
152
+ days: base.days.map((day) => day.disabled ? {
153
+ ...day,
154
+ state: ERtCalendarDayState.Busy
155
+ } : day),
156
+ leadingDays: Array.from({ length: lead }, (_, i) => outsideDay(first - (lead - i) * DAY_LENGTH_MS, ctx.min, ctx.max)),
157
+ trailingDays: Array.from({ length: tail }, (_, i) => outsideDay(last + (i + 1) * DAY_LENGTH_MS, ctx.min, ctx.max))
158
+ };
159
+ }
136
160
  function rtDateWeekdays(locale) {
137
161
  const format = new Intl.DateTimeFormat(locale, {
138
162
  weekday: "short",
@@ -140,7 +164,10 @@ function rtDateWeekdays(locale) {
140
164
  });
141
165
  const monday = Date.UTC(2024, 0, 1);
142
166
  const shift = rtDateFirstDay(locale) - 1;
143
- return Array.from({ length: WEEK }, (_, i) => format.format(monday + (i + shift) % WEEK * DAY_LENGTH_MS));
167
+ return Array.from({ length: WEEK }, (_, i) => {
168
+ const name = format.format(monday + (i + shift) % WEEK * DAY_LENGTH_MS);
169
+ return name.charAt(0).toLocaleUpperCase(locale) + name.slice(1);
170
+ });
144
171
  }
145
172
  function rtDateMonths(year, locale, min, max) {
146
173
  const format = new Intl.DateTimeFormat(locale, {
@@ -231,9 +258,93 @@ function rtDateGridKey(key, day, firstDay, min, max) {
231
258
  if (low !== null && rank(target) < rank(low)) return low;
232
259
  return high !== null && rank(target) > rank(high) ? high : target;
233
260
  }
261
+ const SAMPLE_DAY = new Date(2026, 0, 31);
262
+ const DEFAULT_LAYOUT = {
263
+ order: [
264
+ "day",
265
+ "month",
266
+ "year"
267
+ ],
268
+ separator: "."
269
+ };
270
+ const YEAR_LEN$1 = 4;
271
+ const PART_MAX_LEN = 2;
272
+ const DAY_GROUPS = 3;
273
+ const TIME_GROUPS = 2;
274
+ const TEXT_RE = /^[\d\s.,/:\-T]+$/;
275
+ function isDatePart(type) {
276
+ return type === "day" || type === "month" || type === "year";
277
+ }
278
+ function dayText(day, layout) {
279
+ const [year, month, date] = day.split("-");
280
+ const parts = {
281
+ day: date,
282
+ month,
283
+ year
284
+ };
285
+ return layout.order.map((part) => parts[part]).join(layout.separator);
286
+ }
287
+ function readDay(groups, layout) {
288
+ const parts = {};
289
+ layout.order.forEach((part, index) => {
290
+ parts[part] = groups[index];
291
+ });
292
+ const { day, month, year } = parts;
293
+ if (day === void 0 || month === void 0 || year?.length !== YEAR_LEN$1) return null;
294
+ if (day.length > PART_MAX_LEN || month.length > PART_MAX_LEN) return null;
295
+ return `${year}-${month.padStart(PART_MAX_LEN, "0")}-${day.padStart(PART_MAX_LEN, "0")}`;
296
+ }
297
+ function readTime(groups) {
298
+ if (groups.length !== TIME_GROUPS) return null;
299
+ const [hour, minute] = groups;
300
+ if (minute.length !== PART_MAX_LEN || hour.length > PART_MAX_LEN) return null;
301
+ return `${hour.padStart(PART_MAX_LEN, "0")}:${minute}`;
302
+ }
303
+ function readGroups(groups, type, layout) {
304
+ if (type === "time") return readTime(groups);
305
+ if (type === "date") return groups.length === DAY_GROUPS ? readDay(groups, layout) : null;
306
+ if (groups.length !== 5) return null;
307
+ const day = readDay(groups.slice(0, DAY_GROUPS), layout);
308
+ const time = readTime(groups.slice(DAY_GROUPS));
309
+ return day === null || time === null ? null : `${day}T${time}`;
310
+ }
311
+ function rtDateLayout(locale) {
312
+ const parts = new Intl.DateTimeFormat(locale, {
313
+ day: "2-digit",
314
+ month: "2-digit",
315
+ year: "numeric"
316
+ }).formatToParts(SAMPLE_DAY);
317
+ const order = parts.map((part) => part.type).filter((type) => isDatePart(type));
318
+ const separator = parts.find((part) => part.type === "literal")?.value.trim() ?? "";
319
+ if (order.length !== DAY_GROUPS || separator === "") return DEFAULT_LAYOUT;
320
+ return {
321
+ order,
322
+ separator
323
+ };
324
+ }
325
+ function rtDateText(value, type, layout) {
326
+ if (type === "time" || rtDateRead(value, type) === null) return value;
327
+ if (type === "date") return dayText(value, layout);
328
+ const [day, time] = value.split("T");
329
+ return `${dayText(day, layout)} ${time}`;
330
+ }
331
+ function rtDateShape(type, layout, letters) {
332
+ const time = `${letters.hour}:${letters.minute}`;
333
+ if (type === "time") return time;
334
+ const day = layout.order.map((part) => letters[part]).join(layout.separator);
335
+ return type === "date" ? day : `${day} ${time}`;
336
+ }
337
+ function rtDateParse(text, type, layout) {
338
+ const iso = rtDateRead(text, type);
339
+ if (iso !== null) return iso;
340
+ const value = text.trim();
341
+ if (!TEXT_RE.test(value)) return null;
342
+ const candidate = readGroups(value.match(/\d+/g) ?? [], type, layout);
343
+ return candidate === null ? null : rtDateRead(candidate, type);
344
+ }
234
345
  const BEM_BLOCK$1 = "rt-date-panel";
235
346
  const MONTH_LEN = 7;
236
- const YEAR_LEN$1 = 4;
347
+ const YEAR_LEN = 4;
237
348
  const ESCAPE_BACK = {
238
349
  days: null,
239
350
  months: "days",
@@ -257,11 +368,11 @@ var RtDatePanelComponent = class RtDatePanelComponent {
257
368
  this.draftDay = linkedSignal(() => rtDateSplit(this.value(), this.type()).day, ...ngDevMode ? [{ debugName: "draftDay" }] : /* istanbul ignore next */ []);
258
369
  this.draftTime = linkedSignal(() => rtDateSplit(this.value(), this.type()).time, ...ngDevMode ? [{ debugName: "draftTime" }] : /* istanbul ignore next */ []);
259
370
  this.shownMonth = linkedSignal(() => (this.draftDay() ?? this.today()).slice(0, MONTH_LEN), ...ngDevMode ? [{ debugName: "shownMonth" }] : /* istanbul ignore next */ []);
260
- this.year = linkedSignal(() => Number(this.shownMonth().slice(0, YEAR_LEN$1)), ...ngDevMode ? [{ debugName: "year" }] : /* istanbul ignore next */ []);
371
+ this.year = linkedSignal(() => Number(this.shownMonth().slice(0, YEAR_LEN)), ...ngDevMode ? [{ debugName: "year" }] : /* istanbul ignore next */ []);
261
372
  this.split = computed(() => this.sheet() && this.type() === "datetime-local", ...ngDevMode ? [{ debugName: "split" }] : /* istanbul ignore next */ []);
262
373
  this.showDate = computed(() => this.type() !== "time" && !(this.split() && this.tab() === "time"), ...ngDevMode ? [{ debugName: "showDate" }] : /* istanbul ignore next */ []);
263
374
  this.showTime = computed(() => this.type() !== "date" && !(this.split() && this.tab() === "date"), ...ngDevMode ? [{ debugName: "showTime" }] : /* istanbul ignore next */ []);
264
- this.months = computed(() => [rtDateMonth(this.shownMonth(), {
375
+ this.months = computed(() => [rtDatePanelMonth(this.shownMonth(), {
265
376
  locale: this.#locale(),
266
377
  today: this.today(),
267
378
  chosen: this.draftDay(),
@@ -279,8 +390,8 @@ var RtDatePanelComponent = class RtDatePanelComponent {
279
390
  const cells = this.yearCells();
280
391
  return `${cells[0].label} – ${cells[cells.length - 1].label}`;
281
392
  }, ...ngDevMode ? [{ debugName: "yearSpan" }] : /* istanbul ignore next */ []);
282
- this.chosenYear = computed(() => this.draftDay()?.slice(0, YEAR_LEN$1) ?? null, ...ngDevMode ? [{ debugName: "chosenYear" }] : /* istanbul ignore next */ []);
283
- this.currentYear = computed(() => this.today().slice(0, YEAR_LEN$1), ...ngDevMode ? [{ debugName: "currentYear" }] : /* istanbul ignore next */ []);
393
+ this.chosenYear = computed(() => this.draftDay()?.slice(0, YEAR_LEN) ?? null, ...ngDevMode ? [{ debugName: "chosenYear" }] : /* istanbul ignore next */ []);
394
+ this.currentYear = computed(() => this.today().slice(0, YEAR_LEN), ...ngDevMode ? [{ debugName: "currentYear" }] : /* istanbul ignore next */ []);
284
395
  this.currentMonth = computed(() => this.today().slice(0, MONTH_LEN), ...ngDevMode ? [{ debugName: "currentMonth" }] : /* istanbul ignore next */ []);
285
396
  this.canPrevYears = computed(() => rtDateCanPageYears(this.yearStart(), -1, this.min(), this.max()), ...ngDevMode ? [{ debugName: "canPrevYears" }] : /* istanbul ignore next */ []);
286
397
  this.canNextYears = computed(() => rtDateCanPageYears(this.yearStart(), 1, this.min(), this.max()), ...ngDevMode ? [{ debugName: "canNextYears" }] : /* istanbul ignore next */ []);
@@ -294,7 +405,12 @@ var RtDatePanelComponent = class RtDatePanelComponent {
294
405
  max: this.max()
295
406
  }), ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
296
407
  this.todayOff = computed(() => !rtDateInBounds(this.today(), this.min(), this.max()), ...ngDevMode ? [{ debugName: "todayOff" }] : /* istanbul ignore next */ []);
408
+ this.hasFooter = computed(() => this.type() !== "date" || this.isTodayButtonShown(), ...ngDevMode ? [{ debugName: "hasFooter" }] : /* istanbul ignore next */ []);
297
409
  this.canApply = computed(() => this.#draftValue() !== "", ...ngDevMode ? [{ debugName: "canApply" }] : /* istanbul ignore next */ []);
410
+ this.draftText = computed(() => {
411
+ const parts = this.#draftValue().split("T");
412
+ return parts.length < 2 ? "" : `${rtDateText(parts[0], "date", rtDateLayout(this.#locale()))}, ${parts[1]}`;
413
+ }, ...ngDevMode ? [{ debugName: "draftText" }] : /* istanbul ignore next */ []);
298
414
  this.tabs = computed(() => [{
299
415
  value: "date",
300
416
  label: this.t().uiDate
@@ -314,6 +430,10 @@ var RtDatePanelComponent = class RtDatePanelComponent {
314
430
  ...ngDevMode ? { debugName: "sheet" } : /* istanbul ignore next */ {},
315
431
  transform: booleanAttribute
316
432
  });
433
+ this.isTodayButtonShown = input(true, {
434
+ ...ngDevMode ? { debugName: "isTodayButtonShown" } : /* istanbul ignore next */ {},
435
+ transform: booleanAttribute
436
+ });
317
437
  this.now = input(null, ...ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []);
318
438
  this.picked = output();
319
439
  this.closed = output();
@@ -358,7 +478,7 @@ var RtDatePanelComponent = class RtDatePanelComponent {
358
478
  this.shownMonth.set(rtDateAddMonths(this.shownMonth(), delta));
359
479
  }
360
480
  openMonths() {
361
- this.year.set(Number(this.shownMonth().slice(0, YEAR_LEN$1)));
481
+ this.year.set(Number(this.shownMonth().slice(0, YEAR_LEN)));
362
482
  this.view.set("months");
363
483
  }
364
484
  pageYear(delta) {
@@ -391,6 +511,9 @@ var RtDatePanelComponent = class RtDatePanelComponent {
391
511
  const value = this.#draftValue();
392
512
  if (value !== "") this.#emit(value);
393
513
  }
514
+ reset() {
515
+ this.#emit("");
516
+ }
394
517
  #emit(value) {
395
518
  this.picked.emit(value);
396
519
  this.closed.emit();
@@ -463,6 +586,13 @@ var RtDatePanelComponent = class RtDatePanelComponent {
463
586
  isRequired: false,
464
587
  transformFunction: null
465
588
  },
589
+ isTodayButtonShown: {
590
+ classPropertyName: "isTodayButtonShown",
591
+ publicName: "isTodayButtonShown",
592
+ isSignal: true,
593
+ isRequired: false,
594
+ transformFunction: null
595
+ },
466
596
  now: {
467
597
  classPropertyName: "now",
468
598
  publicName: "now",
@@ -490,8 +620,8 @@ var RtDatePanelComponent = class RtDatePanelComponent {
490
620
  isSignal: true
491
621
  }],
492
622
  ngImport: i0,
493
- template: "<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 if (view() === 'months') {\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 <button\n rtElem=\"year\"\n qa-dataid=\"date-panel-year\"\n type=\"button\"\n [attr.aria-label]=\"t().uiChooseYear\"\n (click)=\"openYears()\">\n {{ year() }}\n </button>\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.data-current]=\"cell.key === currentMonth() ? '' : null\"\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 } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-years\" role=\"group\" [attr.aria-label]=\"t().uiChooseYear\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-years\"\n icon=\"chevron-left\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYears\"\n [disabled]=\"!canPrevYears()\"\n (clicked)=\"pageYears(-1)\" />\n <span rtElem=\"span\" qa-dataid=\"date-panel-span\">{{ yearSpan() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-years\"\n icon=\"chevron-right\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYears\"\n [disabled]=\"!canNextYears()\"\n (clicked)=\"pageYears(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of yearCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-year-cell\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.data-current]=\"cell.key === currentYear() ? '' : null\"\n [attr.aria-pressed]=\"cell.key === chosenYear()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickYear(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",
494
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-panel{--rt-date-panel-cell-size: var(--rt-control-height-sm);--rt-date-panel-cell-radius: var(--rt-radius-md);--rt-date-panel-divider-width: var(--rt-border-width-thin);--rt-date-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);--rt-date-panel-column-height: calc(var(--rt-date-panel-cell-size) * 7 + var(--rt-space-0-5) * 6);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-panel .rt-date-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-justify: center}.rt-date-panel__calendar,.rt-date-panel__months{flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 7)}.rt-date-panel__months-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--rt-space-4)}.rt-date-panel__year{padding:var(--rt-space-1) var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__year:hover{background:var(--rt-color-bg-subtle)}.rt-date-panel__year:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__span{color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__month-grid{display:grid;gap:var(--rt-space-1);grid-template-columns:repeat(3,1fr)}.rt-date-panel__month-grid .rt-date-panel__cell{font-weight:var(--rt-font-weight-medium)}.rt-date-panel__month-grid .rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-hover)}.rt-date-panel__month-grid .rt-date-panel__cell[data-current]:not([aria-pressed=true]){color:var(--rt-color-action-primary)}.rt-date-panel__month-grid .rt-date-panel__cell:disabled{color:var(--rt-color-text-disabled);opacity:1}.rt-date-panel__time{display:flex;gap:var(--rt-space-1)}.rt-date-panel__column{position:relative;display:flex;flex-direction:column;gap:var(--rt-space-0-5);max-block-size:var(--rt-date-panel-column-height);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.rt-date-panel__cell{flex:0 0 auto;padding:0 var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-variant-numeric:tabular-nums;min-block-size:var(--rt-date-panel-cell-size);min-inline-size:var(--rt-control-height-md)}.rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-subtle)}.rt-date-panel__cell:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__cell[data-current]:not([aria-pressed=true]){box-shadow:var(--rt-date-panel-current-ring)}.rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}.rt-date-panel__cell:disabled{color:var(--rt-color-text-muted);cursor:not-allowed;opacity:.45}.rt-date-panel__footer{display:flex;justify-content:flex-end;padding-top:var(--rt-space-2);border-top:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-panel:not(.rt-date-panel--with-time) .rt-date-panel__footer{justify-content:center}.rt-date-panel--sheet{--rt-date-panel-cell-size: calc(var(--rt-size-10) + var(--rt-size-1));padding-inline:var(--rt-space-5)}.rt-date-panel--sheet .rt-date-panel__calendar{--rt-calendar-day-size: var(--rt-date-panel-cell-size)}.rt-date-panel--sheet .rt-date-panel__body{flex-direction:column;align-items:stretch}.rt-date-panel--sheet .rt-date-panel__calendar,.rt-date-panel--sheet .rt-date-panel__months{min-inline-size:0}.rt-date-panel--sheet .rt-date-panel__time{justify-content:center}.rt-date-panel--sheet .rt-date-panel__column{flex:1 1 0}}\n"],
623
+ template: "<ng-container rtBlock=\"rt-date-panel\">\n @if (split()) {\n <rt-toggle-button-group\n rtElem=\"tabs\"\n qa-dataid=\"date-panel-tabs\"\n size=\"md\"\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 if (view() === 'months') {\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=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYear\"\n [disabled]=\"!canPrevYear()\"\n (clicked)=\"pageYear(-1)\" />\n <button\n rtElem=\"year\"\n qa-dataid=\"date-panel-year\"\n type=\"button\"\n [attr.aria-label]=\"t().uiChooseYear\"\n (click)=\"openYears()\">\n {{ year() }}\n </button>\n <rt-icon-button\n qa-dataid=\"date-panel-next-year\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n iconColor=\"muted\"\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.data-current]=\"cell.key === currentMonth() ? '' : null\"\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 } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-years\" role=\"group\" [attr.aria-label]=\"t().uiChooseYear\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-years\"\n icon=\"chevron-left\"\n variant=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYears\"\n [disabled]=\"!canPrevYears()\"\n (clicked)=\"pageYears(-1)\" />\n <span rtElem=\"span\" qa-dataid=\"date-panel-span\">{{ yearSpan() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-years\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYears\"\n [disabled]=\"!canNextYears()\"\n (clicked)=\"pageYears(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of yearCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-year-cell\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.data-current]=\"cell.key === currentYear() ? '' : null\"\n [attr.aria-pressed]=\"cell.key === chosenYear()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickYear(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=\"time-group\">\n <span rtElem=\"time-title\" qa-dataid=\"date-panel-hours-title\" aria-hidden=\"true\">{{ t().uiHours }}</span>\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>\n <div rtElem=\"time-group\">\n <span rtElem=\"time-title\" qa-dataid=\"date-panel-minutes-title\" aria-hidden=\"true\">{{ t().uiMinutes }}</span>\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 </div>\n }\n </div>\n\n @if (hasFooter()) {\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 @if (sheet()) {\n <span rtElem=\"value\" qa-dataid=\"date-panel-value\">{{ draftText() }}</span>\n } @else {\n <button\n rtButton\n rtElem=\"lead\"\n qa-dataid=\"date-panel-now\"\n theme=\"primary\"\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-reset\"\n theme=\"primary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiReset\"\n [attr.aria-label]=\"t().uiReset\"\n (click)=\"reset()\"></button>\n }\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 }\n</ng-container>\n",
624
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-panel{--rt-date-panel-cell-size: var(--rt-control-height-sm);--rt-date-panel-cell-radius: var(--rt-radius-md);--rt-date-panel-divider-width: var(--rt-border-width-thin);--rt-date-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);--rt-date-panel-column-height: calc(var(--rt-date-panel-cell-size) * 7 + var(--rt-space-0-5) * 6);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-panel .rt-date-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-justify: center}.rt-date-panel__calendar,.rt-date-panel__months{flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 7)}.rt-date-panel__months-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--rt-space-4)}.rt-date-panel__year{padding:var(--rt-space-1) var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__year:hover{background:var(--rt-color-bg-subtle)}.rt-date-panel__year:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__span{color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__month-grid{display:grid;gap:var(--rt-space-1);grid-template-columns:repeat(3,1fr)}.rt-date-panel__month-grid .rt-date-panel__cell{font-weight:var(--rt-font-weight-medium)}.rt-date-panel__month-grid .rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-hover)}.rt-date-panel__month-grid .rt-date-panel__cell[data-current]:not([aria-pressed=true]){color:var(--rt-color-action-primary)}.rt-date-panel__month-grid .rt-date-panel__cell:disabled{color:var(--rt-color-text-disabled);opacity:1}.rt-date-panel__time{display:flex;gap:var(--rt-space-2)}.rt-date-panel__time:not(:first-child){align-self:stretch;border-inline-start:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);padding-inline-start:var(--rt-space-4)}.rt-date-panel__tabs{align-self:center}.rt-date-panel__time-group{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-date-panel__time-title{padding:var(--rt-space-1) 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-align:center}.rt-date-panel__lead{margin-inline-end:auto}.rt-date-panel__value{align-self:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);margin-inline-end:auto}.rt-date-panel__column{position:relative;display:flex;flex-direction:column;gap:var(--rt-space-0-5);max-block-size:var(--rt-date-panel-column-height);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.rt-date-panel__cell{flex:0 0 auto;padding:0 var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-variant-numeric:tabular-nums;min-block-size:var(--rt-date-panel-cell-size);min-inline-size:var(--rt-control-height-md)}.rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-subtle)}.rt-date-panel__cell:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__cell[data-current]:not([aria-pressed=true]){box-shadow:var(--rt-date-panel-current-ring)}.rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}.rt-date-panel__cell:disabled{color:var(--rt-color-text-muted);cursor:not-allowed;opacity:.45}.rt-date-panel__column .rt-date-panel__cell{min-inline-size:calc(var(--rt-size-10) * 1.5);padding-inline:var(--rt-space-4) 0;text-align:start}.rt-date-panel__column .rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary-subtle);color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__footer{display:flex;justify-content:flex-end;padding-top:var(--rt-space-2);border-top:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-panel:not(.rt-date-panel--with-time) .rt-date-panel__footer{justify-content:center}.rt-date-panel--sheet{--rt-date-panel-cell-size: calc(var(--rt-size-10) + var(--rt-size-1));padding-inline:var(--rt-space-5)}.rt-date-panel--sheet .rt-date-panel__calendar{--rt-calendar-day-size: var(--rt-date-panel-cell-size)}.rt-date-panel--sheet .rt-date-panel__body{flex-direction:column;align-items:stretch}.rt-date-panel--sheet .rt-date-panel__calendar,.rt-date-panel--sheet .rt-date-panel__months{min-inline-size:0}.rt-date-panel--sheet .rt-date-panel__time{justify-content:center}.rt-date-panel--sheet .rt-date-panel__time-group{flex:1 1 0}}\n"],
495
625
  dependencies: [
496
626
  {
497
627
  kind: "directive",
@@ -625,8 +755,8 @@ i0.ɵɵngDeclareClassMetadata({
625
755
  "[class.rt-date-panel--with-time]": "type() !== 'date'",
626
756
  "(keydown.escape)": "onEscape()"
627
757
  },
628
- template: "<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 if (view() === 'months') {\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 <button\n rtElem=\"year\"\n qa-dataid=\"date-panel-year\"\n type=\"button\"\n [attr.aria-label]=\"t().uiChooseYear\"\n (click)=\"openYears()\">\n {{ year() }}\n </button>\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.data-current]=\"cell.key === currentMonth() ? '' : null\"\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 } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-years\" role=\"group\" [attr.aria-label]=\"t().uiChooseYear\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-years\"\n icon=\"chevron-left\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYears\"\n [disabled]=\"!canPrevYears()\"\n (clicked)=\"pageYears(-1)\" />\n <span rtElem=\"span\" qa-dataid=\"date-panel-span\">{{ yearSpan() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-years\"\n icon=\"chevron-right\"\n variant=\"secondary\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYears\"\n [disabled]=\"!canNextYears()\"\n (clicked)=\"pageYears(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of yearCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-year-cell\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.data-current]=\"cell.key === currentYear() ? '' : null\"\n [attr.aria-pressed]=\"cell.key === chosenYear()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickYear(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",
629
- styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-panel{--rt-date-panel-cell-size: var(--rt-control-height-sm);--rt-date-panel-cell-radius: var(--rt-radius-md);--rt-date-panel-divider-width: var(--rt-border-width-thin);--rt-date-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);--rt-date-panel-column-height: calc(var(--rt-date-panel-cell-size) * 7 + var(--rt-space-0-5) * 6);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-panel .rt-date-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-justify: center}.rt-date-panel__calendar,.rt-date-panel__months{flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 7)}.rt-date-panel__months-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--rt-space-4)}.rt-date-panel__year{padding:var(--rt-space-1) var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__year:hover{background:var(--rt-color-bg-subtle)}.rt-date-panel__year:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__span{color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__month-grid{display:grid;gap:var(--rt-space-1);grid-template-columns:repeat(3,1fr)}.rt-date-panel__month-grid .rt-date-panel__cell{font-weight:var(--rt-font-weight-medium)}.rt-date-panel__month-grid .rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-hover)}.rt-date-panel__month-grid .rt-date-panel__cell[data-current]:not([aria-pressed=true]){color:var(--rt-color-action-primary)}.rt-date-panel__month-grid .rt-date-panel__cell:disabled{color:var(--rt-color-text-disabled);opacity:1}.rt-date-panel__time{display:flex;gap:var(--rt-space-1)}.rt-date-panel__column{position:relative;display:flex;flex-direction:column;gap:var(--rt-space-0-5);max-block-size:var(--rt-date-panel-column-height);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.rt-date-panel__cell{flex:0 0 auto;padding:0 var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-variant-numeric:tabular-nums;min-block-size:var(--rt-date-panel-cell-size);min-inline-size:var(--rt-control-height-md)}.rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-subtle)}.rt-date-panel__cell:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__cell[data-current]:not([aria-pressed=true]){box-shadow:var(--rt-date-panel-current-ring)}.rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}.rt-date-panel__cell:disabled{color:var(--rt-color-text-muted);cursor:not-allowed;opacity:.45}.rt-date-panel__footer{display:flex;justify-content:flex-end;padding-top:var(--rt-space-2);border-top:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-panel:not(.rt-date-panel--with-time) .rt-date-panel__footer{justify-content:center}.rt-date-panel--sheet{--rt-date-panel-cell-size: calc(var(--rt-size-10) + var(--rt-size-1));padding-inline:var(--rt-space-5)}.rt-date-panel--sheet .rt-date-panel__calendar{--rt-calendar-day-size: var(--rt-date-panel-cell-size)}.rt-date-panel--sheet .rt-date-panel__body{flex-direction:column;align-items:stretch}.rt-date-panel--sheet .rt-date-panel__calendar,.rt-date-panel--sheet .rt-date-panel__months{min-inline-size:0}.rt-date-panel--sheet .rt-date-panel__time{justify-content:center}.rt-date-panel--sheet .rt-date-panel__column{flex:1 1 0}}\n"]
758
+ template: "<ng-container rtBlock=\"rt-date-panel\">\n @if (split()) {\n <rt-toggle-button-group\n rtElem=\"tabs\"\n qa-dataid=\"date-panel-tabs\"\n size=\"md\"\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 if (view() === 'months') {\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=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYear\"\n [disabled]=\"!canPrevYear()\"\n (clicked)=\"pageYear(-1)\" />\n <button\n rtElem=\"year\"\n qa-dataid=\"date-panel-year\"\n type=\"button\"\n [attr.aria-label]=\"t().uiChooseYear\"\n (click)=\"openYears()\">\n {{ year() }}\n </button>\n <rt-icon-button\n qa-dataid=\"date-panel-next-year\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n iconColor=\"muted\"\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.data-current]=\"cell.key === currentMonth() ? '' : null\"\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 } @else {\n <div rtElem=\"months\" qa-dataid=\"date-panel-years\" role=\"group\" [attr.aria-label]=\"t().uiChooseYear\">\n <div rtElem=\"months-header\">\n <rt-icon-button\n qa-dataid=\"date-panel-prev-years\"\n icon=\"chevron-left\"\n variant=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiPrevYears\"\n [disabled]=\"!canPrevYears()\"\n (clicked)=\"pageYears(-1)\" />\n <span rtElem=\"span\" qa-dataid=\"date-panel-span\">{{ yearSpan() }}</span>\n <rt-icon-button\n qa-dataid=\"date-panel-next-years\"\n icon=\"chevron-right\"\n variant=\"ghost\"\n iconColor=\"muted\"\n radius=\"full\"\n [ariaLabel]=\"t().uiNextYears\"\n [disabled]=\"!canNextYears()\"\n (clicked)=\"pageYears(1)\" />\n </div>\n <div rtElem=\"month-grid\">\n @for (cell of yearCells(); track cell.key) {\n <button\n rtElem=\"cell\"\n qa-dataid=\"date-panel-year-cell\"\n type=\"button\"\n [attr.data-key]=\"cell.key\"\n [attr.data-current]=\"cell.key === currentYear() ? '' : null\"\n [attr.aria-pressed]=\"cell.key === chosenYear()\"\n [disabled]=\"cell.disabled\"\n (click)=\"pickYear(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=\"time-group\">\n <span rtElem=\"time-title\" qa-dataid=\"date-panel-hours-title\" aria-hidden=\"true\">{{ t().uiHours }}</span>\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>\n <div rtElem=\"time-group\">\n <span rtElem=\"time-title\" qa-dataid=\"date-panel-minutes-title\" aria-hidden=\"true\">{{ t().uiMinutes }}</span>\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 </div>\n }\n </div>\n\n @if (hasFooter()) {\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 @if (sheet()) {\n <span rtElem=\"value\" qa-dataid=\"date-panel-value\">{{ draftText() }}</span>\n } @else {\n <button\n rtButton\n rtElem=\"lead\"\n qa-dataid=\"date-panel-now\"\n theme=\"primary\"\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-reset\"\n theme=\"primary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiReset\"\n [attr.aria-label]=\"t().uiReset\"\n (click)=\"reset()\"></button>\n }\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 }\n</ng-container>\n",
759
+ styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-panel{--rt-date-panel-cell-size: var(--rt-control-height-sm);--rt-date-panel-cell-radius: var(--rt-radius-md);--rt-date-panel-divider-width: var(--rt-border-width-thin);--rt-date-panel-current-ring: inset 0 0 0 var(--rt-border-width-thin) var(--rt-color-action-primary);--rt-date-panel-column-height: calc(var(--rt-date-panel-cell-size) * 7 + var(--rt-space-0-5) * 6);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-panel .rt-date-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-justify: center}.rt-date-panel__calendar,.rt-date-panel__months{flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 7)}.rt-date-panel__months-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--rt-space-4)}.rt-date-panel__year{padding:var(--rt-space-1) var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__year:hover{background:var(--rt-color-bg-subtle)}.rt-date-panel__year:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__span{color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__month-grid{display:grid;gap:var(--rt-space-1);grid-template-columns:repeat(3,1fr)}.rt-date-panel__month-grid .rt-date-panel__cell{font-weight:var(--rt-font-weight-medium)}.rt-date-panel__month-grid .rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-hover)}.rt-date-panel__month-grid .rt-date-panel__cell[data-current]:not([aria-pressed=true]){color:var(--rt-color-action-primary)}.rt-date-panel__month-grid .rt-date-panel__cell:disabled{color:var(--rt-color-text-disabled);opacity:1}.rt-date-panel__time{display:flex;gap:var(--rt-space-2)}.rt-date-panel__time:not(:first-child){align-self:stretch;border-inline-start:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);padding-inline-start:var(--rt-space-4)}.rt-date-panel__tabs{align-self:center}.rt-date-panel__time-group{display:flex;flex-direction:column;gap:var(--rt-space-2)}.rt-date-panel__time-title{padding:var(--rt-space-1) 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-align:center}.rt-date-panel__lead{margin-inline-end:auto}.rt-date-panel__value{align-self:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);margin-inline-end:auto}.rt-date-panel__column{position:relative;display:flex;flex-direction:column;gap:var(--rt-space-0-5);max-block-size:var(--rt-date-panel-column-height);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.rt-date-panel__cell{flex:0 0 auto;padding:0 var(--rt-space-2);border:none;border-radius:var(--rt-date-panel-cell-radius);background:none;color:var(--rt-color-text-primary);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);font-variant-numeric:tabular-nums;min-block-size:var(--rt-date-panel-cell-size);min-inline-size:var(--rt-control-height-md)}.rt-date-panel__cell:hover:not(:disabled,[aria-pressed=true]){background:var(--rt-color-bg-subtle)}.rt-date-panel__cell:focus-visible{outline:var(--rt-focus-ring-width) solid var(--rt-focus-ring-color);outline-offset:var(--rt-focus-ring-offset)}.rt-date-panel__cell[data-current]:not([aria-pressed=true]){box-shadow:var(--rt-date-panel-current-ring)}.rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}.rt-date-panel__cell:disabled{color:var(--rt-color-text-muted);cursor:not-allowed;opacity:.45}.rt-date-panel__column .rt-date-panel__cell{min-inline-size:calc(var(--rt-size-10) * 1.5);padding-inline:var(--rt-space-4) 0;text-align:start}.rt-date-panel__column .rt-date-panel__cell[aria-pressed=true]{background:var(--rt-color-action-primary-subtle);color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-date-panel__footer{display:flex;justify-content:flex-end;padding-top:var(--rt-space-2);border-top:var(--rt-date-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-panel:not(.rt-date-panel--with-time) .rt-date-panel__footer{justify-content:center}.rt-date-panel--sheet{--rt-date-panel-cell-size: calc(var(--rt-size-10) + var(--rt-size-1));padding-inline:var(--rt-space-5)}.rt-date-panel--sheet .rt-date-panel__calendar{--rt-calendar-day-size: var(--rt-date-panel-cell-size)}.rt-date-panel--sheet .rt-date-panel__body{flex-direction:column;align-items:stretch}.rt-date-panel--sheet .rt-date-panel__calendar,.rt-date-panel--sheet .rt-date-panel__months{min-inline-size:0}.rt-date-panel--sheet .rt-date-panel__time{justify-content:center}.rt-date-panel--sheet .rt-date-panel__time-group{flex:1 1 0}}\n"]
630
760
  }]
631
761
  }],
632
762
  ctorParameters: () => [],
@@ -683,6 +813,14 @@ i0.ɵɵngDeclareClassMetadata({
683
813
  required: false
684
814
  }]
685
815
  }],
816
+ isTodayButtonShown: [{
817
+ type: i0.Input,
818
+ args: [{
819
+ isSignal: true,
820
+ alias: "isTodayButtonShown",
821
+ required: false
822
+ }]
823
+ }],
686
824
  now: [{
687
825
  type: i0.Input,
688
826
  args: [{
@@ -701,90 +839,6 @@ i0.ɵɵngDeclareClassMetadata({
701
839
  }]
702
840
  }
703
841
  });
704
- const SAMPLE_DAY = new Date(2026, 0, 31);
705
- const DEFAULT_LAYOUT = {
706
- order: [
707
- "day",
708
- "month",
709
- "year"
710
- ],
711
- separator: "."
712
- };
713
- const YEAR_LEN = 4;
714
- const PART_MAX_LEN = 2;
715
- const DAY_GROUPS = 3;
716
- const TIME_GROUPS = 2;
717
- const TEXT_RE = /^[\d\s.,/:\-T]+$/;
718
- function isDatePart(type) {
719
- return type === "day" || type === "month" || type === "year";
720
- }
721
- function dayText(day, layout) {
722
- const [year, month, date] = day.split("-");
723
- const parts = {
724
- day: date,
725
- month,
726
- year
727
- };
728
- return layout.order.map((part) => parts[part]).join(layout.separator);
729
- }
730
- function readDay(groups, layout) {
731
- const parts = {};
732
- layout.order.forEach((part, index) => {
733
- parts[part] = groups[index];
734
- });
735
- const { day, month, year } = parts;
736
- if (day === void 0 || month === void 0 || year?.length !== YEAR_LEN) return null;
737
- if (day.length > PART_MAX_LEN || month.length > PART_MAX_LEN) return null;
738
- return `${year}-${month.padStart(PART_MAX_LEN, "0")}-${day.padStart(PART_MAX_LEN, "0")}`;
739
- }
740
- function readTime(groups) {
741
- if (groups.length !== TIME_GROUPS) return null;
742
- const [hour, minute] = groups;
743
- if (minute.length !== PART_MAX_LEN || hour.length > PART_MAX_LEN) return null;
744
- return `${hour.padStart(PART_MAX_LEN, "0")}:${minute}`;
745
- }
746
- function readGroups(groups, type, layout) {
747
- if (type === "time") return readTime(groups);
748
- if (type === "date") return groups.length === DAY_GROUPS ? readDay(groups, layout) : null;
749
- if (groups.length !== 5) return null;
750
- const day = readDay(groups.slice(0, DAY_GROUPS), layout);
751
- const time = readTime(groups.slice(DAY_GROUPS));
752
- return day === null || time === null ? null : `${day}T${time}`;
753
- }
754
- function rtDateLayout(locale) {
755
- const parts = new Intl.DateTimeFormat(locale, {
756
- day: "2-digit",
757
- month: "2-digit",
758
- year: "numeric"
759
- }).formatToParts(SAMPLE_DAY);
760
- const order = parts.map((part) => part.type).filter((type) => isDatePart(type));
761
- const separator = parts.find((part) => part.type === "literal")?.value.trim() ?? "";
762
- if (order.length !== DAY_GROUPS || separator === "") return DEFAULT_LAYOUT;
763
- return {
764
- order,
765
- separator
766
- };
767
- }
768
- function rtDateText(value, type, layout) {
769
- if (type === "time" || rtDateRead(value, type) === null) return value;
770
- if (type === "date") return dayText(value, layout);
771
- const [day, time] = value.split("T");
772
- return `${dayText(day, layout)} ${time}`;
773
- }
774
- function rtDateShape(type, layout, letters) {
775
- const time = `${letters.hour}:${letters.minute}`;
776
- if (type === "time") return time;
777
- const day = layout.order.map((part) => letters[part]).join(layout.separator);
778
- return type === "date" ? day : `${day} ${time}`;
779
- }
780
- function rtDateParse(text, type, layout) {
781
- const iso = rtDateRead(text, type);
782
- if (iso !== null) return iso;
783
- const value = text.trim();
784
- if (!TEXT_RE.test(value)) return null;
785
- const candidate = readGroups(value.match(/\d+/g) ?? [], type, layout);
786
- return candidate === null ? null : rtDateRead(candidate, type);
787
- }
788
842
  const BEM_BLOCK = "rt-date-picker";
789
843
  var RtDatePickerComponent = class RtDatePickerComponent extends RtFormControlBase {
790
844
  constructor() {
@@ -1005,6 +1059,7 @@ var RtDatePickerComponent = class RtDatePickerComponent extends RtFormControlBas
1005
1059
  "max",
1006
1060
  "minuteStep",
1007
1061
  "sheet",
1062
+ "isTodayButtonShown",
1008
1063
  "now"
1009
1064
  ],
1010
1065
  outputs: ["picked", "closed"]
@@ -1173,6 +1228,6 @@ i0.ɵɵngDeclareClassMetadata({
1173
1228
  }]
1174
1229
  }
1175
1230
  });
1176
- export { RT_DATE_YEAR_SPAN, RtDatePickerComponent, rtDateAddMonths, rtDateCanPage, rtDateCanPageYears, rtDateFirstDay, rtDateGridKey, rtDateInBounds, rtDateLayout, rtDateMonth, rtDateMonths, rtDateNow, rtDateParse, rtDateRead, rtDateShape, rtDateSplit, rtDateText, rtDateTime, rtDateTimeColumns, rtDateWeekdays, rtDateWrite, rtDateYearSpanStart, rtDateYears };
1231
+ export { RT_DATE_YEAR_SPAN, RtDatePanelComponent, RtDatePickerComponent, rtDateAddMonths, rtDateCanPage, rtDateCanPageYears, rtDateFirstDay, rtDateGridKey, rtDateInBounds, rtDateLayout, rtDateMonth, rtDateMonths, rtDateNow, rtDatePanelMonth, rtDateParse, rtDateRead, rtDateShape, rtDateSplit, rtDateText, rtDateTime, rtDateTimeColumns, rtDateWeekdays, rtDateWrite, rtDateYearSpanStart, rtDateYears };
1177
1232
 
1178
1233
  //# sourceMappingURL=rt-tools-ui-kit-v2-date-picker.mjs.map