@frame-ui-ng/components 0.2.0-beta.0 → 0.4.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 (71) hide show
  1. package/button/src/styles/button.css +20 -4
  2. package/button-group/src/styles/button-group.css +6 -0
  3. package/dropdown-menu/src/styles/_vars.css +1 -1
  4. package/dropdown-menu/src/styles/dropdown-menu-item.css +87 -87
  5. package/fesm2022/frame-ui-ng-components-calendar.mjs +369 -263
  6. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  7. package/fesm2022/frame-ui-ng-components-combobox.mjs +48 -51
  8. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  9. package/fesm2022/frame-ui-ng-components-command.mjs +1 -1
  10. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  11. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +162 -0
  12. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
  13. package/fesm2022/frame-ui-ng-components-date-picker.mjs +232 -226
  14. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  15. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +45 -22
  16. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  17. package/fesm2022/frame-ui-ng-components-input-otp.mjs +64 -69
  18. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  19. package/fesm2022/frame-ui-ng-components-input.mjs +6 -3
  20. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  21. package/fesm2022/frame-ui-ng-components-modal.mjs +93 -15
  22. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  23. package/fesm2022/frame-ui-ng-components-pagination.mjs +37 -36
  24. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  25. package/fesm2022/frame-ui-ng-components-progress.mjs +2 -1
  26. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  27. package/fesm2022/frame-ui-ng-components-resizable.mjs +16 -26
  28. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  29. package/fesm2022/frame-ui-ng-components-select.mjs +6 -3
  30. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  31. package/fesm2022/frame-ui-ng-components-sheet.mjs +19 -16
  32. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  33. package/fesm2022/frame-ui-ng-components-sidebar.mjs +59 -10
  34. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  35. package/fesm2022/frame-ui-ng-components-slider.mjs +53 -59
  36. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  37. package/fesm2022/frame-ui-ng-components-tooltip.mjs +307 -254
  38. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  39. package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
  40. package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
  41. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +10 -12
  42. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  43. package/fesm2022/frame-ui-ng-components.mjs +1047 -806
  44. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  45. package/input/src/styles/input-group.css +50 -0
  46. package/item/src/styles/item.css +188 -187
  47. package/modal/src/styles/modal.css +10 -1
  48. package/package.json +10 -2
  49. package/select/src/styles/select-trigger.css +7 -36
  50. package/sidebar/src/styles/sidebar.css +10 -4
  51. package/src/styles/blueprint.css +102 -11
  52. package/src/styles/components.css +4 -4
  53. package/styles/blueprint.css +102 -11
  54. package/styles/components.css +4 -4
  55. package/styles.css +4 -4
  56. package/tooltip/src/styles/tooltip.css +7 -13
  57. package/types/frame-ui-ng-components-calendar.d.ts +14 -0
  58. package/types/frame-ui-ng-components-combobox.d.ts +1 -1
  59. package/types/frame-ui-ng-components-confirm-modal.d.ts +48 -0
  60. package/types/frame-ui-ng-components-context-menu.d.ts +2 -2
  61. package/types/frame-ui-ng-components-date-picker.d.ts +3 -1
  62. package/types/frame-ui-ng-components-dropdown-menu.d.ts +3 -3
  63. package/types/frame-ui-ng-components-input-otp.d.ts +1 -1
  64. package/types/frame-ui-ng-components-input.d.ts +6 -3
  65. package/types/frame-ui-ng-components-modal.d.ts +18 -7
  66. package/types/frame-ui-ng-components-select.d.ts +6 -3
  67. package/types/frame-ui-ng-components-sheet.d.ts +2 -0
  68. package/types/frame-ui-ng-components-sidebar.d.ts +8 -1
  69. package/types/frame-ui-ng-components-tooltip.d.ts +48 -73
  70. package/types/frame-ui-ng-components-utils.d.ts +5 -0
  71. package/types/frame-ui-ng-components.d.ts +87 -45
@@ -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, viewChild, model, afterNextRender, ViewContainerRef, Injectable, Injector, numberAttribute } 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';
@@ -8,7 +8,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
8
  import { fromEvent } from 'rxjs';
9
9
  import * as i1$1 from '@frame-ui-ng/components/button';
10
10
  import { FrButton as FrButton$1, FrButtonLabel as FrButtonLabel$1 } from '@frame-ui-ng/components/button';
