@frame-ui-ng/components 0.2.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 (36) hide show
  1. package/button/src/styles/button.css +15 -3
  2. package/dropdown-menu/src/styles/_vars.css +1 -1
  3. package/dropdown-menu/src/styles/dropdown-menu-item.css +87 -87
  4. package/fesm2022/frame-ui-ng-components-calendar.mjs +369 -263
  5. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  6. package/fesm2022/frame-ui-ng-components-command.mjs +1 -1
  7. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-date-picker.mjs +232 -226
  9. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +45 -22
  11. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-input.mjs +6 -3
  13. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-select.mjs +6 -3
  15. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-sidebar.mjs +47 -4
  17. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-tooltip.mjs +263 -254
  19. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components.mjs +703 -519
  21. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  22. package/input/src/styles/input-group.css +50 -0
  23. package/package.json +2 -2
  24. package/select/src/styles/select-trigger.css +7 -36
  25. package/src/styles/blueprint.css +4 -11
  26. package/styles/blueprint.css +4 -11
  27. package/tooltip/src/styles/tooltip.css +3 -9
  28. package/types/frame-ui-ng-components-calendar.d.ts +14 -0
  29. package/types/frame-ui-ng-components-context-menu.d.ts +2 -2
  30. package/types/frame-ui-ng-components-date-picker.d.ts +3 -1
  31. package/types/frame-ui-ng-components-dropdown-menu.d.ts +3 -3
  32. package/types/frame-ui-ng-components-input.d.ts +6 -3
  33. package/types/frame-ui-ng-components-select.d.ts +6 -3
  34. package/types/frame-ui-ng-components-sidebar.d.ts +8 -1
  35. package/types/frame-ui-ng-components-tooltip.d.ts +43 -73
  36. package/types/frame-ui-ng-components.d.ts +84 -55
@@ -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';
@@ -812,9 +812,11 @@ class FrCalendar {
812
812
  selected = input(undefined, ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
813
813
  selectedChange = output();
814
814
  monthChange = output();
815
+ focusedDate = signal(null, ...(ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []));
815
816
  navigatedMonth = signal(null, ...(ngDevMode ? [{ debugName: "navigatedMonth" }] : /* istanbul ignore next */ []));
816
817
  internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
817
818
  cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
819
+ host = inject((ElementRef));
818
820
  currentMonth = computed(() => startOfMonth(this.navigatedMonth() ?? this.month() ?? new Date()), ...(ngDevMode ? [{ debugName: "currentMonth" }] : /* istanbul ignore next */ []));
819
821
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
820
822
  value = computed(() => {
@@ -831,6 +833,7 @@ class FrCalendar {
831
833
  })), ...(ngDevMode ? [{ debugName: "monthOptions" }] : /* istanbul ignore next */ []));
832
834
  yearOptions = computed(() => Array.from({ length: Math.max(0, this.toYear() - this.fromYear() + 1) }, (_, index) => this.fromYear() + index), ...(ngDevMode ? [{ debugName: "yearOptions" }] : /* istanbul ignore next */ []));
833
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 */ []));
834
837
  onTouched = () => undefined;
835
838
  onChange = () => undefined;
