@frame-ui-ng/components 0.1.0-beta.0 → 0.3.0-beta.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 (100) hide show
  1. package/accordion/src/styles/_vars.css +25 -25
  2. package/accordion/src/styles/accordion.css +105 -87
  3. package/alert/src/styles/_vars.css +28 -28
  4. package/badge/src/styles/_vars.css +19 -16
  5. package/badge/src/styles/badge.css +132 -125
  6. package/breadcrumb/src/styles/_vars.css +17 -16
  7. package/breadcrumb/src/styles/breadcrumb.css +110 -98
  8. package/button/src/styles/_vars.css +20 -20
  9. package/button/src/styles/button.css +66 -9
  10. package/button-group/src/styles/button-group.css +100 -69
  11. package/calendar/src/styles/_vars.css +29 -29
  12. package/calendar/src/styles/calendar.css +247 -226
  13. package/card/src/styles/_vars.css +17 -17
  14. package/checkbox/src/styles/_vars.css +22 -22
  15. package/collapsible/src/styles/collapsible.css +55 -42
  16. package/combobox/src/styles/_vars.css +61 -60
  17. package/combobox/src/styles/combobox.css +295 -285
  18. package/command/src/styles/_vars.css +47 -37
  19. package/command/src/styles/command.css +236 -171
  20. package/date-picker/src/styles/_vars.css +30 -29
  21. package/date-picker/src/styles/date-picker.css +203 -177
  22. package/dropdown-menu/src/styles/_vars.css +34 -34
  23. package/dropdown-menu/src/styles/dropdown-menu-item.css +87 -87
  24. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -11
  25. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-badge.mjs +1 -0
  27. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-button.mjs +1 -1
  29. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-calendar.mjs +369 -263
  31. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-command.mjs +20 -2
  33. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-date-picker.mjs +232 -226
  35. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  36. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +45 -22
  37. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-input.mjs +6 -3
  39. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-select.mjs +6 -3
  41. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-sidebar.mjs +47 -4
  43. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-toast.mjs +152 -142
  45. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-tooltip.mjs +263 -254
  47. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components.mjs +745 -531
  49. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  50. package/input/src/styles/_vars.css +65 -65
  51. package/input/src/styles/input-group.css +164 -112
  52. package/input/src/styles/input.css +197 -163
  53. package/input-otp/src/styles/_vars.css +21 -21
  54. package/item/src/styles/_vars.css +34 -34
  55. package/menubar/src/styles/_vars.css +22 -22
  56. package/modal/src/styles/_vars.css +19 -18
  57. package/modal/src/styles/modal.css +202 -179
  58. package/navigation-menu/src/styles/_vars.css +45 -45
  59. package/package.json +12 -3
  60. package/pagination/src/styles/_vars.css +22 -22
  61. package/pagination/src/styles/pagination.css +158 -138
  62. package/progress/src/styles/_vars.css +15 -15
  63. package/radio-group/src/styles/_vars.css +29 -29
  64. package/radio-group/src/styles/radio-group.css +146 -137
  65. package/resizable/src/styles/_vars.css +20 -20
  66. package/select/src/styles/_vars.css +28 -28
  67. package/select/src/styles/select-trigger.css +109 -95
  68. package/separator/src/styles/_vars.css +9 -9
  69. package/sheet/src/styles/_vars.css +20 -18
  70. package/sheet/src/styles/sheet.css +220 -215
  71. package/sidebar/src/styles/sidebar.css +544 -531
  72. package/slider/src/styles/_vars.css +17 -17
  73. package/src/styles/blueprint.css +659 -0
  74. package/src/styles/components.css +47 -47
  75. package/styles/blueprint.css +659 -0
  76. package/styles/components.css +47 -47
  77. package/styles.css +49 -49
  78. package/switch/src/styles/_vars.css +34 -34
  79. package/switch/src/styles/switch.css +130 -131
  80. package/tabs/src/styles/_vars.css +23 -23
  81. package/textarea/src/styles/_vars.css +20 -20
  82. package/textarea/src/styles/textarea.css +62 -60
  83. package/toast/src/styles/_vars.css +48 -47
  84. package/toast/src/styles/toast.css +279 -314
  85. package/toggle/src/styles/_vars.css +24 -24
  86. package/tooltip/src/styles/_vars.css +21 -21
  87. package/tooltip/src/styles/tooltip.css +99 -103
  88. package/types/frame-ui-ng-components-accordion.d.ts +3 -1
  89. package/types/frame-ui-ng-components-badge.d.ts +2 -2
  90. package/types/frame-ui-ng-components-calendar.d.ts +14 -0
  91. package/types/frame-ui-ng-components-command.d.ts +7 -2
  92. package/types/frame-ui-ng-components-context-menu.d.ts +2 -2
  93. package/types/frame-ui-ng-components-date-picker.d.ts +3 -1
  94. package/types/frame-ui-ng-components-dropdown-menu.d.ts +3 -3
  95. package/types/frame-ui-ng-components-input.d.ts +6 -3
  96. package/types/frame-ui-ng-components-select.d.ts +6 -3
  97. package/types/frame-ui-ng-components-sidebar.d.ts +8 -1
  98. package/types/frame-ui-ng-components-tooltip.d.ts +43 -73
  99. package/types/frame-ui-ng-components.d.ts +91 -55
  100. package/virtual-scroll/src/styles/virtual-scroll.css +54 -54
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, effect, Directive, input, booleanAttribute, computed, output, signal, Component, contentChild, forwardRef, ChangeDetectionStrategy, Renderer2, RendererStyleFlags2, DestroyRef, TemplateRef, model, afterNextRender, ViewChild, ViewContainerRef, Injectable, Injector, numberAttribute, HostListener } from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, effect, Directive, input, booleanAttribute, computed, output, signal, Component, contentChild, forwardRef, ChangeDetectionStrategy, Renderer2, RendererStyleFlags2, DestroyRef, TemplateRef, model, afterNextRender, ViewChild, ViewContainerRef, Injectable, viewChild, Injector, numberAttribute, HostListener } from '@angular/core';
3
3
  import * as i1 from '@frame-ui-ng/components/spinner';
4
4
  import { FrSpinner } from '@frame-ui-ng/components/spinner';
5
5
  import { NgTemplateOutlet, NgClass, NgComponentOutlet, DOCUMENT } from '@angular/common';