11
- import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
11
+ import { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
12
12
  import { FrControlValueAccessor as FrControlValueAccessor$1, provideDsValueAccessor as provideDsValueAccessor$1 } from '@frame-ui-ng/components/forms';
13
13
  import { Dialog, DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';
14
14
  import * as i1$2 from '@angular/cdk/menu';
@@ -17,6 +17,7 @@ import * as i1$3 from '@frame-ui-ng/components/dropdown-menu';
17
17
  import { buildConnectedPositions as buildConnectedPositions$1, FR_DROPDOWN_MENU_CONTENT as FR_DROPDOWN_MENU_CONTENT$1, FrDropdownMenuTree as FrDropdownMenuTree$1, FR_DROPDOWN_MENU_PARENT as FR_DROPDOWN_MENU_PARENT$1, defaultPositions as defaultPositions$1, FrDropdownMenuTrigger as FrDropdownMenuTrigger$1, FrDropdownMenuContent as FrDropdownMenuContent$1, FrDropdownMenuPanel as FrDropdownMenuPanel$1, FrDropdownMenuItem as FrDropdownMenuItem$1, FrDropdownMenuCheckboxItem as FrDropdownMenuCheckboxItem$1, FrDropdownMenuRadioGroup as FrDropdownMenuRadioGroup$1, FrDropdownMenuRadioItem as FrDropdownMenuRadioItem$1, FrDropdownMenuLabel as FrDropdownMenuLabel$1, FrDropdownMenuSeparator as FrDropdownMenuSeparator$1, FrDropdownMenuShortcut as FrDropdownMenuShortcut$1, FrDropdownMenuItemIndicator as FrDropdownMenuItemIndicator$1, FrDropdownMenuSub as FrDropdownMenuSub$1, FrDropdownMenuSubTrigger as FrDropdownMenuSubTrigger$1, FrDropdownMenu as FrDropdownMenu$1 } from '@frame-ui-ng/components/dropdown-menu';
18
18
  import { FrCalendar as FrCalendar$1 } from '@frame-ui-ng/components/calendar';
19
19
  import { FrInput as FrInput$1 } from '@frame-ui-ng/components/input';
20
+ import { clampNumber, coerceNumber } from '@frame-ui-ng/components/utils';
20
21
 
21
22
  const ACCORDION_ROOT = new InjectionToken('FrAccordion');
22
23
  const ACCORDION_ITEM = new InjectionToken('FrAccordionItem');
@@ -812,9 +813,11 @@ class FrCalendar {
812
813
  selected = input(undefined, ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
813
814
  selectedChange = output();
814
815
  monthChange = output();
816
+ focusedDate = signal(null, ...(ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []));
815
817
  navigatedMonth = signal(null, ...(ngDevMode ? [{ debugName: "navigatedMonth" }] : /* istanbul ignore next */ []));
816
818
  internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
817
819
  cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
820
+ host = inject((ElementRef));
818
821
  currentMonth = computed(() => startOfMonth(this.navigatedMonth() ?? this.month() ?? new Date()), ...(ngDevMode ? [{ debugName: "currentMonth" }] : /* istanbul ignore next */ []));
819
822
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
820
823
  value = computed(() => {
@@ -831,6 +834,7 @@ class FrCalendar {
831
834
  })), ...(ngDevMode ? [{ debugName: "monthOptions" }] : /* istanbul ignore next */ []));
832
835
  yearOptions = computed(() => Array.from({ length: Math.max(0, this.toYear() - this.fromYear() + 1) }, (_, index) => this.fromYear() + index), ...(ngDevMode ? [{ debugName: "yearOptions" }] : /* istanbul ignore next */ []));
833
836
  months = computed(() => Array.from({ length: Math.max(1, this.numberOfMonths()) }, (_, index) => this.buildMonth(addMonths(this.currentMonth(), index))), ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
837
+ activeDate = computed(() => this.resolveActiveDate(), ...(ngDevMode ? [{ debugName: "activeDate" }] : /* istanbul ignore next */ []));
834
838
  onTouched = () => undefined;
835
839
  onChange = () => undefined;
836
840
  writeValue(value) {
@@ -875,6 +879,25 @@ class FrCalendar {
875
879
  this.onChange(nextValue);
876
880
  this.selectedChange.emit(nextValue);
877
881
  }
882
+ handleDayKeydown(event, day) {
883
+ const offset = this.navigationOffset(event.key);
884
+ if (offset === null || this.isDisabled()) {
885
+ return;
886
+ }
887
+ event.preventDefault();
888
+ const next = addDays(day.date, offset);
889
+ this.focusedDate.set(next);
890
+ if (!this.isDateVisible(next)) {
891
+ this.updateMonth(startOfMonth(next));
892
+ }
893
+ this.focusDay(next);
894
+ }
895
+ dayTabIndex(day) {
896
+ return sameDate(day.date, this.activeDate()) ? 0 : -1;
897
+ }
898
+ focusActiveDate() {
899
+ this.focusDay(this.activeDate());
900
+ }
878
901
  monthLabel(date) {
879
902
  return new Intl.DateTimeFormat(this.locale(), {
880
903
  month: 'long',
@@ -891,6 +914,78 @@ class FrCalendar {
891
914
  weekNumber(date) {
892
915
  return isoWeekNumber(date).toString().padStart(2, '0');
893
916
  }
917
+ navigationOffset(key) {
918
+ switch (key) {
919
+ case 'ArrowLeft':
920
+ return this.dir() === 'rtl' ? 1 : -1;
921
+ case 'ArrowRight':
922
+ return this.dir() === 'rtl' ? -1 : 1;
923
+ case 'ArrowUp':
924
+ return -7;
925
+ case 'ArrowDown':
926
+ return 7;
927
+ default:
928
+ return null;
929
+ }
930
+ }
931
+ resolveActiveDate() {
932
+ const focused = this.focusedDate();
933
+ if (focused && this.findDay(focused) && !this.isDayDisabled(focused)) {
934
+ return cloneDate(focused);
935
+ }
936
+ const selected = this.selectedDate();
937
+ if (selected && this.findDay(selected) && !this.isDayDisabled(selected)) {
938
+ return cloneDate(selected);
939
+ }
940
+ const today = new Date();
941
+ if (this.findDay(today) && !this.isDayDisabled(today)) {
942
+ return cloneDate(today);
943
+ }
944
+ const firstEnabled = this.months()
945
+ .flatMap((month) => month.weeks.flat())
946
+ .find((day) => !day.disabled);
947
+ return firstEnabled ? cloneDate(firstEnabled.date) : cloneDate(this.currentMonth());
948
+ }
949
+ selectedDate() {
950
+ const value = this.value();
951
+ if (value instanceof Date) {
952
+ return value;
953
+ }
954
+ if (isRange$1(value)) {
955
+ return value.from ?? value.to;
956
+ }
957
+ return null;
958
+ }
959
+ isDateVisible(date) {
960
+ return this.months().some((month) => month.weeks.some((week) => week.some((day) => sameDate(day.date, date))));
961
+ }
962
+ findDay(date) {
963
+ for (const month of this.months()) {
964
+ for (const week of month.weeks) {
965
+ const day = week.find((item) => sameDate(item.date, date));
966
+ if (day) {
967
+ return day;
968
+ }
969
+ }
970
+ }
971
+ return null;
972
+ }
973
+ isDayDisabled(date) {
974
+ return this.findDay(date)?.disabled ?? true;
975
+ }
976
+ focusDay(date) {
977
+ if (this.focusDayElement(date)) {
978
+ return;
979
+ }
980
+ setTimeout(() => {
981
+ this.focusDayElement(date);
982
+ });
983
+ }
984
+ focusDayElement(date) {
985
+ const button = this.host.nativeElement.querySelector(`.frame-calendar__day[data-date="${dateKey(date)}"]`);
986
+ button?.focus();
987
+ return !!button;
988
+ }
894
989
  updateMonth(month) {
895
990
  const next = startOfMonth(month);
896
991
  this.navigatedMonth.set(next);
@@ -933,137 +1028,143 @@ class FrCalendar {
933
1028
  };
934
1029
  }
935
1030
  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>
1031
+ 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: `
1032
+ <div class="frame-calendar__header">
1033
+ <button
1034
+ class="frame-calendar__nav-button"
1035
+ type="button"
1036
+ [disabled]="isDisabled()"
1037
+ (click)="previousMonth()"
1038
+ [attr.aria-label]="previousMonthLabel()"
1039
+ >
1040
+ @if (previousMonthTemplate(); as template) {
1041
+ <ng-container [ngTemplateOutlet]="template" />
1042
+ } @else {
1043
+ {{ previousMonthIcon() }}
1044
+ }
1045
+ </button>
1046
+
1047
+ @if (captionLayout() === 'dropdown') {
1048
+ <div class="frame-calendar__caption-controls">
1049
+ <select
1050
+ class="frame-calendar__select"
1051
+ [disabled]="isDisabled()"
1052
+ [value]="currentMonth().getMonth()"
1053
+ aria-label="Month"
1054
+ (change)="setMonth($any($event.target).value)"
1055
+ >
1056
+ @for (month of monthOptions(); track month.value) {
1057
+ <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1058
+ {{ month.label }}
1059
+ </option>
1060
+ }
1061
+ </select>
1062
+
1063
+ <select
1064
+ class="frame-calendar__select"
1065
+ [disabled]="isDisabled()"
1066
+ [value]="currentMonth().getFullYear()"
1067
+ aria-label="Year"
1068
+ (change)="setYear($any($event.target).value)"
1069
+ >
1070
+ @for (year of yearOptions(); track year) {
1071
+ <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1072
+ {{ year }}
1073
+ </option>
1074
+ }
1075
+ </select>
1076
+ </div>
1077
+ } @else {
1078
+ <div class="frame-calendar__caption" aria-live="polite">
1079
+ {{ monthLabel(currentMonth()) }}
1080
+ </div>
1081
+ }
1082
+
1083
+ <button
1084
+ class="frame-calendar__nav-button"
1085
+ type="button"
1086
+ [disabled]="isDisabled()"
1087
+ (click)="nextMonth()"
1088
+ [attr.aria-label]="nextMonthLabel()"
1089
+ >
1090
+ @if (nextMonthTemplate(); as template) {
1091
+ <ng-container [ngTemplateOutlet]="template" />
1092
+ } @else {
1093
+ {{ nextMonthIcon() }}
1094
+ }
1095
+ </button>
1096
+ </div>
1097
+
1098
+ <div class="frame-calendar__months">
1099
+ @for (month of months(); track month.key) {
1100
+ <section class="frame-calendar__month" [attr.aria-label]="month.label">
1101
+ @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1102
+ <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1103
+ }
1104
+
1105
+ <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
1106
+ <thead>
1107
+ <tr>
1108
+ @if (showWeekNumber()) {
1109
+ <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1110
+ }
1111
+ @for (weekday of weekdayLabels(); track weekday) {
1112
+ <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1113
+ }
1114
+ </tr>
1115
+ </thead>
1116
+ <tbody>
1117
+ @for (week of month.weeks; track week[0].key) {
1118
+ <tr>
1119
+ @if (showWeekNumber()) {
1120
+ <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1121
+ }
1122
+ @for (day of week; track day.key) {
1123
+ <td
1124
+ class="frame-calendar__cell"
1125
+ [attr.data-outside]="day.outside ? '' : null"
1126
+ [attr.data-selected]="day.selected ? '' : null"
1127
+ [attr.data-range-start]="day.rangeStart ? '' : null"
1128
+ [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1129
+ [attr.data-range-end]="day.rangeEnd ? '' : null"
1130
+ [attr.data-today]="day.today ? '' : null"
1131
+ [attr.data-disabled-date]="day.disabledDate ? '' : null"
1132
+ >
1133
+ <button
1134
+ class="frame-calendar__day"
1135
+ type="button"
1136
+ [disabled]="isDisabled() || day.disabled"
1137
+ [attr.data-date]="day.key"
1138
+ [attr.tabindex]="dayTabIndex(day)"
1139
+ [attr.aria-label]="dayLabel(day.date)"
1140
+ [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1141
+ [attr.aria-selected]="day.selected ? 'true' : 'false'"
1142
+ [attr.aria-current]="day.today ? 'date' : null"
1143
+ (click)="selectDay(day)"
1144
+ (focus)="focusedDate.set(day.date)"
1145
+ (keydown)="handleDayKeydown($event, day)"
1146
+ >
1147
+ @if (cellTemplate(); as template) {
1148
+ <ng-container
1149
+ [ngTemplateOutlet]="template"
1150
+ [ngTemplateOutletContext]="day"
1151
+ />
1152
+ } @else {
1153
+ <span class="frame-calendar__day-number">{{ day.day }}</span>
1154
+ @if (day.dateLabel) {
1155
+ <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1156
+ }
1157
+ }
1158
+ </button>
1159
+ </td>
1160
+ }
1161
+ </tr>
1162
+ }
1163
+ </tbody>
1164
+ </table>
1165
+ </section>
1166
+ }
1167
+ </div>
1067
1168
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1068
1169
  }
1069
1170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCalendar, decorators: [{
@@ -1080,137 +1181,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1080
1181
  '[attr.data-disabled]': 'isDisabled() ? "" : null',
1081
1182
  '[attr.dir]': 'dir()',
1082
1183
  },
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>
1184
+ template: `
1185
+ <div class="frame-calendar__header">
1186
+ <button
1187
+ class="frame-calendar__nav-button"
1188
+ type="button"
1189
+ [disabled]="isDisabled()"
1190
+ (click)="previousMonth()"
1191
+ [attr.aria-label]="previousMonthLabel()"
1192
+ >
1193
+ @if (previousMonthTemplate(); as template) {
1194
+ <ng-container [ngTemplateOutlet]="template" />
1195
+ } @else {
1196
+ {{ previousMonthIcon() }}
1197
+ }
1198
+ </button>
1199
+
1200
+ @if (captionLayout() === 'dropdown') {
1201
+ <div class="frame-calendar__caption-controls">
1202
+ <select
1203
+ class="frame-calendar__select"
1204
+ [disabled]="isDisabled()"
1205
+ [value]="currentMonth().getMonth()"
1206
+ aria-label="Month"
1207
+ (change)="setMonth($any($event.target).value)"
1208
+ >
1209
+ @for (month of monthOptions(); track month.value) {
1210
+ <option [value]="month.value" [selected]="month.value === currentMonth().getMonth()">
1211
+ {{ month.label }}
1212
+ </option>
1213
+ }
1214
+ </select>
1215
+
1216
+ <select
1217
+ class="frame-calendar__select"
1218
+ [disabled]="isDisabled()"
1219
+ [value]="currentMonth().getFullYear()"
1220
+ aria-label="Year"
1221
+ (change)="setYear($any($event.target).value)"
1222
+ >
1223
+ @for (year of yearOptions(); track year) {
1224
+ <option [value]="year" [selected]="year === currentMonth().getFullYear()">
1225
+ {{ year }}
1226
+ </option>
1227
+ }
1228
+ </select>
1229
+ </div>
1230
+ } @else {
1231
+ <div class="frame-calendar__caption" aria-live="polite">
1232
+ {{ monthLabel(currentMonth()) }}
1233
+ </div>
1234
+ }
1235
+
1236
+ <button
1237
+ class="frame-calendar__nav-button"
1238
+ type="button"
1239
+ [disabled]="isDisabled()"
1240
+ (click)="nextMonth()"
1241
+ [attr.aria-label]="nextMonthLabel()"
1242
+ >
1243
+ @if (nextMonthTemplate(); as template) {
1244
+ <ng-container [ngTemplateOutlet]="template" />
1245
+ } @else {
1246
+ {{ nextMonthIcon() }}
1247
+ }
1248
+ </button>
1249
+ </div>
1250
+
1251
+ <div class="frame-calendar__months">
1252
+ @for (month of months(); track month.key) {
1253
+ <section class="frame-calendar__month" [attr.aria-label]="month.label">
1254
+ @if (numberOfMonths() > 1 || captionLayout() === 'dropdown') {
1255
+ <h3 class="frame-calendar__month-caption">{{ month.label }}</h3>
1256
+ }
1257
+
1258
+ <table class="frame-calendar__table" role="grid" [attr.aria-readonly]="true">
1259
+ <thead>
1260
+ <tr>
1261
+ @if (showWeekNumber()) {
1262
+ <th class="frame-calendar__week-number-header" scope="col">Wk</th>
1263
+ }
1264
+ @for (weekday of weekdayLabels(); track weekday) {
1265
+ <th class="frame-calendar__weekday" scope="col">{{ weekday }}</th>
1266
+ }
1267
+ </tr>
1268
+ </thead>
1269
+ <tbody>
1270
+ @for (week of month.weeks; track week[0].key) {
1271
+ <tr>
1272
+ @if (showWeekNumber()) {
1273
+ <td class="frame-calendar__week-number">{{ weekNumber(week[0].date) }}</td>
1274
+ }
1275
+ @for (day of week; track day.key) {
1276
+ <td
1277
+ class="frame-calendar__cell"
1278
+ [attr.data-outside]="day.outside ? '' : null"
1279
+ [attr.data-selected]="day.selected ? '' : null"
1280
+ [attr.data-range-start]="day.rangeStart ? '' : null"
1281
+ [attr.data-range-middle]="day.rangeMiddle ? '' : null"
1282
+ [attr.data-range-end]="day.rangeEnd ? '' : null"
1283
+ [attr.data-today]="day.today ? '' : null"
1284
+ [attr.data-disabled-date]="day.disabledDate ? '' : null"
1285
+ >
1286
+ <button
1287
+ class="frame-calendar__day"
1288
+ type="button"
1289
+ [disabled]="isDisabled() || day.disabled"
1290
+ [attr.data-date]="day.key"
1291
+ [attr.tabindex]="dayTabIndex(day)"
1292
+ [attr.aria-label]="dayLabel(day.date)"
1293
+ [attr.aria-pressed]="day.selected ? 'true' : 'false'"
1294
+ [attr.aria-selected]="day.selected ? 'true' : 'false'"
1295
+ [attr.aria-current]="day.today ? 'date' : null"
1296
+ (click)="selectDay(day)"
1297
+ (focus)="focusedDate.set(day.date)"
1298
+ (keydown)="handleDayKeydown($event, day)"
1299
+ >
1300
+ @if (cellTemplate(); as template) {
1301
+ <ng-container
1302
+ [ngTemplateOutlet]="template"
1303
+ [ngTemplateOutletContext]="day"
1304
+ />
1305
+ } @else {
1306
+ <span class="frame-calendar__day-number">{{ day.day }}</span>
1307
+ @if (day.dateLabel) {
1308
+ <span class="frame-calendar__day-meta">{{ day.dateLabel }}</span>
1309
+ }
1310
+ }
1311
+ </button>
1312
+ </td>
1313
+ }
1314
+ </tr>
1315
+ }
1316
+ </tbody>
1317
+ </table>
1318
+ </section>
1319
+ }
1320
+ </div>
1214
1321
  `,
1215
1322
  }]
1216
1323
  }], 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"] }] } });
@@ -2181,7 +2288,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2181
2288
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
2182
2289
  selectedLabels = new Map();
2183
2290
  resizeObserver = null;
2184
- origin;
2291
+ origin = viewChild(CdkOverlayOrigin, ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
2185
2292
  content = contentChild(FrComboboxContent, ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
2186
2293
  autoHighlight = input(false, { ...(ngDevMode ? { debugName: "autoHighlight" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2187
2294
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -2348,7 +2455,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2348
2455
  this.itemsVersion.update((value) => value + 1);
2349
2456
  }
2350
2457
  measureAnchor() {
2351
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2458
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2352
2459
  if (typeof element?.getBoundingClientRect !== 'function') {
2353
2460
  this.anchorWidth.set(null);
2354
2461
  return;
@@ -2359,7 +2466,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2359
2466
  if (typeof ResizeObserver === 'undefined') {
2360
2467
  return;
2361
2468
  }
2362
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2469
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2363
2470
  if (typeof element?.getBoundingClientRect !== 'function') {
2364
2471
  return;
2365
2472
  }
@@ -2373,27 +2480,27 @@ class FrCombobox extends FrControlValueAccessor$1 {
2373
2480
  provide: FrComboboxRootLookup,
2374
2481
  useExisting: FrCombobox,
2375
2482
  },
2376
- ], queries: [{ propertyName: "content", first: true, predicate: FrComboboxContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "origin", first: true, predicate: CdkOverlayOrigin, descendants: true }], exportAs: ["frCombobox"], usesInheritance: true, ngImport: i0, template: `
2377
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2378
- <ng-content />
2379
- </span>
2380
-
2381
- <ng-template
2382
- cdkConnectedOverlay
2383
- [cdkConnectedOverlayOrigin]="origin"
2384
- [cdkConnectedOverlayOpen]="isOpen()"
2385
- [cdkConnectedOverlayPositions]="positions"
2386
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2387
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
2388
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2389
- (overlayOutsideClick)="close()"
2390
- (positionChange)="handlePositionChange($event)"
2391
- (detach)="close()"
2392
- >
2393
- @if (content()) {
2394
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2395
- }
2396
- </ng-template>
2483
+ ], queries: [{ propertyName: "content", first: true, predicate: FrComboboxContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "origin", first: true, predicate: CdkOverlayOrigin, descendants: true, isSignal: true }], exportAs: ["frCombobox"], usesInheritance: true, ngImport: i0, template: `
2484
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2485
+ <ng-content />
2486
+ </span>
2487
+
2488
+ <ng-template
2489
+ cdkConnectedOverlay
2490
+ [cdkConnectedOverlayOrigin]="origin"
2491
+ [cdkConnectedOverlayOpen]="isOpen()"
2492
+ [cdkConnectedOverlayPositions]="positions"
2493
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2494
+ [cdkConnectedOverlayWidth]="overlayMinWidth()"
2495
+ [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2496
+ (overlayOutsideClick)="close()"
2497
+ (positionChange)="handlePositionChange($event)"
2498
+ (detach)="close()"
2499
+ >
2500
+ @if (content()) {
2501
+ <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2502
+ }
2503
+ </ng-template>
2397
2504
  `, 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: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2398
2505
  }
2399
2506
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCombobox, decorators: [{
@@ -2414,33 +2521,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2414
2521
  '[attr.data-disabled]': 'disabled() ? "" : null',
2415
2522
  '[attr.data-invalid]': 'invalid() ? "" : null'
2416
2523
  },
2417
- template: `
2418
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2419
- <ng-content />
2420
- </span>
2421
-
2422
- <ng-template
2423
- cdkConnectedOverlay
2424
- [cdkConnectedOverlayOrigin]="origin"
2425
- [cdkConnectedOverlayOpen]="isOpen()"
2426
- [cdkConnectedOverlayPositions]="positions"
2427
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2428
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
2429
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2430
- (overlayOutsideClick)="close()"
2431
- (positionChange)="handlePositionChange($event)"
2432
- (detach)="close()"
2433
- >
2434
- @if (content()) {
2435
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2436
- }
2437
- </ng-template>
2524
+ template: `
2525
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2526
+ <ng-content />
2527
+ </span>
2528
+
2529
+ <ng-template
2530
+ cdkConnectedOverlay
2531
+ [cdkConnectedOverlayOrigin]="origin"
2532
+ [cdkConnectedOverlayOpen]="isOpen()"
2533
+ [cdkConnectedOverlayPositions]="positions"
2534
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2535
+ [cdkConnectedOverlayWidth]="overlayMinWidth()"
2536
+ [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2537
+ (overlayOutsideClick)="close()"
2538
+ (positionChange)="handlePositionChange($event)"
2539
+ (detach)="close()"
2540
+ >
2541
+ @if (content()) {
2542
+ <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2543
+ }
2544
+ </ng-template>
2438
2545
  `,
2439
2546
  }]
2440
- }], ctorParameters: () => [], propDecorators: { origin: [{
2441
- type: ViewChild,
2442
- args: [CdkOverlayOrigin]
2443
- }], content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrComboboxContent), { isSignal: true }] }], autoHighlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHighlight", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], itemToStringValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemToStringValue", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
2547
+ }], ctorParameters: () => [], propDecorators: { origin: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkOverlayOrigin), { isSignal: true }] }], content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrComboboxContent), { isSignal: true }] }], autoHighlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHighlight", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], itemToStringValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemToStringValue", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
2444
2548
 
2445
2549
  class FrComboboxInput {
2446
2550
  root = inject(FrCombobox);
@@ -2918,7 +3022,7 @@ class FrCommandService {
2918
3022
  withDefaultClasses(config) {
2919
3023
  return {
2920
3024
  ariaModal: true,
2921
- autoFocus: 'first-tabbable',
3025
+ autoFocus: '[frCommandInput]',
2922
3026
  restoreFocus: true,
2923
3027
  width: 'min(calc(100vw - 2rem), 48rem)',
2924
3028
  maxWidth: 'calc(100vw - 2rem)',
@@ -3953,6 +4057,7 @@ class FrDatePicker extends FrControlValueAccessor$1 {
3953
4057
  valueChange = output();
3954
4058
  openChange = output();
3955
4059
  monthChange = output();
4060
+ calendar = viewChild(FrCalendar$1, ...(ngDevMode ? [{ debugName: "calendar" }] : /* istanbul ignore next */ []));
3956
4061
  positions = POSITIONS;
3957
4062
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3958
4063
  overlaySide = signal('bottom', ...(ngDevMode ? [{ debugName: "overlaySide" }] : /* istanbul ignore next */ []));
@@ -4053,6 +4158,9 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4053
4158
  handlePositionChange(event) {
4054
4159
  this.overlaySide.set(event.connectionPair.overlayY === 'bottom' ? 'top' : 'bottom');
4055
4160
  }
4161
+ focusCalendar() {
4162
+ this.calendar()?.focusActiveDate();
4163
+ }
4056
4164
  overlayPanelClasses() {
4057
4165
  return ['frame-date-picker-overlay', `frame-date-picker-overlay--${this.overlaySide()}`];
4058
4166
  }
@@ -4068,118 +4176,119 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4068
4176
  this.markAsTouched();
4069
4177
  }
4070
4178
  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>
4179
+ 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: `
4180
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4181
+ @if (editable()) {
4182
+ <span class="frame-date-picker__input-wrap">
4183
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4184
+ <input
4185
+ class="frame-date-picker__input"
4186
+ type="text"
4187
+ [disabled]="disabled()"
4188
+ [readOnly]="readonlyInput()"
4189
+ [placeholder]="placeholder()"
4190
+ [value]="inputValue()"
4191
+ [attr.aria-expanded]="isOpen()"
4192
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4193
+ aria-haspopup="dialog"
4194
+ (focus)="open()"
4195
+ (click)="open()"
4196
+ (input)="handleInput($any($event.target).value)"
4197
+ (change)="commitInput($any($event.target).value)"
4198
+ (keydown)="handleTriggerKeydown($event)"
4199
+ (blur)="markAsTouched()"
4200
+ />
4201
+ </span>
4202
+ } @else {
4203
+ <button
4204
+ class="frame-date-picker__trigger"
4205
+ type="button"
4206
+ [disabled]="disabled()"
4207
+ [attr.aria-expanded]="isOpen()"
4208
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4209
+ aria-haspopup="dialog"
4210
+ (click)="toggle()"
4211
+ (keydown)="handleTriggerKeydown($event)"
4212
+ >
4213
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4214
+ <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4215
+ {{ displayValue() || placeholder() }}
4216
+ </span>
4217
+ </button>
4218
+ }
4219
+ </span>
4220
+
4221
+ <ng-template
4222
+ cdkConnectedOverlay
4223
+ [cdkConnectedOverlayOrigin]="origin"
4224
+ [cdkConnectedOverlayOpen]="isOpen()"
4225
+ [cdkConnectedOverlayPositions]="positions"
4226
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4227
+ [cdkConnectedOverlayPush]="true"
4228
+ [cdkConnectedOverlayViewportMargin]="12"
4229
+ (overlayOutsideClick)="close()"
4230
+ (attach)="focusCalendar()"
4231
+ (detach)="close()"
4232
+ (positionChange)="handlePositionChange($event)"
4233
+ >
4234
+ <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4235
+ @if (presets().length) {
4236
+ <div class="frame-date-picker__presets" aria-label="Date presets">
4237
+ @for (preset of presets(); track preset.label) {
4238
+ <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4239
+ {{ preset.label }}
4240
+ </button>
4241
+ }
4242
+ </div>
4243
+ }
4244
+
4245
+ <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4246
+
4247
+ <frame-calendar
4248
+ [mode]="mode()"
4249
+ [captionLayout]="captionLayout()"
4250
+ [numberOfMonths]="numberOfMonths()"
4251
+ [firstDayOfWeek]="firstDayOfWeek()"
4252
+ [locale]="locale()"
4253
+ [timeZone]="timeZone()"
4254
+ [dir]="dir()"
4255
+ [fromYear]="fromYear()"
4256
+ [toYear]="toYear()"
4257
+ [showOutsideDays]="showOutsideDays()"
4258
+ [showWeekNumber]="showWeekNumber()"
4259
+ [disabled]="disabled()"
4260
+ [disabledDates]="disabledDates()"
4261
+ [dateLabels]="dateLabels()"
4262
+ [disabledMatcher]="disabledMatcher()"
4263
+ [cellTemplate]="cellTemplate()"
4264
+ [previousMonthTemplate]="previousMonthTemplate()"
4265
+ [nextMonthTemplate]="nextMonthTemplate()"
4266
+ [previousMonthIcon]="previousMonthIcon()"
4267
+ [nextMonthIcon]="nextMonthIcon()"
4268
+ [previousMonthLabel]="previousMonthLabel()"
4269
+ [nextMonthLabel]="nextMonthLabel()"
4270
+ [month]="month()"
4271
+ [selected]="calendarValue()"
4272
+ (selectedChange)="selectCalendarValue($any($event))"
4273
+ (monthChange)="monthChange.emit($event)"
4274
+ />
4275
+
4276
+ @if (showTime() && mode() === 'single') {
4277
+ <label class="frame-date-picker__time">
4278
+ <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4279
+ <input
4280
+ class="frame-date-picker__time-input"
4281
+ type="time"
4282
+ [disabled]="disabled() || !singleDate()"
4283
+ [value]="timeValue()"
4284
+ (change)="setTime($any($event.target).value)"
4285
+ />
4286
+ </label>
4287
+ }
4288
+
4289
+ <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4290
+ </div>
4291
+ </ng-template>
4183
4292
  `, 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
4293
  }
4185
4294
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDatePicker, decorators: [{
@@ -4198,121 +4307,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4198
4307
  '[attr.data-mode]': 'mode()',
4199
4308
  '[attr.dir]': 'dir()',
4200
4309
  },
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>
4310
+ template: `
4311
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-date-picker__anchor">
4312
+ @if (editable()) {
4313
+ <span class="frame-date-picker__input-wrap">
4314
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4315
+ <input
4316
+ class="frame-date-picker__input"
4317
+ type="text"
4318
+ [disabled]="disabled()"
4319
+ [readOnly]="readonlyInput()"
4320
+ [placeholder]="placeholder()"
4321
+ [value]="inputValue()"
4322
+ [attr.aria-expanded]="isOpen()"
4323
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4324
+ aria-haspopup="dialog"
4325
+ (focus)="open()"
4326
+ (click)="open()"
4327
+ (input)="handleInput($any($event.target).value)"
4328
+ (change)="commitInput($any($event.target).value)"
4329
+ (keydown)="handleTriggerKeydown($event)"
4330
+ (blur)="markAsTouched()"
4331
+ />
4332
+ </span>
4333
+ } @else {
4334
+ <button
4335
+ class="frame-date-picker__trigger"
4336
+ type="button"
4337
+ [disabled]="disabled()"
4338
+ [attr.aria-expanded]="isOpen()"
4339
+ [attr.aria-invalid]="invalid() ? 'true' : null"
4340
+ aria-haspopup="dialog"
4341
+ (click)="toggle()"
4342
+ (keydown)="handleTriggerKeydown($event)"
4343
+ >
4344
+ <span class="frame-date-picker__icon" aria-hidden="true">{{ icon() }}</span>
4345
+ <span class="frame-date-picker__trigger-label" [attr.data-placeholder]="hasValue() ? null : ''">
4346
+ {{ displayValue() || placeholder() }}
4347
+ </span>
4348
+ </button>
4349
+ }
4350
+ </span>
4351
+
4352
+ <ng-template
4353
+ cdkConnectedOverlay
4354
+ [cdkConnectedOverlayOrigin]="origin"
4355
+ [cdkConnectedOverlayOpen]="isOpen()"
4356
+ [cdkConnectedOverlayPositions]="positions"
4357
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
4358
+ [cdkConnectedOverlayPush]="true"
4359
+ [cdkConnectedOverlayViewportMargin]="12"
4360
+ (overlayOutsideClick)="close()"
4361
+ (attach)="focusCalendar()"
4362
+ (detach)="close()"
4363
+ (positionChange)="handlePositionChange($event)"
4364
+ >
4365
+ <div class="frame-date-picker__content" role="dialog" [attr.aria-label]="dialogLabel()">
4366
+ @if (presets().length) {
4367
+ <div class="frame-date-picker__presets" aria-label="Date presets">
4368
+ @for (preset of presets(); track preset.label) {
4369
+ <button class="frame-date-picker__preset" type="button" (click)="selectPreset(preset)">
4370
+ {{ preset.label }}
4371
+ </button>
4372
+ }
4373
+ </div>
4374
+ }
4375
+
4376
+ <ng-container [ngTemplateOutlet]="headerTemplate() ?? null" />
4377
+
4378
+ <frame-calendar
4379
+ [mode]="mode()"
4380
+ [captionLayout]="captionLayout()"
4381
+ [numberOfMonths]="numberOfMonths()"
4382
+ [firstDayOfWeek]="firstDayOfWeek()"
4383
+ [locale]="locale()"
4384
+ [timeZone]="timeZone()"
4385
+ [dir]="dir()"
4386
+ [fromYear]="fromYear()"
4387
+ [toYear]="toYear()"
4388
+ [showOutsideDays]="showOutsideDays()"
4389
+ [showWeekNumber]="showWeekNumber()"
4390
+ [disabled]="disabled()"
4391
+ [disabledDates]="disabledDates()"
4392
+ [dateLabels]="dateLabels()"
4393
+ [disabledMatcher]="disabledMatcher()"
4394
+ [cellTemplate]="cellTemplate()"
4395
+ [previousMonthTemplate]="previousMonthTemplate()"
4396
+ [nextMonthTemplate]="nextMonthTemplate()"
4397
+ [previousMonthIcon]="previousMonthIcon()"
4398
+ [nextMonthIcon]="nextMonthIcon()"
4399
+ [previousMonthLabel]="previousMonthLabel()"
4400
+ [nextMonthLabel]="nextMonthLabel()"
4401
+ [month]="month()"
4402
+ [selected]="calendarValue()"
4403
+ (selectedChange)="selectCalendarValue($any($event))"
4404
+ (monthChange)="monthChange.emit($event)"
4405
+ />
4406
+
4407
+ @if (showTime() && mode() === 'single') {
4408
+ <label class="frame-date-picker__time">
4409
+ <span class="frame-date-picker__time-label">{{ timeLabel() }}</span>
4410
+ <input
4411
+ class="frame-date-picker__time-input"
4412
+ type="time"
4413
+ [disabled]="disabled() || !singleDate()"
4414
+ [value]="timeValue()"
4415
+ (change)="setTime($any($event.target).value)"
4416
+ />
4417
+ </label>
4418
+ }
4419
+
4420
+ <ng-container [ngTemplateOutlet]="footerTemplate() ?? null" />
4421
+ </div>
4422
+ </ng-template>
4313
4423
  `,
4314
4424
  }]
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"] }] } });
4425
+ }], 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
4426
  function normalizeValue(value, mode) {
4317
4427
  if (!value) {
4318
4428
  return mode === 'range' ? { from: null, to: null } : null;
@@ -4377,27 +4487,41 @@ function mergeTime(date, timeSource) {
4377
4487
  return next;
4378
4488
  }
4379
4489
 
4490
+ const DEFAULT_SIDE_OFFSET = 4;
4491
+ const MIN_SUBMENU_SIDE_OFFSET = 8;
4380
4492
  function defaultPositions(isSubmenu) {
4381
4493
  return buildConnectedPositions({
4382
4494
  align: 'start',
4383
4495
  alignOffset: 0,
4384
4496
  isSubmenu,
4385
- side: isSubmenu ? 'right' : 'bottom',
4386
- sideOffset: 4,
4497
+ side: 'auto',
4498
+ sideOffset: DEFAULT_SIDE_OFFSET,
4387
4499
  });
4388
4500
  }
4389
4501
  function buildConnectedPositions(options) {
4390
- const placements = primaryPlacement(options);
4391
- return [placements.primary, placements.fallback];
4502
+ const side = normalizeSide(options.side, options.isSubmenu);
4503
+ if (side === 'auto') {
4504
+ return autoSides(options.isSubmenu).flatMap((side) => primaryPlacement({
4505
+ ...options,
4506
+ side,
4507
+ }));
4508
+ }
4509
+ return primaryPlacement({
4510
+ ...options,
4511
+ side,
4512
+ });
4392
4513
  }
4393
4514
  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: {
4515
+ if (options.side === 'left' || options.side === 'right') {
4516
+ const isRight = options.side === 'right';
4517
+ const sideOffset = options.isSubmenu
4518
+ ? Math.max(options.sideOffset, MIN_SUBMENU_SIDE_OFFSET)
4519
+ : options.sideOffset;
4520
+ const horizontalOffset = isRight ? sideOffset : -sideOffset;
4521
+ const originY = horizontalOriginY(options.align);
4522
+ const overlayY = horizontalOverlayY(options.align);
4523
+ return [
4524
+ {
4401
4525
  originX: isRight ? 'end' : 'start',
4402
4526
  originY,
4403
4527
  overlayX: isRight ? 'start' : 'end',
@@ -4405,7 +4529,7 @@ function primaryPlacement(options) {
4405
4529
  offsetX: horizontalOffset,
4406
4530
  offsetY: options.alignOffset,
4407
4531
  },
4408
- fallback: {
4532
+ {
4409
4533
  originX: isRight ? 'start' : 'end',
4410
4534
  originY,
4411
4535
  overlayX: isRight ? 'end' : 'start',
@@ -4413,14 +4537,14 @@ function primaryPlacement(options) {
4413
4537
  offsetX: -horizontalOffset,
4414
4538
  offsetY: options.alignOffset,
4415
4539
  },
4416
- };
4540
+ ];
4417
4541
  }
4418
- const isBottom = options.side !== 'top';
4542
+ const isBottom = options.side === 'bottom';
4419
4543
  const verticalOffset = isBottom ? options.sideOffset : -options.sideOffset;
4420
4544
  const originX = rootOriginX(options.align);
4421
4545
  const overlayX = rootOverlayX(options.align);
4422
- return {
4423
- primary: {
4546
+ return [
4547
+ {
4424
4548
  originX,
4425
4549
  originY: isBottom ? 'bottom' : 'top',
4426
4550
  overlayX,
@@ -4428,7 +4552,7 @@ function primaryPlacement(options) {
4428
4552
  offsetX: options.alignOffset,
4429
4553
  offsetY: verticalOffset,
4430
4554
  },
4431
- fallback: {
4555
+ {
4432
4556
  originX,
4433
4557
  originY: isBottom ? 'top' : 'bottom',
4434
4558
  overlayX,
@@ -4436,7 +4560,16 @@ function primaryPlacement(options) {
4436
4560
  offsetX: options.alignOffset,
4437
4561
  offsetY: -verticalOffset,
4438
4562
  },
4439
- };
4563
+ ];
4564
+ }
4565
+ function normalizeSide(side, isSubmenu) {
4566
+ if (!isSubmenu || side === 'left' || side === 'right') {
4567
+ return side;
4568
+ }
4569
+ return 'auto';
4570
+ }
4571
+ function autoSides(isSubmenu) {
4572
+ return isSubmenu ? ['right', 'left'] : ['bottom', 'top', 'right', 'left'];
4440
4573
  }
4441
4574
  function rootOriginX(align) {
4442
4575
  if (align === 'center') {
@@ -4450,13 +4583,13 @@ function rootOverlayX(align) {
4450
4583
  }
4451
4584
  return align;
4452
4585
  }
4453
- function submenuOriginY(align) {
4586
+ function horizontalOriginY(align) {
4454
4587
  if (align === 'center') {
4455
4588
  return 'center';
4456
4589
  }
4457
4590
  return align === 'end' ? 'bottom' : 'top';
4458
4591
  }
4459
- function submenuOverlayY(align) {
4592
+ function horizontalOverlayY(align) {
4460
4593
  if (align === 'center') {
4461
4594
  return 'center';
4462
4595
  }
@@ -4578,7 +4711,7 @@ class FrDropdownMenuContent {
4578
4711
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
4579
4712
  alignOffset = input(0, ...(ngDevMode ? [{ debugName: "alignOffset" }] : /* istanbul ignore next */ []));
4580
4713
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4581
- side = input('bottom', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4714
+ side = input('auto', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4582
4715
  sideOffset = input(4, ...(ngDevMode ? [{ debugName: "sideOffset" }] : /* istanbul ignore next */ []));
4583
4716
  isDebugVisible() {
4584
4717
  return this.debugVisible();
@@ -4939,7 +5072,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4939
5072
  }], 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
5073
 
4941
5074
  const FR_DROPDOWN_MENU_ALIGNMENTS = ['center', 'end', 'start'];
4942
- const FR_DROPDOWN_MENU_SIDES = ['bottom', 'left', 'right', 'top'];
5075
+ const FR_DROPDOWN_MENU_SIDES = ['auto', 'bottom', 'left', 'right', 'top'];
4943
5076
  const FR_DROPDOWN_MENU_TRIGGER_MODES = ['both', 'click', 'hover'];
4944
5077
  const FR_DROPDOWN_MENU_ITEM_VARIANTS = ['default', 'destructive'];
4945
5078
 
@@ -5740,6 +5873,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5740
5873
  }] });
5741
5874
 
5742
5875
  const FR_INPUT_GROUP_ADDON_ALIGNS = ['inline-start', 'inline-end'];
5876
+ const FR_INPUT_GROUP_ADDON_VARIANTS = ['default', 'ghost'];
5743
5877
  class FrInputGroup {
5744
5878
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5745
5879
  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 +5889,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5755
5889
  }] });
5756
5890
  class FrInputGroupAddon {
5757
5891
  align = input('inline-start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
5892
+ variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5758
5893
  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 });
5894
+ 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
5895
  }
5761
5896
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupAddon, decorators: [{
5762
5897
  type: Directive,
@@ -5765,9 +5900,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5765
5900
  host: {
5766
5901
  class: 'frame-input-group__addon',
5767
5902
  '[attr.data-align]': 'align()',
5903
+ '[attr.data-variant]': 'variant()',
5768
5904
  },
5769
5905
  }]
5770
- }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }] } });
5906
+ }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5771
5907
  class FrInputGroupText {
5772
5908
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupText, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5773
5909
  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 });
@@ -5800,7 +5936,7 @@ const FR_INPUT_OTP_PATTERN_DIGITS = /^[0-9]$/;
5800
5936
  const FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS = /^[a-zA-Z0-9]$/;
5801
5937
  const FR_INPUT_OTP_CONTROLLER = new InjectionToken('FrInputOtpController');
5802
5938
  class FrInputOtp extends FrControlValueAccessor$1 {
5803
- nativeInput;
5939
+ nativeInput = viewChild('nativeInput', ...(ngDevMode ? [{ debugName: "nativeInput" }] : /* istanbul ignore next */ []));
5804
5940
  maxLength = input(6, { ...(ngDevMode ? { debugName: "maxLength" } : /* istanbul ignore next */ {}), transform: numberAttribute });
5805
5941
  pattern = input(FR_INPUT_OTP_PATTERN_DIGITS, ...(ngDevMode ? [{ debugName: "pattern" }] : /* istanbul ignore next */ []));
5806
5942
  disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled', transform: booleanAttribute });
@@ -5817,11 +5953,11 @@ class FrInputOtp extends FrControlValueAccessor$1 {
5817
5953
  if (this.disabled()) {
5818
5954
  return;
5819
5955
  }
5820
- const inputElement = this.nativeInput?.nativeElement;
5956
+ const inputElement = this.nativeInput()?.nativeElement;
5821
5957
  if (!inputElement) {
5822
5958
  return;
5823
5959
  }
5824
- const nextIndex = clamp$2(index, 0, this.maxLength());
5960
+ const nextIndex = clampNumber(index, 0, this.maxLength());
5825
5961
  inputElement.focus();
5826
5962
  inputElement.setSelectionRange(nextIndex, nextIndex);
5827
5963
  this.activeIndex.set(nextIndex);
@@ -5868,9 +6004,9 @@ class FrInputOtp extends FrControlValueAccessor$1 {
5868
6004
  this.focus(Math.min(next.length, this.maxLength()));
5869
6005
  }
5870
6006
  syncActiveIndex() {
5871
- const inputElement = this.nativeInput?.nativeElement;
6007
+ const inputElement = this.nativeInput()?.nativeElement;
5872
6008
  const index = inputElement?.selectionStart ?? this.value().length;
5873
- this.activeIndex.set(clamp$2(index, 0, this.maxLength()));
6009
+ this.activeIndex.set(clampNumber(index, 0, this.maxLength()));
5874
6010
  }
5875
6011
  markTouched() {
5876
6012
  this.markAsTouched();
@@ -5900,7 +6036,7 @@ class FrInputOtp extends FrControlValueAccessor$1 {
5900
6036
  }
5901
6037
  replaceFrom(index, text) {
5902
6038
  const value = this.value();
5903
- const start = clamp$2(index, 0, this.maxLength());
6039
+ const start = clampNumber(index, 0, this.maxLength());
5904
6040
  const next = `${value.slice(0, start)}${text}${value.slice(start + text.length)}`;
5905
6041
  return this.sanitize(next);
5906
6042
  }
@@ -5919,35 +6055,35 @@ class FrInputOtp extends FrControlValueAccessor$1 {
5919
6055
  return characters.slice(0, this.maxLength()).join('');
5920
6056
  }
5921
6057
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtp, deps: null, target: i0.ɵɵFactoryTarget.Component });
5922
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrInputOtp, isStandalone: true, selector: "frame-input-otp", inputs: { maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pattern: { classPropertyName: "pattern", publicName: "pattern", 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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", complete: "complete" }, host: { attributes: { "role": "group" }, listeners: { "click": "focus(activeIndex())" }, properties: { "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-complete": "isComplete() ? \"\" : null" }, classAttribute: "frame-input-otp" }, providers: [
6058
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.16", type: FrInputOtp, isStandalone: true, selector: "frame-input-otp", inputs: { maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, pattern: { classPropertyName: "pattern", publicName: "pattern", 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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", complete: "complete" }, host: { attributes: { "role": "group" }, listeners: { "click": "focus(activeIndex())" }, properties: { "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-complete": "isComplete() ? \"\" : null" }, classAttribute: "frame-input-otp" }, providers: [
5923
6059
  provideDsValueAccessor$1(FrInputOtp),
5924
6060
  {
5925
6061
  provide: FR_INPUT_OTP_CONTROLLER,
5926
6062
  useExisting: FrInputOtp,
5927
6063
  },
5928
- ], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true }], exportAs: ["frInputOtp"], usesInheritance: true, ngImport: i0, template: `
5929
- <input
5930
- #nativeInput
5931
- frInput
5932
- class="frame-input-otp__native"
5933
- type="text"
5934
- inputmode="numeric"
5935
- autocomplete="one-time-code"
5936
- [attr.aria-invalid]="invalid() ? 'true' : null"
5937
- [attr.aria-label]="ariaLabel()"
5938
- [disabled]="disabled()"
5939
- [maxLength]="maxLength()"
5940
- [value]="value()"
5941
- (blur)="markTouched()"
5942
- (focus)="syncActiveIndex()"
5943
- (input)="handleNativeInput($any($event.target).value)"
5944
- (keydown)="handleKeydown($event)"
5945
- (paste)="handlePaste($event)"
5946
- (select)="syncActiveIndex()"
5947
- (click)="syncActiveIndex()"
5948
- />
5949
-
5950
- <ng-content />
6064
+ ], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true, isSignal: true }], exportAs: ["frInputOtp"], usesInheritance: true, ngImport: i0, template: `
6065
+ <input
6066
+ #nativeInput
6067
+ frInput
6068
+ class="frame-input-otp__native"
6069
+ type="text"
6070
+ inputmode="numeric"
6071
+ autocomplete="one-time-code"
6072
+ [attr.aria-invalid]="invalid() ? 'true' : null"
6073
+ [attr.aria-label]="ariaLabel()"
6074
+ [disabled]="disabled()"
6075
+ [maxLength]="maxLength()"
6076
+ [value]="value()"
6077
+ (blur)="markTouched()"
6078
+ (focus)="syncActiveIndex()"
6079
+ (input)="handleNativeInput($any($event.target).value)"
6080
+ (keydown)="handleKeydown($event)"
6081
+ (paste)="handlePaste($event)"
6082
+ (select)="syncActiveIndex()"
6083
+ (click)="syncActiveIndex()"
6084
+ />
6085
+
6086
+ <ng-content />
5951
6087
  `, isInline: true, dependencies: [{ kind: "directive", type: FrInput$1, selector: "input[frInput]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5952
6088
  }
5953
6089
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtp, decorators: [{
@@ -5972,35 +6108,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5972
6108
  '[attr.data-complete]': 'isComplete() ? "" : null',
5973
6109
  '(click)': 'focus(activeIndex())',
5974
6110
  },
5975
- template: `
5976
- <input
5977
- #nativeInput
5978
- frInput
5979
- class="frame-input-otp__native"
5980
- type="text"
5981
- inputmode="numeric"
5982
- autocomplete="one-time-code"
5983
- [attr.aria-invalid]="invalid() ? 'true' : null"
5984
- [attr.aria-label]="ariaLabel()"
5985
- [disabled]="disabled()"
5986
- [maxLength]="maxLength()"
5987
- [value]="value()"
5988
- (blur)="markTouched()"
5989
- (focus)="syncActiveIndex()"
5990
- (input)="handleNativeInput($any($event.target).value)"
5991
- (keydown)="handleKeydown($event)"
5992
- (paste)="handlePaste($event)"
5993
- (select)="syncActiveIndex()"
5994
- (click)="syncActiveIndex()"
5995
- />
5996
-
5997
- <ng-content />
6111
+ template: `
6112
+ <input
6113
+ #nativeInput
6114
+ frInput
6115
+ class="frame-input-otp__native"
6116
+ type="text"
6117
+ inputmode="numeric"
6118
+ autocomplete="one-time-code"
6119
+ [attr.aria-invalid]="invalid() ? 'true' : null"
6120
+ [attr.aria-label]="ariaLabel()"
6121
+ [disabled]="disabled()"
6122
+ [maxLength]="maxLength()"
6123
+ [value]="value()"
6124
+ (blur)="markTouched()"
6125
+ (focus)="syncActiveIndex()"
6126
+ (input)="handleNativeInput($any($event.target).value)"
6127
+ (keydown)="handleKeydown($event)"
6128
+ (paste)="handlePaste($event)"
6129
+ (select)="syncActiveIndex()"
6130
+ (click)="syncActiveIndex()"
6131
+ />
6132
+
6133
+ <ng-content />
5998
6134
  `,
5999
6135
  }]
6000
- }], propDecorators: { nativeInput: [{
6001
- type: ViewChild,
6002
- args: ['nativeInput']
6003
- }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pattern: [{ type: i0.Input, args: [{ isSignal: true, alias: "pattern", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], complete: [{ type: i0.Output, args: ["complete"] }] } });
6136
+ }], propDecorators: { nativeInput: [{ type: i0.ViewChild, args: ['nativeInput', { isSignal: true }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], pattern: [{ type: i0.Input, args: [{ isSignal: true, alias: "pattern", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], complete: [{ type: i0.Output, args: ["complete"] }] } });
6004
6137
  class FrInputOtpGroup {
6005
6138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6006
6139
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputOtpGroup, isStandalone: true, selector: "[frInputOtpGroup], frame-input-otp-group", host: { classAttribute: "frame-input-otp__group" }, ngImport: i0 });
@@ -6022,10 +6155,10 @@ class FrInputOtpSlot {
6022
6155
  filled = computed(() => !!this.char(), ...(ngDevMode ? [{ debugName: "filled" }] : /* istanbul ignore next */ []));
6023
6156
  active = computed(() => this.root.activeIndex() === this.index(), ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
6024
6157
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
6025
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrInputOtpSlot, isStandalone: true, selector: "[frInputOtpSlot], frame-input-otp-slot", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, listeners: { "click": "root.focus(index())" }, properties: { "attr.data-active": "active() ? \"\" : null", "attr.data-filled": "filled() ? \"\" : null", "attr.data-invalid": "root.invalid() ? \"\" : null", "attr.data-disabled": "root.disabled() ? \"\" : null" }, classAttribute: "frame-input-otp__slot" }, ngImport: i0, template: `
6026
- <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6027
- {{ char() || placeholder() }}
6028
- </span>
6158
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrInputOtpSlot, isStandalone: true, selector: "[frInputOtpSlot], frame-input-otp-slot", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, listeners: { "click": "root.focus(index())" }, properties: { "attr.data-active": "active() ? \"\" : null", "attr.data-filled": "filled() ? \"\" : null", "attr.data-invalid": "root.invalid() ? \"\" : null", "attr.data-disabled": "root.disabled() ? \"\" : null" }, classAttribute: "frame-input-otp__slot" }, ngImport: i0, template: `
6159
+ <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6160
+ {{ char() || placeholder() }}
6161
+ </span>
6029
6162
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6030
6163
  }
6031
6164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpSlot, decorators: [{
@@ -6043,10 +6176,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6043
6176
  '[attr.data-disabled]': 'root.disabled() ? "" : null',
6044
6177
  '(click)': 'root.focus(index())',
6045
6178
  },
6046
- template: `
6047
- <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6048
- {{ char() || placeholder() }}
6049
- </span>
6179
+ template: `
6180
+ <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6181
+ {{ char() || placeholder() }}
6182
+ </span>
6050
6183
  `,
6051
6184
  }]
6052
6185
  }], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
@@ -6078,9 +6211,6 @@ function toMatcher(pattern) {
6078
6211
  const regex = new RegExp(pattern);
6079
6212
  return (character) => regex.test(character);
6080
6213
  }
6081
- function clamp$2(value, min, max) {
6082
- return Math.max(min, Math.min(max, value));
6083
- }
6084
6214
 
6085
6215
  const FR_ITEM_VARIANTS = ['default', 'outline', 'muted'];
6086
6216
  const FR_ITEM_SIZES = ['default', 'sm', 'xs'];
@@ -6697,7 +6827,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6697
6827
  }]
6698
6828
  }] });