836
839
  writeValue(value) {
@@ -875,6 +878,25 @@ class FrCalendar {
875
878
  this.onChange(nextValue);
876
879
  this.selectedChange.emit(nextValue);
877
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
+ }
878
900
  monthLabel(date) {
879
901
  return new Intl.DateTimeFormat(this.locale(), {
880
902
  month: 'long',
@@ -891,6 +913,78 @@ class FrCalendar {
891
913
  weekNumber(date) {
892
914
  return isoWeekNumber(date).toString().padStart(2, '0');
893
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
+ }
894
988
  updateMonth(month) {
895
989
  const next = startOfMonth(month);
896
990
  this.navigatedMonth.set(next);
@@ -933,137 +1027,143 @@ class FrCalendar {
933
1027
  };
934
1028
  }
935
1029
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
936
- 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: `
937
- <div class="frame-calendar__header">
938
- <button
939
- class="frame-calendar__nav-button"
940
- type="button"
941
- [disabled]="isDisabled()"
942
- (click)="previousMonth()"
943
- [attr.aria-label]="previousMonthLabel()"
944
- >
945
- @if (previousMonthTemplate(); as template) {
946
- <ng-container [ngTemplateOutlet]="template" />
947
- } @else {
948
- {{ previousMonthIcon() }}
949
- }
950
- </button>
951
-
952
- @if (captionLayout() === 'dropdown') {
953
- <div class="frame-calendar__caption-controls">
954
- <select
955
- class="frame-calendar__select"
956
- [disabled]="isDisabled()"
957
- [value]="currentMonth().getMonth()"
958
- aria-label="Month"
959
- (change)="setMonth($any($event.target).value)"
960
- >
961
- @for (month of monthOptions(); track month.value) {
962
- <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
963
- {{ month.label }}
964
- </option>
965
- }
966
- </select>
967
-
968
- <select
969
- class="frame-calendar__select"
970
- [disabled]="isDisabled()"
971
- [value]="currentMonth().getFullYear()"
972
- aria-label="Year"
973
- (change)="setYear($any($event.target).value)"
974
- >
975
- @for (year of yearOptions(); track year) {
976
- <option [value]="year" [selected]="year === currentMonth().getFullYear()">
977
- {{ year }}
978
- </option>
979
- }
980
- </select>
981
- </div>
982
- } @else {
983
- <div class="frame-calendar__caption" aria-live="polite">
984
- {{ monthLabel(currentMonth()) }}
985
- </div>
986
- }
987
-
988
- <button
989
- class="frame-calendar__nav-button"
990
- type="button"
991
- [disabled]="isDisabled()"
992
- (click)="nextMonth()"
993
- [attr.aria-label]="nextMonthLabel()"
994
- >
995
- @if (nextMonthTemplate(); as template) {
996
- <ng-container [ngTemplateOutlet]="template" />
997
- } @else {
998
- {{ nextMonthIcon() }}
999
- }
1000
- </button>
1001
- </div>
1002
-
1003
- <div class="frame-calendar__months">
1004
- @for (month of months(); track month.key) {
1005
- <section class="frame-calendar__month" [attr.aria-label]="month.label">
1006
- @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1007
- <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1008
- }
1009
-
1010
- <table class="frame-calendar__table">
1011
- <thead>
1012
- <tr>
1013
- @if (showWeekNumber()) {
1014
- <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1015
- }
1016
- @for (weekday of weekdayLabels(); track weekday) {
1017
- <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1018
- }
1019
- </tr>
1020
- </thead>
1021
- <tbody>
1022
- @for (week of month.weeks; track week[0].key) {
1023
- <tr>
1024
- @if (showWeekNumber()) {
1025
- <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1026
- }
1027
- @for (day of week; track day.key) {
1028
- <td
1029
- class="frame-calendar__cell"
1030
- [attr.data-outside]="day.outside ? '' : null"
1031
- [attr.data-selected]="day.selected ? '' : null"
1032
- [attr.data-range-start]="day.rangeStart ? '' : null"
1033
- [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1034
- [attr.data-range-end]="day.rangeEnd ? '' : null"
1035
- [attr.data-today]="day.today ? '' : null"
1036
- [attr.data-disabled-date]="day.disabledDate ? '' : null"
1037
- >
1038
- <button
1039
- class="frame-calendar__day"
1040
- type="button"
1041
- [disabled]="isDisabled() || day.disabled"
1042
- [attr.aria-label]="dayLabel(day.date)"
1043
- [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1044
- (click)="selectDay(day)"
1045
- >
1046
- @if (cellTemplate(); as template) {
1047
- <ng-container
1048
- [ngTemplateOutlet]="template"
1049
- [ngTemplateOutletContext]="day"
1050
- />
1051
- } @else {
1052
- <span class="frame-calendar__day-number">{{ day.day }}</span>
1053
- @if (day.dateLabel) {
1054
- <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1055
- }
1056
- }
1057
- </button>
1058
- </td>
1059
- }
1060
- </tr>
1061
- }
1062
- </tbody>
1063
- </table>
1064
- </section>
1065
- }
1066
- </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>
1067
1167
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1068
1168
  }
1069
1169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, decorators: [{
@@ -1080,137 +1180,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1080
1180
  '[attr.data-disabled]': 'isDisabled() ? "" : null',
1081
1181
  '[attr.dir]': 'dir()',
1082
1182
  },
1083
- template: `
1084
- <div class="frame-calendar__header">
1085
- <button
1086
- class="frame-calendar__nav-button"
1087
- type="button"
1088
- [disabled]="isDisabled()"
1089
- (click)="previousMonth()"
1090
- [attr.aria-label]="previousMonthLabel()"
1091
- >
1092
- @if (previousMonthTemplate(); as template) {
1093
- <ng-container [ngTemplateOutlet]="template" />
1094
- } @else {
1095
- {{ previousMonthIcon() }}
1096
- }
1097
- </button>
1098
-
1099
- @if (captionLayout() === 'dropdown') {
1100
- <div class="frame-calendar__caption-controls">
1101
- <select
1102
- class="frame-calendar__select"
1103
- [disabled]="isDisabled()"
1104
- [value]="currentMonth().getMonth()"
1105
- aria-label="Month"
1106
- (change)="setMonth($any($event.target).value)"
1107
- >
1108
- @for (month of monthOptions(); track month.value) {
1109
- <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1110
- {{ month.label }}
1111
- </option>
1112
- }
1113
- </select>
1114
-
1115
- <select
1116
- class="frame-calendar__select"
1117
- [disabled]="isDisabled()"
1118
- [value]="currentMonth().getFullYear()"
1119
- aria-label="Year"
1120
- (change)="setYear($any($event.target).value)"
1121
- >
1122
- @for (year of yearOptions(); track year) {
1123
- <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1124
- {{ year }}
1125
- </option>
1126
- }
1127
- </select>
1128
- </div>
1129
- } @else {
1130
- <div class="frame-calendar__caption" aria-live="polite">
1131
- {{ monthLabel(currentMonth()) }}
1132
- </div>
1133
- }
1134
-
1135
- <button
1136
- class="frame-calendar__nav-button"
1137
- type="button"
1138
- [disabled]="isDisabled()"
1139
- (click)="nextMonth()"
1140
- [attr.aria-label]="nextMonthLabel()"
1141
- >
1142
- @if (nextMonthTemplate(); as template) {
1143
- <ng-container [ngTemplateOutlet]="template" />
1144
- } @else {
1145
- {{ nextMonthIcon() }}
1146
- }
1147
- </button>
1148
- </div>
1149
-
1150
- <div class="frame-calendar__months">
1151
- @for (month of months(); track month.key) {
1152
- <section class="frame-calendar__month" [attr.aria-label]="month.label">
1153
- @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1154
- <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1155
- }
1156
-
1157
- <table class="frame-calendar__table">
1158
- <thead>
1159
- <tr>
1160
- @if (showWeekNumber()) {
1161
- <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1162
- }
1163
- @for (weekday of weekdayLabels(); track weekday) {
1164
- <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1165
- }
1166
- </tr>
1167
- </thead>
1168
- <tbody>
1169
- @for (week of month.weeks; track week[0].key) {
1170
- <tr>
1171
- @if (showWeekNumber()) {
1172
- <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1173
- }
1174
- @for (day of week; track day.key) {
1175
- <td
1176
- class="frame-calendar__cell"
1177
- [attr.data-outside]="day.outside ? '' : null"
1178
- [attr.data-selected]="day.selected ? '' : null"
1179
- [attr.data-range-start]="day.rangeStart ? '' : null"
1180
- [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1181
- [attr.data-range-end]="day.rangeEnd ? '' : null"
1182
- [attr.data-today]="day.today ? '' : null"
1183
- [attr.data-disabled-date]="day.disabledDate ? '' : null"
1184
- >
1185
- <button
1186
- class="frame-calendar__day"
1187
- type="button"
1188
- [disabled]="isDisabled() || day.disabled"
1189
- [attr.aria-label]="dayLabel(day.date)"
1190
- [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1191
- (click)="selectDay(day)"
1192
- >
1193
- @if (cellTemplate(); as template) {
1194
- <ng-container
1195
- [ngTemplateOutlet]="template"
1196
- [ngTemplateOutletContext]="day"
1197
- />
1198
- } @else {
1199
- <span class="frame-calendar__day-number">{{ day.day }}</span>
1200
- @if (day.dateLabel) {
1201
- <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1202
- }
1203
- }
1204
- </button>
1205
- </td>
1206
- }
1207
- </tr>
1208
- }
1209
- </tbody>
1210
- </table>
1211
- </section>
1212
- }
1213
- </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>
1214
1320
  `,
1215
1321
  }]
1216
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"] }] } });
@@ -2918,7 +3024,7 @@ class FrCommandService {
2918
3024
  withDefaultClasses(config) {
2919
3025
  return {
2920
3026
  ariaModal: true,
2921
- autoFocus: 'first-tabbable',
3027
+ autoFocus: '[frCommandInput]',
2922
3028
  restoreFocus: true,
2923
3029
  width: 'min(calc(100vw - 2rem), 48rem)',
2924
3030
  maxWidth: 'calc(100vw - 2rem)',
@@ -3953,6 +4059,7 @@ class FrDatePicker extends FrControlValueAccessor$1 {
3953
4059
  valueChange = output();
3954
4060
  openChange = output();
3955
4061
  monthChange = output();
4062
+ calendar = viewChild(FrCalendar$1, ...(ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []));
3956
4063
  positions = POSITIONS;
3957
4064
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3958
4065
  overlaySide = signal('bottom', ...(ngDevMode ? [{ debugName: "overlaySide" }] : /* istanbul ignore next */ []));
@@ -4053,6 +4160,9 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4053
4160
  handlePositionChange(event) {
4054
4161
  this.overlaySide.set(event.connectionPair.overlayY === 'bottom' ? 'top' : 'bottom');
4055
4162
  }
4163
+ focusCalendar() {
4164
+ this.calendar()?.focusActiveDate();
4165
+ }
4056
4166
  overlayPanelClasses() {
4057
4167
  return ['frame-date-picker-overlay', `frame-date-picker-overlay--${this.overlaySide()}`];
4058
4168
  }
@@ -4068,118 +4178,119 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4068
4178
  this.markAsTouched();
4069
4179
  }
4070
4180
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDatePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
4071
- 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: `
4072
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4073
- @if (editable()) {
4074
- <span class="frame-date-picker__input-wrap">
4075
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4076
- <input
4077
- class="frame-date-picker__input"
4078
- type="text"
4079
- [disabled]="disabled()"
4080
- [readOnly]="readonlyInput()"
4081
- [placeholder]="placeholder()"
4082
- [value]="inputValue()"
4083
- [attr.aria-expanded]="isOpen()"
4084
- [attr.aria-invalid]="invalid() ? 'true' : null"
4085
- aria-haspopup="dialog"
4086
- (focus)="open()"
4087
- (click)="open()"
4088
- (input)="handleInput($any($event.target).value)"
4089
- (change)="commitInput($any($event.target).value)"
4090
- (keydown)="handleTriggerKeydown($event)"
4091
- (blur)="markAsTouched()"
4092
- />
4093
- </span>
4094
- } @else {
4095
- <button
4096
- class="frame-date-picker__trigger"
4097
- type="button"
4098
- [disabled]="disabled()"
4099
- [attr.aria-expanded]="isOpen()"
4100
- [attr.aria-invalid]="invalid() ? 'true' : null"
4101
- aria-haspopup="dialog"
4102
- (click)="toggle()"
4103
- (keydown)="handleTriggerKeydown($event)"
4104
- >
4105
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4106
- <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4107
- {{ displayValue() || placeholder() }}
4108
- </span>
4109
- </button>
4110
- }
4111
- </span>
4112
-
4113
- <ng-template
4114
- cdkConnectedOverlay
4115
- [cdkConnectedOverlayOrigin]="origin"
4116
- [cdkConnectedOverlayOpen]="isOpen()"
4117
- [cdkConnectedOverlayPositions]="positions"
4118
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4119
- [cdkConnectedOverlayPush]="true"
4120
- [cdkConnectedOverlayViewportMargin]="12"
4121
- (overlayOutsideClick)="close()"
4122
- (detach)="close()"
4123
- (positionChange)="handlePositionChange($event)"
4124
- >
4125
- <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4126
- @if (presets().length) {
4127
- <div class="frame-date-picker__presets" aria-label="Date presets">
4128
- @for (preset of presets(); track preset.label) {
4129
- <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4130
- {{ preset.label }}
4131
- </button>
4132
- }
4133
- </div>
4134
- }
4135
-
4136
- <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4137
-
4138
- <frame-calendar
4139
- [mode]="mode()"
4140
- [captionLayout]="captionLayout()"
4141
- [numberOfMonths]="numberOfMonths()"
4142
- [firstDayOfWeek]="firstDayOfWeek()"
4143
- [locale]="locale()"
4144
- [timeZone]="timeZone()"
4145
- [dir]="dir()"
4146
- [fromYear]="fromYear()"
4147
- [toYear]="toYear()"
4148
- [showOutsideDays]="showOutsideDays()"
4149
- [showWeekNumber]="showWeekNumber()"
4150
- [disabled]="disabled()"
4151
- [disabledDates]="disabledDates()"
4152
- [dateLabels]="dateLabels()"
4153
- [disabledMatcher]="disabledMatcher()"
4154
- [cellTemplate]="cellTemplate()"
4155
- [previousMonthTemplate]="previousMonthTemplate()"
4156
- [nextMonthTemplate]="nextMonthTemplate()"
4157
- [previousMonthIcon]="previousMonthIcon()"
4158
- [nextMonthIcon]="nextMonthIcon()"
4159
- [previousMonthLabel]="previousMonthLabel()"
4160
- [nextMonthLabel]="nextMonthLabel()"
4161
- [month]="month()"
4162
- [selected]="calendarValue()"
4163
- (selectedChange)="selectCalendarValue($any($event))"
4164
- (monthChange)="monthChange.emit($event)"
4165
- />
4166
-
4167
- @if (showTime() && mode() === 'single') {
4168
- <label class="frame-date-picker__time">
4169
- <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4170
- <input
4171
- class="frame-date-picker__time-input"
4172
- type="time"
4173
- [disabled]="disabled() || !singleDate()"
4174
- [value]="timeValue()"
4175
- (change)="setTime($any($event.target).value)"
4176
- />
4177
- </label>
4178
- }
4179
-
4180
- <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4181
- </div>
4182
- </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>
4183
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 });
4184
4295
  }
4185
4296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDatePicker, decorators: [{
@@ -4198,121 +4309,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4198
4309
  '[attr.data-mode]': 'mode()',
4199
4310
  '[attr.dir]': 'dir()',
4200
4311
  },
4201
- template: `
4202
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4203
- @if (editable()) {
4204
- <span class="frame-date-picker__input-wrap">
4205
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4206
- <input
4207
- class="frame-date-picker__input"
4208
- type="text"
4209
- [disabled]="disabled()"
4210
- [readOnly]="readonlyInput()"
4211
- [placeholder]="placeholder()"
4212
- [value]="inputValue()"
4213
- [attr.aria-expanded]="isOpen()"
4214
- [attr.aria-invalid]="invalid() ? 'true' : null"
4215
- aria-haspopup="dialog"
4216
- (focus)="open()"
4217
- (click)="open()"
4218
- (input)="handleInput($any($event.target).value)"
4219
- (change)="commitInput($any($event.target).value)"
4220
- (keydown)="handleTriggerKeydown($event)"
4221
- (blur)="markAsTouched()"
4222
- />
4223
- </span>
4224
- } @else {
4225
- <button
4226
- class="frame-date-picker__trigger"
4227
- type="button"
4228
- [disabled]="disabled()"
4229
- [attr.aria-expanded]="isOpen()"
4230
- [attr.aria-invalid]="invalid() ? 'true' : null"
4231
- aria-haspopup="dialog"
4232
- (click)="toggle()"
4233
- (keydown)="handleTriggerKeydown($event)"
4234
- >
4235
- <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4236
- <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4237
- {{ displayValue() || placeholder() }}
4238
- </span>
4239
- </button>
4240
- }
4241
- </span>
4242
-
4243
- <ng-template
4244
- cdkConnectedOverlay
4245
- [cdkConnectedOverlayOrigin]="origin"
4246
- [cdkConnectedOverlayOpen]="isOpen()"
4247
- [cdkConnectedOverlayPositions]="positions"
4248
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4249
- [cdkConnectedOverlayPush]="true"
4250
- [cdkConnectedOverlayViewportMargin]="12"
4251
- (overlayOutsideClick)="close()"
4252
- (detach)="close()"
4253
- (positionChange)="handlePositionChange($event)"
4254
- >
4255
- <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4256
- @if (presets().length) {
4257
- <div class="frame-date-picker__presets" aria-label="Date presets">
4258
- @for (preset of presets(); track preset.label) {
4259
- <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4260
- {{ preset.label }}
4261
- </button>
4262
- }
4263
- </div>
4264
- }
4265
-
4266
- <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4267
-
4268
- <frame-calendar
4269
- [mode]="mode()"
4270
- [captionLayout]="captionLayout()"
4271
- [numberOfMonths]="numberOfMonths()"
4272
- [firstDayOfWeek]="firstDayOfWeek()"
4273
- [locale]="locale()"
4274
- [timeZone]="timeZone()"
4275
- [dir]="dir()"
4276
- [fromYear]="fromYear()"
4277
- [toYear]="toYear()"
4278
- [showOutsideDays]="showOutsideDays()"
4279
- [showWeekNumber]="showWeekNumber()"
4280
- [disabled]="disabled()"
4281
- [disabledDates]="disabledDates()"
4282
- [dateLabels]="dateLabels()"
4283
- [disabledMatcher]="disabledMatcher()"
4284
- [cellTemplate]="cellTemplate()"
4285
- [previousMonthTemplate]="previousMonthTemplate()"
4286
- [nextMonthTemplate]="nextMonthTemplate()"
4287
- [previousMonthIcon]="previousMonthIcon()"
4288
- [nextMonthIcon]="nextMonthIcon()"
4289
- [previousMonthLabel]="previousMonthLabel()"
4290
- [nextMonthLabel]="nextMonthLabel()"
4291
- [month]="month()"
4292
- [selected]="calendarValue()"
4293
- (selectedChange)="selectCalendarValue($any($event))"
4294
- (monthChange)="monthChange.emit($event)"
4295
- />
4296
-
4297
- @if (showTime() && mode() === 'single') {
4298
- <label class="frame-date-picker__time">
4299
- <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4300
- <input
4301
- class="frame-date-picker__time-input"
4302
- type="time"
4303
- [disabled]="disabled() || !singleDate()"
4304
- [value]="timeValue()"
4305
- (change)="setTime($any($event.target).value)"
4306
- />
4307
- </label>
4308
- }
4309
-
4310
- <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4311
- </div>
4312
- </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>
4313
4425
  `,
4314
4426
  }]
4315
- }], 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 }] }] } });
4316
4428
  function normalizeValue(value, mode) {
4317
4429
  if (!value) {
4318
4430
  return mode === 'range' ? { from: null, to: null } : null;
@@ -4377,27 +4489,41 @@ function mergeTime(date, timeSource) {
4377
4489
  return next;
4378
4490
  }
4379
4491
 
4492
+ const DEFAULT_SIDE_OFFSET = 4;
4493
+ const MIN_SUBMENU_SIDE_OFFSET = 16;
4380
4494
  function defaultPositions(isSubmenu) {
4381
4495
  return buildConnectedPositions({
4382
4496
  align: 'start',
4383
4497
  alignOffset: 0,
4384
4498
  isSubmenu,
4385
- side: isSubmenu ? 'right' : 'bottom',
4386
- sideOffset: 4,
4499
+ side: 'auto',
4500
+ sideOffset: DEFAULT_SIDE_OFFSET,
4387
4501
  });
4388
4502
  }
4389
4503
  function buildConnectedPositions(options) {
4390
- const placements = primaryPlacement(options);
4391
- 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
+ });
4392
4515
  }