@@ -25,7 +25,7 @@ class FrAccordionContent {
25
25
  host = inject(ElementRef);
26
26
  item = inject(ACCORDION_ITEM);
27
27
  initialized = false;
28
- rafId = -1;
28
+ rafIds = [];
29
29
  constructor() {
30
30
  effect((onCleanup) => {
31
31
  const open = this.item.open();
@@ -51,19 +51,25 @@ class FrAccordionContent {
51
51
  }
52
52
  animate(open) {
53
53
  const element = this.host.nativeElement;
54
+ const currentHeight = element.getBoundingClientRect().height;
55
+ const contentHeight = this.measureContentHeight();
54
56
  if (open) {
55
57
  element.style.visibility = 'visible';
56
- element.style.height = '0px';
57
- element.style.opacity = '0';
58
- this.rafId = requestAnimationFrame(() => {
59
- element.style.height = `${element.scrollHeight}px`;
58
+ element.style.height = `${currentHeight}px`;
59
+ if (currentHeight === 0) {
60
+ element.style.opacity = '0';
61
+ }
62
+ void element.offsetHeight;
63
+ this.requestAnimationFrame(() => {
64
+ element.style.height = `${contentHeight}px`;
60
65
  element.style.opacity = '1';
61
66
  });
62
67
  return;
63
68
  }
64
- element.style.height = `${element.scrollHeight}px`;
69
+ element.style.height = `${currentHeight || contentHeight}px`;
65
70
  element.style.opacity = '1';
66
- this.rafId = requestAnimationFrame(() => {
71
+ void element.offsetHeight;
72
+ this.requestAnimationFrame(() => {
67
73
  element.style.height = '0px';
68
74
  element.style.opacity = '0';
69
75
  });
@@ -74,12 +80,21 @@ class FrAccordionContent {
74
80
  element.style.opacity = open ? '1' : '0';
75
81
  element.style.visibility = open ? 'visible' : 'hidden';
76
82
  }
83
+ measureContentHeight() {
84
+ return this.host.nativeElement.scrollHeight;
85
+ }
77
86
  cancelAnimationFrame() {
78
- if (this.rafId === -1) {
79
- return;
87
+ for (const rafId of this.rafIds) {
88
+ cancelAnimationFrame(rafId);
80
89
  }
81
- cancelAnimationFrame(this.rafId);
82
- this.rafId = -1;
90
+ this.rafIds = [];
91
+ }
92
+ requestAnimationFrame(callback) {
93
+ const rafId = requestAnimationFrame((time) => {
94
+ this.rafIds = this.rafIds.filter((id) => id !== rafId);
95
+ callback(time);
96
+ });
97
+ this.rafIds.push(rafId);
83
98
  }
84
99
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAccordionContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
85
100
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAccordionContent, isStandalone: true, selector: "[frAccordionContent]", host: { attributes: { "role": "region" }, listeners: { "transitionend": "onTransitionEnd($event)" }, properties: { "attr.aria-hidden": "item.open() ? \"false\" : \"true\"", "attr.aria-labelledby": "item.triggerId()", "attr.data-state": "item.open() ? \"open\" : \"closed\"", "attr.id": "item.contentId()" }, classAttribute: "frame-accordion__content" }, ngImport: i0 });
@@ -458,6 +473,7 @@ const FR_AVATAR_SIZES = ['xs', 'sm', 'md', 'lg'];
458
473
  const FR_BADGE_VARIANTS = [
459
474
  'default',
460
475
  'secondary',
476
+ 'success',
461
477
  'destructive',
462
478
  'outline',
463
479
  'ghost',
@@ -654,7 +670,7 @@ class FrButton {
654
670
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
655
671
  loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
656
672
  loadingDisplay = input('replace', ...(ngDevMode ? [{ debugName: "loadingDisplay" }] : /* istanbul ignore next */ []));
657
- radius = input('md', ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
673
+ radius = input('none', ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
658
674
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
659
675
  hasCustomLoadingIndicator = computed(() => !!this.loadingIndicator() || !!this.spinnerIndicator(), ...(ngDevMode ? [{ debugName: "hasCustomLoadingIndicator" }] : /* istanbul ignore next */ []));
660
676
  isUnavailable = computed(() => this.disabled() || this.loading(), ...(ngDevMode ? [{ debugName: "isUnavailable" }] : /* istanbul ignore next */ []));
@@ -796,9 +812,11 @@ class FrCalendar {
796
812
  selected = input(undefined, ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
797
813
  selectedChange = output();
798
814
  monthChange = output();
815
+ focusedDate = signal(null, ...(ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []));
799
816
  navigatedMonth = signal(null, ...(ngDevMode ? [{ debugName: "navigatedMonth" }] : /* istanbul ignore next */ []));
800
817
  internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
801
818
  cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
819
+ host = inject((ElementRef));
802
820
  currentMonth = computed(() => startOfMonth(this.navigatedMonth() ?? this.month() ?? new Date()), ...(ngDevMode ? [{ debugName: "currentMonth" }] : /* istanbul ignore next */ []));
803
821
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
804
822
  value = computed(() => {
@@ -815,6 +833,7 @@ class FrCalendar {
815
833
  })), ...(ngDevMode ? [{ debugName: "monthOptions" }] : /* istanbul ignore next */ []));
816
834
  yearOptions = computed(() => Array.from({ length: Math.max(0, this.toYear() - this.fromYear() + 1) }, (_, index) => this.fromYear() + index), ...(ngDevMode ? [{ debugName: "yearOptions" }] : /* istanbul ignore next */ []));
817
835
  months = computed(() => Array.from({ length: Math.max(1, this.numberOfMonths()) }, (_, index) => this.buildMonth(addMonths(this.currentMonth(), index))), ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
836
+ activeDate = computed(() => this.resolveActiveDate(), ...(ngDevMode ? [{ debugName: "activeDate" }] : /* istanbul ignore next */ []));
818
837
  onTouched = () => undefined;
819
838
  onChange = () => undefined;
820
839
  writeValue(value) {
@@ -859,6 +878,25 @@ class FrCalendar {
859
878
  this.onChange(nextValue);
860
879
  this.selectedChange.emit(nextValue);
861
880
  }
881
+ handleDayKeydown(event, day) {
882
+ const offset = this.navigationOffset(event.key);
883
+ if (offset === null || this.isDisabled()) {
884
+ return;
885
+ }
886
+ event.preventDefault();
887
+ const next = addDays(day.date, offset);
888
+ this.focusedDate.set(next);
889
+ if (!this.isDateVisible(next)) {
890
+ this.updateMonth(startOfMonth(next));
891
+ }
892
+ this.focusDay(next);
893
+ }
894
+ dayTabIndex(day) {
895
+ return sameDate(day.date, this.activeDate()) ? 0 : -1;
896
+ }
897
+ focusActiveDate() {
898
+ this.focusDay(this.activeDate());
899
+ }
862
900
  monthLabel(date) {
863
901
  return new Intl.DateTimeFormat(this.locale(), {
864
902
  month: 'long',
@@ -875,6 +913,78 @@ class FrCalendar {
875
913
  weekNumber(date) {
876
914
  return isoWeekNumber(date).toString().padStart(2, '0');
877
915
  }
916
+ navigationOffset(key) {
917
+ switch (key) {
918
+ case 'ArrowLeft':
919
+ return this.dir() === 'rtl' ? 1 : -1;
920
+ case 'ArrowRight':
921
+ return this.dir() === 'rtl' ? -1 : 1;
922
+ case 'ArrowUp':
923
+ return -7;
924
+ case 'ArrowDown':
925
+ return 7;
926
+ default:
927
+ return null;
928
+ }
929
+ }
930
+ resolveActiveDate() {
931
+ const focused = this.focusedDate();
932
+ if (focused && this.findDay(focused) && !this.isDayDisabled(focused)) {
933
+ return cloneDate(focused);
934
+ }
935
+ const selected = this.selectedDate();
936
+ if (selected && this.findDay(selected) && !this.isDayDisabled(selected)) {
937
+ return cloneDate(selected);
938
+ }
939
+ const today = new Date();
940
+ if (this.findDay(today) && !this.isDayDisabled(today)) {
941
+ return cloneDate(today);
942
+ }
943
+ const firstEnabled = this.months()
944
+ .flatMap((month) => month.weeks.flat())
945
+ .find((day) => !day.disabled);
946
+ return firstEnabled ? cloneDate(firstEnabled.date) : cloneDate(this.currentMonth());
947
+ }
948
+ selectedDate() {
949
+ const value = this.value();
950
+ if (value instanceof Date) {
951
+ return value;
952
+ }
953
+ if (isRange$1(value)) {
954
+ return value.from ?? value.to;
955
+ }
956
+ return null;
957
+ }
958
+ isDateVisible(date) {
959
+ return this.months().some((month) => month.weeks.some((week) => week.some((day) => sameDate(day.date, date))));
960
+ }
961
+ findDay(date) {
962
+ for (const month of this.months()) {
963
+ for (const week of month.weeks) {
964
+ const day = week.find((item) => sameDate(item.date, date));
965
+ if (day) {
966
+ return day;
967
+ }
968
+ }
969
+ }
970
+ return null;
971
+ }
972
+ isDayDisabled(date) {
973
+ return this.findDay(date)?.disabled ?? true;
974
+ }
975
+ focusDay(date) {
976
+ if (this.focusDayElement(date)) {
977
+ return;
978
+ }
979
+ setTimeout(() => {
980
+ this.focusDayElement(date);
981
+ });
982
+ }
983
+ focusDayElement(date) {
984
+ const button = this.host.nativeElement.querySelector(`.frame-calendar__day[data-date="${dateKey(date)}"]`);
985
+ button?.focus();
986
+ return !!button;
987
+ }
878
988
  updateMonth(month) {
879
989
  const next = startOfMonth(month);
880
990
  this.navigatedMonth.set(next);
@@ -917,137 +1027,143 @@ class FrCalendar {
917
1027
  };
918
1028
  }
919
1029
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
920
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrCalendar, isStandalone: true, selector: "frame-calendar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedChange: "selectedChange", monthChange: "monthChange" }, host: { properties: { "attr.data-mode": "mode()", "attr.data-caption-layout": "captionLayout()", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.dir": "dir()" }, classAttribute: "frame-calendar" }, providers: [VALUE_ACCESSOR], ngImport: i0, template: `
921
- <div class="frame-calendar__header">
922
- <button
923
- class="frame-calendar__nav-button"
924
- type="button"
925
- [disabled]="isDisabled()"
926
- (click)="previousMonth()"
927
- [attr.aria-label]="previousMonthLabel()"
928
- >
929
- @if (previousMonthTemplate(); as template) {
930
- <ng-container [ngTemplateOutlet]="template" />
931
- } @else {
932
- {{ previousMonthIcon() }}
933
- }
934
- </button>
935
-
936
- @if (captionLayout() === 'dropdown') {
937
- <div class="frame-calendar__caption-controls">
938
- <select
939
- class="frame-calendar__select"
940
- [disabled]="isDisabled()"
941
- [value]="currentMonth().getMonth()"
942
- aria-label="Month"
943
- (change)="setMonth($any($event.target).value)"
944
- >
945
- @for (month of monthOptions(); track month.value) {
946
- <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
947
- {{ month.label }}
948
- </option>
949
- }
950
- </select>
951
-
952
- <select
953
- class="frame-calendar__select"
954
- [disabled]="isDisabled()"
955
- [value]="currentMonth().getFullYear()"
956
- aria-label="Year"
957
- (change)="setYear($any($event.target).value)"
958
- >
959
- @for (year of yearOptions(); track year) {
960
- <option [value]="year" [selected]="year === currentMonth().getFullYear()">
961
- {{ year }}
962
- </option>
963
- }
964
- </select>
965
- </div>
966
- } @else {
967
- <div class="frame-calendar__caption" aria-live="polite">
968
- {{ monthLabel(currentMonth()) }}
969
- </div>
970
- }
971
-
972
- <button
973
- class="frame-calendar__nav-button"
974
- type="button"
975
- [disabled]="isDisabled()"
976
- (click)="nextMonth()"
977
- [attr.aria-label]="nextMonthLabel()"
978
- >
979
- @if (nextMonthTemplate(); as template) {
980
- <ng-container [ngTemplateOutlet]="template" />
981
- } @else {
982
- {{ nextMonthIcon() }}
983
- }
984
- </button>
985
- </div>
986
-
987
- <div class="frame-calendar__months">
988
- @for (month of months(); track month.key) {
989
- <section class="frame-calendar__month" [attr.aria-label]="month.label">
990
- @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
991
- <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
992
- }
993
-
994
- <table class="frame-calendar__table">
995
- <thead>
996
- <tr>
997
- @if (showWeekNumber()) {
998
- <th class="frame-calendar__week-number-header" scope="col">Wk</th>
999
- }
1000
- @for (weekday of weekdayLabels(); track weekday) {
1001
- <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1002
- }
1003
- </tr>
1004
- </thead>
1005
- <tbody>
1006
- @for (week of month.weeks; track week[0].key) {
1007
- <tr>
1008
- @if (showWeekNumber()) {
1009
- <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1010
- }
1011
- @for (day of week; track day.key) {
1012
- <td
1013
- class="frame-calendar__cell"
1014
- [attr.data-outside]="day.outside ? '' : null"
1015
- [attr.data-selected]="day.selected ? '' : null"
1016
- [attr.data-range-start]="day.rangeStart ? '' : null"
1017
- [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1018
- [attr.data-range-end]="day.rangeEnd ? '' : null"
1019
- [attr.data-today]="day.today ? '' : null"
1020
- [attr.data-disabled-date]="day.disabledDate ? '' : null"
1021
- >
1022
- <button
1023
- class="frame-calendar__day"
1024
- type="button"
1025
- [disabled]="isDisabled() || day.disabled"
1026
- [attr.aria-label]="dayLabel(day.date)"
1027
- [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1028
- (click)="selectDay(day)"
1029
- >
1030
- @if (cellTemplate(); as template) {
1031
- <ng-container
1032
- [ngTemplateOutlet]="template"
1033
- [ngTemplateOutletContext]="day"
1034
- />
1035
- } @else {
1036
- <span class="frame-calendar__day-number">{{ day.day }}</span>
1037
- @if (day.dateLabel) {
1038
- <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1039
- }
1040
- }
1041
- </button>
1042
- </td>
1043
- }
1044
- </tr>
1045
- }
1046
- </tbody>
1047
- </table>
1048
- </section>
1049
- }
1050
- </div>
1030
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrCalendar, isStandalone: true, selector: "frame-calendar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedChange: "selectedChange", monthChange: "monthChange" }, host: { properties: { "attr.data-mode": "mode()", "attr.data-caption-layout": "captionLayout()", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.dir": "dir()" }, classAttribute: "frame-calendar" }, providers: [VALUE_ACCESSOR], ngImport: i0, template: `
1031
+ <div class="frame-calendar__header">
1032
+ <button
1033
+ class="frame-calendar__nav-button"
1034
+ type="button"
1035
+ [disabled]="isDisabled()"
1036
+ (click)="previousMonth()"
1037
+ [attr.aria-label]="previousMonthLabel()"
1038
+ >
1039
+ @if (previousMonthTemplate(); as template) {
1040
+ <ng-container [ngTemplateOutlet]="template" />
1041
+ } @else {
1042
+ {{ previousMonthIcon() }}
1043
+ }
1044
+ </button>
1045
+
1046
+ @if (captionLayout() === 'dropdown') {
1047
+ <div class="frame-calendar__caption-controls">
1048
+ <select
1049
+ class="frame-calendar__select"
1050
+ [disabled]="isDisabled()"
1051
+ [value]="currentMonth().getMonth()"
1052
+ aria-label="Month"
1053
+ (change)="setMonth($any($event.target).value)"
1054
+ >
1055
+ @for (month of monthOptions(); track month.value) {
1056
+ <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1057
+ {{ month.label }}
1058
+ </option>
1059
+ }
1060
+ </select>
1061
+
1062
+ <select
1063
+ class="frame-calendar__select"
1064
+ [disabled]="isDisabled()"
1065
+ [value]="currentMonth().getFullYear()"
1066
+ aria-label="Year"
1067
+ (change)="setYear($any($event.target).value)"
1068
+ >
1069
+ @for (year of yearOptions(); track year) {
1070
+ <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1071
+ {{ year }}
1072
+ </option>
1073
+ }
1074
+ </select>
1075
+ </div>
1076
+ } @else {
1077
+ <div class="frame-calendar__caption" aria-live="polite">
1078
+ {{ monthLabel(currentMonth()) }}
1079
+ </div>
1080
+ }
1081
+
1082
+ <button
1083
+ class="frame-calendar__nav-button"
1084
+ type="button"
1085
+ [disabled]="isDisabled()"
1086
+ (click)="nextMonth()"
1087
+ [attr.aria-label]="nextMonthLabel()"
1088
+ >
1089
+ @if (nextMonthTemplate(); as template) {
1090
+ <ng-container [ngTemplateOutlet]="template" />
1091
+ } @else {
1092
+ {{ nextMonthIcon() }}
1093
+ }
1094
+ </button>
1095
+ </div>
1096
+
1097
+ <div class="frame-calendar__months">
1098
+ @for (month of months(); track month.key) {
1099
+ <section class="frame-calendar__month" [attr.aria-label]="month.label">
1100
+ @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1101
+ <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1102
+ }
1103
+
1104
+ <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
1105
+ <thead>
1106
+ <tr>
1107
+ @if (showWeekNumber()) {
1108
+ <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1109
+ }
1110
+ @for (weekday of weekdayLabels(); track weekday) {
1111
+ <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1112
+ }
1113
+ </tr>
1114
+ </thead>
1115
+ <tbody>
1116
+ @for (week of month.weeks; track week[0].key) {
1117
+ <tr>
1118
+ @if (showWeekNumber()) {
1119
+ <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1120
+ }
1121
+ @for (day of week; track day.key) {
1122
+ <td
1123
+ class="frame-calendar__cell"
1124
+ [attr.data-outside]="day.outside ? '' : null"
1125
+ [attr.data-selected]="day.selected ? '' : null"
1126
+ [attr.data-range-start]="day.rangeStart ? '' : null"
1127
+ [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1128
+ [attr.data-range-end]="day.rangeEnd ? '' : null"
1129
+ [attr.data-today]="day.today ? '' : null"
1130
+ [attr.data-disabled-date]="day.disabledDate ? '' : null"
1131
+ >
1132
+ <button
1133
+ class="frame-calendar__day"
1134
+ type="button"
1135
+ [disabled]="isDisabled() || day.disabled"
1136
+ [attr.data-date]="day.key"
1137
+ [attr.tabindex]="dayTabIndex(day)"
1138
+ [attr.aria-label]="dayLabel(day.date)"
1139
+ [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1140
+ [attr.aria-selected]="day.selected ? 'true' : 'false'"
1141
+ [attr.aria-current]="day.today ? 'date' : null"
1142
+ (click)="selectDay(day)"
1143
+ (focus)="focusedDate.set(day.date)"
1144
+ (keydown)="handleDayKeydown($event, day)"
1145
+ >
1146
+ @if (cellTemplate(); as template) {
1147
+ <ng-container
1148
+ [ngTemplateOutlet]="template"
1149
+ [ngTemplateOutletContext]="day"
1150
+ />
1151
+ } @else {
1152
+ <span class="frame-calendar__day-number">{{ day.day }}</span>
1153
+ @if (day.dateLabel) {
1154
+ <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1155
+ }
1156
+ }
1157
+ </button>
1158
+ </td>
1159
+ }
1160
+ </tr>
1161
+ }
1162
+ </tbody>
1163
+ </table>
1164
+ </section>
1165
+ }
1166
+ </div>
1051
1167
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1052
1168
  }
1053
1169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, decorators: [{
@@ -1064,137 +1180,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1064
1180
  '[attr.data-disabled]': 'isDisabled() ? "" : null',
1065
1181
  '[attr.dir]': 'dir()',
1066
1182
  },
1067
- template: `
1068
- <div class="frame-calendar__header">
1069
- <button
1070
- class="frame-calendar__nav-button"
1071
- type="button"
1072
- [disabled]="isDisabled()"
1073
- (click)="previousMonth()"
1074
- [attr.aria-label]="previousMonthLabel()"
1075
- >
1076
- @if (previousMonthTemplate(); as template) {
1077
- <ng-container [ngTemplateOutlet]="template" />
1078
- } @else {
1079
- {{ previousMonthIcon() }}
1080
- }
1081
- </button>
1082
-
1083
- @if (captionLayout() === 'dropdown') {
1084
- <div class="frame-calendar__caption-controls">
1085
- <select
1086
- class="frame-calendar__select"
1087
- [disabled]="isDisabled()"
1088
- [value]="currentMonth().getMonth()"
1089
- aria-label="Month"
1090
- (change)="setMonth($any($event.target).value)"
1091
- >
1092
- @for (month of monthOptions(); track month.value) {
1093
- <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1094
- {{ month.label }}
1095
- </option>
1096
- }
1097
- </select>
1098
-
1099
- <select
1100
- class="frame-calendar__select"
1101
- [disabled]="isDisabled()"
1102
- [value]="currentMonth().getFullYear()"
1103
- aria-label="Year"
1104
- (change)="setYear($any($event.target).value)"
1105
- >
1106
- @for (year of yearOptions(); track year) {
1107
- <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1108
- {{ year }}
1109
- </option>
1110
- }
1111
- </select>
1112
- </div>
1113
- } @else {
1114
- <div class="frame-calendar__caption" aria-live="polite">
1115
- {{ monthLabel(currentMonth()) }}
1116
- </div>
1117
- }
1118
-
1119
- <button
1120
- class="frame-calendar__nav-button"
1121
- type="button"
1122
- [disabled]="isDisabled()"
1123
- (click)="nextMonth()"
1124
- [attr.aria-label]="nextMonthLabel()"
1125
- >
1126
- @if (nextMonthTemplate(); as template) {
1127
- <ng-container [ngTemplateOutlet]="template" />
1128
- } @else {
1129
- {{ nextMonthIcon() }}
1130
- }
1131
- </button>
1132
- </div>
1133
-
1134
- <div class="frame-calendar__months">
1135
- @for (month of months(); track month.key) {
1136
- <section class="frame-calendar__month" [attr.aria-label]="month.label">
1137
- @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1138
- <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1139
- }
1140
-
1141
- <table class="frame-calendar__table">
1142
- <thead>
1143
- <tr>
1144
- @if (showWeekNumber()) {
1145
- <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1146
- }
1147
- @for (weekday of weekdayLabels(); track weekday) {
1148
- <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1149
- }
1150
- </tr>
1151
- </thead>
1152
- <tbody>
1153
- @for (week of month.weeks; track week[0].key) {
1154
- <tr>
1155
- @if (showWeekNumber()) {
1156
- <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1157
- }
1158
- @for (day of week; track day.key) {
1159
- <td
1160
- class="frame-calendar__cell"
1161
- [attr.data-outside]="day.outside ? '' : null"
1162
- [attr.data-selected]="day.selected ? '' : null"
1163
- [attr.data-range-start]="day.rangeStart ? '' : null"
1164
- [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1165
- [attr.data-range-end]="day.rangeEnd ? '' : null"
1166
- [attr.data-today]="day.today ? '' : null"
1167
- [attr.data-disabled-date]="day.disabledDate ? '' : null"
1168
- >
1169
- <button
1170
- class="frame-calendar__day"
1171
- type="button"
1172
- [disabled]="isDisabled() || day.disabled"
1173
- [attr.aria-label]="dayLabel(day.date)"
1174
- [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1175
- (click)="selectDay(day)"
1176
- >
1177
- @if (cellTemplate(); as template) {
1178
- <ng-container
1179
- [ngTemplateOutlet]="template"
1180
- [ngTemplateOutletContext]="day"
1181
- />
1182
- } @else {
1183
- <span class="frame-calendar__day-number">{{ day.day }}</span>
1184
- @if (day.dateLabel) {
1185
- <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1186
- }
1187
- }
1188
- </button>
1189
- </td>
1190
- }
1191
- </tr>
1192
- }
1193
- </tbody>
1194
- </table>
1195
- </section>
1196
- }
1197
- </div>
1183
+ template: `
1184
+ <div class="frame-calendar__header">
1185
+ <button
1186
+ class="frame-calendar__nav-button"
1187
+ type="button"
1188
+ [disabled]="isDisabled()"
1189
+ (click)="previousMonth()"
1190
+ [attr.aria-label]="previousMonthLabel()"
1191
+ >
1192
+ @if (previousMonthTemplate(); as template) {
1193
+ <ng-container [ngTemplateOutlet]="template" />
1194
+ } @else {
1195
+ {{ previousMonthIcon() }}
1196
+ }
1197
+ </button>
1198
+
1199
+ @if (captionLayout() === 'dropdown') {
1200
+ <div class="frame-calendar__caption-controls">
1201
+ <select
1202
+ class="frame-calendar__select"
1203
+ [disabled]="isDisabled()"
1204
+ [value]="currentMonth().getMonth()"
1205
+ aria-label="Month"
1206
+ (change)="setMonth($any($event.target).value)"
1207
+ >
1208
+ @for (month of monthOptions(); track month.value) {
1209
+ <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1210
+ {{ month.label }}
1211
+ </option>
1212
+ }
1213
+ </select>
1214
+
1215
+ <select
1216
+ class="frame-calendar__select"
1217
+ [disabled]="isDisabled()"
1218
+ [value]="currentMonth().getFullYear()"
1219
+ aria-label="Year"
1220
+ (change)="setYear($any($event.target).value)"
1221
+ >
1222
+ @for (year of yearOptions(); track year) {
1223
+ <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1224
+ {{ year }}
1225
+ </option>
1226
+ }
1227
+ </select>
1228
+ </div>
1229
+ } @else {
1230
+ <div class="frame-calendar__caption" aria-live="polite">
1231
+ {{ monthLabel(currentMonth()) }}
1232
+ </div>
1233
+ }
1234
+
1235
+ <button
1236
+ class="frame-calendar__nav-button"
1237
+ type="button"
1238
+ [disabled]="isDisabled()"
1239
+ (click)="nextMonth()"
1240
+ [attr.aria-label]="nextMonthLabel()"
1241
+ >
1242
+ @if (nextMonthTemplate(); as template) {
1243
+ <ng-container [ngTemplateOutlet]="template" />
1244
+ } @else {
1245
+ {{ nextMonthIcon() }}
1246
+ }
1247
+ </button>
1248
+ </div>
1249
+
1250
+ <div class="frame-calendar__months">
1251
+ @for (month of months(); track month.key) {
1252
+ <section class="frame-calendar__month" [attr.aria-label]="month.label">
1253
+ @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1254
+ <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1255
+ }
1256
+
1257
+ <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
1258
+ <thead>
1259
+ <tr>
1260
+ @if (showWeekNumber()) {
1261
+ <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1262
+ }
1263
+ @for (weekday of weekdayLabels(); track weekday) {
1264
+ <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1265
+ }
1266
+ </tr>
1267
+ </thead>
1268
+ <tbody>
1269
+ @for (week of month.weeks; track week[0].key) {
1270
+ <tr>
1271
+ @if (showWeekNumber()) {
1272
+ <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1273
+ }
1274
+ @for (day of week; track day.key) {
1275
+ <td
1276
+ class="frame-calendar__cell"
1277
+ [attr.data-outside]="day.outside ? '' : null"
1278
+ [attr.data-selected]="day.selected ? '' : null"
1279
+ [attr.data-range-start]="day.rangeStart ? '' : null"
1280
+ [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1281
+ [attr.data-range-end]="day.rangeEnd ? '' : null"
1282
+ [attr.data-today]="day.today ? '' : null"
1283
+ [attr.data-disabled-date]="day.disabledDate ? '' : null"
1284
+ >
1285
+ <button
1286
+ class="frame-calendar__day"
1287
+ type="button"
1288
+ [disabled]="isDisabled() || day.disabled"
1289
+ [attr.data-date]="day.key"
1290
+ [attr.tabindex]="dayTabIndex(day)"
1291
+ [attr.aria-label]="dayLabel(day.date)"
1292
+ [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1293
+ [attr.aria-selected]="day.selected ? 'true' : 'false'"
1294
+ [attr.aria-current]="day.today ? 'date' : null"
1295
+ (click)="selectDay(day)"
1296
+ (focus)="focusedDate.set(day.date)"
1297
+ (keydown)="handleDayKeydown($event, day)"
1298
+ >
1299
+ @if (cellTemplate(); as template) {
1300
+ <ng-container
1301
+ [ngTemplateOutlet]="template"
1302
+ [ngTemplateOutletContext]="day"
1303
+ />
1304
+ } @else {
1305
+ <span class="frame-calendar__day-number">{{ day.day }}</span>
1306
+ @if (day.dateLabel) {
1307
+ <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1308
+ }
1309
+ }
1310
+ </button>
1311
+ </td>
1312
+ }
1313
+ </tr>
1314
+ }
1315
+ </tbody>
1316
+ </table>
1317
+ </section>
1318
+ }
1319
+ </div>
1198
1320
  `,
1199
1321
  }]
1200
1322
  }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }], numberOfMonths: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfMonths", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], fromYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "fromYear", required: false }] }], toYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "toYear", required: false }] }], showOutsideDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOutsideDays", required: false }] }], showWeekNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeekNumber", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], dateLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateLabels", required: false }] }], disabledMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledMatcher", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], previousMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthTemplate", required: false }] }], nextMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthTemplate", required: false }] }], previousMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthIcon", required: false }] }], nextMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthIcon", required: false }] }], previousMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }], month: [{ type: i0.Input, args: [{ isSignal: true, alias: "month", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }], monthChange: [{ type: i0.Output, args: ["monthChange"] }] } });
@@ -2902,7 +3024,7 @@ class FrCommandService {
2902
3024
  withDefaultClasses(config) {
2903
3025
  return {
2904
3026
  ariaModal: true,
2905
- autoFocus: 'first-tabbable',
3027
+ autoFocus: '[frCommandInput]',
2906
3028
  restoreFocus: true,
2907
3029
  width: 'min(calc(100vw - 2rem), 48rem)',
2908
3030
  maxWidth: 'calc(100vw - 2rem)',
@@ -2930,6 +3052,20 @@ function mergeClassList$2(classList, defaultClass) {
2930
3052
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
2931
3053
  }
2932
3054
 
3055
+ class FrCommandFooter {
3056
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3057
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandFooter, isStandalone: true, selector: "[frCommandFooter]", host: { classAttribute: "frame-command__footer" }, ngImport: i0 });
3058
+ }
3059
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandFooter, decorators: [{
3060
+ type: Directive,
3061
+ args: [{
3062
+ selector: '[frCommandFooter]',
3063
+ host: {
3064
+ class: 'frame-command__footer',
3065
+ },
3066
+ }]
3067
+ }] });
3068
+
2933
3069
  const FR_COMMAND = new InjectionToken('FrCommand');
2934
3070
  const FR_COMMAND_GROUP = new InjectionToken('FrCommandGroup');
2935
3071
 
@@ -3923,6 +4059,7 @@ class FrDatePicker extends FrControlValueAccessor$1 {
3923
4059
  valueChange = output();
3924
4060
  openChange = output();
3925
4061
  monthChange = output();
4062
+ calendar = viewChild(FrCalendar$1, ...(ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []));
3926
4063
  positions = POSITIONS;
3927
4064
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3928
4065
  overlaySide = signal('bottom', ...(ngDevMode ? [{ debugName: "overlaySide" }] : /* istanbul ignore next */ []));
@@ -4023,6 +4160,9 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4023
4160
  handlePositionChange(event) {
4024
4161
  this.overlaySide.set(event.connectionPair.overlayY === 'bottom' ? 'top' : 'bottom');
4025
4162
  }
4163
+ focusCalendar() {
4164
+ this.calendar()?.focusActiveDate();
4165
+ }
4026
4166
  overlayPanelClasses() {
4027
4167
  return ['frame-date-picker-overlay', `frame-date-picker-overlay--${this.overlaySide()}`];
4028
4168
  }
@@ -4038,118 +4178,119 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4038
4178
  this.markAsTouched();
4039
4179
  }
4040
4180
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDatePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
4041
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrDatePicker, isStandalone: true, selector: "frame-date-picker", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, readonlyInput: { classPropertyName: "readonlyInput", publicName: "readonlyInput", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, showTime: { classPropertyName: "showTime", publicName: "showTime", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, formatter: { classPropertyName: "formatter", publicName: "formatter", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, timeLabel: { classPropertyName: "timeLabel", publicName: "timeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", openChange: "openChange", monthChange: "monthChange" }, host: { properties: { "attr.data-open": "isOpen() ? \"\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-mode": "mode()", "attr.dir": "dir()" }, classAttribute: "frame-date-picker" }, providers: [provideDsValueAccessor$1(FrDatePicker)], exportAs: ["frDatePicker"], usesInheritance: true, ngImport: i0, template: `
4042
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4043
- @if (editable()) {
4044
- <span class="frame-date-picker__input-wrap">
4045
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4046
- <input
4047
- class="frame-date-picker__input"
4048
- type="text"
4049
- [disabled]="disabled()"
4050
- [readOnly]="readonlyInput()"
4051
- [placeholder]="placeholder()"
4052
- [value]="inputValue()"
4053
- [attr.aria-expanded]="isOpen()"
4054
- [attr.aria-invalid]="invalid() ? 'true' : null"
4055
- aria-haspopup="dialog"
4056
- (focus)="open()"
4057
- (click)="open()"
4058
- (input)="handleInput($any($event.target).value)"
4059
- (change)="commitInput($any($event.target).value)"
4060
- (keydown)="handleTriggerKeydown($event)"
4061
- (blur)="markAsTouched()"
4062
- />
4063
- </span>
4064
- } @else {
4065
- <button
4066
- class="frame-date-picker__trigger"
4067
- type="button"
4068
- [disabled]="disabled()"
4069
- [attr.aria-expanded]="isOpen()"
4070
- [attr.aria-invalid]="invalid() ? 'true' : null"
4071
- aria-haspopup="dialog"
4072
- (click)="toggle()"
4073
- (keydown)="handleTriggerKeydown($event)"
4074
- >
4075
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4076
- <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4077
- {{ displayValue() || placeholder() }}
4078
- </span>
4079
- </button>
4080
- }
4081
- </span>
4082
-
4083
- <ng-template
4084
- cdkConnectedOverlay
4085
- [cdkConnectedOverlayOrigin]="origin"
4086
- [cdkConnectedOverlayOpen]="isOpen()"
4087
- [cdkConnectedOverlayPositions]="positions"
4088
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4089
- [cdkConnectedOverlayPush]="true"
4090
- [cdkConnectedOverlayViewportMargin]="12"
4091
- (overlayOutsideClick)="close()"
4092
- (detach)="close()"
4093
- (positionChange)="handlePositionChange($event)"
4094
- >
4095
- <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4096
- @if (presets().length) {
4097
- <div class="frame-date-picker__presets" aria-label="Date presets">
4098
- @for (preset of presets(); track preset.label) {
4099
- <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4100
- {{ preset.label }}
4101
- </button>
4102
- }
4103
- </div>
4104
- }
4105
-
4106
- <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4107
-
4108
- <frame-calendar
4109
- [mode]="mode()"
4110
- [captionLayout]="captionLayout()"
4111
- [numberOfMonths]="numberOfMonths()"
4112
- [firstDayOfWeek]="firstDayOfWeek()"
4113
- [locale]="locale()"
4114
- [timeZone]="timeZone()"
4115
- [dir]="dir()"
4116
- [fromYear]="fromYear()"
4117
- [toYear]="toYear()"
4118
- [showOutsideDays]="showOutsideDays()"
4119
- [showWeekNumber]="showWeekNumber()"
4120
- [disabled]="disabled()"
4121
- [disabledDates]="disabledDates()"
4122
- [dateLabels]="dateLabels()"
4123
- [disabledMatcher]="disabledMatcher()"
4124
- [cellTemplate]="cellTemplate()"
4125
- [previousMonthTemplate]="previousMonthTemplate()"
4126
- [nextMonthTemplate]="nextMonthTemplate()"
4127
- [previousMonthIcon]="previousMonthIcon()"
4128
- [nextMonthIcon]="nextMonthIcon()"
4129
- [previousMonthLabel]="previousMonthLabel()"
4130
- [nextMonthLabel]="nextMonthLabel()"
4131
- [month]="month()"
4132
- [selected]="calendarValue()"
4133
- (selectedChange)="selectCalendarValue($any($event))"
4134
- (monthChange)="monthChange.emit($event)"
4135
- />
4136
-
4137
- @if (showTime() && mode() === 'single') {
4138
- <label class="frame-date-picker__time">
4139
- <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4140
- <input
4141
- class="frame-date-picker__time-input"
4142
- type="time"
4143
- [disabled]="disabled() || !singleDate()"
4144
- [value]="timeValue()"
4145
- (change)="setTime($any($event.target).value)"
4146
- />
4147
- </label>
4148
- }
4149
-
4150
- <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4151
- </div>
4152
- </ng-template>
4181
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrDatePicker, isStandalone: true, selector: "frame-date-picker", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, numberOfMonths: { classPropertyName: "numberOfMonths", publicName: "numberOfMonths", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, fromYear: { classPropertyName: "fromYear", publicName: "fromYear", isSignal: true, isRequired: false, transformFunction: null }, toYear: { classPropertyName: "toYear", publicName: "toYear", isSignal: true, isRequired: false, transformFunction: null }, showOutsideDays: { classPropertyName: "showOutsideDays", publicName: "showOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, readonlyInput: { classPropertyName: "readonlyInput", publicName: "readonlyInput", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, showTime: { classPropertyName: "showTime", publicName: "showTime", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, dialogLabel: { classPropertyName: "dialogLabel", publicName: "dialogLabel", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, dateLabels: { classPropertyName: "dateLabels", publicName: "dateLabels", isSignal: true, isRequired: false, transformFunction: null }, disabledMatcher: { classPropertyName: "disabledMatcher", publicName: "disabledMatcher", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthTemplate: { classPropertyName: "previousMonthTemplate", publicName: "previousMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, nextMonthTemplate: { classPropertyName: "nextMonthTemplate", publicName: "nextMonthTemplate", isSignal: true, isRequired: false, transformFunction: null }, previousMonthIcon: { classPropertyName: "previousMonthIcon", publicName: "previousMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, nextMonthIcon: { classPropertyName: "nextMonthIcon", publicName: "nextMonthIcon", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null }, month: { classPropertyName: "month", publicName: "month", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, formatter: { classPropertyName: "formatter", publicName: "formatter", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, timeLabel: { classPropertyName: "timeLabel", publicName: "timeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", openChange: "openChange", monthChange: "monthChange" }, host: { properties: { "attr.data-open": "isOpen() ? \"\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-mode": "mode()", "attr.dir": "dir()" }, classAttribute: "frame-date-picker" }, providers: [provideDsValueAccessor$1(FrDatePicker)], viewQueries: [{ propertyName: "calendar", first: true, predicate: FrCalendar$1, descendants: true, isSignal: true }], exportAs: ["frDatePicker"], usesInheritance: true, ngImport: i0, template: `
4182
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4183
+ @if (editable()) {
4184
+ <span class="frame-date-picker__input-wrap">
4185
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4186
+ <input
4187
+ class="frame-date-picker__input"
4188
+ type="text"
4189
+ [disabled]="disabled()"
4190
+ [readOnly]="readonlyInput()"
4191
+ [placeholder]="placeholder()"
4192
+ [value]="inputValue()"
4193
+ [attr.aria-expanded]="isOpen()"
4194
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4195
+ aria-haspopup="dialog"
4196
+ (focus)="open()"
4197
+ (click)="open()"
4198
+ (input)="handleInput($any($event.target).value)"
4199
+ (change)="commitInput($any($event.target).value)"
4200
+ (keydown)="handleTriggerKeydown($event)"
4201
+ (blur)="markAsTouched()"
4202
+ />
4203
+ </span>
4204
+ } @else {
4205
+ <button
4206
+ class="frame-date-picker__trigger"
4207
+ type="button"
4208
+ [disabled]="disabled()"
4209
+ [attr.aria-expanded]="isOpen()"
4210
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4211
+ aria-haspopup="dialog"
4212
+ (click)="toggle()"
4213
+ (keydown)="handleTriggerKeydown($event)"
4214
+ >
4215
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4216
+ <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4217
+ {{ displayValue() || placeholder() }}
4218
+ </span>
4219
+ </button>
4220
+ }
4221
+ </span>
4222
+
4223
+ <ng-template
4224
+ cdkConnectedOverlay
4225
+ [cdkConnectedOverlayOrigin]="origin"
4226
+ [cdkConnectedOverlayOpen]="isOpen()"
4227
+ [cdkConnectedOverlayPositions]="positions"
4228
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4229
+ [cdkConnectedOverlayPush]="true"
4230
+ [cdkConnectedOverlayViewportMargin]="12"
4231
+ (overlayOutsideClick)="close()"
4232
+ (attach)="focusCalendar()"
4233
+ (detach)="close()"
4234
+ (positionChange)="handlePositionChange($event)"
4235
+ >
4236
+ <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4237
+ @if (presets().length) {
4238
+ <div class="frame-date-picker__presets" aria-label="Date presets">
4239
+ @for (preset of presets(); track preset.label) {
4240
+ <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4241
+ {{ preset.label }}
4242
+ </button>
4243
+ }
4244
+ </div>
4245
+ }
4246
+
4247
+ <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4248
+
4249
+ <frame-calendar
4250
+ [mode]="mode()"
4251
+ [captionLayout]="captionLayout()"
4252
+ [numberOfMonths]="numberOfMonths()"
4253
+ [firstDayOfWeek]="firstDayOfWeek()"
4254
+ [locale]="locale()"
4255
+ [timeZone]="timeZone()"
4256
+ [dir]="dir()"
4257
+ [fromYear]="fromYear()"
4258
+ [toYear]="toYear()"
4259
+ [showOutsideDays]="showOutsideDays()"
4260
+ [showWeekNumber]="showWeekNumber()"
4261
+ [disabled]="disabled()"
4262
+ [disabledDates]="disabledDates()"
4263
+ [dateLabels]="dateLabels()"
4264
+ [disabledMatcher]="disabledMatcher()"
4265
+ [cellTemplate]="cellTemplate()"
4266
+ [previousMonthTemplate]="previousMonthTemplate()"
4267
+ [nextMonthTemplate]="nextMonthTemplate()"
4268
+ [previousMonthIcon]="previousMonthIcon()"
4269
+ [nextMonthIcon]="nextMonthIcon()"
4270
+ [previousMonthLabel]="previousMonthLabel()"
4271
+ [nextMonthLabel]="nextMonthLabel()"
4272
+ [month]="month()"
4273
+ [selected]="calendarValue()"
4274
+ (selectedChange)="selectCalendarValue($any($event))"
4275
+ (monthChange)="monthChange.emit($event)"
4276
+ />
4277
+
4278
+ @if (showTime() && mode() === 'single') {
4279
+ <label class="frame-date-picker__time">
4280
+ <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4281
+ <input
4282
+ class="frame-date-picker__time-input"
4283
+ type="time"
4284
+ [disabled]="disabled() || !singleDate()"
4285
+ [value]="timeValue()"
4286
+ (change)="setTime($any($event.target).value)"
4287
+ />
4288
+ </label>
4289
+ }
4290
+
4291
+ <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4292
+ </div>
4293
+ </ng-template>
4153
4294
  `, isInline: true, dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: FrCalendar$1, selector: "frame-calendar", inputs: ["mode", "captionLayout", "numberOfMonths", "firstDayOfWeek", "locale", "timeZone", "dir", "fromYear", "toYear", "showOutsideDays", "showWeekNumber", "disabled", "disabledDates", "dateLabels", "disabledMatcher", "cellTemplate", "previousMonthTemplate", "nextMonthTemplate", "previousMonthIcon", "nextMonthIcon", "previousMonthLabel", "nextMonthLabel", "month", "selected"], outputs: ["selectedChange", "monthChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4154
4295
  }
4155
4296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDatePicker, decorators: [{
@@ -4168,121 +4309,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4168
4309
  '[attr.data-mode]': 'mode()',
4169
4310
  '[attr.dir]': 'dir()',
4170
4311
  },
4171
- template: `
4172
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4173
- @if (editable()) {
4174
- <span class="frame-date-picker__input-wrap">
4175
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4176
- <input
4177
- class="frame-date-picker__input"
4178
- type="text"
4179
- [disabled]="disabled()"
4180
- [readOnly]="readonlyInput()"
4181
- [placeholder]="placeholder()"
4182
- [value]="inputValue()"
4183
- [attr.aria-expanded]="isOpen()"
4184
- [attr.aria-invalid]="invalid() ? 'true' : null"
4185
- aria-haspopup="dialog"
4186
- (focus)="open()"
4187
- (click)="open()"
4188
- (input)="handleInput($any($event.target).value)"
4189
- (change)="commitInput($any($event.target).value)"
4190
- (keydown)="handleTriggerKeydown($event)"
4191
- (blur)="markAsTouched()"
4192
- />
4193
- </span>
4194
- } @else {
4195
- <button
4196
- class="frame-date-picker__trigger"
4197
- type="button"
4198
- [disabled]="disabled()"
4199
- [attr.aria-expanded]="isOpen()"
4200
- [attr.aria-invalid]="invalid() ? 'true' : null"
4201
- aria-haspopup="dialog"
4202
- (click)="toggle()"
4203
- (keydown)="handleTriggerKeydown($event)"
4204
- >
4205
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4206
- <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4207
- {{ displayValue() || placeholder() }}
4208
- </span>
4209
- </button>
4210
- }
4211
- </span>
4212
-
4213
- <ng-template
4214
- cdkConnectedOverlay
4215
- [cdkConnectedOverlayOrigin]="origin"
4216
- [cdkConnectedOverlayOpen]="isOpen()"
4217
- [cdkConnectedOverlayPositions]="positions"
4218
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4219
- [cdkConnectedOverlayPush]="true"
4220
- [cdkConnectedOverlayViewportMargin]="12"
4221
- (overlayOutsideClick)="close()"
4222
- (detach)="close()"
4223
- (positionChange)="handlePositionChange($event)"
4224
- >
4225
- <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4226
- @if (presets().length) {
4227
- <div class="frame-date-picker__presets" aria-label="Date presets">
4228
- @for (preset of presets(); track preset.label) {
4229
- <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4230
- {{ preset.label }}
4231
- </button>
4232
- }
4233
- </div>
4234
- }
4235
-
4236
- <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4237
-
4238
- <frame-calendar
4239
- [mode]="mode()"
4240
- [captionLayout]="captionLayout()"
4241
- [numberOfMonths]="numberOfMonths()"
4242
- [firstDayOfWeek]="firstDayOfWeek()"
4243
- [locale]="locale()"
4244
- [timeZone]="timeZone()"
4245
- [dir]="dir()"
4246
- [fromYear]="fromYear()"
4247
- [toYear]="toYear()"
4248
- [showOutsideDays]="showOutsideDays()"
4249
- [showWeekNumber]="showWeekNumber()"
4250
- [disabled]="disabled()"
4251
- [disabledDates]="disabledDates()"
4252
- [dateLabels]="dateLabels()"
4253
- [disabledMatcher]="disabledMatcher()"
4254
- [cellTemplate]="cellTemplate()"
4255
- [previousMonthTemplate]="previousMonthTemplate()"
4256
- [nextMonthTemplate]="nextMonthTemplate()"
4257
- [previousMonthIcon]="previousMonthIcon()"
4258
- [nextMonthIcon]="nextMonthIcon()"
4259
- [previousMonthLabel]="previousMonthLabel()"
4260
- [nextMonthLabel]="nextMonthLabel()"
4261
- [month]="month()"
4262
- [selected]="calendarValue()"
4263
- (selectedChange)="selectCalendarValue($any($event))"
4264
- (monthChange)="monthChange.emit($event)"
4265
- />
4266
-
4267
- @if (showTime() && mode() === 'single') {
4268
- <label class="frame-date-picker__time">
4269
- <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4270
- <input
4271
- class="frame-date-picker__time-input"
4272
- type="time"
4273
- [disabled]="disabled() || !singleDate()"
4274
- [value]="timeValue()"
4275
- (change)="setTime($any($event.target).value)"
4276
- />
4277
- </label>
4278
- }
4279
-
4280
- <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4281
- </div>
4282
- </ng-template>
4312
+ template: `
4313
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4314
+ @if (editable()) {
4315
+ <span class="frame-date-picker__input-wrap">
4316
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4317
+ <input
4318
+ class="frame-date-picker__input"
4319
+ type="text"
4320
+ [disabled]="disabled()"
4321
+ [readOnly]="readonlyInput()"
4322
+ [placeholder]="placeholder()"
4323
+ [value]="inputValue()"
4324
+ [attr.aria-expanded]="isOpen()"
4325
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4326
+ aria-haspopup="dialog"
4327
+ (focus)="open()"
4328
+ (click)="open()"
4329
+ (input)="handleInput($any($event.target).value)"
4330
+ (change)="commitInput($any($event.target).value)"
4331
+ (keydown)="handleTriggerKeydown($event)"
4332
+ (blur)="markAsTouched()"
4333
+ />
4334
+ </span>
4335
+ } @else {
4336
+ <button
4337
+ class="frame-date-picker__trigger"
4338
+ type="button"
4339
+ [disabled]="disabled()"
4340
+ [attr.aria-expanded]="isOpen()"
4341
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4342
+ aria-haspopup="dialog"
4343
+ (click)="toggle()"
4344
+ (keydown)="handleTriggerKeydown($event)"
4345
+ >
4346
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4347
+ <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4348
+ {{ displayValue() || placeholder() }}
4349
+ </span>
4350
+ </button>
4351
+ }
4352
+ </span>
4353
+
4354
+ <ng-template
4355
+ cdkConnectedOverlay
4356
+ [cdkConnectedOverlayOrigin]="origin"
4357
+ [cdkConnectedOverlayOpen]="isOpen()"
4358
+ [cdkConnectedOverlayPositions]="positions"
4359
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4360
+ [cdkConnectedOverlayPush]="true"
4361
+ [cdkConnectedOverlayViewportMargin]="12"
4362
+ (overlayOutsideClick)="close()"
4363
+ (attach)="focusCalendar()"
4364
+ (detach)="close()"
4365
+ (positionChange)="handlePositionChange($event)"
4366
+ >
4367
+ <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4368
+ @if (presets().length) {
4369
+ <div class="frame-date-picker__presets" aria-label="Date presets">
4370
+ @for (preset of presets(); track preset.label) {
4371
+ <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4372
+ {{ preset.label }}
4373
+ </button>
4374
+ }
4375
+ </div>
4376
+ }
4377
+
4378
+ <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4379
+
4380
+ <frame-calendar
4381
+ [mode]="mode()"
4382
+ [captionLayout]="captionLayout()"
4383
+ [numberOfMonths]="numberOfMonths()"
4384
+ [firstDayOfWeek]="firstDayOfWeek()"
4385
+ [locale]="locale()"
4386
+ [timeZone]="timeZone()"
4387
+ [dir]="dir()"
4388
+ [fromYear]="fromYear()"
4389
+ [toYear]="toYear()"
4390
+ [showOutsideDays]="showOutsideDays()"
4391
+ [showWeekNumber]="showWeekNumber()"
4392
+ [disabled]="disabled()"
4393
+ [disabledDates]="disabledDates()"
4394
+ [dateLabels]="dateLabels()"
4395
+ [disabledMatcher]="disabledMatcher()"
4396
+ [cellTemplate]="cellTemplate()"
4397
+ [previousMonthTemplate]="previousMonthTemplate()"
4398
+ [nextMonthTemplate]="nextMonthTemplate()"
4399
+ [previousMonthIcon]="previousMonthIcon()"
4400
+ [nextMonthIcon]="nextMonthIcon()"
4401
+ [previousMonthLabel]="previousMonthLabel()"
4402
+ [nextMonthLabel]="nextMonthLabel()"
4403
+ [month]="month()"
4404
+ [selected]="calendarValue()"
4405
+ (selectedChange)="selectCalendarValue($any($event))"
4406
+ (monthChange)="monthChange.emit($event)"
4407
+ />
4408
+
4409
+ @if (showTime() && mode() === 'single') {
4410
+ <label class="frame-date-picker__time">
4411
+ <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4412
+ <input
4413
+ class="frame-date-picker__time-input"
4414
+ type="time"
4415
+ [disabled]="disabled() || !singleDate()"
4416
+ [value]="timeValue()"
4417
+ (change)="setTime($any($event.target).value)"
4418
+ />
4419
+ </label>
4420
+ }
4421
+
4422
+ <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4423
+ </div>
4424
+ </ng-template>
4283
4425
  `,
4284
4426
  }]
4285
- }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }], numberOfMonths: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfMonths", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], fromYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "fromYear", required: false }] }], toYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "toYear", required: false }] }], showOutsideDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOutsideDays", required: false }] }], showWeekNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeekNumber", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonlyInput", required: false }] }], closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], showTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTime", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], dateLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateLabels", required: false }] }], disabledMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledMatcher", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], previousMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthTemplate", required: false }] }], nextMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthTemplate", required: false }] }], previousMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthIcon", required: false }] }], nextMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthIcon", required: false }] }], previousMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], footerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerTemplate", required: false }] }], month: [{ type: i0.Input, args: [{ isSignal: true, alias: "month", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], formatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatter", required: false }] }], parser: [{ type: i0.Input, args: [{ isSignal: true, alias: "parser", required: false }] }], timeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], openChange: [{ type: i0.Output, args: ["openChange"] }], monthChange: [{ type: i0.Output, args: ["monthChange"] }] } });
4427
+ }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }], numberOfMonths: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfMonths", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }], fromYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "fromYear", required: false }] }], toYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "toYear", required: false }] }], showOutsideDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOutsideDays", required: false }] }], showWeekNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeekNumber", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonlyInput", required: false }] }], closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], showTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTime", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], dialogLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dialogLabel", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], dateLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateLabels", required: false }] }], disabledMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledMatcher", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], previousMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthTemplate", required: false }] }], nextMonthTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthTemplate", required: false }] }], previousMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthIcon", required: false }] }], nextMonthIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthIcon", required: false }] }], previousMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], footerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerTemplate", required: false }] }], month: [{ type: i0.Input, args: [{ isSignal: true, alias: "month", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], formatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatter", required: false }] }], parser: [{ type: i0.Input, args: [{ isSignal: true, alias: "parser", required: false }] }], timeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], openChange: [{ type: i0.Output, args: ["openChange"] }], monthChange: [{ type: i0.Output, args: ["monthChange"] }], calendar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FrCalendar$1), { isSignal: true }] }] } });
4286
4428
  function normalizeValue(value, mode) {
4287
4429
  if (!value) {
4288
4430
  return mode === 'range' ? { from: null, to: null } : null;
@@ -4347,27 +4489,41 @@ function mergeTime(date, timeSource) {
4347
4489
  return next;
4348
4490
  }
4349
4491
 
4492
+ const DEFAULT_SIDE_OFFSET = 4;
4493
+ const MIN_SUBMENU_SIDE_OFFSET = 16;
4350
4494
  function defaultPositions(isSubmenu) {
4351
4495
  return buildConnectedPositions({
4352
4496
  align: 'start',
4353
4497
  alignOffset: 0,
4354
4498
  isSubmenu,
4355
- side: isSubmenu ? 'right' : 'bottom',
4356
- sideOffset: 4,
4499
+ side: 'auto',
4500
+ sideOffset: DEFAULT_SIDE_OFFSET,
4357
4501
  });
4358
4502
  }
4359
4503
  function buildConnectedPositions(options) {
4360
- const placements = primaryPlacement(options);
4361
- return [placements.primary, placements.fallback];
4504
+ const side = normalizeSide(options.side, options.isSubmenu);
4505
+ if (side === 'auto') {
4506
+ return autoSides(options.isSubmenu).flatMap((side) => primaryPlacement({
4507
+ ...options,
4508
+ side,
4509
+ }));
4510
+ }
4511
+ return primaryPlacement({
4512
+ ...options,
4513
+ side,
4514
+ });
4362
4515
  }
4363
4516
  function primaryPlacement(options) {
4364
- if (options.isSubmenu) {
4365
- const isRight = options.side !== 'left';
4366
- const horizontalOffset = isRight ? options.sideOffset : -options.sideOffset;
4367
- const originY = submenuOriginY(options.align);
4368
- const overlayY = submenuOverlayY(options.align);
4369
- return {
4370
- primary: {
4517
+ if (options.side === 'left' || options.side === 'right') {
4518
+ const isRight = options.side === 'right';
4519
+ const sideOffset = options.isSubmenu
4520
+ ? Math.max(options.sideOffset, MIN_SUBMENU_SIDE_OFFSET)
4521
+ : options.sideOffset;
4522
+ const horizontalOffset = isRight ? sideOffset : -sideOffset;
4523
+ const originY = horizontalOriginY(options.align);
4524
+ const overlayY = horizontalOverlayY(options.align);
4525
+ return [
4526
+ {
4371
4527
  originX: isRight ? 'end' : 'start',
4372
4528
  originY,
4373
4529
  overlayX: isRight ? 'start' : 'end',
@@ -4375,7 +4531,7 @@ function primaryPlacement(options) {
4375
4531
  offsetX: horizontalOffset,
4376
4532
  offsetY: options.alignOffset,
4377
4533
  },
4378
- fallback: {
4534
+ {
4379
4535
  originX: isRight ? 'start' : 'end',
4380
4536
  originY,
4381
4537
  overlayX: isRight ? 'end' : 'start',
@@ -4383,14 +4539,14 @@ function primaryPlacement(options) {
4383
4539
  offsetX: -horizontalOffset,
4384
4540
  offsetY: options.alignOffset,
4385
4541
  },
4386
- };
4542
+ ];
4387
4543
  }
4388
- const isBottom = options.side !== 'top';
4544
+ const isBottom = options.side === 'bottom';
4389
4545
  const verticalOffset = isBottom ? options.sideOffset : -options.sideOffset;
4390
4546
  const originX = rootOriginX(options.align);
4391
4547
  const overlayX = rootOverlayX(options.align);
4392
- return {
4393
- primary: {
4548
+ return [
4549
+ {
4394
4550
  originX,
4395
4551
  originY: isBottom ? 'bottom' : 'top',
4396
4552
  overlayX,
@@ -4398,7 +4554,7 @@ function primaryPlacement(options) {
4398
4554
  offsetX: options.alignOffset,
4399
4555
  offsetY: verticalOffset,
4400
4556
  },
4401
- fallback: {
4557
+ {
4402
4558
  originX,
4403
4559
  originY: isBottom ? 'top' : 'bottom',
4404
4560
  overlayX,
@@ -4406,7 +4562,16 @@ function primaryPlacement(options) {
4406
4562
  offsetX: options.alignOffset,
4407
4563
  offsetY: -verticalOffset,
4408
4564
  },
4409
- };
4565
+ ];
4566
+ }
4567
+ function normalizeSide(side, isSubmenu) {
4568
+ if (!isSubmenu || side === 'left' || side === 'right') {
4569
+ return side;
4570
+ }
4571
+ return 'auto';
4572
+ }
4573
+ function autoSides(isSubmenu) {
4574
+ return isSubmenu ? ['right', 'left'] : ['bottom', 'top', 'right', 'left'];
4410
4575
  }
4411
4576
  function rootOriginX(align) {
4412
4577
  if (align === 'center') {
@@ -4420,13 +4585,13 @@ function rootOverlayX(align) {
4420
4585
  }
4421
4586
  return align;
4422
4587
  }
4423
- function submenuOriginY(align) {
4588
+ function horizontalOriginY(align) {
4424
4589
  if (align === 'center') {
4425
4590
  return 'center';
4426
4591
  }
4427
4592
  return align === 'end' ? 'bottom' : 'top';
4428
4593
  }
4429
- function submenuOverlayY(align) {
4594
+ function horizontalOverlayY(align) {
4430
4595
  if (align === 'center') {
4431
4596
  return 'center';
4432
4597
  }
@@ -4548,7 +4713,7 @@ class FrDropdownMenuContent {
4548
4713
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
4549
4714
  alignOffset = input(0, ...(ngDevMode ? [{ debugName: "alignOffset" }] : /* istanbul ignore next */ []));
4550
4715
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4551
- side = input('bottom', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4716
+ side = input('auto', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4552
4717
  sideOffset = input(4, ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
4553
4718
  isDebugVisible() {
4554
4719
  return this.debugVisible();
@@ -4909,7 +5074,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4909
5074
  }], propDecorators: { menuContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "frDropdownMenuSubTrigger", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4910
5075
 
4911
5076
  const FR_DROPDOWN_MENU_ALIGNMENTS = ['center', 'end', 'start'];
4912
- const FR_DROPDOWN_MENU_SIDES = ['bottom', 'left', 'right', 'top'];
5077
+ const FR_DROPDOWN_MENU_SIDES = ['auto', 'bottom', 'left', 'right', 'top'];
4913
5078
  const FR_DROPDOWN_MENU_TRIGGER_MODES = ['both', 'click', 'hover'];
4914
5079
  const FR_DROPDOWN_MENU_ITEM_VARIANTS = ['default', 'destructive'];
4915
5080
 
@@ -5710,6 +5875,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5710
5875
  }] });
5711
5876
 
5712
5877
  const FR_INPUT_GROUP_ADDON_ALIGNS = ['inline-start', 'inline-end'];
5878
+ const FR_INPUT_GROUP_ADDON_VARIANTS = ['default', 'ghost'];
5713
5879
  class FrInputGroup {
5714
5880
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5715
5881
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputGroup, isStandalone: true, selector: "[frInputGroup], frame-input-group", host: { classAttribute: "frame-input-group" }, ngImport: i0 });
@@ -5725,8 +5891,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5725
5891
  }] });
5726
5892
  class FrInputGroupAddon {
5727
5893
  align = input('inline-start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
5894
+ variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5728
5895
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupAddon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5729
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrInputGroupAddon, isStandalone: true, selector: "[frInputGroupAddon], frame-input-group-addon", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-align": "align()" }, classAttribute: "frame-input-group__addon" }, ngImport: i0 });
5896
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrInputGroupAddon, isStandalone: true, selector: "[frInputGroupAddon], frame-input-group-addon", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-align": "align()", "attr.data-variant": "variant()" }, classAttribute: "frame-input-group__addon" }, ngImport: i0 });
5730
5897
  }
5731
5898
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupAddon, decorators: [{
5732
5899
  type: Directive,
@@ -5735,9 +5902,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5735
5902
  host: {
5736
5903
  class: 'frame-input-group__addon',
5737
5904
  '[attr.data-align]': 'align()',
5905
+ '[attr.data-variant]': 'variant()',
5738
5906
  },
5739
5907
  }]
5740
- }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }] } });
5908
+ }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5741
5909
  class FrInputGroupText {
5742
5910
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupText, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5743
5911
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputGroupText, isStandalone: true, selector: "[frInputGroupText], frame-input-group-text", host: { classAttribute: "frame-input-group__text" }, ngImport: i0 });
@@ -8500,6 +8668,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8500
8668
  }]
8501
8669
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indicatorPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorPosition", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
8502
8670
 
8671
+ const FR_SELECT_ICON_POSITIONS = ['leading', 'trailing'];
8503
8672
  class FrSelectValue {
8504
8673
  select = inject(FrSelect);
8505
8674
  placeholder = input('Select an option', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -8534,8 +8703,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8534
8703
  }]
8535
8704
  }] });
8536
8705
  class FrSelectIcon {
8706
+ position = input('trailing', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
8537
8707
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8538
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectIcon, isStandalone: true, selector: "[frSelectIcon], frame-select-icon", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-select__icon" }, ngImport: i0 });
8708
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSelectIcon, isStandalone: true, selector: "[frSelectIcon], frame-select-icon", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, properties: { "attr.data-position": "position()" }, classAttribute: "frame-select__icon" }, ngImport: i0 });
8539
8709
  }
8540
8710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, decorators: [{
8541
8711
  type: Directive,
@@ -8544,9 +8714,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8544
8714
  host: {
8545
8715
  class: 'frame-select__icon',
8546
8716
  'aria-hidden': 'true',
8717
+ '[attr.data-position]': 'position()',
8547
8718
  },
8548
8719
  }]
8549
- }] });
8720
+ }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
8550
8721
  class FrSelectError {
8551
8722
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8552
8723
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectError, isStandalone: true, selector: "[frSelectError], frame-select-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-select__error" }, ngImport: i0 });
@@ -9401,6 +9572,13 @@ function coerceMenuButtonSize(value) {
9401
9572
  function coerceMenuButtonVariant(value) {
9402
9573
  return value === 'outline' ? 'outline' : 'default';
9403
9574
  }
9575
+ function coerceOptionalNumber(value) {
9576
+ if (value === null || value === undefined || value === '') {
9577
+ return null;
9578
+ }
9579
+ const coerced = numberAttribute(value, Number.NaN);
9580
+ return Number.isFinite(coerced) ? coerced : null;
9581
+ }
9404
9582
  class FrSidebarProvider {
9405
9583
  document = inject(DOCUMENT);
9406
9584
  elementRef = inject(ElementRef);
@@ -9508,8 +9686,10 @@ class FrSidebar {
9508
9686
  side = input('left', { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), transform: coerceSide });
9509
9687
  variant = input('sidebar', { ...(ngDevMode ? { debugName: "variant" } : /* istanbul ignore next */ {}), transform: coerceVariant });
9510
9688
  collapsible = input('offcanvas', { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: coerceCollapsible });
9689
+ minSize = input(null, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9690
+ maxSize = input(384, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9511
9691
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9512
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSidebar, isStandalone: true, selector: "[frSidebar], frame-sidebar", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-side": "side()", "attr.data-variant": "variant()", "attr.data-collapsible": "collapsible()", "attr.data-state": "provider?.state() ?? \"expanded\"", "attr.data-mobile-open": "provider?.openMobile() ?? false" }, classAttribute: "frame-sidebar" }, ngImport: i0 });
9692
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSidebar, isStandalone: true, selector: "[frSidebar], frame-sidebar", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-side": "side()", "attr.data-variant": "variant()", "attr.data-collapsible": "collapsible()", "attr.data-state": "provider?.state() ?? \"expanded\"", "attr.data-mobile-open": "provider?.openMobile() ?? false" }, classAttribute: "frame-sidebar" }, ngImport: i0 });
9513
9693
  }
9514
9694
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, decorators: [{
9515
9695
  type: Directive,
@@ -9524,7 +9704,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9524
9704
  '[attr.data-mobile-open]': 'provider?.openMobile() ?? false',
9525
9705
  },
9526
9706
  }]
9527
- }], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }] } });
9707
+ }], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }] } });
9528
9708
  class FrSidebarTrigger {
9529
9709
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9530
9710
  ariaLabel = input('Toggle sidebar', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9556,6 +9736,8 @@ class FrSidebarRail {
9556
9736
  suppressClick = false;
9557
9737
  frameId = -1;
9558
9738
  pendingWidth = 0;
9739
+ resizeMinSize = 192;
9740
+ resizeMaxSize = 384;
9559
9741
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9560
9742
  toggle() {
9561
9743
  if (this.suppressClick) {
@@ -9571,6 +9753,7 @@ class FrSidebarRail {
9571
9753
  this.startWidth = this.sidebar.elementRef.nativeElement.getBoundingClientRect().width;
9572
9754
  this.dragging = false;
9573
9755
  this.pendingWidth = this.startWidth;
9756
+ this.captureResizeBounds();
9574
9757
  this.provider.setResizing(true);
9575
9758
  event.preventDefault();
9576
9759
  const move = (moveEvent) => this.resize(moveEvent);
@@ -9582,6 +9765,8 @@ class FrSidebarRail {
9582
9765
  this.suppressClick = this.dragging;
9583
9766
  this.dragging = false;
9584
9767
  this.pendingWidth = 0;
9768
+ this.resizeMinSize = 192;
9769
+ this.resizeMaxSize = 384;
9585
9770
  setTimeout(() => {
9586
9771
  this.suppressClick = false;
9587
9772
  });
@@ -9595,7 +9780,7 @@ class FrSidebarRail {
9595
9780
  }
9596
9781
  const delta = event.clientX - this.startX;
9597
9782
  const direction = this.sidebar.side() === 'right' ? -1 : 1;
9598
- const nextWidth = Math.min(Math.max(this.startWidth + delta * direction, 192), 384);
9783
+ const nextWidth = this.clampWidth(this.startWidth + delta * direction);
9599
9784
  if (Math.abs(delta) > 3) {
9600
9785
  this.dragging = true;
9601
9786
  }
@@ -9617,6 +9802,35 @@ class FrSidebarRail {
9617
9802
  this.provider?.setSidebarWidth(this.pendingWidth);
9618
9803
  }
9619
9804
  }
9805
+ clampWidth(width) {
9806
+ return Math.min(Math.max(width, this.resizeMinSize), this.resizeMaxSize);
9807
+ }
9808
+ captureResizeBounds() {
9809
+ if (!this.sidebar) {
9810
+ return;
9811
+ }
9812
+ const minSize = this.sidebar.minSize() ?? this.measureContentMinSize();
9813
+ const maxSize = this.sidebar.maxSize() ?? Number.POSITIVE_INFINITY;
9814
+ this.resizeMinSize = minSize;
9815
+ this.resizeMaxSize = Math.max(minSize, maxSize);
9816
+ }
9817
+ measureContentMinSize() {
9818
+ if (!this.sidebar) {
9819
+ return 192;
9820
+ }
9821
+ const sidebarElement = this.sidebar.elementRef.nativeElement;
9822
+ const sidebarRect = sidebarElement.getBoundingClientRect();
9823
+ let measuredWidth = 0;
9824
+ for (const element of Array.from(sidebarElement.querySelectorAll('*'))) {
9825
+ if (element.hasAttribute('frSidebarRail') || element.tagName.toLowerCase() === 'frame-sidebar-rail') {
9826
+ continue;
9827
+ }
9828
+ const rect = element.getBoundingClientRect();
9829
+ const inlineStart = Math.max(0, rect.left - sidebarRect.left);
9830
+ measuredWidth = Math.max(measuredWidth, inlineStart + element.scrollWidth);
9831
+ }
9832
+ return Math.max(Math.ceil(measuredWidth), 192);
9833
+ }
9620
9834
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarRail, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9621
9835
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarRail, isStandalone: true, selector: "[frSidebarRail], frame-sidebar-rail", host: { attributes: { "role": "separator", "tabindex": "0", "aria-label": "Resize sidebar", "aria-orientation": "vertical" }, listeners: { "click": "toggle()", "pointerdown": "startResize($event)", "keydown.enter": "toggle()", "keydown.space": "toggle(); $event.preventDefault()" }, classAttribute: "frame-sidebar__rail" }, ngImport: i0 });
9622
9836
  }
@@ -10274,5 +10488,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10274
10488
  * Generated bundle index. Do not edit.
10275
10489
  */
10276
10490
 
10277
- export { FR_ACCORDION_TYPES, FR_ALERT_VARIANTS, FR_AVATAR_SIZES, FR_BADGE_ICON_POSITIONS, FR_BADGE_VARIANTS, FR_BUTTON_APPEARANCES, FR_BUTTON_GROUP_ORIENTATIONS, FR_BUTTON_LOADING_DISPLAYS, FR_BUTTON_RADII, FR_BUTTON_SIZES, FR_CARD_FOOTER_ALIGNS, FR_CARD_SIZES, FR_CARD_SPACINGS, FR_CAROUSEL_ALIGNS, FR_CAROUSEL_DIRECTIONS, FR_CAROUSEL_ORIENTATIONS, FR_CONTEXT_MENU_CONTENT, FR_DROPDOWN_MENU_ALIGNMENTS, FR_DROPDOWN_MENU_CONTENT, FR_DROPDOWN_MENU_ITEM_VARIANTS, FR_DROPDOWN_MENU_PARENT, FR_DROPDOWN_MENU_SIDES, FR_DROPDOWN_MENU_TRIGGER_MODES, FR_EMPTY_MEDIA_VARIANTS, FR_EMPTY_ORIENTATIONS, FR_EMPTY_VARIANTS, FR_FIELD_LEGEND_VARIANTS, FR_FIELD_ORIENTATIONS, FR_HOVER_CARD_ALIGNMENTS, FR_HOVER_CARD_SIDES, FR_INPUT_GROUP_ADDON_ALIGNS, FR_INPUT_OTP_PATTERN_DIGITS, FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS, FR_ITEM_MEDIA_VARIANTS, FR_ITEM_SIZES, FR_ITEM_VARIANTS, FR_MENUBAR_PARENT, FR_MODAL_DATA, FR_NAVIGATION_MENU_PARENT, FR_POPOVER_ALIGNMENTS, FR_POPOVER_SIDES, FR_RADIO_GROUP_ORIENTATIONS, FR_RADIO_GROUP_VARIANTS, FR_RESIZABLE_ORIENTATIONS, FR_SELECT_INDICATOR_POSITIONS, FR_SELECT_POSITIONS, FR_SEPARATOR_ORIENTATIONS, FR_SHEET_DATA, FR_SHEET_SIDES, FR_SIDEBAR_COLLAPSIBLES, FR_SIDEBAR_MENU_BUTTON_SIZES, FR_SIDEBAR_MENU_BUTTON_VARIANTS, FR_SIDEBAR_PROVIDER, FR_SIDEBAR_SIDES, FR_SIDEBAR_VARIANTS, FR_SLIDER_ORIENTATIONS, FR_SWITCH_SIZES, FrAccordion, FrAccordionContent, FrAccordionIcon, FrAccordionItem, FrAccordionTrigger, FrAlert, FrAlertDescription, FrAlertIcon, FrAlertTitle, FrAvatar, FrAvatarBadge, FrAvatarFallback, FrAvatarGroup, FrAvatarGroupCount, FrAvatarIcon, FrAvatarImage, FrBadge, FrBadgeIcon, FrBadgeLabel, FrBadgeSpinner, FrBreadcrumb, FrBreadcrumbEllipsis, FrBreadcrumbItem, FrBreadcrumbLink, FrBreadcrumbList, FrBreadcrumbPage, FrBreadcrumbSeparator, FrButton, FrButtonGroup, FrButtonIcon, FrButtonLabel, FrButtonLoading, FrCalendar, FrCard, FrCardAction, FrCardContent, FrCardDescription, FrCardFooter, FrCardHeader, FrCardTitle, FrCarousel, FrCarouselContent, FrCarouselItem, FrCarouselNext, FrCarouselPrevious, FrCheckbox, FrCheckboxField, FrCheckboxLabel, FrCollapsible, FrCollapsibleContent, FrCollapsibleTrigger, FrCombobox, FrComboboxChip, FrComboboxChipRemove, FrComboboxChips, FrComboboxChipsInput, FrComboboxClear, FrComboboxCollection, FrComboboxContent, FrComboboxEmpty, FrComboboxError, FrComboboxGroup, FrComboboxInput, FrComboboxItem, FrComboboxItemIndicator, FrComboboxLabel, FrComboboxList, FrComboboxPanel, FrComboboxRootLookup, FrComboboxSeparator, FrComboboxTrigger, FrComboboxValueList, FrCommand, FrCommandDialog, FrCommandDialogTrigger, FrCommandEmpty, FrCommandGroup, FrCommandGroupHeading, FrCommandInput, FrCommandItem, FrCommandItemIcon, FrCommandList, FrCommandSeparator, FrCommandService, FrCommandShortcut, FrContextMenu, FrContextMenuCheckboxItem, FrContextMenuContent, FrContextMenuItem, FrContextMenuItemIndicator, FrContextMenuLabel, FrContextMenuPanel, FrContextMenuRadioGroup, FrContextMenuRadioItem, FrContextMenuSeparator, FrContextMenuShortcut, FrContextMenuSub, FrContextMenuSubTrigger, FrContextMenuTrigger, FrControlValueAccessor, FrDatePicker, FrDropdownMenu, FrDropdownMenuCheckboxItem, FrDropdownMenuContent, FrDropdownMenuItem, FrDropdownMenuItemIndicator, FrDropdownMenuLabel, FrDropdownMenuPanel, FrDropdownMenuRadioGroup, FrDropdownMenuRadioItem, FrDropdownMenuSeparator, FrDropdownMenuShortcut, FrDropdownMenuSub, FrDropdownMenuSubTrigger, FrDropdownMenuTree, FrDropdownMenuTrigger, FrEmpty, FrEmptyContent, FrEmptyDescription, FrEmptyHeader, FrEmptyMedia, FrEmptyTitle, FrField, FrFieldContent, FrFieldDescription, FrFieldError, FrFieldGroup, FrFieldLabel, FrFieldLegend, FrFieldSeparator, FrFieldSet, FrHoverCardRoot as FrHoverCard, FrHoverCardContent, FrHoverCardPanel, FrHoverCardTrigger, FrIconButton, FrInput, FrInputBadge, FrInputControl, FrInputDescription, FrInputError, FrInputField, FrInputFieldGroup, FrInputGroup, FrInputGroupAddon, FrInputGroupInput, FrInputGroupText, FrInputHeader, FrInputLabel, FrInputOtp, FrInputOtpGroup, FrInputOtpSeparator, FrInputOtpSlot, FrItem, FrItemActions, FrItemContent, FrItemDescription, FrItemFooter, FrItemGroup, FrItemHeader, FrItemMedia, FrItemSeparator, FrItemTitle, FrMenuBar, FrMenuBarCheckboxItem, FrMenuBarContent, FrMenuBarItem, FrMenuBarItemIndicator, FrMenuBarLabel, FrMenuBarMenu, FrMenuBarPanel, FrMenuBarRadioGroup, FrMenuBarRadioItem, FrMenuBarSeparator, FrMenuBarShortcut, FrMenuBarSub, FrMenuBarSubTrigger, FrMenuBarTrigger, FrModalBody, FrModalClose, FrModalContent, FrModalDescription, FrModalFooter, FrModalHeader, FrModalPanel, FrModalService, FrModalShell, FrModalTitle, FrModalTrigger, FrNavigationLinkSeparator, FrNavigationMenu, FrNavigationMenuContent, FrNavigationMenuFeature, FrNavigationMenuGrid, FrNavigationMenuIndicator, FrNavigationMenuItem, FrNavigationMenuLink, FrNavigationMenuLinkDescription, FrNavigationMenuLinkTitle, FrNavigationMenuList, FrNavigationMenuPanel, FrNavigationMenuTrigger, FrNavigationMenuViewport, FrPagination, FrPaginationContent, FrPaginationEllipsis, FrPaginationIcon, FrPaginationItem, FrPaginationLink, FrPaginationNext, FrPaginationPrevious, FrPopoverRoot as FrPopover, FrPopoverBody, FrPopoverClose, FrPopoverContent, FrPopoverDescription, FrPopoverFooter, FrPopoverHeader, FrPopoverPanel, FrPopoverTitle, FrPopoverTrigger, FrProgress, FrProgressIndicator, FrRadioGroup, FrRadioGroupCard, FrRadioGroupCardMeta, FrRadioGroupField, FrRadioGroupItem, FrResizableHandle, FrResizablePanel, FrResizablePanelGroup, FrSelect, FrSelectContent, FrSelectError, FrSelectGroup, FrSelectIcon, FrSelectItem, FrSelectItemIndicator, FrSelectLabel, FrSelectPanel, FrSelectSeparator, FrSelectValue, FrSeparator, FrSheetBody, FrSheetClose, FrSheetContent, FrSheetDescription, FrSheetFooter, FrSheetHeader, FrSheetPanel, FrSheetService, FrSheetShell, FrSheetTitle, FrSheetTrigger, FrSidebar, FrSidebarContent, FrSidebarFooter, FrSidebarGroup, FrSidebarGroupAction, FrSidebarGroupContent, FrSidebarGroupLabel, FrSidebarHeader, FrSidebarInset, FrSidebarMenu, FrSidebarMenuAction, FrSidebarMenuBadge, FrSidebarMenuButton, FrSidebarMenuItem, FrSidebarMenuSkeleton, FrSidebarMenuSub, FrSidebarMenuSubButton, FrSidebarMenuSubItem, FrSidebarProvider, FrSidebarRail, FrSidebarTrigger, FrSlider, FrSwitch, FrSwitchContent, FrSwitchDescription, FrSwitchError, FrSwitchField, FrSwitchLabel, FrTextarea, FrVirtualContent, FrVirtualFor, FrVirtualItem, FrVirtualItemMeta, FrVirtualList, FrVirtualPanel, FrVirtualViewport, buildConnectedPositions, calculateScrollOffsetForIndex, calculateVirtualRange, defaultPositions, provideDsValueAccessor };
10491
+ export { FR_ACCORDION_TYPES, FR_ALERT_VARIANTS, FR_AVATAR_SIZES, FR_BADGE_ICON_POSITIONS, FR_BADGE_VARIANTS, FR_BUTTON_APPEARANCES, FR_BUTTON_GROUP_ORIENTATIONS, FR_BUTTON_LOADING_DISPLAYS, FR_BUTTON_RADII, FR_BUTTON_SIZES, FR_CARD_FOOTER_ALIGNS, FR_CARD_SIZES, FR_CARD_SPACINGS, FR_CAROUSEL_ALIGNS, FR_CAROUSEL_DIRECTIONS, FR_CAROUSEL_ORIENTATIONS, FR_CONTEXT_MENU_CONTENT, FR_DROPDOWN_MENU_ALIGNMENTS, FR_DROPDOWN_MENU_CONTENT, FR_DROPDOWN_MENU_ITEM_VARIANTS, FR_DROPDOWN_MENU_PARENT, FR_DROPDOWN_MENU_SIDES, FR_DROPDOWN_MENU_TRIGGER_MODES, FR_EMPTY_MEDIA_VARIANTS, FR_EMPTY_ORIENTATIONS, FR_EMPTY_VARIANTS, FR_FIELD_LEGEND_VARIANTS, FR_FIELD_ORIENTATIONS, FR_HOVER_CARD_ALIGNMENTS, FR_HOVER_CARD_SIDES, FR_INPUT_GROUP_ADDON_ALIGNS, FR_INPUT_GROUP_ADDON_VARIANTS, FR_INPUT_OTP_PATTERN_DIGITS, FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS, FR_ITEM_MEDIA_VARIANTS, FR_ITEM_SIZES, FR_ITEM_VARIANTS, FR_MENUBAR_PARENT, FR_MODAL_DATA, FR_NAVIGATION_MENU_PARENT, FR_POPOVER_ALIGNMENTS, FR_POPOVER_SIDES, FR_RADIO_GROUP_ORIENTATIONS, FR_RADIO_GROUP_VARIANTS, FR_RESIZABLE_ORIENTATIONS, FR_SELECT_ICON_POSITIONS, FR_SELECT_INDICATOR_POSITIONS, FR_SELECT_POSITIONS, FR_SEPARATOR_ORIENTATIONS, FR_SHEET_DATA, FR_SHEET_SIDES, FR_SIDEBAR_COLLAPSIBLES, FR_SIDEBAR_MENU_BUTTON_SIZES, FR_SIDEBAR_MENU_BUTTON_VARIANTS, FR_SIDEBAR_PROVIDER, FR_SIDEBAR_SIDES, FR_SIDEBAR_VARIANTS, FR_SLIDER_ORIENTATIONS, FR_SWITCH_SIZES, FrAccordion, FrAccordionContent, FrAccordionIcon, FrAccordionItem, FrAccordionTrigger, FrAlert, FrAlertDescription, FrAlertIcon, FrAlertTitle, FrAvatar, FrAvatarBadge, FrAvatarFallback, FrAvatarGroup, FrAvatarGroupCount, FrAvatarIcon, FrAvatarImage, FrBadge, FrBadgeIcon, FrBadgeLabel, FrBadgeSpinner, FrBreadcrumb, FrBreadcrumbEllipsis, FrBreadcrumbItem, FrBreadcrumbLink, FrBreadcrumbList, FrBreadcrumbPage, FrBreadcrumbSeparator, FrButton, FrButtonGroup, FrButtonIcon, FrButtonLabel, FrButtonLoading, FrCalendar, FrCard, FrCardAction, FrCardContent, FrCardDescription, FrCardFooter, FrCardHeader, FrCardTitle, FrCarousel, FrCarouselContent, FrCarouselItem, FrCarouselNext, FrCarouselPrevious, FrCheckbox, FrCheckboxField, FrCheckboxLabel, FrCollapsible, FrCollapsibleContent, FrCollapsibleTrigger, FrCombobox, FrComboboxChip, FrComboboxChipRemove, FrComboboxChips, FrComboboxChipsInput, FrComboboxClear, FrComboboxCollection, FrComboboxContent, FrComboboxEmpty, FrComboboxError, FrComboboxGroup, FrComboboxInput, FrComboboxItem, FrComboboxItemIndicator, FrComboboxLabel, FrComboboxList, FrComboboxPanel, FrComboboxRootLookup, FrComboboxSeparator, FrComboboxTrigger, FrComboboxValueList, FrCommand, FrCommandDialog, FrCommandDialogTrigger, FrCommandEmpty, FrCommandFooter, FrCommandGroup, FrCommandGroupHeading, FrCommandInput, FrCommandItem, FrCommandItemIcon, FrCommandList, FrCommandSeparator, FrCommandService, FrCommandShortcut, FrContextMenu, FrContextMenuCheckboxItem, FrContextMenuContent, FrContextMenuItem, FrContextMenuItemIndicator, FrContextMenuLabel, FrContextMenuPanel, FrContextMenuRadioGroup, FrContextMenuRadioItem, FrContextMenuSeparator, FrContextMenuShortcut, FrContextMenuSub, FrContextMenuSubTrigger, FrContextMenuTrigger, FrControlValueAccessor, FrDatePicker, FrDropdownMenu, FrDropdownMenuCheckboxItem, FrDropdownMenuContent, FrDropdownMenuItem, FrDropdownMenuItemIndicator, FrDropdownMenuLabel, FrDropdownMenuPanel, FrDropdownMenuRadioGroup, FrDropdownMenuRadioItem, FrDropdownMenuSeparator, FrDropdownMenuShortcut, FrDropdownMenuSub, FrDropdownMenuSubTrigger, FrDropdownMenuTree, FrDropdownMenuTrigger, FrEmpty, FrEmptyContent, FrEmptyDescription, FrEmptyHeader, FrEmptyMedia, FrEmptyTitle, FrField, FrFieldContent, FrFieldDescription, FrFieldError, FrFieldGroup, FrFieldLabel, FrFieldLegend, FrFieldSeparator, FrFieldSet, FrHoverCardRoot as FrHoverCard, FrHoverCardContent, FrHoverCardPanel, FrHoverCardTrigger, FrIconButton, FrInput, FrInputBadge, FrInputControl, FrInputDescription, FrInputError, FrInputField, FrInputFieldGroup, FrInputGroup, FrInputGroupAddon, FrInputGroupInput, FrInputGroupText, FrInputHeader, FrInputLabel, FrInputOtp, FrInputOtpGroup, FrInputOtpSeparator, FrInputOtpSlot, FrItem, FrItemActions, FrItemContent, FrItemDescription, FrItemFooter, FrItemGroup, FrItemHeader, FrItemMedia, FrItemSeparator, FrItemTitle, FrMenuBar, FrMenuBarCheckboxItem, FrMenuBarContent, FrMenuBarItem, FrMenuBarItemIndicator, FrMenuBarLabel, FrMenuBarMenu, FrMenuBarPanel, FrMenuBarRadioGroup, FrMenuBarRadioItem, FrMenuBarSeparator, FrMenuBarShortcut, FrMenuBarSub, FrMenuBarSubTrigger, FrMenuBarTrigger, FrModalBody, FrModalClose, FrModalContent, FrModalDescription, FrModalFooter, FrModalHeader, FrModalPanel, FrModalService, FrModalShell, FrModalTitle, FrModalTrigger, FrNavigationLinkSeparator, FrNavigationMenu, FrNavigationMenuContent, FrNavigationMenuFeature, FrNavigationMenuGrid, FrNavigationMenuIndicator, FrNavigationMenuItem, FrNavigationMenuLink, FrNavigationMenuLinkDescription, FrNavigationMenuLinkTitle, FrNavigationMenuList, FrNavigationMenuPanel, FrNavigationMenuTrigger, FrNavigationMenuViewport, FrPagination, FrPaginationContent, FrPaginationEllipsis, FrPaginationIcon, FrPaginationItem, FrPaginationLink, FrPaginationNext, FrPaginationPrevious, FrPopoverRoot as FrPopover, FrPopoverBody, FrPopoverClose, FrPopoverContent, FrPopoverDescription, FrPopoverFooter, FrPopoverHeader, FrPopoverPanel, FrPopoverTitle, FrPopoverTrigger, FrProgress, FrProgressIndicator, FrRadioGroup, FrRadioGroupCard, FrRadioGroupCardMeta, FrRadioGroupField, FrRadioGroupItem, FrResizableHandle, FrResizablePanel, FrResizablePanelGroup, FrSelect, FrSelectContent, FrSelectError, FrSelectGroup, FrSelectIcon, FrSelectItem, FrSelectItemIndicator, FrSelectLabel, FrSelectPanel, FrSelectSeparator, FrSelectValue, FrSeparator, FrSheetBody, FrSheetClose, FrSheetContent, FrSheetDescription, FrSheetFooter, FrSheetHeader, FrSheetPanel, FrSheetService, FrSheetShell, FrSheetTitle, FrSheetTrigger, FrSidebar, FrSidebarContent, FrSidebarFooter, FrSidebarGroup, FrSidebarGroupAction, FrSidebarGroupContent, FrSidebarGroupLabel, FrSidebarHeader, FrSidebarInset, FrSidebarMenu, FrSidebarMenuAction, FrSidebarMenuBadge, FrSidebarMenuButton, FrSidebarMenuItem, FrSidebarMenuSkeleton, FrSidebarMenuSub, FrSidebarMenuSubButton, FrSidebarMenuSubItem, FrSidebarProvider, FrSidebarRail, FrSidebarTrigger, FrSlider, FrSwitch, FrSwitchContent, FrSwitchDescription, FrSwitchError, FrSwitchField, FrSwitchLabel, FrTextarea, FrVirtualContent, FrVirtualFor, FrVirtualItem, FrVirtualItemMeta, FrVirtualList, FrVirtualPanel, FrVirtualViewport, buildConnectedPositions, calculateScrollOffsetForIndex, calculateVirtualRange, defaultPositions, provideDsValueAccessor };
10278
10492
  //# sourceMappingURL=frame-ui-ng-components.mjs.map