6699
6829
 
6830
+ class FrModalRef extends DialogRef {
6831
+ }
6832
+
6700
6833
  const FR_MODAL_DATA = DIALOG_DATA;
6834
+ const FR_MODAL_REF = FrModalRef;
6701
6835
 
6702
6836
  class FrModalShell {
6703
6837
  dialogRef = inject((DialogRef));
@@ -6833,26 +6967,27 @@ const DEFAULT_PANEL_CLASS$1 = 'frame-modal__overlay-pane';
6833
6967
  const DEFAULT_BACKDROP_CLASS$1 = 'frame-modal__backdrop';
6834
6968
  class FrModalService {
6835
6969
  dialog = inject(Dialog);
6836
- open(content, config = {}) {
6837
- if (isComponentType$1(content) && hasShellOptions$1(config)) {
6970
+ open(content, dataOrConfig, config) {
6971
+ const resolvedConfig = resolveOpenConfig(content, dataOrConfig, config);
6972
+ if (isComponentType$1(content) && hasShellOptions$1(resolvedConfig)) {
6838
6973
  const shellConfig = {
6839
- ...withoutShellOptions$1(config),
6974
+ ...withoutShellOptions$1(resolvedConfig),
6840
6975
  data: {
6841
6976
  bodyComponent: content,
6842
- bodyData: config.bodyData ?? config.data,
6843
- bodyInputs: config.bodyInputs,
6844
- description: config.description,
6845
- footerActions: config.footerActions,
6846
- scrollable: config.scrollable,
6847
- showCloseButton: config.showCloseButton,
6848
- size: config.size,
6849
- stickyFooter: config.stickyFooter,
6850
- title: config.title,
6977
+ bodyData: resolvedConfig.bodyData ?? resolvedConfig.data,
6978
+ bodyInputs: resolvedConfig.inputs ?? resolvedConfig.bodyInputs,
6979
+ description: resolvedConfig.description,
6980
+ footerActions: resolvedConfig.footerActions,
6981
+ scrollable: resolvedConfig.scrollable,
6982
+ showCloseButton: resolvedConfig.showCloseButton,
6983
+ size: resolvedConfig.size,
6984
+ stickyFooter: resolvedConfig.stickyFooter,
6985
+ title: resolvedConfig.title,
6851
6986
  },
6852
6987
  };
6853
6988
  return this.dialog.open(FrModalShell, this.withDefaultClasses(shellConfig));
6854
6989
  }
6855
- return this.dialog.open(content, this.withDefaultClasses(config));
6990
+ return this.dialog.open(content, this.withDefaultClasses(resolvedConfig));
6856
6991
  }
6857
6992
  closeAll() {
6858
6993
  this.dialog.closeAll();
@@ -6866,6 +7001,7 @@ class FrModalService {
6866
7001
  ...config,
6867
7002
  panelClass: mergeClassList$1(config.panelClass, DEFAULT_PANEL_CLASS$1),
6868
7003
  backdropClass: mergeClassList$1(config.backdropClass, DEFAULT_BACKDROP_CLASS$1),
7004
+ providers: withModalRefProvider(config.providers),
6869
7005
  };
6870
7006
  }
6871
7007
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -6884,6 +7020,7 @@ function hasShellOptions$1(config) {
6884
7020
  config.bodyInputs,
6885
7021
  config.description,
6886
7022
  config.footerActions,
7023
+ config.inputs,
6887
7024
  config.scrollable,
6888
7025
  config.showCloseButton,
6889
7026
  config.size,
@@ -6892,9 +7029,70 @@ function hasShellOptions$1(config) {
6892
7029
  ].some((value) => value !== undefined);
6893
7030
  }
6894
7031
  function withoutShellOptions$1(config) {
6895
- const { bodyData: _bodyData, bodyInputs: _bodyInputs, description: _description, footerActions: _footerActions, scrollable: _scrollable, showCloseButton: _showCloseButton, size: _size, stickyFooter: _stickyFooter, title: _title, ...dialogConfig } = config;
7032
+ const { bodyData: _bodyData, bodyInputs: _bodyInputs, description: _description, footerActions: _footerActions, inputs: _inputs, scrollable: _scrollable, showCloseButton: _showCloseButton, size: _size, stickyFooter: _stickyFooter, title: _title, ...dialogConfig } = config;
6896
7033
  return dialogConfig;
6897
7034
  }
7035
+ function resolveOpenConfig(content, dataOrConfig, config) {
7036
+ if (!isComponentType$1(content)) {
7037
+ return (dataOrConfig ?? {});
7038
+ }
7039
+ if (config) {
7040
+ return {
7041
+ ...config,
7042
+ data: dataOrConfig,
7043
+ };
7044
+ }
7045
+ if (dataOrConfig === undefined) {
7046
+ return {};
7047
+ }
7048
+ if (isModalConfig(dataOrConfig)) {
7049
+ return dataOrConfig;
7050
+ }
7051
+ return {
7052
+ data: dataOrConfig,
7053
+ };
7054
+ }
7055
+ const CONFIG_KEYS = new Set([
7056
+ 'ariaDescribedBy',
7057
+ 'ariaLabel',
7058
+ 'ariaLabelledBy',
7059
+ 'ariaModal',
7060
+ 'autoFocus',
7061
+ 'backdropClass',
7062
+ 'bodyData',
7063
+ 'bodyInputs',
7064
+ 'closeOnDestroy',
7065
+ 'closeOnNavigation',
7066
+ 'data',
7067
+ 'description',
7068
+ 'direction',
7069
+ 'disableClose',
7070
+ 'footerActions',
7071
+ 'height',
7072
+ 'inputs',
7073
+ 'maxHeight',
7074
+ 'maxWidth',
7075
+ 'minHeight',
7076
+ 'minWidth',
7077
+ 'panelClass',
7078
+ 'positionStrategy',
7079
+ 'providers',
7080
+ 'restoreFocus',
7081
+ 'role',
7082
+ 'scrollable',
7083
+ 'showCloseButton',
7084
+ 'size',
7085
+ 'stickyFooter',
7086
+ 'title',
7087
+ 'viewContainerRef',
7088
+ 'width',
7089
+ ]);
7090
+ function isModalConfig(value) {
7091
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
7092
+ return false;
7093
+ }
7094
+ return Object.keys(value).some((key) => CONFIG_KEYS.has(key));
7095
+ }
6898
7096
  function mergeClassList$1(classList, defaultClass) {
6899
7097
  const classes = Array.isArray(classList)
6900
7098
  ? classList
@@ -6903,6 +7101,16 @@ function mergeClassList$1(classList, defaultClass) {
6903
7101
  : [];
6904
7102
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
6905
7103
  }
7104
+ function withModalRefProvider(providers) {
7105
+ const modalRefProvider = { provide: FrModalRef, useExisting: DialogRef };
7106
+ if (typeof providers === 'function') {
7107
+ return (dialogRef, config, container) => [
7108
+ modalRefProvider,
7109
+ ...providers(dialogRef, config, container),
7110
+ ];
7111
+ }
7112
+ return [modalRefProvider, ...(providers ?? [])];
7113
+ }
6906
7114
 
6907
7115
  class FrModalTrigger {
6908
7116
  static CUSTOM_PROPERTY_PREFIX = '--frame-modal-';
@@ -7225,7 +7433,7 @@ class FrPagination {
7225
7433
  canNext = computed(() => this.page() < this.normalizedTotalPages(), ...(ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []));
7226
7434
  pages = computed(() => this.buildPages(), ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
7227
7435
  goToPage(page) {
7228
- this.page.set(Math.min(Math.max(page, 1), this.normalizedTotalPages()));
7436
+ this.page.set(clampNumber(page, 1, this.normalizedTotalPages()));
7229
7437
  }
7230
7438
  goToPreviousPage() {
7231
7439
  this.goToPage(this.page() - 1);
@@ -7240,7 +7448,7 @@ class FrPagination {
7240
7448
  const totalPages = this.normalizedTotalPages();
7241
7449
  const boundaryCount = Math.max(0, Math.floor(this.boundaryCount()));
7242
7450
  const siblingCount = Math.max(0, Math.floor(this.siblingCount()));
7243
- const currentPage = Math.min(Math.max(this.page(), 1), totalPages);
7451
+ const currentPage = clampNumber(this.page(), 1, totalPages);
7244
7452
  const pages = new Set();
7245
7453
  for (let page = 1; page <= Math.min(boundaryCount, totalPages); page += 1) {
7246
7454
  pages.add(page);
@@ -7380,13 +7588,13 @@ class FrPaginationPrevious {
7380
7588
  this.pagination.goToPreviousPage();
7381
7589
  }
7382
7590
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationPrevious, deps: [], target: i0.ɵɵFactoryTarget.Component });
7383
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrPaginationPrevious, isStandalone: true, selector: "a[frPaginationPrevious], button[frPaginationPrevious]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-disabled": "isDisabled() ? \"true\" : null", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.data-icon-only": "iconOnly() ? \"\" : null", "attr.disabled": "isDisabled() ? \"\" : null", "attr.tabindex": "isDisabled() ? \"-1\" : null" }, classAttribute: "frame-pagination__link frame-pagination__previous" }, ngImport: i0, template: `
7384
- <span class="frame-pagination__control-icon" aria-hidden="true">
7385
- <ng-content select="[frPaginationIcon]">‹</ng-content>
7386
- </span>
7387
- @if (!iconOnly()) {
7388
- <span class="frame-pagination__control-text">{{ text() }}</span>
7389
- }
7591
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrPaginationPrevious, isStandalone: true, selector: "a[frPaginationPrevious], button[frPaginationPrevious]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-disabled": "isDisabled() ? \"true\" : null", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.data-icon-only": "iconOnly() ? \"\" : null", "attr.disabled": "isDisabled() ? \"\" : null", "attr.tabindex": "isDisabled() ? \"-1\" : null" }, classAttribute: "frame-pagination__link frame-pagination__previous" }, ngImport: i0, template: `
7592
+ <span class="frame-pagination__control-icon" aria-hidden="true">
7593
+ <ng-content select="[frPaginationIcon]">‹</ng-content>
7594
+ </span>
7595
+ @if (!iconOnly()) {
7596
+ <span class="frame-pagination__control-text">{{ text() }}</span>
7597
+ }
7390
7598
  `, isInline: true });
7391
7599
  }
7392
7600
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationPrevious, decorators: [{
@@ -7403,13 +7611,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7403
7611
  '[attr.tabindex]': 'isDisabled() ? "-1" : null',
7404
7612
  '(click)': 'handleClick($event)',
7405
7613
  },
7406
- template: `
7407
- <span class="frame-pagination__control-icon" aria-hidden="true">
7408
- <ng-content select="[frPaginationIcon]">‹</ng-content>
7409
- </span>
7410
- @if (!iconOnly()) {
7411
- <span class="frame-pagination__control-text">{{ text() }}</span>
7412
- }
7614
+ template: `
7615
+ <span class="frame-pagination__control-icon" aria-hidden="true">
7616
+ <ng-content select="[frPaginationIcon]">‹</ng-content>
7617
+ </span>
7618
+ @if (!iconOnly()) {
7619
+ <span class="frame-pagination__control-text">{{ text() }}</span>
7620
+ }
7413
7621
  `,
7414
7622
  }]
7415
7623
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
@@ -7432,13 +7640,13 @@ class FrPaginationNext {
7432
7640
  this.pagination.goToNextPage();
7433
7641
  }
7434
7642
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationNext, deps: [], target: i0.ɵɵFactoryTarget.Component });
7435
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrPaginationNext, isStandalone: true, selector: "a[frPaginationNext], button[frPaginationNext]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-disabled": "isDisabled() ? \"true\" : null", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.data-icon-only": "iconOnly() ? \"\" : null", "attr.disabled": "isDisabled() ? \"\" : null", "attr.tabindex": "isDisabled() ? \"-1\" : null" }, classAttribute: "frame-pagination__link frame-pagination__next" }, ngImport: i0, template: `
7436
- @if (!iconOnly()) {
7437
- <span class="frame-pagination__control-text">{{ text() }}</span>
7438
- }
7439
- <span class="frame-pagination__control-icon" aria-hidden="true">
7440
- <ng-content select="[frPaginationIcon]">›</ng-content>
7441
- </span>
7643
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrPaginationNext, isStandalone: true, selector: "a[frPaginationNext], button[frPaginationNext]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-disabled": "isDisabled() ? \"true\" : null", "attr.data-disabled": "isDisabled() ? \"\" : null", "attr.data-icon-only": "iconOnly() ? \"\" : null", "attr.disabled": "isDisabled() ? \"\" : null", "attr.tabindex": "isDisabled() ? \"-1\" : null" }, classAttribute: "frame-pagination__link frame-pagination__next" }, ngImport: i0, template: `
7644
+ @if (!iconOnly()) {
7645
+ <span class="frame-pagination__control-text">{{ text() }}</span>
7646
+ }
7647
+ <span class="frame-pagination__control-icon" aria-hidden="true">
7648
+ <ng-content select="[frPaginationIcon]">›</ng-content>
7649
+ </span>
7442
7650
  `, isInline: true });
7443
7651
  }
7444
7652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationNext, decorators: [{
@@ -7455,22 +7663,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7455
7663
  '[attr.tabindex]': 'isDisabled() ? "-1" : null',
7456
7664
  '(click)': 'handleClick($event)',
7457
7665
  },
7458
- template: `
7459
- @if (!iconOnly()) {
7460
- <span class="frame-pagination__control-text">{{ text() }}</span>
7461
- }
7462
- <span class="frame-pagination__control-icon" aria-hidden="true">
7463
- <ng-content select="[frPaginationIcon]">›</ng-content>
7464
- </span>
7666
+ template: `
7667
+ @if (!iconOnly()) {
7668
+ <span class="frame-pagination__control-text">{{ text() }}</span>
7669
+ }
7670
+ <span class="frame-pagination__control-icon" aria-hidden="true">
7671
+ <ng-content select="[frPaginationIcon]">›</ng-content>
7672
+ </span>
7465
7673
  `,