4393
4516
  function primaryPlacement(options) {
4394
- if (options.isSubmenu) {
4395
- const isRight = options.side !== 'left';
4396
- const horizontalOffset = isRight ? options.sideOffset : -options.sideOffset;
4397
- const originY = submenuOriginY(options.align);
4398
- const overlayY = submenuOverlayY(options.align);
4399
- return {
4400
- 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
+ {
4401
4527
  originX: isRight ? 'end' : 'start',
4402
4528
  originY,
4403
4529
  overlayX: isRight ? 'start' : 'end',
@@ -4405,7 +4531,7 @@ function primaryPlacement(options) {
4405
4531
  offsetX: horizontalOffset,
4406
4532
  offsetY: options.alignOffset,
4407
4533
  },
4408
- fallback: {
4534
+ {
4409
4535
  originX: isRight ? 'start' : 'end',
4410
4536
  originY,
4411
4537
  overlayX: isRight ? 'end' : 'start',
@@ -4413,14 +4539,14 @@ function primaryPlacement(options) {
4413
4539
  offsetX: -horizontalOffset,
4414
4540
  offsetY: options.alignOffset,
4415
4541
  },
4416
- };
4542
+ ];
4417
4543
  }
4418
- const isBottom = options.side !== 'top';
4544
+ const isBottom = options.side === 'bottom';
4419
4545
  const verticalOffset = isBottom ? options.sideOffset : -options.sideOffset;
4420
4546
  const originX = rootOriginX(options.align);
4421
4547
  const overlayX = rootOverlayX(options.align);
4422
- return {
4423
- primary: {
4548
+ return [
4549
+ {
4424
4550
  originX,
4425
4551
  originY: isBottom ? 'bottom' : 'top',
4426
4552
  overlayX,
@@ -4428,7 +4554,7 @@ function primaryPlacement(options) {
4428
4554
  offsetX: options.alignOffset,
4429
4555
  offsetY: verticalOffset,
4430
4556
  },
4431
- fallback: {
4557
+ {
4432
4558
  originX,
4433
4559
  originY: isBottom ? 'top' : 'bottom',
4434
4560
  overlayX,
@@ -4436,7 +4562,16 @@ function primaryPlacement(options) {
4436
4562
  offsetX: options.alignOffset,
4437
4563
  offsetY: -verticalOffset,
4438
4564
  },
4439
- };
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'];
4440
4575
  }
4441
4576
  function rootOriginX(align) {
4442
4577
  if (align === 'center') {
@@ -4450,13 +4585,13 @@ function rootOverlayX(align) {
4450
4585
  }
4451
4586
  return align;
4452
4587
  }
4453
- function submenuOriginY(align) {
4588
+ function horizontalOriginY(align) {
4454
4589
  if (align === 'center') {
4455
4590
  return 'center';
4456
4591
  }
4457
4592
  return align === 'end' ? 'bottom' : 'top';
4458
4593
  }
4459
- function submenuOverlayY(align) {
4594
+ function horizontalOverlayY(align) {
4460
4595
  if (align === 'center') {
4461
4596
  return 'center';
4462
4597
  }
@@ -4578,7 +4713,7 @@ class FrDropdownMenuContent {
4578
4713
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
4579
4714
  alignOffset = input(0, ...(ngDevMode ? [{ debugName: "alignOffset" }] : /* istanbul ignore next */ []));
4580
4715
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4581
- side = input('bottom', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4716
+ side = input('auto', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4582
4717
  sideOffset = input(4, ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
4583
4718
  isDebugVisible() {
4584
4719
  return this.debugVisible();
@@ -4939,7 +5074,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4939
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 }] }] } });
4940
5075
 
4941
5076
  const FR_DROPDOWN_MENU_ALIGNMENTS = ['center', 'end', 'start'];
4942
- const FR_DROPDOWN_MENU_SIDES = ['bottom', 'left', 'right', 'top'];
5077
+ const FR_DROPDOWN_MENU_SIDES = ['auto', 'bottom', 'left', 'right', 'top'];
4943
5078
  const FR_DROPDOWN_MENU_TRIGGER_MODES = ['both', 'click', 'hover'];
4944
5079
  const FR_DROPDOWN_MENU_ITEM_VARIANTS = ['default', 'destructive'];
4945
5080
 
@@ -5740,6 +5875,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5740
5875
  }] });
5741
5876
 
5742
5877
  const FR_INPUT_GROUP_ADDON_ALIGNS = ['inline-start', 'inline-end'];
5878
+ const FR_INPUT_GROUP_ADDON_VARIANTS = ['default', 'ghost'];
5743
5879
  class FrInputGroup {
5744
5880
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5745
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 });
@@ -5755,8 +5891,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5755
5891
  }] });
