@frame-ui-ng/components 0.3.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 (51) hide show
  1. package/button/src/styles/button.css +5 -1
  2. package/button-group/src/styles/button-group.css +6 -0
  3. package/fesm2022/frame-ui-ng-components-combobox.mjs +48 -51
  4. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  5. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +162 -0
  6. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
  7. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +1 -1
  8. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  9. package/fesm2022/frame-ui-ng-components-input-otp.mjs +64 -69
  10. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  11. package/fesm2022/frame-ui-ng-components-modal.mjs +93 -15
  12. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  13. package/fesm2022/frame-ui-ng-components-pagination.mjs +37 -36
  14. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  15. package/fesm2022/frame-ui-ng-components-progress.mjs +2 -1
  16. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  17. package/fesm2022/frame-ui-ng-components-resizable.mjs +16 -26
  18. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  19. package/fesm2022/frame-ui-ng-components-sheet.mjs +19 -16
  20. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  21. package/fesm2022/frame-ui-ng-components-sidebar.mjs +19 -13
  22. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  23. package/fesm2022/frame-ui-ng-components-slider.mjs +53 -59
  24. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  25. package/fesm2022/frame-ui-ng-components-tooltip.mjs +44 -0
  26. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  27. package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
  28. package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
  29. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +10 -12
  30. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  31. package/fesm2022/frame-ui-ng-components.mjs +353 -296
  32. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  33. package/item/src/styles/item.css +188 -187
  34. package/modal/src/styles/modal.css +10 -1
  35. package/package.json +10 -2
  36. package/sidebar/src/styles/sidebar.css +10 -4
  37. package/src/styles/blueprint.css +98 -0
  38. package/src/styles/components.css +4 -4
  39. package/styles/blueprint.css +98 -0
  40. package/styles/components.css +4 -4
  41. package/styles.css +4 -4
  42. package/tooltip/src/styles/tooltip.css +4 -4
  43. package/types/frame-ui-ng-components-combobox.d.ts +1 -1
  44. package/types/frame-ui-ng-components-confirm-modal.d.ts +48 -0
  45. package/types/frame-ui-ng-components-input-otp.d.ts +1 -1
  46. package/types/frame-ui-ng-components-modal.d.ts +18 -7
  47. package/types/frame-ui-ng-components-sheet.d.ts +2 -0
  48. package/types/frame-ui-ng-components-sidebar.d.ts +2 -2
  49. package/types/frame-ui-ng-components-tooltip.d.ts +5 -0
  50. package/types/frame-ui-ng-components-utils.d.ts +5 -0
  51. package/types/frame-ui-ng-components.d.ts +68 -55
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, effect, Directive, input, booleanAttribute, computed, output, signal, Component, contentChild, forwardRef, ChangeDetectionStrategy, Renderer2, RendererStyleFlags2, DestroyRef, TemplateRef, model, afterNextRender, ViewChild, ViewContainerRef, Injectable, viewChild, 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');
@@ -2287,7 +2288,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2287
2288
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
2288
2289
  selectedLabels = new Map();
2289
2290
  resizeObserver = null;