7466
7674
  }]
7467
7675
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
7468
7676
  class FrPaginationEllipsis {
7469
7677
  label = input('More pages', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7470
7678
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
7471
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrPaginationEllipsis, isStandalone: true, selector: "[frPaginationEllipsis], frame-pagination-ellipsis", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, classAttribute: "frame-pagination__ellipsis" }, ngImport: i0, template: `
7472
- <span aria-hidden="true">...</span>
7473
- <span class="frame-pagination__sr-only">{{ label() }}</span>
7679
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrPaginationEllipsis, isStandalone: true, selector: "[frPaginationEllipsis], frame-pagination-ellipsis", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, classAttribute: "frame-pagination__ellipsis" }, ngImport: i0, template: `
7680
+ <span aria-hidden="true">...</span>
7681
+ <span class="frame-pagination__sr-only">{{ label() }}</span>
7474
7682
  `, isInline: true });
7475
7683
  }
7476
7684
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationEllipsis, decorators: [{
@@ -7481,9 +7689,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7481
7689
  class: 'frame-pagination__ellipsis',
7482
7690
  role: 'presentation',
7483
7691
  },
7484
- template: `
7485
- <span aria-hidden="true">...</span>
7486
- <span class="frame-pagination__sr-only">{{ label() }}</span>
7692
+ template: `
7693
+ <span aria-hidden="true">...</span>
7694
+ <span class="frame-pagination__sr-only">{{ label() }}</span>
7487
7695
  `,
7488
7696
  }]