5756
5892
  class FrInputGroupAddon {
5757
5893
  align = input('inline-start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
5894
+ variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5758
5895
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupAddon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5759
- 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 });
5760
5897
  }
5761
5898
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupAddon, decorators: [{
5762
5899
  type: Directive,
@@ -5765,9 +5902,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5765
5902
  host: {
5766
5903
  class: 'frame-input-group__addon',
5767
5904
  '[attr.data-align]': 'align()',
5905
+ '[attr.data-variant]': 'variant()',
5768
5906
  },
5769
5907
  }]
5770
- }], 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 }] }] } });
5771
5909
  class FrInputGroupText {
5772
5910
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupText, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5773
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 });
@@ -8530,6 +8668,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8530
8668
  }]
8531
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 }] }] } });
8532
8670
 
8671
+ const FR_SELECT_ICON_POSITIONS = ['leading', 'trailing'];
8533
8672
  class FrSelectValue {
8534
8673
  select = inject(FrSelect);
8535
8674
  placeholder = input('Select an option', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -8564,8 +8703,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8564
8703
  }]
8565
8704
  }] });
8566
8705
  class FrSelectIcon {
8706
+ position = input('trailing', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
8567
8707
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8568
- 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 });
8569
8709
  }
8570
8710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, decorators: [{
8571
8711
  type: Directive,
@@ -8574,9 +8714,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8574
8714
  host: {
8575
8715
  class: 'frame-select__icon',
8576
8716
  'aria-hidden': 'true',
8717
+ '[attr.data-position]': 'position()',
8577
8718
  },
8578
8719
  }]