2290
- origin;
2291
+ origin = viewChild(CdkOverlayOrigin, ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
2291
2292
  content = contentChild(FrComboboxContent, ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
2292
2293
  autoHighlight = input(false, { ...(ngDevMode ? { debugName: "autoHighlight" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2293
2294
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -2454,7 +2455,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2454
2455
  this.itemsVersion.update((value) => value + 1);
2455
2456
  }
2456
2457
  measureAnchor() {
2457
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2458
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2458
2459
  if (typeof element?.getBoundingClientRect !== 'function') {
2459
2460
  this.anchorWidth.set(null);
2460
2461
  return;
@@ -2465,7 +2466,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2465
2466
  if (typeof ResizeObserver === 'undefined') {
2466
2467
  return;
2467
2468
  }
2468
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2469
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
2469
2470
  if (typeof element?.getBoundingClientRect !== 'function') {
2470
2471
  return;
2471
2472
  }
@@ -2479,27 +2480,27 @@ class FrCombobox extends FrControlValueAccessor$1 {
2479
2480
  provide: FrComboboxRootLookup,
2480
2481
  useExisting: FrCombobox,
2481
2482
  },
2482
- ], 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: `
2483
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2484
- <ng-content />
2485
- </span>
2486
-
2487
- <ng-template
2488
- cdkConnectedOverlay
2489
- [cdkConnectedOverlayOrigin]="origin"
2490
- [cdkConnectedOverlayOpen]="isOpen()"
2491
- [cdkConnectedOverlayPositions]="positions"
2492
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2493
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
2494
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2495
- (overlayOutsideClick)="close()"
2496
- (positionChange)="handlePositionChange($event)"
2497
- (detach)="close()"
2498
- >
2499
- @if (content()) {
2500
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2501
- }
2502
- </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>
2503
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"] }] });
2504
2505
  }
2505
2506
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCombobox, decorators: [{
@@ -2520,33 +2521,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2520
2521
  '[attr.data-disabled]': 'disabled() ? "" : null',
2521
2522
  '[attr.data-invalid]': 'invalid() ? "" : null'
2522
2523
  },
2523
- template: `
2524
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
2525
- <ng-content />
2526
- </span>
2527
-
2528
- <ng-template
2529
- cdkConnectedOverlay
2530
- [cdkConnectedOverlayOrigin]="origin"
2531
- [cdkConnectedOverlayOpen]="isOpen()"
2532
- [cdkConnectedOverlayPositions]="positions"
2533
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
2534
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
2535
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
2536
- (overlayOutsideClick)="close()"
2537
- (positionChange)="handlePositionChange($event)"
2538
- (detach)="close()"
2539
- >
2540
- @if (content()) {
2541
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
2542
- }
2543
- </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>
2544
2545
  `,
2545
2546
  }]
2546
- }], ctorParameters: () => [], propDecorators: { origin: [{
2547
- type: ViewChild,
2548
- args: [CdkOverlayOrigin]
2549
- }], 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"] }] } });
2550
2548
 
2551
2549
  class FrComboboxInput {
2552
2550
  root = inject(FrCombobox);
@@ -4490,7 +4488,7 @@ function mergeTime(date, timeSource) {
4490
4488
  }
4491
4489
 
4492
4490
  const DEFAULT_SIDE_OFFSET = 4;
4493
- const MIN_SUBMENU_SIDE_OFFSET = 16;
4491
+ const MIN_SUBMENU_SIDE_OFFSET = 8;
4494
4492
  function defaultPositions(isSubmenu) {
4495
4493
  return buildConnectedPositions({
4496
4494
  align: 'start',
@@ -5938,7 +5936,7 @@ const FR_INPUT_OTP_PATTERN_DIGITS = /^[0-9]$/;
5938
5936
  const FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS = /^[a-zA-Z0-9]$/;
5939
5937
  const FR_INPUT_OTP_CONTROLLER = new InjectionToken('FrInputOtpController');
5940
5938
  class FrInputOtp extends FrControlValueAccessor$1 {
5941
- nativeInput;
5939
+ nativeInput = viewChild('nativeInput', ...(ngDevMode ? [{ debugName: "nativeInput" }] : /* istanbul ignore next */ []));
5942
5940
  maxLength = input(6, { ...(ngDevMode ? { debugName: "maxLength" } : /* istanbul ignore next */ {}), transform: numberAttribute });
5943
5941
  pattern = input(FR_INPUT_OTP_PATTERN_DIGITS, ...(ngDevMode ? [{ debugName: "pattern" }] : /* istanbul ignore next */ []));
5944
5942
  disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled', transform: booleanAttribute });
@@ -5955,11 +5953,11 @@ class FrInputOtp extends FrControlValueAccessor$1 {
5955
5953
  if (this.disabled()) {
5956
5954
  return;
5957
5955
  }
5958
- const inputElement = this.nativeInput?.nativeElement;
5956
+ const inputElement = this.nativeInput()?.nativeElement;
5959
5957
  if (!inputElement) {
5960
5958
  return;
5961
5959
  }
5962
- const nextIndex = clamp$2(index, 0, this.maxLength());
5960
+ const nextIndex = clampNumber(index, 0, this.maxLength());
5963
5961
  inputElement.focus();
5964
5962
  inputElement.setSelectionRange(nextIndex, nextIndex);
5965
5963
  this.activeIndex.set(nextIndex);
@@ -6006,9 +6004,9 @@ class FrInputOtp extends FrControlValueAccessor$1 {
6006
6004
  this.focus(Math.min(next.length, this.maxLength()));
6007
6005
  }
6008
6006
  syncActiveIndex() {
6009
- const inputElement = this.nativeInput?.nativeElement;
6007
+ const inputElement = this.nativeInput()?.nativeElement;
6010
6008
  const index = inputElement?.selectionStart ?? this.value().length;
6011
- this.activeIndex.set(clamp$2(index, 0, this.maxLength()));
6009
+ this.activeIndex.set(clampNumber(index, 0, this.maxLength()));
6012
6010
  }
6013
6011
  markTouched() {
6014
6012
  this.markAsTouched();
@@ -6038,7 +6036,7 @@ class FrInputOtp extends FrControlValueAccessor$1 {
6038
6036
  }
6039
6037
  replaceFrom(index, text) {
6040
6038
  const value = this.value();
6041
- const start = clamp$2(index, 0, this.maxLength());
6039
+ const start = clampNumber(index, 0, this.maxLength());
6042
6040
  const next = `${value.slice(0, start)}${text}${value.slice(start + text.length)}`;
6043
6041
  return this.sanitize(next);
6044
6042
  }
@@ -6057,35 +6055,35 @@ class FrInputOtp extends FrControlValueAccessor$1 {
6057
6055
  return characters.slice(0, this.maxLength()).join('');
6058
6056
  }
6059
6057
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtp, deps: null, target: i0.ɵɵFactoryTarget.Component });
6060
- 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: [
6061
6059
  provideDsValueAccessor$1(FrInputOtp),
6062
6060
  {
6063
6061
  provide: FR_INPUT_OTP_CONTROLLER,
6064
6062
  useExisting: FrInputOtp,
6065
6063
  },
6066
- ], viewQueries: [{ propertyName: "nativeInput", first: true, predicate: ["nativeInput"], descendants: true }], exportAs: ["frInputOtp"], usesInheritance: true, ngImport: i0, template: `
6067
- <input
6068
- #nativeInput
6069
- frInput
6070
- class="frame-input-otp__native"
6071
- type="text"
6072
- inputmode="numeric"
6073
- autocomplete="one-time-code"
6074
- [attr.aria-invalid]="invalid() ? 'true' : null"
6075
- [attr.aria-label]="ariaLabel()"
6076
- [disabled]="disabled()"
6077
- [maxLength]="maxLength()"
6078
- [value]="value()"
6079
- (blur)="markTouched()"
6080
- (focus)="syncActiveIndex()"
6081
- (input)="handleNativeInput($any($event.target).value)"
6082
- (keydown)="handleKeydown($event)"
6083
- (paste)="handlePaste($event)"
6084
- (select)="syncActiveIndex()"
6085
- (click)="syncActiveIndex()"
6086
- />
6087
-
6088
- <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 />
6089
6087
  `, isInline: true, dependencies: [{ kind: "directive", type: FrInput$1, selector: "input[frInput]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6090
6088
  }
6091
6089
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtp, decorators: [{
@@ -6110,35 +6108,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6110
6108
  '[attr.data-complete]': 'isComplete() ? "" : null',
6111
6109
  '(click)': 'focus(activeIndex())',
6112
6110
  },
6113
- template: `
6114
- <input
6115
- #nativeInput
6116
- frInput
6117
- class="frame-input-otp__native"
6118
- type="text"
6119
- inputmode="numeric"
6120
- autocomplete="one-time-code"
6121
- [attr.aria-invalid]="invalid() ? 'true' : null"
6122
- [attr.aria-label]="ariaLabel()"
6123
- [disabled]="disabled()"
6124
- [maxLength]="maxLength()"
6125
- [value]="value()"
6126
- (blur)="markTouched()"
6127
- (focus)="syncActiveIndex()"
6128
- (input)="handleNativeInput($any($event.target).value)"
6129
- (keydown)="handleKeydown($event)"
6130
- (paste)="handlePaste($event)"
6131
- (select)="syncActiveIndex()"
6132
- (click)="syncActiveIndex()"
6133
- />
6134
-
6135
- <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 />
6136
6134
  `,
6137
6135
  }]
6138
- }], propDecorators: { nativeInput: [{
6139
- type: ViewChild,
6140
- args: ['nativeInput']
6141
- }], 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"] }] } });
6142
6137
  class FrInputOtpGroup {
6143
6138
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6144
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 });
@@ -6160,10 +6155,10 @@ class FrInputOtpSlot {
6160
6155
  filled = computed(() => !!this.char(), ...(ngDevMode ? [{ debugName: "filled" }] : /* istanbul ignore next */ []));
6161
6156
  active = computed(() => this.root.activeIndex() === this.index(), ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
6162
6157
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
6163
- 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: `
6164
- <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6165
- {{ char() || placeholder() }}
6166
- </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>
6167
6162
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6168
6163
  }
6169
6164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpSlot, decorators: [{
@@ -6181,10 +6176,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6181
6176
  '[attr.data-disabled]': 'root.disabled() ? "" : null',
6182
6177
  '(click)': 'root.focus(index())',
6183
6178
  },
6184
- template: `
6185
- <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6186
- {{ char() || placeholder() }}
6187
- </span>
6179
+ template: `
6180
+ <span class="frame-input-otp__slot-char" [ngClass]="{ 'frame-input-otp__slot-char--empty': !filled() }">
6181
+ {{ char() || placeholder() }}
6182
+ </span>
6188
6183
  `,
6189
6184
  }]
6190
6185
  }], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
@@ -6216,9 +6211,6 @@ function toMatcher(pattern) {
6216
6211
  const regex = new RegExp(pattern);
6217
6212
  return (character) => regex.test(character);
6218
6213
  }
6219
- function clamp$2(value, min, max) {
6220
- return Math.max(min, Math.min(max, value));
6221
- }
6222
6214
 
6223
6215
  const FR_ITEM_VARIANTS = ['default', 'outline', 'muted'];
6224
6216
  const FR_ITEM_SIZES = ['default', 'sm', 'xs'];
@@ -6835,7 +6827,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6835
6827
  }]
6836
6828
  }] });
6837
6829
 
6830
+ class FrModalRef extends DialogRef {
6831
+ }
6832
+
6838
6833
  const FR_MODAL_DATA = DIALOG_DATA;
6834
+ const FR_MODAL_REF = FrModalRef;
6839
6835
 
6840
6836
  class FrModalShell {
6841
6837
  dialogRef = inject((DialogRef));
@@ -6971,26 +6967,27 @@ const DEFAULT_PANEL_CLASS$1 = 'frame-modal__overlay-pane';
6971
6967
  const DEFAULT_BACKDROP_CLASS$1 = 'frame-modal__backdrop';
6972
6968
  class FrModalService {
6973
6969
  dialog = inject(Dialog);
6974
- open(content, config = {}) {
6975
- 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)) {
6976
6973
  const shellConfig = {
6977
- ...withoutShellOptions$1(config),
6974
+ ...withoutShellOptions$1(resolvedConfig),
6978
6975
  data: {
6979
6976
  bodyComponent: content,
6980
- bodyData: config.bodyData ?? config.data,
6981
- bodyInputs: config.bodyInputs,
6982
- description: config.description,
6983
- footerActions: config.footerActions,
6984
- scrollable: config.scrollable,
6985
- showCloseButton: config.showCloseButton,
6986
- size: config.size,
6987
- stickyFooter: config.stickyFooter,
6988
- 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,
6989
6986
  },
6990
6987
  };
6991
6988
  return this.dialog.open(FrModalShell, this.withDefaultClasses(shellConfig));
6992
6989
  }
6993
- return this.dialog.open(content, this.withDefaultClasses(config));
6990
+ return this.dialog.open(content, this.withDefaultClasses(resolvedConfig));
6994
6991
  }
6995
6992
  closeAll() {
6996
6993
  this.dialog.closeAll();
@@ -7004,6 +7001,7 @@ class FrModalService {
7004
7001
  ...config,
7005
7002
  panelClass: mergeClassList$1(config.panelClass, DEFAULT_PANEL_CLASS$1),
7006
7003
  backdropClass: mergeClassList$1(config.backdropClass, DEFAULT_BACKDROP_CLASS$1),
7004
+ providers: withModalRefProvider(config.providers),
7007
7005
  };
7008
7006
  }
7009
7007
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -7022,6 +7020,7 @@ function hasShellOptions$1(config) {
7022
7020
  config.bodyInputs,
7023
7021
  config.description,
7024
7022
  config.footerActions,
7023
+ config.inputs,
7025
7024
  config.scrollable,
7026
7025
  config.showCloseButton,
7027
7026
  config.size,
@@ -7030,9 +7029,70 @@ function hasShellOptions$1(config) {
7030
7029
  ].some((value) => value !== undefined);
7031
7030
  }
7032
7031
  function withoutShellOptions$1(config) {
7033
- 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;
7034
7033
  return dialogConfig;
7035
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
+ }
7036
7096
  function mergeClassList$1(classList, defaultClass) {
7037
7097
  const classes = Array.isArray(classList)
7038
7098
  ? classList
@@ -7041,6 +7101,16 @@ function mergeClassList$1(classList, defaultClass) {
7041
7101
  : [];
7042
7102
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
7043
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
+ }
7044
7114
 
7045
7115
  class FrModalTrigger {
7046
7116
  static CUSTOM_PROPERTY_PREFIX = '--frame-modal-';
@@ -7363,7 +7433,7 @@ class FrPagination {
7363
7433
  canNext = computed(() => this.page() < this.normalizedTotalPages(), ...(ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []));
7364
7434
  pages = computed(() => this.buildPages(), ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
7365
7435
  goToPage(page) {
7366
- this.page.set(Math.min(Math.max(page, 1), this.normalizedTotalPages()));
7436
+ this.page.set(clampNumber(page, 1, this.normalizedTotalPages()));
7367
7437
  }
7368
7438
  goToPreviousPage() {
7369
7439
  this.goToPage(this.page() - 1);
@@ -7378,7 +7448,7 @@ class FrPagination {
7378
7448
  const totalPages = this.normalizedTotalPages();
7379
7449
  const boundaryCount = Math.max(0, Math.floor(this.boundaryCount()));
7380
7450
  const siblingCount = Math.max(0, Math.floor(this.siblingCount()));
7381
- const currentPage = Math.min(Math.max(this.page(), 1), totalPages);
7451
+ const currentPage = clampNumber(this.page(), 1, totalPages);
7382
7452
  const pages = new Set();
7383
7453
  for (let page = 1; page <= Math.min(boundaryCount, totalPages); page += 1) {
7384
7454
  pages.add(page);
@@ -7518,13 +7588,13 @@ class FrPaginationPrevious {
7518
7588
  this.pagination.goToPreviousPage();
7519
7589
  }
7520
7590
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationPrevious, deps: [], target: i0.ɵɵFactoryTarget.Component });
7521
- 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: `
7522
- <span class="frame-pagination__control-icon" aria-hidden="true">
7523
- <ng-content select="[frPaginationIcon]">‹</ng-content>
7524
- </span>
7525
- @if (!iconOnly()) {
7526
- <span class="frame-pagination__control-text">{{ text() }}</span>
7527
- }
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
+ }
7528
7598
  `, isInline: true });
7529
7599
  }
7530
7600
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationPrevious, decorators: [{
@@ -7541,13 +7611,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7541
7611
  '[attr.tabindex]': 'isDisabled() ? "-1" : null',
7542
7612
  '(click)': 'handleClick($event)',
7543
7613
  },
7544
- template: `
7545
- <span class="frame-pagination__control-icon" aria-hidden="true">
7546
- <ng-content select="[frPaginationIcon]">‹</ng-content>
7547
- </span>
7548
- @if (!iconOnly()) {
7549
- <span class="frame-pagination__control-text">{{ text() }}</span>
7550
- }
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
+ }
7551
7621
  `,
7552
7622
  }]
7553
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 }] }] } });
@@ -7570,13 +7640,13 @@ class FrPaginationNext {
7570
7640
  this.pagination.goToNextPage();
7571
7641
  }
7572
7642
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationNext, deps: [], target: i0.ɵɵFactoryTarget.Component });
7573
- 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: `
7574
- @if (!iconOnly()) {
7575
- <span class="frame-pagination__control-text">{{ text() }}</span>
7576
- }
7577
- <span class="frame-pagination__control-icon" aria-hidden="true">
7578
- <ng-content select="[frPaginationIcon]">›</ng-content>
7579
- </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>
7580
7650
  `, isInline: true });
7581
7651
  }
7582
7652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationNext, decorators: [{
@@ -7593,22 +7663,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7593
7663
  '[attr.tabindex]': 'isDisabled() ? "-1" : null',
7594
7664
  '(click)': 'handleClick($event)',
7595
7665
  },
7596
- template: `
7597
- @if (!iconOnly()) {
7598
- <span class="frame-pagination__control-text">{{ text() }}</span>
7599
- }
7600
- <span class="frame-pagination__control-icon" aria-hidden="true">
7601
- <ng-content select="[frPaginationIcon]">›</ng-content>
7602
- </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>
7603
7673
  `,
7604
7674
  }]
7605
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 }] }] } });
7606
7676
  class FrPaginationEllipsis {
7607
7677
  label = input('More pages', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7608
7678
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
7609
- 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: `
7610
- <span aria-hidden="true">...</span>
7611
- <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>
7612
7682
  `, isInline: true });
7613
7683
  }
7614
7684
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationEllipsis, decorators: [{
@@ -7619,9 +7689,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7619
7689
  class: 'frame-pagination__ellipsis',
7620
7690
  role: 'presentation',
7621
7691
  },
7622
- template: `
7623
- <span aria-hidden="true">...</span>
7624
- <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>
7625
7695
  `,
7626
7696
  }]
7627
7697
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
@@ -8036,7 +8106,7 @@ class FrProgress {
8036
8106
  if (value === null) {
8037
8107
  return 0;
8038
8108
  }
8039
- return Math.min(Math.max(value, 0), this.max());
8109
+ return clampNumber(value, 0, this.max());
8040
8110
  }, ...(ngDevMode ? [{ debugName: "normalizedValue" }] : /* istanbul ignore next */ []));
8041
8111
  percentage = computed(() => (this.normalizedValue() / this.max()) * 100, ...(ngDevMode ? [{ debugName: "percentage" }] : /* istanbul ignore next */ []));
8042
8112
  state = computed(() => {
@@ -8166,13 +8236,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8166
8236
 
8167
8237
  const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'];
8168
8238
  let nextResizableId = 0;
8169
- function coerceSize(value, fallback) {
8170
- const parsed = Number(value);
8171
- return Number.isFinite(parsed) ? parsed : fallback;
8172
- }
8173
- function clampSize(value, min, max) {
8174
- return Math.min(Math.max(value, min), max);
8175
- }
8176
8239
  class FrResizablePanelGroup {
8177
8240
  elementRef = inject((ElementRef));
8178
8241
  groupId = `frame-resizable-${++nextResizableId}`;
@@ -8212,7 +8275,7 @@ class FrResizablePanelGroup {
8212
8275
  panel.style.flexGrow = '0';
8213
8276
  panel.style.flexShrink = '0';
8214
8277
  if (!panel.style.flexBasis) {
8215
- 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)));
8216
8279
  }
8217
8280
  else {
8218
8281
  this.applyPanelSize(panel, this.panelSize(panel) ?? 0);
@@ -8302,8 +8365,8 @@ class FrResizablePanelGroup {
8302
8365
  resizePair(previousPanel, nextPanel, pairTotal, requestedPreviousSize) {
8303
8366
  const previousMin = this.minSize(previousPanel);
8304
8367
  const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));
8305
- const previousSize = clampSize(requestedPreviousSize, previousMin, previousMax);
8306
- 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));
8307
8370
  this.applyPanelSize(previousPanel, previousSize);
8308
8371
  this.applyPanelSize(nextPanel, nextSize);
8309
8372
  this.updateHandleMetadata();
@@ -8362,16 +8425,16 @@ class FrResizablePanelGroup {
8362
8425
  }
8363
8426
  defaultSize(panel) {
8364
8427
  const value = panel.getAttribute('data-default-size');
8365
- return value === null ? null : coerceSize(value, 0);
8428
+ return value === null ? null : coerceNumber(value, 0);
8366
8429
  }
8367
8430
  minSize(panel) {
8368
- return coerceSize(panel.getAttribute('data-min-size'), 0);
8431
+ return coerceNumber(panel.getAttribute('data-min-size'), 0);
8369
8432
  }
8370
8433
  maxSize(panel) {
8371
- return coerceSize(panel.getAttribute('data-max-size'), 100);
8434
+ return coerceNumber(panel.getAttribute('data-max-size'), 100);
8372
8435
  }
8373
8436
  collapsedSize(panel) {
8374
- return coerceSize(panel.getAttribute('data-collapsed-size'), 0);
8437
+ return coerceNumber(panel.getAttribute('data-collapsed-size'), 0);
8375
8438
  }
8376
8439
  collapsible(panel) {
8377
8440
  return panel.hasAttribute('data-collapsible');
@@ -8392,11 +8455,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8392
8455
  }]
8393
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"] }] } });
8394
8457
  class FrResizablePanel {
8395
- defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 0) });
8396
- minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceSize(value, 0) });
8397
- 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) });
8398
8461
  collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
8399
- 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) });
8400
8463
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrResizablePanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8401
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 });
8402
8465
  }
@@ -8445,15 +8508,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8445
8508
  '[attr.data-orientation]': 'group.orientation()',
8446
8509
  '[attr.data-handle]': 'withHandle() ? "" : null',
8447
8510
  '[attr.data-disabled]': 'group.disabled() ? "" : null',
8511
+ '(pointerdown)': 'onPointerDown($event)',
8512
+ '(keydown)': 'onKeydown($event)',
8448
8513
  },
8449
8514
  }]
8450
- }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }], onPointerDown: [{
8451
- type: HostListener,
8452
- args: ['pointerdown', ['$event']]
8453
- }], onKeydown: [{
8454
- type: HostListener,
8455
- args: ['keydown', ['$event']]
8456
- }] } });
8515
+ }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }] } });
8457
8516
 
8458
8517
  const FR_SELECT_POSITIONS = ['item-aligned', 'popper'];
8459
8518
  class FrSelectContent extends FrDropdownMenuContent$1 {
@@ -8827,10 +8886,6 @@ const FR_SLIDER_ORIENTATIONS = ['horizontal', 'vertical'];
8827
8886
  function coerceOrientation(value) {
8828
8887
  return value === 'vertical' ? 'vertical' : 'horizontal';
8829
8888
  }
8830
- function coerceNumber(value, fallback) {
8831
- const parsed = Number(value);
8832
- return Number.isFinite(parsed) ? parsed : fallback;
8833
- }
8834
8889
  function coerceValue(value) {
8835
8890
  if (Array.isArray(value)) {
8836
8891
  return value.map((item) => coerceNumber(item, 0));
@@ -8966,7 +9021,7 @@ class FrSlider extends FrControlValueAccessor$1 {
8966
9021
  const next = index < normalized.length - 1 ? normalized[index + 1] - minDistance : max;
8967
9022
  const lower = activeIndex === index ? previous : min;
8968
9023
  const upper = activeIndex === index ? next : max;
8969
- return this.snap(clamp$1(value, lower, upper), min, step);
9024
+ return this.snap(clampNumber(value, lower, upper), min, step);
8970
9025
  });
8971
9026
  }
8972
9027
  snap(value, min, step) {
@@ -8989,7 +9044,7 @@ class FrSlider extends FrControlValueAccessor$1 {
8989
9044
  if (this.inverted()) {
8990
9045
  percent = 1 - percent;
8991
9046
  }
8992
- return this.min() + clamp$1(percent, 0, 1) * (this.max() - this.min());
9047
+ return this.min() + clampNumber(percent, 0, 1) * (this.max() - this.min());
8993
9048
  }
8994
9049
  closestThumbIndex(value) {
8995
9050
  return this.values().reduce((closestIndex, thumb, index, values) => {
@@ -9002,31 +9057,31 @@ class FrSlider extends FrControlValueAccessor$1 {
9002
9057
  return getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';
9003
9058
  }
9004
9059
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
9005
- 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: `
9006
- <span class="frame-slider__track">
9007
- <span class="frame-slider__range"></span>
9008
- </span>
9009
-
9010
- @for (thumb of values(); track $index) {
9011
- <input
9012
- class="frame-slider__native"
9013
- type="range"
9014
- [attr.aria-label]="thumbLabel($index)"
9015
- [attr.aria-valuetext]="valueText(thumb)"
9016
- [disabled]="disabled()"
9017
- [min]="min()"
9018
- [max]="max()"
9019
- [step]="step()"
9020
- [value]="thumb"
9021
- (blur)="markTouched()"
9022
- (input)="handleNativeInput($index, $any($event.target).value)"
9023
- />
9024
- <span
9025
- class="frame-slider__thumb"
9026
- [attr.data-active]="activeThumb() === $index ? '' : null"
9027
- [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
9028
- ></span>
9029
- }
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
+ }
9030
9085
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
9031
9086
  }
9032
9087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, decorators: [{
@@ -9046,37 +9101,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9046
9101
  '[style.--frame-slider-end-percent]': 'rangeEndPercent() + "%"',
9047
9102
  '(pointerdown)': 'handlePointerDown($event)',
9048
9103
  },
9049
- template: `
9050
- <span class="frame-slider__track">
9051
- <span class="frame-slider__range"></span>
9052
- </span>
9053
-
9054
- @for (thumb of values(); track $index) {
9055
- <input
9056
- class="frame-slider__native"
9057
- type="range"
9058
- [attr.aria-label]="thumbLabel($index)"
9059
- [attr.aria-valuetext]="valueText(thumb)"
9060
- [disabled]="disabled()"
9061
- [min]="min()"
9062
- [max]="max()"
9063
- [step]="step()"
9064
- [value]="thumb"
9065
- (blur)="markTouched()"
9066
- (input)="handleNativeInput($index, $any($event.target).value)"
9067
- />
9068
- <span
9069
- class="frame-slider__thumb"
9070
- [attr.data-active]="activeThumb() === $index ? '' : null"
9071
- [style.--frame-slider-thumb-percent]="percentForValue(thumb) + '%'"
9072
- ></span>
9073
- }
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
+ }
9074
9129
  `,
9075
9130
  }]
9076
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"] }] } });
9077
- function clamp$1(value, min, max) {
9078
- return Math.min(Math.max(value, min), max);
9079
- }
9080
9132
 
9081
9133
  const FR_SEPARATOR_ORIENTATIONS = ['horizontal', 'vertical'];
9082
9134
  function coerceSeparatorOrientation(value) {
@@ -9179,18 +9231,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9179
9231
  }]
9180
9232
  }], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "frSheetClose", required: false }] }] } });