7489
7697
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
@@ -7898,7 +8106,7 @@ class FrProgress {
7898
8106
  if (value === null) {
7899
8107
  return 0;
7900
8108
  }
7901
- return Math.min(Math.max(value, 0), this.max());
8109
+ return clampNumber(value, 0, this.max());
7902
8110
  }, ...(ngDevMode ? [{ debugName: "normalizedValue" }] : /* istanbul ignore next */ []));
7903
8111
  percentage = computed(() => (this.normalizedValue() / this.max()) * 100, ...(ngDevMode ? [{ debugName: "percentage" }] : /* istanbul ignore next */ []));
7904
8112
  state = computed(() => {
@@ -8028,13 +8236,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8028
8236
 
8029
8237
  const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'];
8030
8238
  let nextResizableId = 0;
8031
- function coerceSize(value, fallback) {
8032
- const parsed = Number(value);
8033
- return Number.isFinite(parsed) ? parsed : fallback;
8034
- }
8035
- function clampSize(value, min, max) {
8036
- return Math.min(Math.max(value, min), max);
8037
- }
8038
8239
  class FrResizablePanelGroup {
8039
8240
  elementRef = inject((ElementRef));
8040
8241
  groupId = `frame-resizable-${++nextResizableId}`;
@@ -8074,7 +8275,7 @@ class FrResizablePanelGroup {
8074
8275
  panel.style.flexGrow = '0';
8075
8276
  panel.style.flexShrink = '0';
8076
8277
  if (!panel.style.flexBasis) {
8077
- this.applyPanelSize(panel, clampSize(this.defaultSize(panel) ?? fallbackSize, this.minSize(panel), this.maxSize(panel)));
8278
+ this.applyPanelSize(panel, clampNumber(this.defaultSize(panel) ?? fallbackSize, this.minSize(panel), this.maxSize(panel)));
8078
8279
  }
8079
8280
  else {
8080
8281
  this.applyPanelSize(panel, this.panelSize(panel) ?? 0);
@@ -8164,8 +8365,8 @@ class FrResizablePanelGroup {
8164
8365
  resizePair(previousPanel, nextPanel, pairTotal, requestedPreviousSize) {
8165
8366
  const previousMin = this.minSize(previousPanel);
8166
8367
  const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));
8167
- const previousSize = clampSize(requestedPreviousSize, previousMin, previousMax);
8168
- const nextSize = clampSize(pairTotal - previousSize, this.minSize(nextPanel), this.maxSize(nextPanel));
8368
+ const previousSize = clampNumber(requestedPreviousSize, previousMin, previousMax);
8369
+ const nextSize = clampNumber(pairTotal - previousSize, this.minSize(nextPanel), this.maxSize(nextPanel));
8169
8370
  this.applyPanelSize(previousPanel, previousSize);
8170
8371
  this.applyPanelSize(nextPanel, nextSize);
8171
8372
  this.updateHandleMetadata();
@@ -8224,16 +8425,16 @@ class FrResizablePanelGroup {
8224
8425
  }
8225
8426
  defaultSize(panel) {
8226
8427
  const value = panel.getAttribute('data-default-size');
8227
- return value === null ? null : coerceSize(value, 0);
8428
+ return value === null ? null : coerceNumber(value, 0);
8228
8429
  }
8229
8430
  minSize(panel) {
8230
- return coerceSize(panel.getAttribute('data-min-size'), 0);
8431
+ return coerceNumber(panel.getAttribute('data-min-size'), 0);
8231
8432
  }
8232
8433
  maxSize(panel) {
8233
- return coerceSize(panel.getAttribute('data-max-size'), 100);
8434
+ return coerceNumber(panel.getAttribute('data-max-size'), 100);
8234
8435
  }
8235
8436
  collapsedSize(panel) {
8236
- return coerceSize(panel.getAttribute('data-collapsed-size'), 0);
8437
+ return coerceNumber(panel.getAttribute('data-collapsed-size'), 0);
8237
8438
  }
8238
8439
  collapsible(panel) {
8239
8440
  return panel.hasAttribute('data-collapsible');
@@ -8254,11 +8455,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8254
8455
  }]
8255
8456
  }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], layoutChange: [{ type: i0.Output, args: ["layoutChange"] }] } });