8579
- }] });
8720
+ }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
8580
8721
  class FrSelectError {
8581
8722
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8582
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 });
@@ -9431,6 +9572,13 @@ function coerceMenuButtonSize(value) {
9431
9572
  function coerceMenuButtonVariant(value) {
9432
9573
  return value === 'outline' ? 'outline' : 'default';
9433
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
+ }
9434
9582
  class FrSidebarProvider {
9435
9583
  document = inject(DOCUMENT);
9436
9584
  elementRef = inject(ElementRef);
@@ -9538,8 +9686,10 @@ class FrSidebar {
9538
9686
  side = input('left', { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), transform: coerceSide });
9539
9687
  variant = input('sidebar', { ...(ngDevMode ? { debugName: "variant" } : /* istanbul ignore next */ {}), transform: coerceVariant });
9540
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 });
9541
9691
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9542
- 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 });
9543
9693
  }
9544
9694
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, decorators: [{
9545
9695
  type: Directive,
@@ -9554,7 +9704,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9554
9704
  '[attr.data-mobile-open]': 'provider?.openMobile() ?? false',
9555
9705
  },
9556
9706
  }]
9557
- }], 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 }] }] } });
9558
9708
  class FrSidebarTrigger {
9559
9709
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9560
9710
  ariaLabel = input('Toggle sidebar', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9586,6 +9736,8 @@ class FrSidebarRail {
9586
9736
  suppressClick = false;
9587
9737
  frameId = -1;
9588
9738
  pendingWidth = 0;
9739
+ resizeMinSize = 192;
9740
+ resizeMaxSize = 384;
9589
9741
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9590
9742
  toggle() {
9591
9743
  if (this.suppressClick) {
@@ -9601,6 +9753,7 @@ class FrSidebarRail {
9601
9753
  this.startWidth = this.sidebar.elementRef.nativeElement.getBoundingClientRect().width;
9602
9754
  this.dragging = false;
9603
9755
  this.pendingWidth = this.startWidth;
9756
+ this.captureResizeBounds();
9604
9757
  this.provider.setResizing(true);
9605
9758
  event.preventDefault();
9606
9759
  const move = (moveEvent) => this.resize(moveEvent);
@@ -9612,6 +9765,8 @@ class FrSidebarRail {
9612
9765
  this.suppressClick = this.dragging;
9613
9766
  this.dragging = false;
9614
9767
  this.pendingWidth = 0;
9768
+ this.resizeMinSize = 192;
9769
+ this.resizeMaxSize = 384;
9615
9770
  setTimeout(() => {
9616
9771
  this.suppressClick = false;
9617
9772
  });
@@ -9625,7 +9780,7 @@ class FrSidebarRail {
9625
9780
  }
9626
9781
  const delta = event.clientX - this.startX;
9627
9782
  const direction = this.sidebar.side() === 'right' ? -1 : 1;
9628
- const nextWidth = Math.min(Math.max(this.startWidth + delta * direction, 192), 384);
9783
+ const nextWidth = this.clampWidth(this.startWidth + delta * direction);
9629
9784
  if (Math.abs(delta) > 3) {
9630
9785
  this.dragging = true;
9631
9786
  }
@@ -9647,6 +9802,35 @@ class FrSidebarRail {
9647
9802
  this.provider?.setSidebarWidth(this.pendingWidth);
9648
9803
  }
9649
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
+ }
9650
9834
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarRail, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9651
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 });
9652
9836
  }
@@ -10304,5 +10488,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10304
10488
  * Generated bundle index. Do not edit.
10305
10489
  */
10306
10490
 
10307
- 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, 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 };
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 };
10308
10492
  //# sourceMappingURL=frame-ui-ng-components.mjs.map