9181
9233
  class FrSheetPanel {
9234
+ dialogRef = inject(DialogRef, { optional: true });
9182
9235
  scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9183
9236
  showCloseButton = input(true, { ...(ngDevMode ? { debugName: "showCloseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9184
9237
  side = input('right', { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), transform: coerceSheetSide });
9185
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
9186
- 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: `
9187
- <ng-content />
9188
- @if (showCloseButton()) {
9189
- <button class="frame-sheet__close" frSheetClose type="button" aria-label="Close sheet">
9190
- <span aria-hidden="true">×</span>
9191
- </button>
9238
+ close() {
9239
+ this.dialogRef?.close();
9192
9240
  }
9193
- `, 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 });
9194
9250
  }
9195
9251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetPanel, decorators: [{
9196
9252
  type: Component,
@@ -9201,15 +9257,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9201
9257
  '[attr.data-scrollable]': 'scrollable() ? "" : null',
9202
9258
  '[attr.data-side]': 'side()',
9203
9259
  },
9204
- template: `
9205
- <ng-content />
9206
- @if (showCloseButton()) {
9207
- <button class="frame-sheet__close" frSheetClose type="button" aria-label="Close sheet">
9208
- <span aria-hidden="true">×</span>
9209
- </button>
9210
- }
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
+ }
9211
9267
  `,
9212
- imports: [FrSheetClose],
9213
9268
  }]