8256
8457
  class FrResizablePanel {
8257
- defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 0) });
8258
- minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 0) });
8259
- maxSize = input(100, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 100) });
8458
+ defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
8459
+ minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
8460
+ maxSize = input(100, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 100) });
8260
8461
  collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
8261
- collapsedSize = input(0, { ...(ngDevMode ? { debugName: "collapsedSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 0) });
8462
+ collapsedSize = input(0, { ...(ngDevMode ? { debugName: "collapsedSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
8262
8463
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrResizablePanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8263
8464
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrResizablePanel, isStandalone: true, selector: "[frResizablePanel], frame-resizable-panel", inputs: { defaultSize: { classPropertyName: "defaultSize", publicName: "defaultSize", 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 }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapsedSize: { classPropertyName: "collapsedSize", publicName: "collapsedSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-default-size": "defaultSize()", "attr.data-min-size": "minSize()", "attr.data-max-size": "maxSize()", "attr.data-collapsible": "collapsible() ? \"\" : null", "attr.data-collapsed-size": "collapsedSize()" }, classAttribute: "frame-resizable__panel" }, ngImport: i0 });
8264
8465
  }
@@ -8307,15 +8508,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8307
8508
  '[attr.data-orientation]': 'group.orientation()',
8308
8509
  '[attr.data-handle]': 'withHandle() ? "" : null',
8309
8510
  '[attr.data-disabled]': 'group.disabled() ? "" : null',
8511
+ '(pointerdown)': 'onPointerDown($event)',
8512
+ '(keydown)': 'onKeydown($event)',
8310
8513
  },
8311
8514
  }]
8312
- }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }], onPointerDown: [{
8313
- type: HostListener,
8314
- args: ['pointerdown', ['$event']]
8315
- }], onKeydown: [{
8316
- type: HostListener,
8317
- args: ['keydown', ['$event']]
8318
- }] } });
8515
+ }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }] } });
8319
8516
 
8320
8517
  const FR_SELECT_POSITIONS = ['item-aligned', 'popper'];
8321
8518
  class FrSelectContent extends FrDropdownMenuContent$1 {
@@ -8530,6 +8727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8530
8727
  }]
8531
8728
  }], 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
8729
 
8730
+ const FR_SELECT_ICON_POSITIONS = ['leading', 'trailing'];
8533
8731
  class FrSelectValue {
8534
8732
  select = inject(FrSelect);
8535
8733
  placeholder = input('Select an option', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -8564,8 +8762,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8564
8762
  }]
8565
8763
  }] });
8566
8764
  class FrSelectIcon {
8765
+ position = input('trailing', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
8567
8766
  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 });
8767
+ 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
8768
  }
8570
8769
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, decorators: [{
8571
8770
  type: Directive,
@@ -8574,9 +8773,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8574
8773
  host: {
8575
8774
  class: 'frame-select__icon',
8576
8775
  'aria-hidden': 'true',
8776
+ '[attr.data-position]': 'position()',
8577
8777
  },
8578
8778
  }]
8579
- }] });
8779
+ }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
8580
8780
  class FrSelectError {
8581
8781
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8582
8782
  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 });
@@ -8686,10 +8886,6 @@ const FR_SLIDER_ORIENTATIONS = ['horizontal', 'vertical'];
8686
8886
  function coerceOrientation(value) {
8687
8887
  return value === 'vertical' ? 'vertical' : 'horizontal';
8688
8888
  }
8689
- function coerceNumber(value, fallback) {
8690
- const parsed = Number(value);
8691
- return Number.isFinite(parsed) ? parsed : fallback;
8692
- }
8693
8889
  function coerceValue(value) {
8694
8890
  if (Array.isArray(value)) {
8695
8891
  return value.map((item) => coerceNumber(item, 0));
@@ -8825,7 +9021,7 @@ class FrSlider extends FrControlValueAccessor$1 {
8825
9021
  const next = index < normalized.length - 1 ? normalized[index + 1] - minDistance : max;
8826
9022
  const lower = activeIndex === index ? previous : min;
8827
9023
  const upper = activeIndex === index ? next : max;
8828
- return this.snap(clamp$1(value, lower, upper), min, step);
9024
+ return this.snap(clampNumber(value, lower, upper), min, step);
8829
9025
  });
8830
9026
  }
8831
9027
  snap(value, min, step) {
@@ -8848,7 +9044,7 @@ class FrSlider extends FrControlValueAccessor$1 {
8848
9044
  if (this.inverted()) {
8849
9045
  percent = 1 - percent;
8850
9046
  }
8851
- return this.min() + clamp$1(percent, 0, 1) * (this.max() - this.min());
9047
+ return this.min() + clampNumber(percent, 0, 1) * (this.max() - this.min());
8852
9048
  }
8853
9049
  closestThumbIndex(value) {
8854
9050
  return this.values().reduce((closestIndex, thumb, index, values) => {
@@ -8861,31 +9057,31 @@ class FrSlider extends FrControlValueAccessor$1 {
8861
9057
  return getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';
8862
9058
  }
8863
9059
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
8864
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSlider, isStandalone: true, selector: "frame-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, minStepsBetweenThumbs: { classPropertyName: "minStepsBetweenThumbs", publicName: "minStepsBetweenThumbs", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", 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 }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, valueInput: { classPropertyName: "valueInput", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, formatValue: { classPropertyName: "formatValue", publicName: "formatValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { listeners: { "pointerdown": "handlePointerDown($event)" }, properties: { "attr.data-orientation": "orientation()", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-inverted": "inverted() ? \"\" : null", "style.--frame-slider-start-percent": "rangeStartPercent() + \"%\"", "style.--frame-slider-end-percent": "rangeEndPercent() + \"%\"" }, classAttribute: "frame-slider" }, providers: [provideDsValueAccessor$1(FrSlider)], exportAs: ["frSlider"], usesInheritance: true, ngImport: i0, template: `
8865
- <span class="frame-slider__track">
8866
- <span class="frame-slider__range"></span>
8867
- </span>
8868
-
8869
- @for (thumb of values(); track $index) {
8870
- <input
8871
- class="frame-slider__native"
8872
- type="range"
8873
- [attr.aria-label]="thumbLabel($index)"
8874
- [attr.aria-valuetext]="valueText(thumb)"
8875
- [disabled]="disabled()"
8876
- [min]="min()"
8877
- [max]="max()"
8878
- [step]="step()"
8879
- [value]="thumb"
8880
- (blur)="markTouched()"
8881
- (input)="handleNativeInput($index, $any($event.target).value)"
8882
- />
8883
- <span
8884
- class="frame-slider__thumb"
8885
- [attr.data-active]="activeThumb() === $index ? '' : null"
8886
- [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
8887
- ></span>
8888
- }
9060
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSlider, isStandalone: true, selector: "frame-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, minStepsBetweenThumbs: { classPropertyName: "minStepsBetweenThumbs", publicName: "minStepsBetweenThumbs", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", 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 }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, valueInput: { classPropertyName: "valueInput", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, formatValue: { classPropertyName: "formatValue", publicName: "formatValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { listeners: { "pointerdown": "handlePointerDown($event)" }, properties: { "attr.data-orientation": "orientation()", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.data-inverted": "inverted() ? \"\" : null", "style.--frame-slider-start-percent": "rangeStartPercent() + \"%\"", "style.--frame-slider-end-percent": "rangeEndPercent() + \"%\"" }, classAttribute: "frame-slider" }, providers: [provideDsValueAccessor$1(FrSlider)], exportAs: ["frSlider"], usesInheritance: true, ngImport: i0, template: `
9061
+ <span class="frame-slider__track">
9062
+ <span class="frame-slider__range"></span>
9063
+ </span>
9064
+
9065
+ @for (thumb of values(); track $index) {
9066
+ <input
9067
+ class="frame-slider__native"
9068
+ type="range"
9069
+ [attr.aria-label]="thumbLabel($index)"
9070
+ [attr.aria-valuetext]="valueText(thumb)"
9071
+ [disabled]="disabled()"
9072
+ [min]="min()"
9073
+ [max]="max()"
9074
+ [step]="step()"
9075
+ [value]="thumb"
9076
+ (blur)="markTouched()"
9077
+ (input)="handleNativeInput($index, $any($event.target).value)"
9078
+ />
9079
+ <span
9080
+ class="frame-slider__thumb"
9081
+ [attr.data-active]="activeThumb() === $index ? '' : null"
9082
+ [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
9083
+ ></span>
9084
+ }
8889
9085
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8890
9086
  }
8891
9087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, decorators: [{
@@ -8905,37 +9101,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8905
9101
  '[style.--frame-slider-end-percent]': 'rangeEndPercent() + "%"',
8906
9102
  '(pointerdown)': 'handlePointerDown($event)',
8907
9103
  },
8908
- template: `
8909
- <span class="frame-slider__track">
8910
- <span class="frame-slider__range"></span>
8911
- </span>
8912
-
8913
- @for (thumb of values(); track $index) {
8914
- <input
8915
- class="frame-slider__native"
8916
- type="range"
8917
- [attr.aria-label]="thumbLabel($index)"
8918
- [attr.aria-valuetext]="valueText(thumb)"
8919
- [disabled]="disabled()"
8920
- [min]="min()"
8921
- [max]="max()"
8922
- [step]="step()"
8923
- [value]="thumb"
8924
- (blur)="markTouched()"
8925
- (input)="handleNativeInput($index, $any($event.target).value)"
8926
- />
8927
- <span
8928
- class="frame-slider__thumb"
8929
- [attr.data-active]="activeThumb() === $index ? '' : null"
8930
- [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
8931
- ></span>
8932
- }
9104
+ template: `
9105
+ <span class="frame-slider__track">
9106
+ <span class="frame-slider__range"></span>
9107
+ </span>
9108
+
9109
+ @for (thumb of values(); track $index) {
9110
+ <input
9111
+ class="frame-slider__native"
9112
+ type="range"
9113
+ [attr.aria-label]="thumbLabel($index)"
9114
+ [attr.aria-valuetext]="valueText(thumb)"
9115
+ [disabled]="disabled()"
9116
+ [min]="min()"
9117
+ [max]="max()"
9118
+ [step]="step()"
9119
+ [value]="thumb"
9120
+ (blur)="markTouched()"
9121
+ (input)="handleNativeInput($index, $any($event.target).value)"
9122
+ />
9123
+ <span
9124
+ class="frame-slider__thumb"
9125
+ [attr.data-active]="activeThumb() === $index ? '' : null"
9126
+ [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
9127
+ ></span>
9128
+ }
8933
9129
  `,
8934
9130
  }]
8935
9131
  }], ctorParameters: () => [], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], minStepsBetweenThumbs: [{ type: i0.Input, args: [{ isSignal: true, alias: "minStepsBetweenThumbs", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], valueInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], formatValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatValue", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
8936
- function clamp$1(value, min, max) {
8937
- return Math.min(Math.max(value, min), max);
8938
- }
8939
9132
 
8940
9133
  const FR_SEPARATOR_ORIENTATIONS = ['horizontal', 'vertical'];
8941
9134
  function coerceSeparatorOrientation(value) {
@@ -9038,18 +9231,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9038
9231
  }]
9039
9232
  }], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "frSheetClose", required: false }] }] } });
9040
9233
  class FrSheetPanel {
9234
+ dialogRef = inject(DialogRef, { optional: true });
9041
9235
  scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9042
9236
  showCloseButton = input(true, { ...(ngDevMode ? { debugName: "showCloseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9043
9237
  side = input('right', { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), transform: coerceSheetSide });
9044
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
9045
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSheetPanel, isStandalone: true, selector: "[frSheetPanel], frame-sheet-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-side": "side()" }, classAttribute: "frame-sheet__panel" }, ngImport: i0, template: `
9046
- <ng-content />
9047
- @if (showCloseButton()) {
9048
- <button class="frame-sheet__close" frSheetClose type="button" aria-label="Close sheet">
9049
- <span aria-hidden="true">×</span>
9050
- </button>
9238
+ close() {
9239
+ this.dialogRef?.close();
9051
9240
  }
9052
- `, isInline: true, dependencies: [{ kind: "directive", type: FrSheetClose, selector: "[frSheetClose]", inputs: ["frSheetClose"] }] });
9241
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
9242
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSheetPanel, isStandalone: true, selector: "[frSheetPanel], frame-sheet-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-side": "side()" }, classAttribute: "frame-sheet__panel" }, ngImport: i0, template: `
9243
+ <ng-content />
9244
+ @if (showCloseButton()) {
9245
+ <button class="frame-sheet__close" type="button" aria-label="Close sheet" (click)="close()">
9246
+ <span aria-hidden="true">×</span>
9247
+ </button>
9248
+ }
9249
+ `, isInline: true });
9053
9250
  }
9054
9251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetPanel, decorators: [{
9055
9252
  type: Component,
@@ -9060,15 +9257,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9060
9257
  '[attr.data-scrollable]': 'scrollable() ? "" : null',
9061
9258
  '[attr.data-side]': 'side()',
9062
9259
  },
9063
- template: `
9064
- <ng-content />
9065
- @if (showCloseButton()) {
9066
- <button class="frame-sheet__close" frSheetClose type="button" aria-label="Close sheet">
9067
- <span aria-hidden="true">×</span>
9068
- </button>
9069
- }
9260
+ template: `
9261
+ <ng-content />
9262
+ @if (showCloseButton()) {
9263
+ <button class="frame-sheet__close" type="button" aria-label="Close sheet" (click)="close()">
9264
+ <span aria-hidden="true">×</span>
9265
+ </button>
9266
+ }
9070
9267
  `,
9071
- imports: [FrSheetClose],
9072
9268
  }]
9073
9269
  }], propDecorators: { scrollable: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollable", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }] } });
9074
9270
  class FrSheetHeader {
@@ -9431,6 +9627,13 @@ function coerceMenuButtonSize(value) {
9431
9627
  function coerceMenuButtonVariant(value) {
9432
9628
  return value === 'outline' ? 'outline' : 'default';
9433
9629
  }
9630
+ function coerceOptionalNumber(value) {
9631
+ if (value === null || value === undefined || value === '') {
9632
+ return null;
9633
+ }
9634
+ const coerced = numberAttribute(value, Number.NaN);
9635
+ return Number.isFinite(coerced) ? coerced : null;
9636
+ }
9434
9637
  class FrSidebarProvider {
9435
9638
  document = inject(DOCUMENT);
9436
9639
  elementRef = inject(ElementRef);
@@ -9526,20 +9729,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9526
9729
  '[attr.data-mobile-open]': 'openMobile()',
9527
9730
  '[attr.data-mobile]': 'isMobile() ? "" : null',
9528
9731
  '[attr.data-resizing]': 'resizing() ? "" : null',
9732
+ '(document:keydown)': 'handleKeydown($event)',
9529
9733
  },
9530
9734
  }]
9531
- }], ctorParameters: () => [], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }], openMobileChange: [{ type: i0.Output, args: ["openMobileChange"] }], shortcut: [{ type: i0.Input, args: [{ isSignal: true, alias: "shortcut", required: false }] }], keyboardShortcut: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardShortcut", required: false }] }], handleKeydown: [{
9532
- type: HostListener,
9533
- args: ['document:keydown', ['$event']]
9534
- }] } });
9735
+ }], ctorParameters: () => [], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }], openMobileChange: [{ type: i0.Output, args: ["openMobileChange"] }], shortcut: [{ type: i0.Input, args: [{ isSignal: true, alias: "shortcut", required: false }] }], keyboardShortcut: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardShortcut", required: false }] }] } });
9535
9736
  class FrSidebar {
9536
9737
  elementRef = inject(ElementRef);
9537
9738
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9538
9739
  side = input('left', { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), transform: coerceSide });