9214
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 }] }] } });
9215
9270
  class FrSheetHeader {
@@ -9674,12 +9729,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9674
9729
  '[attr.data-mobile-open]': 'openMobile()',
9675
9730
  '[attr.data-mobile]': 'isMobile() ? "" : null',
9676
9731
  '[attr.data-resizing]': 'resizing() ? "" : null',
9732
+ '(document:keydown)': 'handleKeydown($event)',
9677
9733
  },
9678
9734
  }]
9679
- }], 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: [{
9680
- type: HostListener,
9681
- args: ['document:keydown', ['$event']]
9682
- }] } });
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 }] }] } });
9683
9736
  class FrSidebar {
9684
9737
  elementRef = inject(ElementRef);
9685
9738
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
@@ -9688,8 +9741,9 @@ class FrSidebar {
9688
9741
  collapsible = input('offcanvas', { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: coerceCollapsible });
9689
9742
  minSize = input(null, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9690
9743
  maxSize = input(384, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: coerceOptionalNumber });
9744
+ resizable = input(true, { ...(ngDevMode ? { debugName: "resizable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9691
9745
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9692
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSidebar, isStandalone: true, selector: "[frSidebar], frame-sidebar", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-side": "side()", "attr.data-variant": "variant()", "attr.data-collapsible": "collapsible()", "attr.data-state": "provider?.state() ?? \"expanded\"", "attr.data-mobile-open": "provider?.openMobile() ?? false" }, classAttribute: "frame-sidebar" }, ngImport: i0 });
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 });
9693
9747
  }