9539
9740
  variant = input('sidebar', { ...(ngDevMode ? { debugName: "variant" } : /* istanbul ignore next */ {}), transform: coerceVariant });
9540
9741
  collapsible = input('offcanvas', { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: coerceCollapsible });
9742
+ minSize = input(null, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9743
+ maxSize = input(384, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9744
+ resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9541
9745
  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 });
9746
+ 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 }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-side": "side()", "attr.data-variant": "variant()", "attr.data-collapsible": "collapsible()", "attr.data-resizable": "resizable() ? \"\" : null", "attr.data-state": "provider?.state() ?? \"expanded\"", "attr.data-mobile-open": "provider?.openMobile() ?? false" }, classAttribute: "frame-sidebar" }, ngImport: i0 });
9543
9747
  }
9544
9748
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, decorators: [{
9545
9749
  type: Directive,
@@ -9550,11 +9754,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9550
9754
  '[attr.data-side]': 'side()',
9551
9755
  '[attr.data-variant]': 'variant()',
9552
9756
  '[attr.data-collapsible]': 'collapsible()',
9757
+ '[attr.data-resizable]': 'resizable() ? "" : null',
9553
9758
  '[attr.data-state]': 'provider?.state() ?? "expanded"',
9554
9759
  '[attr.data-mobile-open]': 'provider?.openMobile() ?? false',
9555
9760
  },
9556
9761
  }]
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 }] }] } });
9762
+ }], 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 }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }] } });
9558
9763
  class FrSidebarTrigger {
9559
9764
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9560
9765
  ariaLabel = input('Toggle sidebar', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9586,32 +9791,42 @@ class FrSidebarRail {
9586
9791
  suppressClick = false;
9587
9792
  frameId = -1;
9588
9793
  pendingWidth = 0;
9794
+ resizeMinSize = 192;
9795
+ resizeMaxSize = 384;
9589
9796
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9590
9797
  toggle() {
9591
9798
  if (this.suppressClick) {
9592
9799
  return;
9593
9800
  }
9801
+ if (this.sidebar?.collapsible() === 'icon') {
9802
+ return;
9803
+ }
9594
9804
  this.provider?.toggleSidebar();
9595
9805
  }
9596
9806
  startResize(event) {
9597
- if (!this.sidebar || !this.provider || this.provider.isMobile()) {
9807
+ if (!this.sidebar || !this.provider || this.provider.isMobile() || !this.sidebar.resizable()) {
9598
9808
  return;
9599
9809
  }
9600
9810
  this.startX = event.clientX;
9601
9811
  this.startWidth = this.sidebar.elementRef.nativeElement.getBoundingClientRect().width;
9602
9812
  this.dragging = false;
9603
9813
  this.pendingWidth = this.startWidth;
9814
+ this.captureResizeBounds();
9604
9815
  this.provider.setResizing(true);
9605
9816
  event.preventDefault();
9606
9817
  const move = (moveEvent) => this.resize(moveEvent);
9607
9818
  const up = () => {
9608
9819
  this.document.removeEventListener('pointermove', move);
9609
9820
  this.document.removeEventListener('pointerup', up);
9610
- this.flushResize();
9821
+ if (this.dragging) {
9822
+ this.flushResize();
9823
+ }
9611
9824
  this.provider?.setResizing(false);
9612
9825
  this.suppressClick = this.dragging;
9613
9826
  this.dragging = false;
9614
9827
  this.pendingWidth = 0;
9828
+ this.resizeMinSize = 192;
9829
+ this.resizeMaxSize = 384;
9615
9830
  setTimeout(() => {
9616
9831
  this.suppressClick = false;
9617
9832
  });
@@ -9625,9 +9840,12 @@ class FrSidebarRail {
9625
9840
  }
9626
9841
  const delta = event.clientX - this.startX;
9627
9842
  const direction = this.sidebar.side() === 'right' ? -1 : 1;
9628
- const nextWidth = Math.min(Math.max(this.startWidth + delta * direction, 192), 384);
9843
+ const nextWidth = clampNumber(this.startWidth + delta * direction, this.resizeMinSize, this.resizeMaxSize);
9629
9844
  if (Math.abs(delta) > 3) {
9630
9845
  this.dragging = true;
9846
+ if (this.sidebar.collapsible() === 'icon' && !this.provider.open()) {
9847
+ this.provider.setOpen(true);
9848
+ }
9631
9849
  }
9632
9850
  this.pendingWidth = nextWidth;
9633
9851
  if (this.frameId !== -1) {
@@ -9647,6 +9865,32 @@ class FrSidebarRail {
9647
9865
  this.provider?.setSidebarWidth(this.pendingWidth);
9648
9866
  }
9649
9867
  }
9868
+ captureResizeBounds() {
9869
+ if (!this.sidebar) {
9870
+ return;
9871
+ }
9872
+ const minSize = this.sidebar.minSize() ?? this.measureContentMinSize();
9873
+ const maxSize = this.sidebar.maxSize() ?? Number.POSITIVE_INFINITY;
9874
+ this.resizeMinSize = minSize;
9875
+ this.resizeMaxSize = Math.max(minSize, maxSize);
9876
+ }
9877
+ measureContentMinSize() {
9878
+ if (!this.sidebar) {
9879
+ return 192;
9880
+ }
9881
+ const sidebarElement = this.sidebar.elementRef.nativeElement;
9882
+ const sidebarRect = sidebarElement.getBoundingClientRect();
9883
+ let measuredWidth = 0;
9884
+ for (const element of Array.from(sidebarElement.querySelectorAll('*'))) {
9885
+ if (element.hasAttribute('frSidebarRail') || element.tagName.toLowerCase() === 'frame-sidebar-rail') {
9886
+ continue;
9887
+ }
9888
+ const rect = element.getBoundingClientRect();
9889
+ const inlineStart = Math.max(0, rect.left - sidebarRect.left);
9890
+ measuredWidth = Math.max(measuredWidth, inlineStart + element.scrollWidth);
9891
+ }
9892
+ return Math.max(Math.ceil(measuredWidth), 192);
9893
+ }
9650
9894
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarRail, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9651
9895
  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
9896
  }
@@ -10036,8 +10280,8 @@ function calculateVirtualRange(options) {
10036
10280
  const overscan = Math.max(Math.trunc(options.overscan), 0);
10037
10281
  const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);
10038
10282
  const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;
10039
- const start = clamp(rawStart, 0, totalCount);
10040
- const end = clamp(start + visibleCount + overscan * 2, start, totalCount);
10283
+ const start = clampNumber(rawStart, 0, totalCount);
10284
+ const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);
10041
10285
  return {
10042
10286
  start,
10043
10287
  end,
@@ -10049,31 +10293,28 @@ function calculateScrollOffsetForIndex(index, alignment, itemSize, viewportSize,
10049
10293
  const normalizedItemSize = Math.max(itemSize, 1);
10050
10294
  const normalizedViewportSize = Math.max(viewportSize, 0);
10051
10295
  const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);
10052
- const clampedIndex = clamp(index, 0, Math.max(totalCount - 1, 0));
10296
+ const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));
10053
10297
  const itemStart = clampedIndex * normalizedItemSize;
10054
10298
  const itemEnd = itemStart + normalizedItemSize;
10055
10299
  switch (alignment) {
10056
10300
  case 'start':
10057
- return clamp(itemStart, 0, maxScrollTop);
10301
+ return clampNumber(itemStart, 0, maxScrollTop);
10058
10302
  case 'center':
10059
- return clamp(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
10303
+ return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
10060
10304
  case 'end':
10061
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10305
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10062
10306
  case 'nearest':
10063
10307
  case 'auto':
10064
10308
  default:
10065
10309
  if (itemStart < currentScrollTop) {
10066
- return clamp(itemStart, 0, maxScrollTop);
10310
+ return clampNumber(itemStart, 0, maxScrollTop);
10067
10311
  }
10068
10312
  if (itemEnd > currentScrollTop + normalizedViewportSize) {
10069
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10313
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10070
10314
  }
10071
- return clamp(currentScrollTop, 0, maxScrollTop);
10315
+ return clampNumber(currentScrollTop, 0, maxScrollTop);
10072
10316
  }
10073
10317
  }
10074
- function clamp(value, min, max) {
10075
- return Math.min(Math.max(value, min), max);
10076
- }
10077
10318
 
10078
10319
  class FrVirtualViewport {
10079
10320
  destroyRef = inject(DestroyRef);
@@ -10304,5 +10545,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10304
10545
  * Generated bundle index. Do not edit.
10305
10546
  */
10306
10547
 
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 };
10548
+ 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_MODAL_REF, 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, FrModalRef, 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
10549
  //# sourceMappingURL=frame-ui-ng-components.mjs.map