9694
9748
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebar, decorators: [{
9695
9749
  type: Directive,
@@ -9700,11 +9754,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9700
9754
  '[attr.data-side]': 'side()',
9701
9755
  '[attr.data-variant]': 'variant()',
9702
9756
  '[attr.data-collapsible]': 'collapsible()',
9757
+ '[attr.data-resizable]': 'resizable() ? "" : null',
9703
9758
  '[attr.data-state]': 'provider?.state() ?? "expanded"',
9704
9759
  '[attr.data-mobile-open]': 'provider?.openMobile() ?? false',
9705
9760
  },
9706
9761
  }]
9707
- }], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }] } });
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 }] }] } });
9708
9763
  class FrSidebarTrigger {
9709
9764
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9710
9765
  ariaLabel = input('Toggle sidebar', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9743,10 +9798,13 @@ class FrSidebarRail {
9743
9798
  if (this.suppressClick) {
9744
9799
  return;
9745
9800
  }
9801
+ if (this.sidebar?.collapsible() === 'icon') {
9802
+ return;
9803
+ }
9746
9804
  this.provider?.toggleSidebar();
9747
9805
  }
9748
9806
  startResize(event) {
9749
- if (!this.sidebar || !this.provider || this.provider.isMobile()) {
9807
+ if (!this.sidebar || !this.provider || this.provider.isMobile() || !this.sidebar.resizable()) {
9750
9808
  return;
9751
9809
  }
9752
9810
  this.startX = event.clientX;
@@ -9760,7 +9818,9 @@ class FrSidebarRail {
9760
9818
  const up = () => {
9761
9819
  this.document.removeEventListener('pointermove', move);
9762
9820
  this.document.removeEventListener('pointerup', up);
9763
- this.flushResize();
9821
+ if (this.dragging) {
9822
+ this.flushResize();
9823
+ }
9764
9824
  this.provider?.setResizing(false);
9765
9825
  this.suppressClick = this.dragging;
9766
9826
  this.dragging = false;
@@ -9780,9 +9840,12 @@ class FrSidebarRail {
9780
9840
  }
9781
9841
  const delta = event.clientX - this.startX;
9782
9842
  const direction = this.sidebar.side() === 'right' ? -1 : 1;
9783
- const nextWidth = this.clampWidth(this.startWidth + delta * direction);
9843
+ const nextWidth = clampNumber(this.startWidth + delta * direction, this.resizeMinSize, this.resizeMaxSize);
9784
9844
  if (Math.abs(delta) > 3) {
9785
9845
  this.dragging = true;
9846
+ if (this.sidebar.collapsible() === 'icon' && !this.provider.open()) {
9847
+ this.provider.setOpen(true);
9848
+ }
9786
9849
  }
9787
9850
  this.pendingWidth = nextWidth;
9788
9851
  if (this.frameId !== -1) {
@@ -9802,9 +9865,6 @@ class FrSidebarRail {
9802
9865
  this.provider?.setSidebarWidth(this.pendingWidth);
9803
9866
  }
9804
9867
  }
9805
- clampWidth(width) {
9806
- return Math.min(Math.max(width, this.resizeMinSize), this.resizeMaxSize);
9807
- }
9808
9868
  captureResizeBounds() {
9809
9869
  if (!this.sidebar) {
9810
9870
  return;
@@ -10220,8 +10280,8 @@ function calculateVirtualRange(options) {
10220
10280
  const overscan = Math.max(Math.trunc(options.overscan), 0);
10221
10281
  const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);
10222
10282
  const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;
10223
- const start = clamp(rawStart, 0, totalCount);
10224
- 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);
10225
10285
  return {
10226
10286
  start,
10227
10287
  end,
@@ -10233,31 +10293,28 @@ function calculateScrollOffsetForIndex(index, alignment, itemSize, viewportSize,
10233
10293
  const normalizedItemSize = Math.max(itemSize, 1);
10234
10294
  const normalizedViewportSize = Math.max(viewportSize, 0);
10235
10295
  const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);
10236
- const clampedIndex = clamp(index, 0, Math.max(totalCount - 1, 0));
10296
+ const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));
10237
10297
  const itemStart = clampedIndex * normalizedItemSize;
10238
10298
  const itemEnd = itemStart + normalizedItemSize;
10239
10299
  switch (alignment) {
10240
10300
  case 'start':
10241
- return clamp(itemStart, 0, maxScrollTop);
10301
+ return clampNumber(itemStart, 0, maxScrollTop);
10242
10302
  case 'center':
10243
- return clamp(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
10303
+ return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);
10244
10304
  case 'end':
10245
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10305
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10246
10306
  case 'nearest':
10247
10307
  case 'auto':
10248
10308
  default:
10249
10309
  if (itemStart < currentScrollTop) {
10250
- return clamp(itemStart, 0, maxScrollTop);
10310
+ return clampNumber(itemStart, 0, maxScrollTop);
10251
10311
  }
10252
10312
  if (itemEnd > currentScrollTop + normalizedViewportSize) {
10253
- return clamp(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10313
+ return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);
10254
10314
  }
10255
- return clamp(currentScrollTop, 0, maxScrollTop);
10315
+ return clampNumber(currentScrollTop, 0, maxScrollTop);
10256
10316
  }
10257
10317
  }
10258
- function clamp(value, min, max) {
10259
- return Math.min(Math.max(value, min), max);
10260
- }
10261
10318
 
10262
10319
  class FrVirtualViewport {
10263
10320
  destroyRef = inject(DestroyRef);
@@ -10488,5 +10545,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10488
10545
  * Generated bundle index. Do not edit.
10489
10546
  */
10490
10547
 
10491
- export { FR_ACCORDION_TYPES, FR_ALERT_VARIANTS, FR_AVATAR_SIZES, FR_BADGE_ICON_POSITIONS, FR_BADGE_VARIANTS, FR_BUTTON_APPEARANCES, FR_BUTTON_GROUP_ORIENTATIONS, FR_BUTTON_LOADING_DISPLAYS, FR_BUTTON_RADII, FR_BUTTON_SIZES, FR_CARD_FOOTER_ALIGNS, FR_CARD_SIZES, FR_CARD_SPACINGS, FR_CAROUSEL_ALIGNS, FR_CAROUSEL_DIRECTIONS, FR_CAROUSEL_ORIENTATIONS, FR_CONTEXT_MENU_CONTENT, FR_DROPDOWN_MENU_ALIGNMENTS, FR_DROPDOWN_MENU_CONTENT, FR_DROPDOWN_MENU_ITEM_VARIANTS, FR_DROPDOWN_MENU_PARENT, FR_DROPDOWN_MENU_SIDES, FR_DROPDOWN_MENU_TRIGGER_MODES, FR_EMPTY_MEDIA_VARIANTS, FR_EMPTY_ORIENTATIONS, FR_EMPTY_VARIANTS, FR_FIELD_LEGEND_VARIANTS, FR_FIELD_ORIENTATIONS, FR_HOVER_CARD_ALIGNMENTS, FR_HOVER_CARD_SIDES, FR_INPUT_GROUP_ADDON_ALIGNS, FR_INPUT_GROUP_ADDON_VARIANTS, FR_INPUT_OTP_PATTERN_DIGITS, FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS, FR_ITEM_MEDIA_VARIANTS, FR_ITEM_SIZES, FR_ITEM_VARIANTS, FR_MENUBAR_PARENT, FR_MODAL_DATA, FR_NAVIGATION_MENU_PARENT, FR_POPOVER_ALIGNMENTS, FR_POPOVER_SIDES, FR_RADIO_GROUP_ORIENTATIONS, FR_RADIO_GROUP_VARIANTS, FR_RESIZABLE_ORIENTATIONS, FR_SELECT_ICON_POSITIONS, FR_SELECT_INDICATOR_POSITIONS, FR_SELECT_POSITIONS, FR_SEPARATOR_ORIENTATIONS, FR_SHEET_DATA, FR_SHEET_SIDES, FR_SIDEBAR_COLLAPSIBLES, FR_SIDEBAR_MENU_BUTTON_SIZES, FR_SIDEBAR_MENU_BUTTON_VARIANTS, FR_SIDEBAR_PROVIDER, FR_SIDEBAR_SIDES, FR_SIDEBAR_VARIANTS, FR_SLIDER_ORIENTATIONS, FR_SWITCH_SIZES, FrAccordion, FrAccordionContent, FrAccordionIcon, FrAccordionItem, FrAccordionTrigger, FrAlert, FrAlertDescription, FrAlertIcon, FrAlertTitle, FrAvatar, FrAvatarBadge, FrAvatarFallback, FrAvatarGroup, FrAvatarGroupCount, FrAvatarIcon, FrAvatarImage, FrBadge, FrBadgeIcon, FrBadgeLabel, FrBadgeSpinner, FrBreadcrumb, FrBreadcrumbEllipsis, FrBreadcrumbItem, FrBreadcrumbLink, FrBreadcrumbList, FrBreadcrumbPage, FrBreadcrumbSeparator, FrButton, FrButtonGroup, FrButtonIcon, FrButtonLabel, FrButtonLoading, FrCalendar, FrCard, FrCardAction, FrCardContent, FrCardDescription, FrCardFooter, FrCardHeader, FrCardTitle, FrCarousel, FrCarouselContent, FrCarouselItem, FrCarouselNext, FrCarouselPrevious, FrCheckbox, FrCheckboxField, FrCheckboxLabel, FrCollapsible, FrCollapsibleContent, FrCollapsibleTrigger, FrCombobox, FrComboboxChip, FrComboboxChipRemove, FrComboboxChips, FrComboboxChipsInput, FrComboboxClear, FrComboboxCollection, FrComboboxContent, FrComboboxEmpty, FrComboboxError, FrComboboxGroup, FrComboboxInput, FrComboboxItem, FrComboboxItemIndicator, FrComboboxLabel, FrComboboxList, FrComboboxPanel, FrComboboxRootLookup, FrComboboxSeparator, FrComboboxTrigger, FrComboboxValueList, FrCommand, FrCommandDialog, FrCommandDialogTrigger, FrCommandEmpty, FrCommandFooter, FrCommandGroup, FrCommandGroupHeading, FrCommandInput, FrCommandItem, FrCommandItemIcon, FrCommandList, FrCommandSeparator, FrCommandService, FrCommandShortcut, FrContextMenu, FrContextMenuCheckboxItem, FrContextMenuContent, FrContextMenuItem, FrContextMenuItemIndicator, FrContextMenuLabel, FrContextMenuPanel, FrContextMenuRadioGroup, FrContextMenuRadioItem, FrContextMenuSeparator, FrContextMenuShortcut, FrContextMenuSub, FrContextMenuSubTrigger, FrContextMenuTrigger, FrControlValueAccessor, FrDatePicker, FrDropdownMenu, FrDropdownMenuCheckboxItem, FrDropdownMenuContent, FrDropdownMenuItem, FrDropdownMenuItemIndicator, FrDropdownMenuLabel, FrDropdownMenuPanel, FrDropdownMenuRadioGroup, FrDropdownMenuRadioItem, FrDropdownMenuSeparator, FrDropdownMenuShortcut, FrDropdownMenuSub, FrDropdownMenuSubTrigger, FrDropdownMenuTree, FrDropdownMenuTrigger, FrEmpty, FrEmptyContent, FrEmptyDescription, FrEmptyHeader, FrEmptyMedia, FrEmptyTitle, FrField, FrFieldContent, FrFieldDescription, FrFieldError, FrFieldGroup, FrFieldLabel, FrFieldLegend, FrFieldSeparator, FrFieldSet, FrHoverCardRoot as FrHoverCard, FrHoverCardContent, FrHoverCardPanel, FrHoverCardTrigger, FrIconButton, FrInput, FrInputBadge, FrInputControl, FrInputDescription, FrInputError, FrInputField, FrInputFieldGroup, FrInputGroup, FrInputGroupAddon, FrInputGroupInput, FrInputGroupText, FrInputHeader, FrInputLabel, FrInputOtp, FrInputOtpGroup, FrInputOtpSeparator, FrInputOtpSlot, FrItem, FrItemActions, FrItemContent, FrItemDescription, FrItemFooter, FrItemGroup, FrItemHeader, FrItemMedia, FrItemSeparator, FrItemTitle, FrMenuBar, FrMenuBarCheckboxItem, FrMenuBarContent, FrMenuBarItem, FrMenuBarItemIndicator, FrMenuBarLabel, FrMenuBarMenu, FrMenuBarPanel, FrMenuBarRadioGroup, FrMenuBarRadioItem, FrMenuBarSeparator, FrMenuBarShortcut, FrMenuBarSub, FrMenuBarSubTrigger, FrMenuBarTrigger, FrModalBody, FrModalClose, FrModalContent, FrModalDescription, FrModalFooter, FrModalHeader, FrModalPanel, FrModalService, FrModalShell, FrModalTitle, FrModalTrigger, FrNavigationLinkSeparator, FrNavigationMenu, FrNavigationMenuContent, FrNavigationMenuFeature, FrNavigationMenuGrid, FrNavigationMenuIndicator, FrNavigationMenuItem, FrNavigationMenuLink, FrNavigationMenuLinkDescription, FrNavigationMenuLinkTitle, FrNavigationMenuList, FrNavigationMenuPanel, FrNavigationMenuTrigger, FrNavigationMenuViewport, FrPagination, FrPaginationContent, FrPaginationEllipsis, FrPaginationIcon, FrPaginationItem, FrPaginationLink, FrPaginationNext, FrPaginationPrevious, FrPopoverRoot as FrPopover, FrPopoverBody, FrPopoverClose, FrPopoverContent, FrPopoverDescription, FrPopoverFooter, FrPopoverHeader, FrPopoverPanel, FrPopoverTitle, FrPopoverTrigger, FrProgress, FrProgressIndicator, FrRadioGroup, FrRadioGroupCard, FrRadioGroupCardMeta, FrRadioGroupField, FrRadioGroupItem, FrResizableHandle, FrResizablePanel, FrResizablePanelGroup, FrSelect, FrSelectContent, FrSelectError, FrSelectGroup, FrSelectIcon, FrSelectItem, FrSelectItemIndicator, FrSelectLabel, FrSelectPanel, FrSelectSeparator, FrSelectValue, FrSeparator, FrSheetBody, FrSheetClose, FrSheetContent, FrSheetDescription, FrSheetFooter, FrSheetHeader, FrSheetPanel, FrSheetService, FrSheetShell, FrSheetTitle, FrSheetTrigger, FrSidebar, FrSidebarContent, FrSidebarFooter, FrSidebarGroup, FrSidebarGroupAction, FrSidebarGroupContent, FrSidebarGroupLabel, FrSidebarHeader, FrSidebarInset, FrSidebarMenu, FrSidebarMenuAction, FrSidebarMenuBadge, FrSidebarMenuButton, FrSidebarMenuItem, FrSidebarMenuSkeleton, FrSidebarMenuSub, FrSidebarMenuSubButton, FrSidebarMenuSubItem, FrSidebarProvider, FrSidebarRail, FrSidebarTrigger, FrSlider, FrSwitch, FrSwitchContent, FrSwitchDescription, FrSwitchError, FrSwitchField, FrSwitchLabel, FrTextarea, FrVirtualContent, FrVirtualFor, FrVirtualItem, FrVirtualItemMeta, FrVirtualList, FrVirtualPanel, FrVirtualViewport, buildConnectedPositions, calculateScrollOffsetForIndex, calculateVirtualRange, defaultPositions, provideDsValueAccessor };
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 };
10492
10549
  //# sourceMappingURL=frame-ui-ng-components.mjs.map