@frame-ui-ng/components 0.4.0-beta.0 → 0.4.1

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 (161) hide show
  1. package/confirm-popover/src/styles/confirm-popover.css +20 -0
  2. package/drag-drop/src/styles/_vars.css +28 -0
  3. package/drag-drop/src/styles/drag-drop.css +132 -0
  4. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
  5. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  6. package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
  7. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
  9. package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
  11. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
  13. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
  15. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
  17. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
  19. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
  21. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
  23. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
  25. package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
  27. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-combobox.mjs +66 -18
  29. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
  31. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +3 -0
  33. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
  35. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
  36. package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
  37. package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
  39. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
  41. package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
  42. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +73 -36
  43. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
  45. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
  47. package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
  49. package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
  51. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-input-otp.mjs +5 -0
  53. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
  55. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
  57. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
  59. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-modal.mjs +128 -114
  61. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
  63. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-pagination.mjs +8 -0
  65. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
  67. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-progress.mjs +2 -0
  69. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
  71. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-resizable.mjs +6 -0
  73. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
  75. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
  77. package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-sheet.mjs +99 -88
  79. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components-sidebar.mjs +27 -12
  81. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  82. package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
  83. package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
  84. package/fesm2022/frame-ui-ng-components-slider.mjs +29 -16
  85. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  86. package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
  87. package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
  88. package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
  89. package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
  90. package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
  91. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  92. package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
  93. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  94. package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
  95. package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
  96. package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
  97. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  98. package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
  99. package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
  100. package/fesm2022/frame-ui-ng-components-tooltip.mjs +30 -25
  101. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  102. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +26 -8
  103. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  104. package/fesm2022/frame-ui-ng-components.mjs +1387 -552
  105. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  106. package/package.json +10 -2
  107. package/popover/src/styles/popover.css +106 -101
  108. package/src/styles/components.css +6 -4
  109. package/styles/components.css +6 -4
  110. package/styles.css +6 -4
  111. package/types/frame-ui-ng-components-accordion.d.ts +11 -4
  112. package/types/frame-ui-ng-components-alert.d.ts +4 -0
  113. package/types/frame-ui-ng-components-avatar.d.ts +7 -0
  114. package/types/frame-ui-ng-components-badge.d.ts +4 -0
  115. package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
  116. package/types/frame-ui-ng-components-button-group.d.ts +1 -0
  117. package/types/frame-ui-ng-components-button.d.ts +5 -0
  118. package/types/frame-ui-ng-components-calendar.d.ts +1 -0
  119. package/types/frame-ui-ng-components-card.d.ts +8 -3
  120. package/types/frame-ui-ng-components-carousel.d.ts +11 -2
  121. package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
  122. package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
  123. package/types/frame-ui-ng-components-combobox.d.ts +32 -3
  124. package/types/frame-ui-ng-components-command.d.ts +26 -4
  125. package/types/frame-ui-ng-components-confirm-modal.d.ts +2 -0
  126. package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
  127. package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
  128. package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
  129. package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
  130. package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
  131. package/types/frame-ui-ng-components-empty.d.ts +6 -0
  132. package/types/frame-ui-ng-components-field.d.ts +9 -0
  133. package/types/frame-ui-ng-components-forms.d.ts +1 -0
  134. package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
  135. package/types/frame-ui-ng-components-input-otp.d.ts +4 -0
  136. package/types/frame-ui-ng-components-input.d.ts +13 -0
  137. package/types/frame-ui-ng-components-item.d.ts +10 -0
  138. package/types/frame-ui-ng-components-menubar.d.ts +15 -0
  139. package/types/frame-ui-ng-components-modal.d.ts +12 -0
  140. package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
  141. package/types/frame-ui-ng-components-pagination.d.ts +8 -0
  142. package/types/frame-ui-ng-components-popover.d.ts +14 -2
  143. package/types/frame-ui-ng-components-progress.d.ts +2 -0
  144. package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
  145. package/types/frame-ui-ng-components-resizable.d.ts +3 -0
  146. package/types/frame-ui-ng-components-select.d.ts +23 -2
  147. package/types/frame-ui-ng-components-separator.d.ts +1 -0
  148. package/types/frame-ui-ng-components-sheet.d.ts +11 -0
  149. package/types/frame-ui-ng-components-sidebar.d.ts +21 -0
  150. package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
  151. package/types/frame-ui-ng-components-slider.d.ts +5 -2
  152. package/types/frame-ui-ng-components-spinner.d.ts +1 -0
  153. package/types/frame-ui-ng-components-switch.d.ts +6 -0
  154. package/types/frame-ui-ng-components-table.d.ts +26 -0
  155. package/types/frame-ui-ng-components-tabs.d.ts +4 -0
  156. package/types/frame-ui-ng-components-textarea.d.ts +1 -0
  157. package/types/frame-ui-ng-components-toast.d.ts +2 -0
  158. package/types/frame-ui-ng-components-toggle.d.ts +8 -2
  159. package/types/frame-ui-ng-components-tooltip.d.ts +6 -2
  160. package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
  161. package/types/frame-ui-ng-components.d.ts +492 -76
@@ -1,16 +1,17 @@
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, viewChild, model, afterNextRender, ViewContainerRef, Injectable, Injector, numberAttribute } from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, Directive, input, booleanAttribute, computed, output, linkedSignal, signal, Component, contentChild, forwardRef, ChangeDetectionStrategy, DestroyRef, TemplateRef, viewChild, model, afterNextRender, Renderer2, ViewContainerRef, Injectable, PLATFORM_ID, numberAttribute, Injector } 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
- import { NgTemplateOutlet, NgClass, NgComponentOutlet, DOCUMENT } from '@angular/common';
5
+ import { NgTemplateOutlet, isPlatformBrowser, NgClass, NgComponentOutlet, DOCUMENT } from '@angular/common';
6
6
  import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
7
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 { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
11
+ import { CdkOverlayOrigin, CdkConnectedOverlay, Overlay } 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
+ import { ComponentPortal } from '@angular/cdk/portal';
14
15
  import * as i1$2 from '@angular/cdk/menu';
15
16
  import { CdkMenu, CdkTargetMenuAim, CdkMenuItem, CdkMenuItemCheckbox, CdkMenuGroup, CdkMenuItemRadio, CdkMenuTrigger, CdkContextMenuTrigger } from '@angular/cdk/menu';
16
17
  import * as i1$3 from '@frame-ui-ng/components/dropdown-menu';
@@ -22,23 +23,29 @@ import { clampNumber, coerceNumber } from '@frame-ui-ng/components/utils';
22
23
  const ACCORDION_ROOT = new InjectionToken('FrAccordion');
23
24
  const ACCORDION_ITEM = new InjectionToken('FrAccordionItem');
24
25
 
26
+ /** Content slot for accordion. */
25
27
  class FrAccordionContent {
26
28
  host = inject(ElementRef);
27
29
  item = inject(ACCORDION_ITEM);
28
30
  initialized = false;
31
+ lastOpen = false;
29
32
  rafIds = [];
30
- constructor() {
31
- effect((onCleanup) => {
32
- const open = this.item.open();
33
- this.cancelAnimationFrame();
34
- if (!this.initialized) {
35
- this.applyStaticState(open);
36
- this.initialized = true;
37
- return;
38
- }
39
- this.animate(open);
40
- onCleanup(() => this.cancelAnimationFrame());
41
- });
33
+ ngAfterViewInit() {
34
+ this.lastOpen = this.item.open();
35
+ this.applyStaticState(this.lastOpen);
36
+ this.initialized = true;
37
+ }
38
+ ngDoCheck() {
39
+ const open = this.item.open();
40
+ if (!this.initialized || open === this.lastOpen) {
41
+ return;
42
+ }
43
+ this.cancelAnimationFrame();
44
+ this.lastOpen = open;
45
+ this.animate(open);
46
+ }
47
+ ngOnDestroy() {
48
+ this.cancelAnimationFrame();
42
49
  }
43
50
  onTransitionEnd(event) {
44
51
  if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {
@@ -115,9 +122,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
115
122
  'role': 'region',
116
123
  },
117
124
  }]
118
- }], ctorParameters: () => [] });
125
+ }] });
119
126
 
120
127
  let accordionItemId = 0;
128
+ /** Item slot for accordion. */
121
129
  class FrAccordionItem {
122
130
  root = inject(ACCORDION_ROOT);
123
131
  itemId = ++accordionItemId;
@@ -150,18 +158,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
150
158
  }]
151
159
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
152
160
 
161
+ /** Accordion component primitive. */
153
162
  class FrAccordion {
154
163
  type = input('single', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
155
164
  border = input(true, { ...(ngDevMode ? { debugName: "border" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
156
165
  collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
157
166
  defaultValue = input(null, ...(ngDevMode ? [{ debugName: "defaultValue" }] : /* istanbul ignore next */ []));
158
167
  valueChange = output();
159
- openItems = signal([], ...(ngDevMode ? [{ debugName: "openItems" }] : /* istanbul ignore next */ []));
160
- constructor() {
161
- effect(() => {
162
- this.openItems.set(this.normalizeValues(this.defaultValue(), this.type()));
163
- });
164
- }
168
+ openItems = linkedSignal(() => this.normalizeValues(this.defaultValue(), this.type()), ...(ngDevMode ? [{ debugName: "openItems" }] : /* istanbul ignore next */ []));
165
169
  isItemOpen(value) {
166
170
  return this.openItems().includes(value);
167
171
  }
@@ -217,8 +221,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
217
221
  '[attr.data-type]': 'type()',
218
222
  },
219
223
  }]
220
- }], ctorParameters: () => [], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], border: [{ type: i0.Input, args: [{ isSignal: true, alias: "border", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
224
+ }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], border: [{ type: i0.Input, args: [{ isSignal: true, alias: "border", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
221
225
 
226
+ /** Trigger control for accordion. */
222
227
  class FrAccordionTrigger {
223
228
  item = inject(ACCORDION_ITEM);
224
229
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAccordionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -242,6 +247,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
242
247
  },
243
248
  }]
244
249
  }] });
250
+ /** Icon slot for accordion. */
245
251
  class FrAccordionIcon {
246
252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAccordionIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
247
253
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAccordionIcon, isStandalone: true, selector: "[frAccordionIcon]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-accordion__icon" }, ngImport: i0 });
@@ -267,6 +273,7 @@ const FR_ALERT_VARIANTS = [
267
273
  'danger',
268
274
  'info',
269
275
  ];
276
+ /** Alert component primitive. */
270
277
  class FrAlert {
271
278
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
272
279
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAlert, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -283,6 +290,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
283
290
  },
284
291
  }]
285
292
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
293
+ /** Icon slot for alert. */
286
294
  class FrAlertIcon {
287
295
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAlertIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
288
296
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAlertIcon, isStandalone: true, selector: "[frAlertIcon]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-alert__icon" }, ngImport: i0 });
@@ -297,6 +305,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
297
305
  },
298
306
  }]
299
307
  }] });
308
+ /** Title slot for alert. */
300
309
  class FrAlertTitle {
301
310
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAlertTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
302
311
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAlertTitle, isStandalone: true, selector: "[frAlertTitle]", host: { classAttribute: "frame-alert__title" }, ngImport: i0 });
@@ -310,6 +319,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
310
319
  },
311
320
  }]
312
321
  }] });
322
+ /** Description slot for alert. */
313
323
  class FrAlertDescription {
314
324
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAlertDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
315
325
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAlertDescription, isStandalone: true, selector: "[frAlertDescription]", host: { classAttribute: "frame-alert__description" }, ngImport: i0 });
@@ -324,6 +334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
324
334
  }]
325
335
  }] });
326
336
 
337
+ /** Badge slot for avatar. */
327
338
  class FrAvatarBadge {
328
339
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAvatarBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
329
340
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAvatarBadge, isStandalone: true, selector: "[frAvatarBadge]", host: { classAttribute: "frame-avatar__badge" }, ngImport: i0 });
@@ -341,6 +352,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
341
352
 
342
353
  const AVATAR_ROOT = new InjectionToken('FrAvatar');
343
354
 
355
+ /** Avatar fallback component primitive. */
344
356
  class FrAvatarFallback {
345
357
  root = inject(AVATAR_ROOT);
346
358
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAvatarFallback, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -359,6 +371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
359
371
  }]
360
372
  }] });
361
373
 
374
+ /** Group slot for avatar. */
362
375
  class FrAvatarGroup {
363
376
  expandOnHover = input(false, { ...(ngDevMode ? { debugName: "expandOnHover" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
364
377
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
@@ -377,6 +390,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
377
390
  },
378
391
  }]
379
392
  }], propDecorators: { expandOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandOnHover", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
393
+ /** Avatar group count component primitive. */
380
394
  class FrAvatarGroupCount {
381
395
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAvatarGroupCount, deps: [], target: i0.ɵɵFactoryTarget.Directive });
382
396
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrAvatarGroupCount, isStandalone: true, selector: "[frAvatarGroupCount]", host: { classAttribute: "frame-avatar-group__count" }, ngImport: i0 });
@@ -392,6 +406,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
392
406
  }]
393
407
  }] });
394
408
 
409
+ /** Icon slot for avatar. */
395
410
  class FrAvatarIcon {
396
411
  root = inject(AVATAR_ROOT);
397
412
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrAvatarIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -410,6 +425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
410
425
  }]
411
426
  }] });
412
427
 
428
+ /** Avatar image component primitive. */
413
429
  class FrAvatarImage {
414
430
  host = inject(ElementRef);
415
431
  root = inject(AVATAR_ROOT);
@@ -445,6 +461,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
445
461
  }]
446
462
  }] });
447
463
 
464
+ /** Avatar component primitive. */
448
465
  class FrAvatar {
449
466
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
450
467
  status = signal('idle', ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
@@ -481,6 +498,7 @@ const FR_BADGE_VARIANTS = [
481
498
  'link',
482
499
  ];
483
500
  const FR_BADGE_ICON_POSITIONS = ['inline-start', 'inline-end'];
501
+ /** Inline badge host with variant styling. */
484
502
  class FrBadge {
485
503
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
486
504
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -496,6 +514,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
496
514
  },
497
515
  }]
498
516
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
517
+ /** Icon slot for badge. */
499
518
  class FrBadgeIcon {
500
519
  position = input('inline-start', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
501
520
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBadgeIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -512,6 +531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
512
531
  },
513
532
  }]
514
533
  }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
534
+ /** Label slot for badge. */
515
535
  class FrBadgeLabel {
516
536
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBadgeLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
517
537
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBadgeLabel, isStandalone: true, selector: "[frBadgeLabel]", host: { classAttribute: "frame-badge__label" }, ngImport: i0 });
@@ -525,6 +545,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
525
545
  },
526
546
  }]
527
547
  }] });
548
+ /** Loading indicator slot for badge. */
528
549
  class FrBadgeSpinner {
529
550
  position = input('inline-start', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
530
551
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBadgeSpinner, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -550,6 +571,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
550
571
  }]
551
572
  }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
552
573
 
574
+ /** Breadcrumb navigation landmark. */
553
575
  class FrBreadcrumb {
554
576
  ariaLabel = input('breadcrumb', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
555
577
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumb, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -565,6 +587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
565
587
  },
566
588
  }]
567
589
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
590
+ /** List slot for breadcrumb. */
568
591
  class FrBreadcrumbList {
569
592
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
570
593
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBreadcrumbList, isStandalone: true, selector: "ol[frBreadcrumbList], ul[frBreadcrumbList], [frBreadcrumbList]", host: { classAttribute: "frame-breadcrumb__list" }, ngImport: i0 });
@@ -578,6 +601,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
578
601
  },
579
602
  }]
580
603
  }] });
604
+ /** Item slot for breadcrumb. */
581
605
  class FrBreadcrumbItem {
582
606
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
583
607
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBreadcrumbItem, isStandalone: true, selector: "li[frBreadcrumbItem], [frBreadcrumbItem]", host: { classAttribute: "frame-breadcrumb__item" }, ngImport: i0 });
@@ -591,6 +615,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
591
615
  },
592
616
  }]
593
617
  }] });
618
+ /** Navigable link inside a breadcrumb item. */
594
619
  class FrBreadcrumbLink {
595
620
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbLink, deps: [], target: i0.ɵɵFactoryTarget.Directive });
596
621
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBreadcrumbLink, isStandalone: true, selector: "a[frBreadcrumbLink], [frBreadcrumbLink]", host: { classAttribute: "frame-breadcrumb__link" }, ngImport: i0 });
@@ -604,6 +629,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
604
629
  },
605
630
  }]
606
631
  }] });
632
+ /** Page slot for breadcrumb. */
607
633
  class FrBreadcrumbPage {
608
634
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbPage, deps: [], target: i0.ɵɵFactoryTarget.Directive });
609
635
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBreadcrumbPage, isStandalone: true, selector: "[frBreadcrumbPage]", host: { attributes: { "aria-current": "page" }, classAttribute: "frame-breadcrumb__page" }, ngImport: i0 });
@@ -618,6 +644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
618
644
  },
619
645
  }]
620
646
  }] });
647
+ /** Separator slot for breadcrumb. */
621
648
  class FrBreadcrumbSeparator {
622
649
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
623
650
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrBreadcrumbSeparator, isStandalone: true, selector: "[frBreadcrumbSeparator]", host: { attributes: { "aria-hidden": "true", "role": "presentation" }, classAttribute: "frame-breadcrumb__separator" }, ngImport: i0 });
@@ -633,12 +660,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
633
660
  },
634
661
  }]
635
662
  }] });
663
+ /** Ellipsis slot for breadcrumb. */
636
664
  class FrBreadcrumbEllipsis {
637
665
  label = input('More pages', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
638
666
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
639
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrBreadcrumbEllipsis, isStandalone: true, selector: "[frBreadcrumbEllipsis], frame-breadcrumb-ellipsis", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, classAttribute: "frame-breadcrumb__ellipsis" }, ngImport: i0, template: `
640
- <span aria-hidden="true">...</span>
641
- <span class="frame-breadcrumb__sr-only">{{ label() }}</span>
667
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.16", type: FrBreadcrumbEllipsis, isStandalone: true, selector: "[frBreadcrumbEllipsis], frame-breadcrumb-ellipsis", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "presentation" }, classAttribute: "frame-breadcrumb__ellipsis" }, ngImport: i0, template: `
668
+ <span aria-hidden="true">...</span>
669
+ <span class="frame-breadcrumb__sr-only">{{ label() }}</span>
642
670
  `, isInline: true });
643
671
  }
644
672
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrBreadcrumbEllipsis, decorators: [{
@@ -649,9 +677,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
649
677
  class: 'frame-breadcrumb__ellipsis',
650
678
  'role': 'presentation',
651
679
  },
652
- template: `
653
- <span aria-hidden="true">...</span>
654
- <span class="frame-breadcrumb__sr-only">{{ label() }}</span>
680
+ template: `
681
+ <span aria-hidden="true">...</span>
682
+ <span class="frame-breadcrumb__sr-only">{{ label() }}</span>
655
683
  `,
656
684
  }]
657
685
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
@@ -664,6 +692,7 @@ const FR_BUTTON_APPEARANCES = [
664
692
  const FR_BUTTON_LOADING_DISPLAYS = ['inline', 'replace'];
665
693
  const FR_BUTTON_RADII = ['full', 'lg', 'md', 'none', 'sm'];
666
694
  const FR_BUTTON_SIZES = ['sm', 'md', 'lg'];
695
+ /** Button host with FrameUI size and appearance variants. */
667
696
  class FrButton {
668
697
  loadingIndicator = contentChild(FrButtonLoading, ...(ngDevMode ? [{ debugName: "loadingIndicator" }] : /* istanbul ignore next */ []));
669
698
  spinnerIndicator = contentChild(FrSpinner, ...(ngDevMode ? [{ debugName: "spinnerIndicator" }] : /* istanbul ignore next */ []));
@@ -699,6 +728,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
699
728
  },
700
729
  }]
701
730
  }], propDecorators: { loadingIndicator: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrButtonLoading), { isSignal: true }] }], spinnerIndicator: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrSpinner), { isSignal: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingDisplay", required: false }] }], radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
731
+ /** Icon-only button host with square sizing. */
702
732
  class FrIconButton {
703
733
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
704
734
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrIconButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -721,6 +751,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
721
751
  },
722
752
  }]
723
753
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
754
+ /** Icon slot for button. */
724
755
  class FrButtonIcon {
725
756
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrButtonIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
726
757
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrButtonIcon, isStandalone: true, selector: "[frButtonIcon]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-button__icon" }, ngImport: i0 });
@@ -735,6 +766,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
735
766
  },
736
767
  }]
737
768
  }] });
769
+ /** Label slot for button. */
738
770
  class FrButtonLabel {
739
771
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrButtonLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
740
772
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrButtonLabel, isStandalone: true, selector: "[frButtonLabel]", host: { classAttribute: "frame-button__label" }, ngImport: i0 });
@@ -748,6 +780,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
748
780
  },
749
781
  }]
750
782
  }] });
783
+ /** Loading indicator slot for button. */
751
784
  class FrButtonLoading {
752
785
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrButtonLoading, deps: [], target: i0.ɵɵFactoryTarget.Directive });
753
786
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrButtonLoading, isStandalone: true, selector: "[frButtonLoading]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-button__loading" }, ngImport: i0 });
@@ -764,6 +797,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
764
797
  }] });
765
798
 
766
799
  const FR_BUTTON_GROUP_ORIENTATIONS = ['horizontal', 'vertical'];
800
+ /** Groups related buttons with shared orientation. */
767
801
  class FrButtonGroup {
768
802
  orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
769
803
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrButtonGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -786,6 +820,7 @@ const VALUE_ACCESSOR = {
786
820
  useExisting: forwardRef(() => FrCalendar),
787
821
  multi: true,
788
822
  };
823
+ /** Calendar control for single-date and range selection. */
789
824
  class FrCalendar {
790
825
  mode = input('single', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
791
826
  captionLayout = input('label', ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
@@ -930,6 +965,7 @@ class FrCalendar {
930
965
  }
931
966
  resolveActiveDate() {
932
967
  const focused = this.focusedDate();
968
+ // Prefer the roving-focus target, then selection, then today, then first enabled day.
933
969
  if (focused && this.findDay(focused) && !this.isDayDisabled(focused)) {
934
970
  return cloneDate(focused);
935
971
  }
@@ -977,6 +1013,7 @@ class FrCalendar {
977
1013
  if (this.focusDayElement(date)) {
978
1014
  return;
979
1015
  }
1016
+ // Month navigation may render the target button one tick later.
980
1017
  setTimeout(() => {
981
1018
  this.focusDayElement(date);
982
1019
  });
@@ -995,6 +1032,7 @@ class FrCalendar {
995
1032
  const start = startOfMonth(monthDate);
996
1033
  const gridStart = startOfWeek(start, this.firstDayOfWeek());
997
1034
  const weeks = [];
1035
+ // Always build a six-week grid so layout height stays stable across months.
998
1036
  for (let week = 0; week < 6; week++) {
999
1037
  const days = [];
1000
1038
  for (let dayIndex = 0; dayIndex < 7; dayIndex++) {
@@ -1427,23 +1465,16 @@ const FR_CARD_SPACING_VALUES = {
1427
1465
  lg: '1.25rem',
1428
1466
  xl: '2rem',
1429
1467
  };
1468
+ /** Card container with size and spacing controls. */
1430
1469
  class FrCard {
1431
- elementRef = inject(ElementRef);
1432
- renderer = inject(Renderer2);
1433
1470
  size = input('default', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1434
1471
  spacing = input(null, ...(ngDevMode ? [{ debugName: "spacing" }] : /* istanbul ignore next */ []));
1435
- constructor() {
1436
- effect(() => {
1437
- const spacing = this.spacing();
1438
- if (!spacing) {
1439
- this.renderer.removeStyle(this.elementRef.nativeElement, '--frame-card-spacing', RendererStyleFlags2.DashCase);
1440
- return;
1441
- }
1442
- this.renderer.setStyle(this.elementRef.nativeElement, '--frame-card-spacing', FR_CARD_SPACING_VALUES[spacing], RendererStyleFlags2.DashCase);
1443
- });
1444
- }
1472
+ spacingValue = computed(() => {
1473
+ const spacing = this.spacing();
1474
+ return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;
1475
+ }, ...(ngDevMode ? [{ debugName: "spacingValue" }] : /* istanbul ignore next */ []));
1445
1476
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1446
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()" }, classAttribute: "frame-card" }, ngImport: i0 });
1477
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()", "style.--frame-card-spacing": "spacingValue()" }, classAttribute: "frame-card" }, ngImport: i0 });
1447
1478
  }
1448
1479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, decorators: [{
1449
1480
  type: Directive,
@@ -1453,9 +1484,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1453
1484
  class: 'frame-card',
1454
1485
  '[attr.data-size]': 'size()',
1455
1486
  '[attr.data-spacing]': 'spacing()',
1487
+ '[style.--frame-card-spacing]': 'spacingValue()',
1456
1488
  },
1457
1489
  }]
1458
- }], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }] } });
1490
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }] } });
1491
+ /** Header slot for card. */
1459
1492
  class FrCardHeader {
1460
1493
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1461
1494
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardHeader, isStandalone: true, selector: "[frCardHeader]", host: { classAttribute: "frame-card__header" }, ngImport: i0 });
@@ -1469,6 +1502,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1469
1502
  },
1470
1503
  }]
1471
1504
  }] });
1505
+ /** Title slot for card. */
1472
1506
  class FrCardTitle {
1473
1507
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1474
1508
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardTitle, isStandalone: true, selector: "[frCardTitle]", host: { classAttribute: "frame-card__title" }, ngImport: i0 });
@@ -1482,6 +1516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1482
1516
  },
1483
1517
  }]
1484
1518
  }] });
1519
+ /** Description slot for card. */
1485
1520
  class FrCardDescription {
1486
1521
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1487
1522
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardDescription, isStandalone: true, selector: "[frCardDescription]", host: { classAttribute: "frame-card__description" }, ngImport: i0 });
@@ -1495,6 +1530,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1495
1530
  },
1496
1531
  }]
1497
1532
  }] });
1533
+ /** Action slot for card. */
1498
1534
  class FrCardAction {
1499
1535
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1500
1536
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardAction, isStandalone: true, selector: "[frCardAction]", host: { classAttribute: "frame-card__action" }, ngImport: i0 });
@@ -1508,6 +1544,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1508
1544
  },
1509
1545
  }]
1510
1546
  }] });
1547
+ /** Content slot for card. */
1511
1548
  class FrCardContent {
1512
1549
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1513
1550
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardContent, isStandalone: true, selector: "[frCardContent]", host: { classAttribute: "frame-card__content" }, ngImport: i0 });
@@ -1521,6 +1558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1521
1558
  },
1522
1559
  }]
1523
1560
  }] });
1561
+ /** Footer slot for card. */
1524
1562
  class FrCardFooter {
1525
1563
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
1526
1564
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -1541,6 +1579,7 @@ const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'];
1541
1579
  const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'];
1542
1580
  const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'];
1543
1581
  const FR_CAROUSEL = new InjectionToken('FrCarousel');
1582
+ /** Carousel root that coordinates scroll state and navigation. */
1544
1583
  class FrCarousel {
1545
1584
  destroyRef = inject(DestroyRef);
1546
1585
  listeners = new Map();
@@ -1552,6 +1591,8 @@ class FrCarousel {
1552
1591
  loopBoundaryClone = null;
1553
1592
  contentElement = null;
1554
1593
  itemElements = [];
1594
+ lastLoop = false;
1595
+ lastPlugins = null;
1555
1596
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
1556
1597
  loop = input(false, { ...(ngDevMode ? { debugName: "loop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1557
1598
  orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
@@ -1575,27 +1616,20 @@ class FrCarousel {
1575
1616
  on: (event, callback) => this.on(event, callback),
1576
1617
  };
1577
1618
  constructor() {
1578
- effect(() => {
1579
- const plugins = this.plugins();
1580
- this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
1581
- for (const plugin of plugins) {
1582
- const cleanup = plugin(this.api);
1583
- if (typeof cleanup === 'function') {
1584
- this.pluginCleanups.push(cleanup);
1585
- }
1586
- }
1587
- });
1588
- effect(() => {
1589
- if (!this.effectiveLoop()) {
1590
- this.removeLoopClone();
1591
- }
1592
- });
1593
1619
  this.destroyRef.onDestroy(() => {
1594
1620
  this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
1595
1621
  this.clearLoopResetTimer();
1596
1622
  this.clearScrollSyncTimer();
1597
1623
  });
1598
1624
  }
1625
+ ngDoCheck() {
1626
+ this.syncPlugins();
1627
+ const loop = this.effectiveLoop();
1628
+ if (!loop && loop !== this.lastLoop) {
1629
+ this.removeLoopClone();
1630
+ }
1631
+ this.lastLoop = loop;
1632
+ }
1599
1633
  ngAfterViewInit() {
1600
1634
  queueMicrotask(() => {
1601
1635
  this.recalculate();
@@ -1669,6 +1703,20 @@ class FrCarousel {
1669
1703
  emit(event) {
1670
1704
  this.listeners.get(event)?.forEach((callback) => callback());
1671
1705
  }
1706
+ syncPlugins() {
1707
+ const plugins = this.plugins();
1708
+ if (plugins === this.lastPlugins) {
1709
+ return;
1710
+ }
1711
+ this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
1712
+ for (const plugin of plugins) {
1713
+ const cleanup = plugin(this.api);
1714
+ if (typeof cleanup === 'function') {
1715
+ this.pluginCleanups.push(cleanup);
1716
+ }
1717
+ }
1718
+ this.lastPlugins = plugins;
1719
+ }
1672
1720
  recalculate() {
1673
1721
  this.snapCount.set(this.itemElements.length);
1674
1722
  this.emit('reInit');
@@ -1677,6 +1725,7 @@ class FrCarousel {
1677
1725
  if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {
1678
1726
  return;
1679
1727
  }
1728
+ // Derive the active item from the nearest snap point during user-driven scrolling.
1680
1729
  const current = this.getCurrentScrollOffset();
1681
1730
  const closest = this.itemElements.reduce((best, item, index) => {
1682
1731
  const targetOffset = this.getItemScrollOffset(item);
@@ -1748,6 +1797,7 @@ class FrCarousel {
1748
1797
  if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {
1749
1798
  return;
1750
1799
  }
1800
+ // Scroll to a temporary clone first, then jump back to the real edge item invisibly.
1751
1801
  const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;
1752
1802
  const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];
1753
1803
  const resetTarget = this.itemElements[finalIndex];
@@ -1795,6 +1845,7 @@ class FrCarousel {
1795
1845
  if (!this.contentElement) {
1796
1846
  return;
1797
1847
  }
1848
+ // `scrollend` is not universal, so keep a timeout fallback for the loop reset.
1798
1849
  let didReset = false;
1799
1850
  const reset = () => {
1800
1851
  if (didReset) {
@@ -1853,6 +1904,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1853
1904
  providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],
1854
1905
  }]
1855
1906
  }], ctorParameters: () => [], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], opts: [{ type: i0.Input, args: [{ isSignal: true, alias: "opts", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], apiReady: [{ type: i0.Output, args: ["apiReady"] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }] } });
1907
+ /** Content slot for carousel. */
1856
1908
  class FrCarouselContent {
1857
1909
  carousel = inject(FR_CAROUSEL);
1858
1910
  elementRef = inject(ElementRef);
@@ -1872,6 +1924,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1872
1924
  },
1873
1925
  }]
1874
1926
  }] });
1927
+ /** Item slot for carousel. */
1875
1928
  class FrCarouselItem {
1876
1929
  carousel = inject(FR_CAROUSEL);
1877
1930
  destroyRef = inject(DestroyRef);
@@ -1894,6 +1947,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1894
1947
  },
1895
1948
  }]
1896
1949
  }] });
1950
+ /** Previous-slide control for carousel. */
1897
1951
  class FrCarouselPrevious {
1898
1952
  carousel = inject(FR_CAROUSEL);
1899
1953
  label = input('Previous slide', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
@@ -1919,6 +1973,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1919
1973
  },
1920
1974
  }]
1921
1975
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
1976
+ /** Next-slide control for carousel. */
1922
1977
  class FrCarouselNext {
1923
1978
  carousel = inject(FR_CAROUSEL);
1924
1979
  label = input('Next slide', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
@@ -1945,16 +2000,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1945
2000
  }]
1946
2001
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
1947
2002
 
2003
+ /** Checkbox input styled as a FrameUI control. */
1948
2004
  class FrCheckbox {
1949
- elementRef = inject((ElementRef));
1950
2005
  indeterminate = input(false, { ...(ngDevMode ? { debugName: "indeterminate" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1951
- constructor() {
1952
- effect(() => {
1953
- this.elementRef.nativeElement.indeterminate = this.indeterminate();
1954
- });
1955
- }
1956
2006
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1957
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCheckbox, isStandalone: true, selector: "input[type=checkbox][frCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-checked": "indeterminate() ? \"mixed\" : null", "attr.data-indeterminate": "indeterminate() ? \"\" : null" }, classAttribute: "frame-checkbox" }, ngImport: i0 });
2007
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCheckbox, isStandalone: true, selector: "input[type=checkbox][frCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-checked": "indeterminate() ? \"mixed\" : null", "attr.data-indeterminate": "indeterminate() ? \"\" : null", "indeterminate": "indeterminate()" }, classAttribute: "frame-checkbox" }, ngImport: i0 });
1958
2008
  }
1959
2009
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckbox, decorators: [{
1960
2010
  type: Directive,
@@ -1964,9 +2014,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1964
2014
  class: 'frame-checkbox',
1965
2015
  '[attr.aria-checked]': 'indeterminate() ? "mixed" : null',
1966
2016
  '[attr.data-indeterminate]': 'indeterminate() ? "" : null',
2017
+ '[indeterminate]': 'indeterminate()',
1967
2018
  },
1968
2019
  }]
1969
- }], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
2020
+ }], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
2021
+ /** Field slot for checkbox. */
1970
2022
  class FrCheckboxField {
1971
2023
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckboxField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1972
2024
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCheckboxField, isStandalone: true, selector: "label[frCheckboxField]", host: { classAttribute: "frame-checkbox-field" }, ngImport: i0 });
@@ -1980,6 +2032,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1980
2032
  },
1981
2033
  }]
1982
2034
  }] });
2035
+ /** Label slot for checkbox. */
1983
2036
  class FrCheckboxLabel {
1984
2037
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckboxLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1985
2038
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCheckboxLabel, isStandalone: true, selector: "[frCheckboxLabel]", host: { classAttribute: "frame-checkbox-label" }, ngImport: i0 });
@@ -1996,23 +2049,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
1996
2049
 
1997
2050
  const FR_COLLAPSIBLE = new InjectionToken('FrCollapsible');
1998
2051
 
2052
+ /** Content slot for collapsible. */
1999
2053
  class FrCollapsibleContent {
2000
2054
  host = inject(ElementRef);
2001
2055
  collapsible = inject(FR_COLLAPSIBLE);
2002
2056
  initialized = false;
2057
+ lastOpen = false;
2003
2058
  rafId = -1;
2004
- constructor() {
2005
- effect((onCleanup) => {
2006
- const open = this.collapsible.open();
2007
- this.cancelAnimationFrame();
2008
- if (!this.initialized) {
2009
- this.applyStaticState(open);
2010
- this.initialized = true;
2011
- return;
2012
- }
2013
- this.animate(open);
2014
- onCleanup(() => this.cancelAnimationFrame());
2015
- });
2059
+ ngAfterViewInit() {
2060
+ this.lastOpen = this.collapsible.open();
2061
+ this.applyStaticState(this.lastOpen);
2062
+ this.initialized = true;
2063
+ }
2064
+ ngDoCheck() {
2065
+ const open = this.collapsible.open();
2066
+ if (!this.initialized || open === this.lastOpen) {
2067
+ return;
2068
+ }
2069
+ this.cancelAnimationFrame();
2070
+ this.lastOpen = open;
2071
+ this.animate(open);
2072
+ }
2073
+ ngOnDestroy() {
2074
+ this.cancelAnimationFrame();
2016
2075
  }
2017
2076
  onTransitionEnd(event) {
2018
2077
  if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {
@@ -2074,12 +2133,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2074
2133
  role: 'region',
2075
2134
  },
2076
2135
  }]
2077
- }], ctorParameters: () => [] });
2136
+ }] });
2078
2137
 
2079
2138
  let collapsibleId = 0;
2139
+ /** Root controller for expandable collapsible content. */
2080
2140
  class FrCollapsible {
2081
2141
  collapsibleId = ++collapsibleId;
2082
- internalOpen = signal(false, ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
2142
+ internalOpen = linkedSignal(() => this.defaultOpen(), ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
2083
2143
  defaultOpen = input(false, { ...(ngDevMode ? { debugName: "defaultOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2084
2144
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2085
2145
  openInput = input(undefined, { ...(ngDevMode ? { debugName: "openInput" } : /* istanbul ignore next */ {}), alias: 'open' });
@@ -2087,13 +2147,6 @@ class FrCollapsible {
2087
2147
  open = computed(() => this.openInput() ?? this.internalOpen(), ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
2088
2148
  triggerId = computed(() => `frame-collapsible-trigger-${this.collapsibleId}`, ...(ngDevMode ? [{ debugName: "triggerId" }] : /* istanbul ignore next */ []));
2089
2149
  contentId = computed(() => `frame-collapsible-content-${this.collapsibleId}`, ...(ngDevMode ? [{ debugName: "contentId" }] : /* istanbul ignore next */ []));
2090
- constructor() {
2091
- effect(() => {
2092
- if (this.openInput() === undefined) {
2093
- this.internalOpen.set(this.defaultOpen());
2094
- }
2095
- });
2096
- }
2097
2150
  toggle() {
2098
2151
  if (this.disabled()) {
2099
2152
  return;
@@ -2125,8 +2178,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2125
2178
  '[attr.data-state]': 'open() ? "open" : "closed"',
2126
2179
  },
2127
2180
  }]
2128
- }], ctorParameters: () => [], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
2181
+ }], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
2129
2182
 
2183
+ /** Trigger control for collapsible. */
2130
2184
  class FrCollapsibleTrigger {
2131
2185
  collapsible = inject(FR_COLLAPSIBLE);
2132
2186
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCollapsibleTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -2151,6 +2205,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2151
2205
  }]
2152
2206
  }] });
2153
2207
 
2208
+ /** Content slot for combobox. */
2154
2209
  class FrComboboxContent {
2155
2210
  templateRef = inject((TemplateRef));
2156
2211
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -2163,6 +2218,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2163
2218
  exportAs: 'frComboboxContent',
2164
2219
  }]
2165
2220
  }] });
2221
+ /** Panel slot for combobox. */
2166
2222
  class FrComboboxPanel {
2167
2223
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2168
2224
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxPanel, isStandalone: true, selector: "[frComboboxPanel], frame-combobox-panel", host: { attributes: { "role": "listbox" }, classAttribute: "frame-combobox__panel" }, ngImport: i0 });
@@ -2177,6 +2233,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2177
2233
  },
2178
2234
  }]
2179
2235
  }] });
2236
+ /** List slot for combobox. */
2180
2237
  class FrComboboxList {
2181
2238
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2182
2239
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxList, isStandalone: true, selector: "[frComboboxList], frame-combobox-list", host: { classAttribute: "frame-combobox__list" }, ngImport: i0 });
@@ -2190,6 +2247,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2190
2247
  },
2191
2248
  }]
2192
2249
  }] });
2250
+ /** Empty-state slot for combobox results. */
2193
2251
  class FrComboboxEmpty {
2194
2252
  root = inject(FrComboboxRootLookup);
2195
2253
  hidden() {
@@ -2208,6 +2266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2208
2266
  },
2209
2267
  }]
2210
2268
  }] });
2269
+ /** Group slot for combobox. */
2211
2270
  class FrComboboxGroup {
2212
2271
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2213
2272
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxGroup, isStandalone: true, selector: "[frComboboxGroup], frame-combobox-group", host: { classAttribute: "frame-combobox__group" }, ngImport: i0 });
@@ -2221,6 +2280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2221
2280
  },
2222
2281
  }]
2223
2282
  }] });
2283
+ /** Label slot for combobox. */
2224
2284
  class FrComboboxLabel {
2225
2285
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2226
2286
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxLabel, isStandalone: true, selector: "[frComboboxLabel], frame-combobox-label", host: { classAttribute: "frame-combobox__label" }, ngImport: i0 });
@@ -2234,6 +2294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2234
2294
  },
2235
2295
  }]
2236
2296
  }] });
2297
+ /** Separator slot for combobox. */
2237
2298
  class FrComboboxSeparator {
2238
2299
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2239
2300
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxSeparator, isStandalone: true, selector: "[frComboboxSeparator], frame-combobox-separator", host: { attributes: { "role": "separator" }, classAttribute: "frame-combobox__separator" }, ngImport: i0 });
@@ -2248,6 +2309,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2248
2309
  },
2249
2310
  }]
2250
2311
  }] });
2312
+ /** Collection host for combobox options. */
2251
2313
  class FrComboboxCollection {
2252
2314
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxCollection, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2253
2315
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxCollection, isStandalone: true, selector: "[frComboboxCollection], frame-combobox-collection", host: { classAttribute: "frame-combobox__collection" }, ngImport: i0 });
@@ -2262,6 +2324,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2262
2324
  }]
2263
2325
  }] });
2264
2326
  // Resolved by the root file to avoid a circular import in decorator metadata.
2327
+ /** Base API for combobox root lookup. */
2265
2328
  class FrComboboxRootLookup {
2266
2329
  }
2267
2330
 
@@ -2281,12 +2344,16 @@ const POSITIONS$1 = [
2281
2344
  offsetY: -4,
2282
2345
  },
2283
2346
  ];
2347
+ /** Combobox control with single and multi-value support. */
2284
2348
  class FrCombobox extends FrControlValueAccessor$1 {
2285
2349
  destroyRef = inject(DestroyRef);
2286
2350
  elementRef = inject(ElementRef);
2287
2351
  items = new Set();
2288
2352
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
2289
2353
  selectedLabels = new Map();
2354
+ lastAutoHighlight = false;
2355
+ lastItemsVersion = -1;
2356
+ lastQuery = '';
2290
2357
  resizeObserver = null;
2291
2358
  origin = viewChild(CdkOverlayOrigin, ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
2292
2359
  content = contentChild(FrComboboxContent, ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
@@ -2323,18 +2390,6 @@ class FrCombobox extends FrControlValueAccessor$1 {
2323
2390
  hasValue = computed(() => this.selectedValues().length > 0 || this.query().length > 0, ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
2324
2391
  constructor() {
2325
2392
  super();
2326
- effect(() => {
2327
- if (this.debugVisible()) {
2328
- afterNextRender(() => this.open());
2329
- }
2330
- });
2331
- effect(() => {
2332
- this.query();
2333
- this.itemsVersion();
2334
- if (this.autoHighlight()) {
2335
- this.highlightedIndex.set(0);
2336
- }
2337
- });
2338
2393
  queueMicrotask(() => {
2339
2394
  this.measureAnchor();
2340
2395
  this.attachResizeObserver();
@@ -2343,6 +2398,29 @@ class FrCombobox extends FrControlValueAccessor$1 {
2343
2398
  this.resizeObserver?.disconnect();
2344
2399
  });
2345
2400
  }
2401
+ ngAfterViewInit() {
2402
+ if (this.debugVisible()) {
2403
+ this.open();
2404
+ }
2405
+ }
2406
+ ngDoCheck() {
2407
+ if (this.debugVisible() && !this.isOpen()) {
2408
+ this.open();
2409
+ }
2410
+ const autoHighlight = this.autoHighlight();
2411
+ const itemsVersion = this.itemsVersion();
2412
+ const query = this.query();
2413
+ if (autoHighlight &&
2414
+ (query !== this.lastQuery ||
2415
+ itemsVersion !== this.lastItemsVersion ||
2416
+ autoHighlight !== this.lastAutoHighlight)) {
2417
+ // Filtering can invalidate the current index, so restart highlight at the first visible item.
2418
+ this.highlightedIndex.set(0);
2419
+ }
2420
+ this.lastAutoHighlight = autoHighlight;
2421
+ this.lastItemsVersion = itemsVersion;
2422
+ this.lastQuery = query;
2423
+ }
2346
2424
  registerItem(item) {
2347
2425
  this.items.add(item);
2348
2426
  this.bumpItems();
@@ -2351,6 +2429,9 @@ class FrCombobox extends FrControlValueAccessor$1 {
2351
2429
  this.items.delete(item);
2352
2430
  this.bumpItems();
2353
2431
  }
2432
+ refreshItems() {
2433
+ this.bumpItems();
2434
+ }
2354
2435
  visibleItems() {
2355
2436
  this.itemsVersion();
2356
2437
  return Array.from(this.items).filter((item) => item.isVisible());
@@ -2460,6 +2541,7 @@ class FrCombobox extends FrControlValueAccessor$1 {
2460
2541
  this.anchorWidth.set(null);
2461
2542
  return;
2462
2543
  }
2544
+ // Match the overlay width to the trigger even when content is rendered in the CDK overlay.
2463
2545
  this.anchorWidth.set(element.getBoundingClientRect().width || null);
2464
2546
  }
2465
2547
  attachResizeObserver() {
@@ -2546,6 +2628,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2546
2628
  }]
2547
2629
  }], 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"] }] } });
2548
2630
 
2631
+ /** Search input for combobox filtering. */
2549
2632
  class FrComboboxInput {
2550
2633
  root = inject(FrCombobox);
2551
2634
  elementRef = inject(ElementRef);
@@ -2603,6 +2686,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2603
2686
  },
2604
2687
  }]
2605
2688
  }] });
2689
+ /** Trigger control for combobox. */
2606
2690
  class FrComboboxTrigger {
2607
2691
  root = inject(FrCombobox);
2608
2692
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -2622,6 +2706,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2622
2706
  },
2623
2707
  }]
2624
2708
  }] });
2709
+ /** Clear control for combobox values. */
2625
2710
  class FrComboboxClear {
2626
2711
  root = inject(FrCombobox);
2627
2712
  hidden() {
@@ -2643,6 +2728,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2643
2728
  }]
2644
2729
  }] });
2645
2730
 
2731
+ /** Item slot for combobox. */
2646
2732
  class FrComboboxItem {
2647
2733
  destroyRef = inject(DestroyRef);
2648
2734
  elementRef = inject(ElementRef);
@@ -2652,6 +2738,7 @@ class FrComboboxItem {
2652
2738
  itemLabel = input(null, { ...(ngDevMode ? { debugName: "itemLabel" } : /* istanbul ignore next */ {}), alias: 'label' });
2653
2739
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2654
2740
  resolvedLabel = signal('', ...(ngDevMode ? [{ debugName: "resolvedLabel" }] : /* istanbul ignore next */ []));
2741
+ lastItemStateKey = '';
2655
2742
  label = computed(() => this.itemLabel() ?? this.resolvedLabel(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2656
2743
  visible = computed(() => this.root.itemVisible(this.label()), ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
2657
2744
  constructor() {
@@ -2664,11 +2751,17 @@ class FrComboboxItem {
2664
2751
  this.refreshResolvedLabel();
2665
2752
  this.observeTextChanges();
2666
2753
  });
2667
- effect(() => {
2668
- if (this.root.isSelected(this.value())) {
2669
- this.root.rememberItemLabel(this.value(), this.label());
2670
- }
2671
- });
2754
+ }
2755
+ ngDoCheck() {
2756
+ const itemStateKey = `${this.label()}|${this.disabled()}|${this.root.isSelected(this.value())}`;
2757
+ if (itemStateKey === this.lastItemStateKey) {
2758
+ return;
2759
+ }
2760
+ this.lastItemStateKey = itemStateKey;
2761
+ this.root.refreshItems();
2762
+ if (this.root.isSelected(this.value())) {
2763
+ this.root.rememberItemLabel(this.value(), this.label());
2764
+ }
2672
2765
  }
2673
2766
  isVisible() {
2674
2767
  return this.visible();
@@ -2695,11 +2788,13 @@ class FrComboboxItem {
2695
2788
  }
2696
2789
  refreshResolvedLabel() {
2697
2790
  this.resolvedLabel.set(this.resolveLabel());
2791
+ this.root.refreshItems();
2698
2792
  }
2699
2793
  observeTextChanges() {
2700
2794
  if (typeof MutationObserver === 'undefined' || this.itemLabel() !== null) {
2701
2795
  return;
2702
2796
  }
2797
+ // Items without explicit labels derive filtering text from projected content.
2703
2798
  this.mutationObserver = new MutationObserver(() => this.refreshResolvedLabel());
2704
2799
  this.mutationObserver.observe(this.elementRef.nativeElement, {
2705
2800
  characterData: true,
@@ -2728,6 +2823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2728
2823
  },
2729
2824
  }]
2730
2825
  }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], itemLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
2826
+ /** Indicator slot for combobox item. */
2731
2827
  class FrComboboxItemIndicator {
2732
2828
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2733
2829
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxItemIndicator, isStandalone: true, selector: "[frComboboxItemIndicator]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-combobox__item-indicator" }, ngImport: i0 });
@@ -2743,6 +2839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2743
2839
  }]
2744
2840
  }] });
2745
2841
 
2842
+ /** Chip list for multi-value combobox selections. */
2746
2843
  class FrComboboxChips {
2747
2844
  root = inject(FrCombobox);
2748
2845
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxChips, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -2759,6 +2856,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2759
2856
  },
2760
2857
  }]
2761
2858
  }] });
2859
+ /** List slot for combobox value. */
2762
2860
  class FrComboboxValueList {
2763
2861
  root = inject(FrCombobox);
2764
2862
  values() {
@@ -2777,6 +2875,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2777
2875
  },
2778
2876
  }]
2779
2877
  }] });
2878
+ /** Selected value chip for combobox. */
2780
2879
  class FrComboboxChip {
2781
2880
  root = inject(FrCombobox);
2782
2881
  elementRef = inject(ElementRef);
@@ -2824,6 +2923,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2824
2923
  },
2825
2924
  }]
2826
2925
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }] } });
2926
+ /** Remove control for a combobox chip. */
2827
2927
  class FrComboboxChipRemove {
2828
2928
  chip = inject(FrComboboxChip);
2829
2929
  remove(event) {
@@ -2845,6 +2945,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2845
2945
  },
2846
2946
  }]
2847
2947
  }] });
2948
+ /** Inline text input inside combobox chips. */
2848
2949
  class FrComboboxChipsInput {
2849
2950
  root = inject(FrCombobox);
2850
2951
  handleInput(event) {
@@ -2887,6 +2988,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2887
2988
  },
2888
2989
  }]
2889
2990
  }] });
2991
+ /** Error slot for combobox. */
2890
2992
  class FrComboboxError {
2891
2993
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2892
2994
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxError, isStandalone: true, selector: "[frComboboxError], frame-combobox-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-combobox__error" }, ngImport: i0 });
@@ -2904,6 +3006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2904
3006
 
2905
3007
  const DEFAULT_PANEL_CLASS$2 = 'frame-command-dialog__overlay-pane';
2906
3008
  const DEFAULT_BACKDROP_CLASS$2 = 'frame-command-dialog__backdrop';
3009
+ /** Template configuration for a command dialog. */
2907
3010
  class FrCommandDialog {
2908
3011
  templateRef = inject((TemplateRef));
2909
3012
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -2956,6 +3059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
2956
3059
  standalone: true,
2957
3060
  }]
2958
3061
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], closeOnDestroy: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnDestroy", required: false }] }], closeOnNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnNavigation", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], minHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHeight", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
3062
+ /** Trigger control for command dialog. */
2959
3063
  class FrCommandDialogTrigger {
2960
3064
  commandDialog = inject(FrCommandService);
2961
3065
  destroyRef = inject(DestroyRef);
@@ -3005,6 +3109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3005
3109
  },
3006
3110
  }]
3007
3111
  }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "frCommandDialogTrigger", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
3112
+ /** Service for opening command dialogs. */
3008
3113
  class FrCommandService {
3009
3114
  dialog = inject(Dialog);
3010
3115
  open(content, config = {}) {
@@ -3050,6 +3155,7 @@ function mergeClassList$2(classList, defaultClass) {
3050
3155
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
3051
3156
  }
3052
3157
 
3158
+ /** Footer slot for command. */
3053
3159
  class FrCommandFooter {
3054
3160
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3055
3161
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandFooter, isStandalone: true, selector: "[frCommandFooter]", host: { classAttribute: "frame-command__footer" }, ngImport: i0 });
@@ -3067,6 +3173,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3067
3173
  const FR_COMMAND = new InjectionToken('FrCommand');
3068
3174
  const FR_COMMAND_GROUP = new InjectionToken('FrCommandGroup');
3069
3175
 
3176
+ /** Group slot for command. */
3070
3177
  class FrCommandGroup {
3071
3178
  items = new Set();
3072
3179
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
@@ -3105,6 +3212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3105
3212
  },
3106
3213
  }]
3107
3214
  }], propDecorators: { forceMount: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceMount", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }] } });
3215
+ /** Heading slot for a command group. */
3108
3216
  class FrCommandGroupHeading {
3109
3217
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandGroupHeading, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3110
3218
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandGroupHeading, isStandalone: true, selector: "[frCommandGroupHeading]", host: { classAttribute: "frame-command__group-heading" }, ngImport: i0 });
@@ -3120,6 +3228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3120
3228
  }]
3121
3229
  }] });
3122
3230
 
3231
+ /** Command input component primitive. */
3123
3232
  class FrCommandInput {
3124
3233
  elementRef = inject(ElementRef);
3125
3234
  command = inject(FR_COMMAND);
@@ -3150,6 +3259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3150
3259
  }]
3151
3260
  }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
3152
3261
 
3262
+ /** Item slot for command. */
3153
3263
  class FrCommandItem {
3154
3264
  destroyRef = inject(DestroyRef);
3155
3265
  elementRef = inject(ElementRef);
@@ -3171,6 +3281,7 @@ class FrCommandItem {
3171
3281
  }, ...(ngDevMode ? [{ debugName: "keywords" }] : /* istanbul ignore next */ []));
3172
3282
  value = computed(() => this.valueInput() ?? this.label(), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
3173
3283
  visible = computed(() => this.command.filteredItemVisible(this.label(), this.keywords()), ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
3284
+ lastSearchKey = '';
3174
3285
  constructor() {
3175
3286
  this.command.registerItem(this);
3176
3287
  this.group?.registerItem(this);
@@ -3183,11 +3294,14 @@ class FrCommandItem {
3183
3294
  this.refreshResolvedLabel();
3184
3295
  this.observeTextChanges();
3185
3296
  });
3186
- effect(() => {
3187
- this.label();
3188
- this.keywords();
3189
- this.command.visibleCount();
3190
- });
3297
+ }
3298
+ ngDoCheck() {
3299
+ const searchKey = `${this.label()}|${this.keywords().join('|')}|${this.disabled()}`;
3300
+ if (searchKey === this.lastSearchKey) {
3301
+ return;
3302
+ }
3303
+ this.lastSearchKey = searchKey;
3304
+ this.command.refreshItems();
3191
3305
  }
3192
3306
  isVisible() {
3193
3307
  return this.visible();
@@ -3222,11 +3336,13 @@ class FrCommandItem {
3222
3336
  }
3223
3337
  refreshResolvedLabel() {
3224
3338
  this.resolvedLabel.set(this.resolveLabel());
3339
+ this.command.refreshItems();
3225
3340
  }
3226
3341
  observeTextChanges() {
3227
3342
  if (typeof MutationObserver === 'undefined' || this.itemLabel() !== null) {
3228
3343
  return;
3229
3344
  }
3345
+ // Items without explicit labels derive search text from projected content.
3230
3346
  this.mutationObserver = new MutationObserver(() => this.refreshResolvedLabel());
3231
3347
  this.mutationObserver.observe(this.elementRef.nativeElement, {
3232
3348
  characterData: true,
@@ -3259,6 +3375,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3259
3375
  },
3260
3376
  }]
3261
3377
  }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], itemKeywords: [{ type: i0.Input, args: [{ isSignal: true, alias: "keywords", required: false }] }], itemLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], valueInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], itemSelected: [{ type: i0.Output, args: ["selected"] }] } });
3378
+ /** Icon slot for command item. */
3262
3379
  class FrCommandItemIcon {
3263
3380
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandItemIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3264
3381
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandItemIcon, isStandalone: true, selector: "[frCommandItemIcon]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-command__item-icon" }, ngImport: i0 });
@@ -3274,6 +3391,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3274
3391
  },
3275
3392
  }]
3276
3393
  }] });
3394
+ /** Shortcut slot for command. */
3277
3395
  class FrCommandShortcut {
3278
3396
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3279
3397
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandShortcut, isStandalone: true, selector: "[frCommandShortcut]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-command__shortcut" }, ngImport: i0 });
@@ -3290,6 +3408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3290
3408
  }]
3291
3409
  }] });
3292
3410
 
3411
+ /** List slot for command. */
3293
3412
  class FrCommandList {
3294
3413
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3295
3414
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandList, isStandalone: true, selector: "[frCommandList]", host: { attributes: { "role": "listbox" }, classAttribute: "frame-command__list" }, ngImport: i0 });
@@ -3305,6 +3424,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3305
3424
  },
3306
3425
  }]
3307
3426
  }] });
3427
+ /** Empty-state slot for command results. */
3308
3428
  class FrCommandEmpty {
3309
3429
  command = inject(FR_COMMAND);
3310
3430
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandEmpty, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -3329,10 +3449,15 @@ const DEFAULT_FILTER = (query, label, keywords) => {
3329
3449
  }
3330
3450
  return [label, ...keywords].some((value) => value.toLowerCase().includes(normalizedQuery));
3331
3451
  };
3452
+ /** Command menu root that coordinates filtering and selection. */
3332
3453
  class FrCommand {
3333
3454
  dialogRef = inject(DialogRef, { optional: true });
3334
3455
  items = new Set();
3335
3456
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
3457
+ lastFilter = null;
3458
+ lastHighlightedIndex = 0;
3459
+ lastItemsVersion = -1;
3460
+ lastQuery = '';
3336
3461
  closeOnSelect = input(false, { ...(ngDevMode ? { debugName: "closeOnSelect" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3337
3462
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3338
3463
  filter = input(DEFAULT_FILTER, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
@@ -3343,17 +3468,21 @@ class FrCommand {
3343
3468
  query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
3344
3469
  highlightedIndex = signal(0, ...(ngDevMode ? [{ debugName: "highlightedIndex" }] : /* istanbul ignore next */ []));
3345
3470
  selectedValue = computed(() => this.value(), ...(ngDevMode ? [{ debugName: "selectedValue" }] : /* istanbul ignore next */ []));
3346
- constructor() {
3347
- effect(() => {
3348
- this.query();
3349
- this.itemsVersion();
3471
+ ngDoCheck() {
3472
+ const filter = this.filter();
3473
+ const highlightedIndex = this.highlightedIndex();
3474
+ const itemsVersion = this.itemsVersion();
3475
+ const query = this.query();
3476
+ if (query !== this.lastQuery || itemsVersion !== this.lastItemsVersion || filter !== this.lastFilter) {
3350
3477
  this.normalizeHighlight();
3351
- });
3352
- effect(() => {
3353
- this.highlightedIndex();
3354
- this.itemsVersion();
3478
+ }
3479
+ if (highlightedIndex !== this.lastHighlightedIndex || itemsVersion !== this.lastItemsVersion) {
3355
3480
  this.scrollHighlightedItemIntoView();
3356
- });
3481
+ }
3482
+ this.lastFilter = filter;
3483
+ this.lastHighlightedIndex = this.highlightedIndex();
3484
+ this.lastItemsVersion = itemsVersion;
3485
+ this.lastQuery = query;
3357
3486
  }
3358
3487
  registerItem(item) {
3359
3488
  this.items.add(item);
@@ -3363,6 +3492,9 @@ class FrCommand {
3363
3492
  this.items.delete(item);
3364
3493
  this.bumpItems();
3365
3494
  }
3495
+ refreshItems() {
3496
+ this.bumpItems();
3497
+ }
3366
3498
  visibleItems() {
3367
3499
  this.itemsVersion();
3368
3500
  return Array.from(this.items).filter((item) => item.isVisible() && !item.disabled());
@@ -3484,8 +3616,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3484
3616
  '(keydown)': 'handleKeydown($event)',
3485
3617
  },
3486
3618
  }]
3487
- }], ctorParameters: () => [], propDecorators: { closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }] } });
3619
+ }], propDecorators: { closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], itemSelected: [{ type: i0.Output, args: ["itemSelected"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }] } });
3488
3620
 
3621
+ /** Separator slot for command. */
3489
3622
  class FrCommandSeparator {
3490
3623
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCommandSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3491
3624
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCommandSeparator, isStandalone: true, selector: "[frCommandSeparator]", host: { attributes: { "role": "separator" }, classAttribute: "frame-command__separator" }, ngImport: i0 });
@@ -3502,7 +3635,405 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3502
3635
  }]
3503
3636
  }] });
3504
3637
 
3638
+ let nextConfirmPopoverId = 0;
3639
+ /** Flexible confirmation popover trigger that can attach to any host element. */
3640
+ class FrConfirmPopover {
3641
+ destroyRef = inject(DestroyRef);
3642
+ elementRef = inject(ElementRef);
3643
+ overlay = inject(Overlay);
3644
+ platformId = inject(PLATFORM_ID);
3645
+ config = input({}, { ...(ngDevMode ? { debugName: "config" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopover' });
3646
+ align = input(undefined, { ...(ngDevMode ? { debugName: "align" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverAlign' });
3647
+ alignOffset = input(undefined, { ...(ngDevMode ? { debugName: "alignOffset" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverAlignOffset',
3648
+ transform: optionalNumberAttribute });
3649
+ buttonSize = input(undefined, { ...(ngDevMode ? { debugName: "buttonSize" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverButtonSize' });
3650
+ cancelAppearance = input(undefined, { ...(ngDevMode ? { debugName: "cancelAppearance" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverCancelAppearance' });
3651
+ cancelLabel = input(undefined, { ...(ngDevMode ? { debugName: "cancelLabel" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverCancelLabel' });
3652
+ confirmAppearance = input(undefined, { ...(ngDevMode ? { debugName: "confirmAppearance" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverConfirmAppearance' });
3653
+ confirmLabel = input(undefined, { ...(ngDevMode ? { debugName: "confirmLabel" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverConfirmLabel' });
3654
+ description = input(undefined, { ...(ngDevMode ? { debugName: "description" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverDescription' });
3655
+ disabled = input(undefined, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverDisabled',
3656
+ transform: optionalBooleanAttribute });
3657
+ side = input(undefined, { ...(ngDevMode ? { debugName: "side" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverSide' });
3658
+ sideOffset = input(undefined, { ...(ngDevMode ? { debugName: "sideOffset" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverSideOffset',
3659
+ transform: optionalNumberAttribute });
3660
+ title = input(undefined, { ...(ngDevMode ? { debugName: "title" } : /* istanbul ignore next */ {}), alias: 'frConfirmPopoverTitle' });
3661
+ closed = output({ alias: 'frConfirmPopoverClosed' });
3662
+ cancelled = output({ alias: 'frConfirmPopoverCancelled' });
3663
+ confirmed = output({ alias: 'frConfirmPopoverConfirmed' });
3664
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3665
+ overlayRef = null;
3666
+ panelRef = null;
3667
+ currentSide = 'bottom';
3668
+ constructor() {
3669
+ this.destroyRef.onDestroy(() => this.destroy());
3670
+ }
3671
+ open() {
3672
+ if (!isPlatformBrowser(this.platformId)) {
3673
+ return;
3674
+ }
3675
+ const config = this.resolvedConfig();
3676
+ if (config.disabled) {
3677
+ return;
3678
+ }
3679
+ if (!this.overlayRef) {
3680
+ this.overlayRef = this.createOverlay(config);
3681
+ }
3682
+ if (!this.overlayRef.hasAttached()) {
3683
+ this.panelRef = this.overlayRef.attach(new ComponentPortal(FrConfirmPopoverPanel));
3684
+ this.panelRef.instance.cancelled.subscribe(() => this.close('cancel'));
3685
+ this.panelRef.instance.confirmed.subscribe(() => this.close('confirm'));
3686
+ this.syncCustomPropertiesToOverlay();
3687
+ }
3688
+ this.updatePanelInputs(config);
3689
+ this.isOpen.set(true);
3690
+ }
3691
+ close(result) {
3692
+ this.detachPanel({ dispose: true });
3693
+ this.closed.emit(result);
3694
+ if (result === 'confirm') {
3695
+ this.confirmed.emit();
3696
+ return;
3697
+ }
3698
+ if (result === 'cancel') {
3699
+ this.cancelled.emit();
3700
+ }
3701
+ }
3702
+ toggle() {
3703
+ if (this.isOpen()) {
3704
+ this.close();
3705
+ return;
3706
+ }
3707
+ this.open();
3708
+ }
3709
+ handleClick(event) {
3710
+ event.preventDefault();
3711
+ this.toggle();
3712
+ }
3713
+ handleKeydown(event) {
3714
+ if (event.key === 'Escape') {
3715
+ event.preventDefault();
3716
+ this.close();
3717
+ return;
3718
+ }
3719
+ if (this.isNativeInteractiveElement()) {
3720
+ return;
3721
+ }
3722
+ if (event.key === 'Enter' || event.key === ' ') {
3723
+ event.preventDefault();
3724
+ this.toggle();
3725
+ }
3726
+ }
3727
+ createOverlay(config) {
3728
+ this.currentSide = config.side;
3729
+ const positionStrategy = this.overlay
3730
+ .position()
3731
+ .flexibleConnectedTo(this.elementRef.nativeElement)
3732
+ .withPositions(buildConfirmPopoverPositions(config))
3733
+ .withPush(true)
3734
+ .withViewportMargin(12);
3735
+ positionStrategy.positionChanges.subscribe((event) => this.handlePositionChange(event));
3736
+ const overlayRef = this.overlay.create({
3737
+ hasBackdrop: true,
3738
+ backdropClass: 'frame-popover__backdrop',
3739
+ panelClass: [
3740
+ 'frame-popover-overlay',
3741
+ 'frame-confirm-popover-overlay',
3742
+ `frame-popover-overlay--${config.side}`,
3743
+ ],
3744
+ positionStrategy,
3745
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
3746
+ });
3747
+ overlayRef.backdropClick().subscribe(() => this.close());
3748
+ overlayRef.keydownEvents().subscribe((event) => {
3749
+ if (event.key === 'Escape') {
3750
+ event.preventDefault();
3751
+ this.close();
3752
+ }
3753
+ });
3754
+ return overlayRef;
3755
+ }
3756
+ handlePositionChange(event) {
3757
+ const pair = event.connectionPair;
3758
+ const side = pair.overlayY === 'top'
3759
+ ? 'bottom'
3760
+ : pair.overlayY === 'bottom'
3761
+ ? 'top'
3762
+ : pair.overlayX === 'start'
3763
+ ? 'right'
3764
+ : 'left';
3765
+ this.currentSide = side;
3766
+ this.panelRef?.setInput('side', side);
3767
+ this.overlayRef?.removePanelClass([
3768
+ 'frame-popover-overlay--top',
3769
+ 'frame-popover-overlay--right',
3770
+ 'frame-popover-overlay--bottom',
3771
+ 'frame-popover-overlay--left',
3772
+ ]);
3773
+ this.overlayRef?.addPanelClass(`frame-popover-overlay--${side}`);
3774
+ }
3775
+ updatePanelInputs(config) {
3776
+ const panelRef = this.panelRef;
3777
+ if (!panelRef) {
3778
+ return;
3779
+ }
3780
+ const panelId = `frame-confirm-popover-${nextConfirmPopoverId++}`;
3781
+ panelRef.setInput('buttonSize', config.buttonSize);
3782
+ panelRef.setInput('cancelAppearance', config.cancelAppearance);
3783
+ panelRef.setInput('cancelLabel', config.cancelLabel);
3784
+ panelRef.setInput('confirmAppearance', config.confirmAppearance);
3785
+ panelRef.setInput('confirmLabel', config.confirmLabel);
3786
+ panelRef.setInput('description', config.description);
3787
+ panelRef.setInput('descriptionId', config.description ? `${panelId}-description` : null);
3788
+ panelRef.setInput('side', this.currentSide);
3789
+ panelRef.setInput('title', config.title);
3790
+ panelRef.setInput('titleId', `${panelId}-title`);
3791
+ }
3792
+ resolvedConfig() {
3793
+ const config = this.config();
3794
+ const baseConfig = typeof config === 'string' ? { title: config } : config;
3795
+ return {
3796
+ align: this.align() ?? baseConfig.align ?? 'center',
3797
+ alignOffset: this.alignOffset() ?? baseConfig.alignOffset ?? 0,
3798
+ buttonSize: this.buttonSize() ?? baseConfig.buttonSize ?? 'sm',
3799
+ cancelAppearance: this.cancelAppearance() ?? baseConfig.cancelAppearance ?? 'outline',
3800
+ cancelLabel: this.cancelLabel() ?? baseConfig.cancelLabel ?? 'Cancel',
3801
+ confirmAppearance: this.confirmAppearance() ?? baseConfig.confirmAppearance ?? 'primary',
3802
+ confirmLabel: this.confirmLabel() ?? baseConfig.confirmLabel ?? 'Confirm',
3803
+ description: this.description() ?? baseConfig.description,
3804
+ disabled: this.disabled() ?? baseConfig.disabled ?? false,
3805
+ side: this.side() ?? baseConfig.side ?? 'bottom',
3806
+ sideOffset: this.sideOffset() ?? baseConfig.sideOffset ?? 8,
3807
+ title: this.title() ?? baseConfig.title ?? 'Are you sure?',
3808
+ };
3809
+ }
3810
+ syncCustomPropertiesToOverlay() {
3811
+ const overlayPane = this.overlayRef?.overlayElement;
3812
+ const panel = overlayPane?.querySelector('.frame-confirm-popover__content');
3813
+ if (!overlayPane || !panel || typeof getComputedStyle === 'undefined') {
3814
+ return;
3815
+ }
3816
+ const sourceStyles = getComputedStyle(this.elementRef.nativeElement);
3817
+ // Overlay content is portaled, so copy popover-compatible token overrides from the trigger.
3818
+ for (let index = 0; index < sourceStyles.length; index += 1) {
3819
+ const propertyName = sourceStyles.item(index);
3820
+ if (!propertyName.startsWith('--frame-popover-') && !propertyName.startsWith('--frame-confirm-popover-')) {
3821
+ continue;
3822
+ }
3823
+ const propertyValue = sourceStyles.getPropertyValue(propertyName);
3824
+ overlayPane.style.setProperty(propertyName, propertyValue);
3825
+ panel.style.setProperty(propertyName, propertyValue);
3826
+ }
3827
+ }
3828
+ isNativeInteractiveElement() {
3829
+ const tagName = this.elementRef.nativeElement.tagName.toLowerCase();
3830
+ return ['a', 'button', 'input', 'select', 'textarea'].includes(tagName);
3831
+ }
3832
+ destroy() {
3833
+ this.detachPanel({ dispose: true });
3834
+ }
3835
+ detachPanel(options = {}) {
3836
+ this.overlayRef?.detach();
3837
+ this.panelRef = null;
3838
+ this.isOpen.set(false);
3839
+ if (options.dispose) {
3840
+ this.overlayRef?.dispose();
3841
+ this.overlayRef = null;
3842
+ }
3843
+ }
3844
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrConfirmPopover, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3845
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrConfirmPopover, isStandalone: true, selector: "\n [frConfirmPopover],\n [frConfirmPopoverAlign],\n [frConfirmPopoverAlignOffset],\n [frConfirmPopoverButtonSize],\n [frConfirmPopoverCancelAppearance],\n [frConfirmPopoverCancelLabel],\n [frConfirmPopoverConfirmAppearance],\n [frConfirmPopoverConfirmLabel],\n [frConfirmPopoverDescription],\n [frConfirmPopoverDisabled],\n [frConfirmPopoverSide],\n [frConfirmPopoverSideOffset],\n [frConfirmPopoverTitle]\n ", inputs: { config: { classPropertyName: "config", publicName: "frConfirmPopover", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "frConfirmPopoverAlign", isSignal: true, isRequired: false, transformFunction: null }, alignOffset: { classPropertyName: "alignOffset", publicName: "frConfirmPopoverAlignOffset", isSignal: true, isRequired: false, transformFunction: null }, buttonSize: { classPropertyName: "buttonSize", publicName: "frConfirmPopoverButtonSize", isSignal: true, isRequired: false, transformFunction: null }, cancelAppearance: { classPropertyName: "cancelAppearance", publicName: "frConfirmPopoverCancelAppearance", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "frConfirmPopoverCancelLabel", isSignal: true, isRequired: false, transformFunction: null }, confirmAppearance: { classPropertyName: "confirmAppearance", publicName: "frConfirmPopoverConfirmAppearance", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "frConfirmPopoverConfirmLabel", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "frConfirmPopoverDescription", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "frConfirmPopoverDisabled", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "frConfirmPopoverSide", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "frConfirmPopoverSideOffset", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "frConfirmPopoverTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "frConfirmPopoverClosed", cancelled: "frConfirmPopoverCancelled", confirmed: "frConfirmPopoverConfirmed" }, host: { listeners: { "click": "handleClick($event)", "keydown": "handleKeydown($event)" }, properties: { "attr.aria-expanded": "isOpen()", "attr.aria-haspopup": "\"dialog\"", "attr.data-state": "isOpen() ? \"open\" : \"closed\"" }, classAttribute: "frame-confirm-popover__trigger" }, exportAs: ["frConfirmPopover"], ngImport: i0 });
3846
+ }
3847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrConfirmPopover, decorators: [{
3848
+ type: Directive,
3849
+ args: [{
3850
+ selector: `
3851
+ [frConfirmPopover],
3852
+ [frConfirmPopoverAlign],
3853
+ [frConfirmPopoverAlignOffset],
3854
+ [frConfirmPopoverButtonSize],
3855
+ [frConfirmPopoverCancelAppearance],
3856
+ [frConfirmPopoverCancelLabel],
3857
+ [frConfirmPopoverConfirmAppearance],
3858
+ [frConfirmPopoverConfirmLabel],
3859
+ [frConfirmPopoverDescription],
3860
+ [frConfirmPopoverDisabled],
3861
+ [frConfirmPopoverSide],
3862
+ [frConfirmPopoverSideOffset],
3863
+ [frConfirmPopoverTitle]
3864
+ `,
3865
+ exportAs: 'frConfirmPopover',
3866
+ host: {
3867
+ class: 'frame-confirm-popover__trigger',
3868
+ '[attr.aria-expanded]': 'isOpen()',
3869
+ '[attr.aria-haspopup]': '"dialog"',
3870
+ '[attr.data-state]': 'isOpen() ? "open" : "closed"',
3871
+ '(click)': 'handleClick($event)',
3872
+ '(keydown)': 'handleKeydown($event)',
3873
+ },
3874
+ }]
3875
+ }], ctorParameters: () => [], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopover", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverAlign", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverAlignOffset", required: false }] }], buttonSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverButtonSize", required: false }] }], cancelAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverCancelAppearance", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverCancelLabel", required: false }] }], confirmAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverConfirmAppearance", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverConfirmLabel", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverDescription", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverDisabled", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverSide", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverSideOffset", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "frConfirmPopoverTitle", required: false }] }], closed: [{ type: i0.Output, args: ["frConfirmPopoverClosed"] }], cancelled: [{ type: i0.Output, args: ["frConfirmPopoverCancelled"] }], confirmed: [{ type: i0.Output, args: ["frConfirmPopoverConfirmed"] }] } });
3876
+ class FrConfirmPopoverPanel {
3877
+ buttonSize = input('sm', ...(ngDevMode ? [{ debugName: "buttonSize" }] : /* istanbul ignore next */ []));
3878
+ cancelAppearance = input('outline', ...(ngDevMode ? [{ debugName: "cancelAppearance" }] : /* istanbul ignore next */ []));
3879
+ cancelLabel = input('Cancel', ...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
3880
+ confirmAppearance = input('primary', ...(ngDevMode ? [{ debugName: "confirmAppearance" }] : /* istanbul ignore next */ []));
3881
+ confirmLabel = input('Confirm', ...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
3882
+ description = input(undefined, ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
3883
+ descriptionId = input(null, ...(ngDevMode ? [{ debugName: "descriptionId" }] : /* istanbul ignore next */ []));
3884
+ side = input('bottom', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
3885
+ title = input('Are you sure?', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
3886
+ titleId = input.required(...(ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []));
3887
+ cancelled = output();
3888
+ confirmed = output();
3889
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrConfirmPopoverPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
3890
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrConfirmPopoverPanel, isStandalone: true, selector: "frame-confirm-popover-panel", inputs: { buttonSize: { classPropertyName: "buttonSize", publicName: "buttonSize", isSignal: true, isRequired: false, transformFunction: null }, cancelAppearance: { classPropertyName: "cancelAppearance", publicName: "cancelAppearance", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null }, confirmAppearance: { classPropertyName: "confirmAppearance", publicName: "confirmAppearance", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, descriptionId: { classPropertyName: "descriptionId", publicName: "descriptionId", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, titleId: { classPropertyName: "titleId", publicName: "titleId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { cancelled: "cancelled", confirmed: "confirmed" }, ngImport: i0, template: `
3891
+ <div
3892
+ class="frame-popover__content frame-confirm-popover__content"
3893
+ role="alertdialog"
3894
+ [attr.aria-describedby]="descriptionId()"
3895
+ [attr.aria-labelledby]="titleId()"
3896
+ [attr.data-side]="side()"
3897
+ >
3898
+ <div class="frame-popover__header frame-confirm-popover__header">
3899
+ <h3 class="frame-popover__title frame-confirm-popover__title" [id]="titleId()">
3900
+ {{ title() }}
3901
+ </h3>
3902
+
3903
+ @if (description()) {
3904
+ <p class="frame-popover__description frame-confirm-popover__description" [id]="descriptionId()">
3905
+ {{ description() }}
3906
+ </p>
3907
+ }
3908
+ </div>
3909
+
3910
+ <div class="frame-popover__footer frame-confirm-popover__footer">
3911
+ <button
3912
+ frButton
3913
+ type="button"
3914
+ [appearance]="cancelAppearance()"
3915
+ [size]="buttonSize()"
3916
+ (click)="cancelled.emit()"
3917
+ >
3918
+ <span frButtonLabel>{{ cancelLabel() }}</span>
3919
+ </button>
3920
+ <button
3921
+ frButton
3922
+ type="button"
3923
+ [appearance]="confirmAppearance()"
3924
+ [size]="buttonSize()"
3925
+ (click)="confirmed.emit()"
3926
+ >
3927
+ <span frButtonLabel>{{ confirmLabel() }}</span>
3928
+ </button>
3929
+ </div>
3930
+ </div>
3931
+ `, isInline: true, dependencies: [{ kind: "directive", type: FrButton$1, selector: "a[frButton], button[frButton]", inputs: ["appearance", "disabled", "loading", "loadingDisplay", "radius", "size"] }, { kind: "directive", type: FrButtonLabel$1, selector: "[frButtonLabel]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3932
+ }
3933
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrConfirmPopoverPanel, decorators: [{
3934
+ type: Component,
3935
+ args: [{
3936
+ selector: 'frame-confirm-popover-panel',
3937
+ imports: [FrButton$1, FrButtonLabel$1],
3938
+ changeDetection: ChangeDetectionStrategy.OnPush,
3939
+ template: `
3940
+ <div
3941
+ class="frame-popover__content frame-confirm-popover__content"
3942
+ role="alertdialog"
3943
+ [attr.aria-describedby]="descriptionId()"
3944
+ [attr.aria-labelledby]="titleId()"
3945
+ [attr.data-side]="side()"
3946
+ >
3947
+ <div class="frame-popover__header frame-confirm-popover__header">
3948
+ <h3 class="frame-popover__title frame-confirm-popover__title" [id]="titleId()">
3949
+ {{ title() }}
3950
+ </h3>
3951
+
3952
+ @if (description()) {
3953
+ <p class="frame-popover__description frame-confirm-popover__description" [id]="descriptionId()">
3954
+ {{ description() }}
3955
+ </p>
3956
+ }
3957
+ </div>
3958
+
3959
+ <div class="frame-popover__footer frame-confirm-popover__footer">
3960
+ <button
3961
+ frButton
3962
+ type="button"
3963
+ [appearance]="cancelAppearance()"
3964
+ [size]="buttonSize()"
3965
+ (click)="cancelled.emit()"
3966
+ >
3967
+ <span frButtonLabel>{{ cancelLabel() }}</span>
3968
+ </button>
3969
+ <button
3970
+ frButton
3971
+ type="button"
3972
+ [appearance]="confirmAppearance()"
3973
+ [size]="buttonSize()"
3974
+ (click)="confirmed.emit()"
3975
+ >
3976
+ <span frButtonLabel>{{ confirmLabel() }}</span>
3977
+ </button>
3978
+ </div>
3979
+ </div>
3980
+ `,
3981
+ }]
3982
+ }], propDecorators: { buttonSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonSize", required: false }] }], cancelAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelAppearance", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }], confirmAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmAppearance", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], descriptionId: [{ type: i0.Input, args: [{ isSignal: true, alias: "descriptionId", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], titleId: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleId", required: true }] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }], confirmed: [{ type: i0.Output, args: ["confirmed"] }] } });
3983
+ function buildConfirmPopoverPositions(options) {
3984
+ const primary = buildPosition$2(options.side, options);
3985
+ const fallback = buildPosition$2(oppositeSide$2(options.side), options);
3986
+ return [primary, fallback];
3987
+ }
3988
+ function buildPosition$2(side, options) {
3989
+ if (side === 'top' || side === 'bottom') {
3990
+ const isBottom = side === 'bottom';
3991
+ return {
3992
+ originX: options.align,
3993
+ originY: isBottom ? 'bottom' : 'top',
3994
+ overlayX: options.align,
3995
+ overlayY: isBottom ? 'top' : 'bottom',
3996
+ offsetX: options.alignOffset,
3997
+ offsetY: isBottom ? options.sideOffset : -options.sideOffset,
3998
+ };
3999
+ }
4000
+ const isRight = side === 'right';
4001
+ return {
4002
+ originX: isRight ? 'end' : 'start',
4003
+ originY: verticalPosition(options.align),
4004
+ overlayX: isRight ? 'start' : 'end',
4005
+ overlayY: verticalPosition(options.align),
4006
+ offsetX: isRight ? options.sideOffset : -options.sideOffset,
4007
+ offsetY: options.alignOffset,
4008
+ };
4009
+ }
4010
+ function verticalPosition(align) {
4011
+ if (align === 'center') {
4012
+ return 'center';
4013
+ }
4014
+ return align === 'start' ? 'top' : 'bottom';
4015
+ }
4016
+ function oppositeSide$2(side) {
4017
+ if (side === 'top') {
4018
+ return 'bottom';
4019
+ }
4020
+ if (side === 'bottom') {
4021
+ return 'top';
4022
+ }
4023
+ if (side === 'left') {
4024
+ return 'right';
4025
+ }
4026
+ return 'left';
4027
+ }
4028
+ function optionalBooleanAttribute(value) {
4029
+ return value == null ? undefined : booleanAttribute(value);
4030
+ }
4031
+ function optionalNumberAttribute(value) {
4032
+ return value == null ? undefined : numberAttribute(value);
4033
+ }
4034
+
3505
4035
  const FR_CONTEXT_MENU_CONTENT = new InjectionToken('FrContextMenuContent');
4036
+ /** Content slot for context menu. */
3506
4037
  class FrContextMenuContent {
3507
4038
  templateRef = inject((TemplateRef));
3508
4039
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
@@ -3551,6 +4082,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3551
4082
  ],
3552
4083
  }]
3553
4084
  }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }] } });
4085
+ /** Panel slot for context menu. */
3554
4086
  class FrContextMenuPanel {
3555
4087
  side = inject(FR_CONTEXT_MENU_CONTENT).side;
3556
4088
  tree = inject(FrDropdownMenuTree$1);
@@ -3579,6 +4111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3579
4111
  }]
3580
4112
  }] });
3581
4113
 
4114
+ /** Item slot for context menu. */
3582
4115
  class FrContextMenuItem {
3583
4116
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3584
4117
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -3597,16 +4130,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3597
4130
  },
3598
4131
  }]
3599
4132
  }], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4133
+ /** Item slot for context menu checkbox. */
3600
4134
  class FrContextMenuCheckboxItem {
3601
4135
  checkboxItem = inject(CdkMenuItemCheckbox);
4136
+ lastChecked = false;
3602
4137
  checked = input(false, { ...(ngDevMode ? { debugName: "checked" } : /* istanbul ignore next */ {}), alias: 'checked',
3603
4138
  transform: booleanAttribute });
3604
4139
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3605
4140
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3606
- constructor() {
3607
- effect(() => {
3608
- this.checkboxItem.checked = this.checked();
3609
- });
4141
+ ngDoCheck() {
4142
+ const checked = this.checked();
4143
+ if (checked === this.lastChecked) {
4144
+ return;
4145
+ }
4146
+ this.lastChecked = checked;
4147
+ this.checkboxItem.checked = checked;
3610
4148
  }
3611
4149
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuCheckboxItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3612
4150
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrContextMenuCheckboxItem, isStandalone: true, selector: "button[frContextMenuCheckboxItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-checked": "checkboxItem.checked ? \"\" : null", "attr.data-inset": "inset() ? \"\" : null", "attr.data-variant": "variant()" }, classAttribute: "frame-context-menu__item frame-context-menu__checkbox-item frame-dropdown-menu__item frame-dropdown-menu__checkbox-item" }, hostDirectives: [{ directive: i1$2.CdkMenuItemCheckbox }], ngImport: i0 });
@@ -3623,7 +4161,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3623
4161
  '[attr.data-variant]': 'variant()',
3624
4162
  },
3625
4163
  }]
3626
- }], ctorParameters: () => [], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4164
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4165
+ /** Group slot for context menu radio. */
3627
4166
  class FrContextMenuRadioGroup {
3628
4167
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuRadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3629
4168
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrContextMenuRadioGroup, isStandalone: true, selector: "[frContextMenuRadioGroup]", host: { classAttribute: "frame-context-menu__radio-group frame-dropdown-menu__radio-group" }, hostDirectives: [{ directive: i1$2.CdkMenuGroup }], ngImport: i0 });
@@ -3638,16 +4177,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3638
4177
  },
3639
4178
  }]
3640
4179
  }] });
4180
+ /** Item slot for context menu radio. */
3641
4181
  class FrContextMenuRadioItem {
3642
4182
  radioItem = inject(CdkMenuItemRadio);
4183
+ lastChecked = false;
3643
4184
  checked = input(false, { ...(ngDevMode ? { debugName: "checked" } : /* istanbul ignore next */ {}), alias: 'checked',
3644
4185
  transform: booleanAttribute });
3645
4186
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3646
4187
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3647
- constructor() {
3648
- effect(() => {
3649
- this.radioItem.checked = this.checked();
3650
- });
4188
+ ngDoCheck() {
4189
+ const checked = this.checked();
4190
+ if (checked === this.lastChecked) {
4191
+ return;
4192
+ }
4193
+ this.lastChecked = checked;
4194
+ this.radioItem.checked = checked;
3651
4195
  }
3652
4196
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuRadioItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3653
4197
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrContextMenuRadioItem, isStandalone: true, selector: "button[frContextMenuRadioItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-checked": "radioItem.checked ? \"\" : null", "attr.data-inset": "inset() ? \"\" : null", "attr.data-variant": "variant()" }, classAttribute: "frame-context-menu__item frame-context-menu__radio-item frame-dropdown-menu__item frame-dropdown-menu__radio-item" }, hostDirectives: [{ directive: i1$2.CdkMenuItemRadio }], ngImport: i0 });
@@ -3664,7 +4208,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3664
4208
  '[attr.data-variant]': 'variant()',
3665
4209
  },
3666
4210
  }]
3667
- }], ctorParameters: () => [], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4211
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
4212
+ /** Label slot for context menu. */
3668
4213
  class FrContextMenuLabel {
3669
4214
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3670
4215
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -3680,6 +4225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3680
4225
  },
3681
4226
  }]
3682
4227
  }], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }] } });
4228
+ /** Separator slot for context menu. */
3683
4229
  class FrContextMenuSeparator {
3684
4230
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3685
4231
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrContextMenuSeparator, isStandalone: true, selector: "[frContextMenuSeparator]", host: { attributes: { "role": "separator" }, classAttribute: "frame-context-menu__separator frame-dropdown-menu__separator" }, ngImport: i0 });
@@ -3694,6 +4240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3694
4240
  },
3695
4241
  }]
3696
4242
  }] });
4243
+ /** Shortcut slot for context menu. */
3697
4244
  class FrContextMenuShortcut {
3698
4245
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3699
4246
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrContextMenuShortcut, isStandalone: true, selector: "[frContextMenuShortcut]", host: { classAttribute: "frame-context-menu__shortcut frame-dropdown-menu__shortcut" }, ngImport: i0 });
@@ -3707,6 +4254,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3707
4254
  },
3708
4255
  }]
3709
4256
  }] });
4257
+ /** Indicator slot for context menu item. */
3710
4258
  class FrContextMenuItemIndicator {
3711
4259
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3712
4260
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrContextMenuItemIndicator, isStandalone: true, selector: "[frContextMenuItemIndicator]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-context-menu__indicator frame-dropdown-menu__indicator" }, ngImport: i0 });
@@ -3722,6 +4270,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3722
4270
  }]
3723
4271
  }] });
3724
4272
 
4273
+ /** Root controller for context menu interactions. */
3725
4274
  class FrContextMenu {
3726
4275
  closeDelay = input(140, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
3727
4276
  triggerMode = input('both', ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
@@ -3750,18 +4299,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3750
4299
  },
3751
4300
  }]
3752
4301
  }], propDecorators: { closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
4302
+ /** Nested submenu controller for context menu. */
3753
4303
  class FrContextMenuSub {
3754
4304
  parent = inject(FR_DROPDOWN_MENU_PARENT$1, { skipSelf: true });
3755
4305
  closeDelayInput = input(null, { ...(ngDevMode ? { debugName: "closeDelayInput" } : /* istanbul ignore next */ {}), alias: 'closeDelay' });
3756
4306
  triggerModeInput = input(null, { ...(ngDevMode ? { debugName: "triggerModeInput" } : /* istanbul ignore next */ {}), alias: 'triggerMode' });
3757
- closeDelay = signal(this.parent.closeDelay(), ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
3758
- triggerMode = signal(this.parent.triggerMode(), ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
3759
- constructor() {
3760
- effect(() => {
3761
- this.closeDelay.set(this.closeDelayInput() ?? this.parent.closeDelay());
3762
- this.triggerMode.set(this.triggerModeInput() ?? this.parent.triggerMode());
3763
- });
3764
- }
4307
+ closeDelay = computed(() => this.closeDelayInput() ?? this.parent.closeDelay(), ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
4308
+ triggerMode = computed(() => this.triggerModeInput() ?? this.parent.triggerMode(), ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
3765
4309
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrContextMenuSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3766
4310
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrContextMenuSub, isStandalone: true, selector: "[frContextMenuSub]", inputs: { closeDelayInput: { classPropertyName: "closeDelayInput", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null }, triggerModeInput: { classPropertyName: "triggerModeInput", publicName: "triggerMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "frame-context-menu-sub frame-dropdown-menu-sub" }, providers: [
3767
4311
  {
@@ -3784,8 +4328,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3784
4328
  class: 'frame-context-menu-sub frame-dropdown-menu-sub',
3785
4329
  },
3786
4330
  }]
3787
- }], ctorParameters: () => [], propDecorators: { closeDelayInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
4331
+ }], propDecorators: { closeDelayInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
3788
4332
 
4333
+ /** Trigger control for context menu sub. */
3789
4334
  class FrContextMenuSubTrigger {
3790
4335
  cdkMenuTrigger = inject(CdkMenuTrigger);
3791
4336
  destroyRef = inject(DestroyRef);
@@ -3798,18 +4343,7 @@ class FrContextMenuSubTrigger {
3798
4343
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3799
4344
  constructor() {
3800
4345
  this.tree.register(this);
3801
- effect(() => {
3802
- const content = this.menuContent();
3803
- this.cdkMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
3804
- this.cdkMenuTrigger.menuPosition = this.resolvePositions();
3805
- if (content?.isDebugVisible() && !this.cdkMenuTrigger.isOpen()) {
3806
- queueMicrotask(() => {
3807
- if (!this.cdkMenuTrigger.isOpen()) {
3808
- this.cdkMenuTrigger.open();
3809
- }
3810
- });
3811
- }
3812
- });
4346
+ queueMicrotask(() => this.syncCdkTrigger());
3813
4347
  this.cdkMenuTrigger.opened.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
3814
4348
  this.tree.cancelClose();
3815
4349
  this.isOpen.set(true);
@@ -3826,6 +4360,21 @@ class FrContextMenuSubTrigger {
3826
4360
  this.isOpen.set(false);
3827
4361
  });
3828
4362
  }
4363
+ ngDoCheck() {
4364
+ this.syncCdkTrigger();
4365
+ }
4366
+ syncCdkTrigger() {
4367
+ const content = this.menuContent();
4368
+ this.cdkMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
4369
+ this.cdkMenuTrigger.menuPosition = this.resolvePositions();
4370
+ if (content?.isDebugVisible() && !this.cdkMenuTrigger.isOpen()) {
4371
+ queueMicrotask(() => {
4372
+ if (!this.cdkMenuTrigger.isOpen()) {
4373
+ this.cdkMenuTrigger.open();
4374
+ }
4375
+ });
4376
+ }
4377
+ }
3829
4378
  close() {
3830
4379
  if (this.menuContent()?.isDebugVisible()) {
3831
4380
  return;
@@ -3879,6 +4428,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
3879
4428
  }]
3880
4429
  }], ctorParameters: () => [], propDecorators: { menuContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "frContextMenuSubTrigger", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
3881
4430
 
4431
+ /** Trigger control for context menu. */
3882
4432
  class FrContextMenuTrigger {
3883
4433
  static CUSTOM_PROPERTY_PREFIX = '--frame-dropdown-menu-';
3884
4434
  cdkContextMenuTrigger = inject(CdkContextMenuTrigger);
@@ -3892,19 +4442,7 @@ class FrContextMenuTrigger {
3892
4442
  closed = output();
3893
4443
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
3894
4444
  constructor() {
3895
- effect(() => {
3896
- const content = this.menuContent();
3897
- this.cdkContextMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
3898
- this.cdkContextMenuTrigger.menuPosition = this.resolvePositions();
3899
- this.cdkContextMenuTrigger.disabled = this.disabled();
3900
- if (content?.isDebugVisible() && !this.cdkContextMenuTrigger.isOpen()) {
3901
- queueMicrotask(() => {
3902
- if (!this.cdkContextMenuTrigger.isOpen()) {
3903
- this.openAtCenter();
3904
- }
3905
- });
3906
- }
3907
- });
4445
+ queueMicrotask(() => this.syncCdkTrigger());
3908
4446
  this.cdkContextMenuTrigger.opened.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
3909
4447
  this.isOpen.set(true);
3910
4448
  this.opened.emit();
@@ -3925,6 +4463,22 @@ class FrContextMenuTrigger {
3925
4463
  this.closed.emit();
3926
4464
  });
3927
4465
  }
4466
+ ngDoCheck() {
4467
+ this.syncCdkTrigger();
4468
+ }
4469
+ syncCdkTrigger() {
4470
+ const content = this.menuContent();
4471
+ this.cdkContextMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
4472
+ this.cdkContextMenuTrigger.menuPosition = this.resolvePositions();
4473
+ this.cdkContextMenuTrigger.disabled = this.disabled();
4474
+ if (content?.isDebugVisible() && !this.cdkContextMenuTrigger.isOpen()) {
4475
+ queueMicrotask(() => {
4476
+ if (!this.cdkContextMenuTrigger.isOpen()) {
4477
+ this.openAtCenter();
4478
+ }
4479
+ });
4480
+ }
4481
+ }
3928
4482
  openAt(coordinates) {
3929
4483
  if (this.disabled() || !this.menuContent()) {
3930
4484
  return;
@@ -3939,6 +4493,7 @@ class FrContextMenuTrigger {
3939
4493
  return;
3940
4494
  }
3941
4495
  this.clearLongPress();
4496
+ // Touch and pen users need a delayed open because they do not have a native contextmenu gesture.
3942
4497
  this.longPressTimeoutId = setTimeout(() => {
3943
4498
  event.preventDefault();
3944
4499
  this.openAt({ x: event.clientX, y: event.clientY });
@@ -3969,6 +4524,7 @@ class FrContextMenuTrigger {
3969
4524
  }
3970
4525
  const menuPanel = overlayElement.querySelector('.frame-dropdown-menu__content') ?? overlayElement;
3971
4526
  const sourceStyles = getComputedStyle(this.elementRef.nativeElement);
4527
+ // CDK portals the menu, so trigger-scoped CSS variables must be mirrored manually.
3972
4528
  for (let index = 0; index < sourceStyles.length; index += 1) {
3973
4529
  const propertyName = sourceStyles.item(index);
3974
4530
  if (!propertyName.startsWith(FrContextMenuTrigger.CUSTOM_PROPERTY_PREFIX)) {
@@ -4015,6 +4571,7 @@ const POSITIONS = [
4015
4571
  offsetY: -8,
4016
4572
  },
4017
4573
  ];
4574
+ /** Date picker control backed by the calendar primitive. */
4018
4575
  class FrDatePicker extends FrControlValueAccessor$1 {
4019
4576
  mode = input('single', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
4020
4577
  captionLayout = input('label', ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
@@ -4116,6 +4673,7 @@ class FrDatePicker extends FrControlValueAccessor$1 {
4116
4673
  }
4117
4674
  selectCalendarValue(value) {
4118
4675
  const previous = this.singleDate();
4676
+ // Preserve the existing time when a calendar click only changes the date portion.
4119
4677
  const next = this.showTime() && value instanceof Date && previous ? mergeTime(value, previous) : value;
4120
4678
  this.commitValue(normalizeValue(next, this.mode()));
4121
4679
  if (this.closeOnSelect() && isCompleteValue(this.value(), this.mode())) {
@@ -4427,6 +4985,7 @@ function normalizeValue(value, mode) {
4427
4985
  if (!value) {
4428
4986
  return mode === 'range' ? { from: null, to: null } : null;
4429
4987
  }
4988
+ // Normalize across modes so form writes, presets, and calendar selections share one shape.
4430
4989
  if (mode === 'range') {
4431
4990
  if (isRange(value)) {
4432
4991
  return {
@@ -4597,6 +5156,7 @@ function horizontalOverlayY(align) {
4597
5156
  }
4598
5157
 
4599
5158
  const FR_DROPDOWN_MENU_PARENT = new InjectionToken('FrDropdownMenuParent');
5159
+ /** Shared registry for nested dropdown menu state. */
4600
5160
  class FrDropdownMenuTree {
4601
5161
  triggers = new Set();
4602
5162
  closeTimeoutId = null;
@@ -4641,6 +5201,7 @@ class FrDropdownMenuTree {
4641
5201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuTree, decorators: [{
4642
5202
  type: Injectable
4643
5203
  }] });
5204
+ /** Root controller for dropdown menu interactions. */
4644
5205
  class FrDropdownMenu {
4645
5206
  closeDelay = input(140, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
4646
5207
  triggerMode = input('click', ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
@@ -4669,18 +5230,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4669
5230
  },
4670
5231
  }]
4671
5232
  }], propDecorators: { closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
5233
+ /** Nested submenu controller for dropdown menu. */
4672
5234
  class FrDropdownMenuSub {
4673
5235
  parent = inject(FR_DROPDOWN_MENU_PARENT, { skipSelf: true });
4674
5236
  closeDelayInput = input(null, { ...(ngDevMode ? { debugName: "closeDelayInput" } : /* istanbul ignore next */ {}), alias: 'closeDelay' });
4675
5237
  triggerModeInput = input(null, { ...(ngDevMode ? { debugName: "triggerModeInput" } : /* istanbul ignore next */ {}), alias: 'triggerMode' });
4676
- closeDelay = signal(this.parent.closeDelay(), ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
4677
- triggerMode = signal(this.parent.triggerMode(), ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
4678
- constructor() {
4679
- effect(() => {
4680
- this.closeDelay.set(this.closeDelayInput() ?? this.parent.closeDelay());
4681
- this.triggerMode.set(this.triggerModeInput() ?? this.parent.triggerMode());
4682
- });
4683
- }
5238
+ closeDelay = computed(() => this.closeDelayInput() ?? this.parent.closeDelay(), ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
5239
+ triggerMode = computed(() => this.triggerModeInput() ?? this.parent.triggerMode(), ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
4684
5240
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4685
5241
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrDropdownMenuSub, isStandalone: true, selector: "[frDropdownMenuSub]", inputs: { closeDelayInput: { classPropertyName: "closeDelayInput", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null }, triggerModeInput: { classPropertyName: "triggerModeInput", publicName: "triggerMode", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "frame-dropdown-menu-sub" }, providers: [
4686
5242
  {
@@ -4703,9 +5259,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4703
5259
  class: 'frame-dropdown-menu-sub',
4704
5260
  },
4705
5261
  }]
4706
- }], ctorParameters: () => [], propDecorators: { closeDelayInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
5262
+ }], propDecorators: { closeDelayInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
4707
5263
 
4708
5264
  const FR_DROPDOWN_MENU_CONTENT = new InjectionToken('FrDropdownMenuContent');
5265
+ /** Content slot for dropdown menu. */
4709
5266
  class FrDropdownMenuContent {
4710
5267
  templateRef = inject((TemplateRef));
4711
5268
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
@@ -4746,6 +5303,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4746
5303
  ],
4747
5304
  }]
4748
5305
  }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }] } });
5306
+ /** Panel slot for dropdown menu. */
4749
5307
  class FrDropdownMenuPanel {
4750
5308
  side = inject(FR_DROPDOWN_MENU_CONTENT).side;
4751
5309
  tree = inject(FrDropdownMenuTree);
@@ -4774,6 +5332,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4774
5332
  }]
4775
5333
  }] });
4776
5334
 
5335
+ /** Item slot for dropdown menu. */
4777
5336
  class FrDropdownMenuItem {
4778
5337
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4779
5338
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -4792,16 +5351,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4792
5351
  },
4793
5352
  }]
4794
5353
  }], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5354
+ /** Item slot for dropdown menu checkbox. */
4795
5355
  class FrDropdownMenuCheckboxItem {
4796
5356
  checkboxItem = inject(CdkMenuItemCheckbox);
5357
+ lastChecked = false;
4797
5358
  checked = input(false, { ...(ngDevMode ? { debugName: "checked" } : /* istanbul ignore next */ {}), alias: 'checked',
4798
5359
  transform: booleanAttribute });
4799
5360
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4800
5361
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
4801
- constructor() {
4802
- effect(() => {
4803
- this.checkboxItem.checked = this.checked();
4804
- });
5362
+ ngDoCheck() {
5363
+ const checked = this.checked();
5364
+ if (checked === this.lastChecked) {
5365
+ return;
5366
+ }
5367
+ this.lastChecked = checked;
5368
+ this.checkboxItem.checked = checked;
4805
5369
  }
4806
5370
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuCheckboxItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4807
5371
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrDropdownMenuCheckboxItem, isStandalone: true, selector: "button[frDropdownMenuCheckboxItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-checked": "checkboxItem.checked ? \"\" : null", "attr.data-inset": "inset() ? \"\" : null", "attr.data-variant": "variant()" }, classAttribute: "frame-dropdown-menu__item frame-dropdown-menu__checkbox-item" }, hostDirectives: [{ directive: i1$2.CdkMenuItemCheckbox }], ngImport: i0 });
@@ -4818,7 +5382,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4818
5382
  '[attr.data-variant]': 'variant()',
4819
5383
  },
4820
5384
  }]
4821
- }], ctorParameters: () => [], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5385
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5386
+ /** Group slot for dropdown menu radio. */
4822
5387
  class FrDropdownMenuRadioGroup {
4823
5388
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuRadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4824
5389
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrDropdownMenuRadioGroup, isStandalone: true, selector: "[frDropdownMenuRadioGroup]", host: { classAttribute: "frame-dropdown-menu__radio-group" }, hostDirectives: [{ directive: i1$2.CdkMenuGroup }], ngImport: i0 });
@@ -4833,16 +5398,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4833
5398
  },
4834
5399
  }]
4835
5400
  }] });
5401
+ /** Item slot for dropdown menu radio. */
4836
5402
  class FrDropdownMenuRadioItem {
4837
5403
  radioItem = inject(CdkMenuItemRadio);
5404
+ lastChecked = false;
4838
5405
  checked = input(false, { ...(ngDevMode ? { debugName: "checked" } : /* istanbul ignore next */ {}), alias: 'checked',
4839
5406
  transform: booleanAttribute });
4840
5407
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4841
5408
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
4842
- constructor() {
4843
- effect(() => {
4844
- this.radioItem.checked = this.checked();
4845
- });
5409
+ ngDoCheck() {
5410
+ const checked = this.checked();
5411
+ if (checked === this.lastChecked) {
5412
+ return;
5413
+ }
5414
+ this.lastChecked = checked;
5415
+ this.radioItem.checked = checked;
4846
5416
  }
4847
5417
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuRadioItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4848
5418
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrDropdownMenuRadioItem, isStandalone: true, selector: "button[frDropdownMenuRadioItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-checked": "radioItem.checked ? \"\" : null", "attr.data-inset": "inset() ? \"\" : null", "attr.data-variant": "variant()" }, classAttribute: "frame-dropdown-menu__item frame-dropdown-menu__radio-item" }, hostDirectives: [{ directive: i1$2.CdkMenuItemRadio }], ngImport: i0 });
@@ -4859,7 +5429,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4859
5429
  '[attr.data-variant]': 'variant()',
4860
5430
  },
4861
5431
  }]
4862
- }], ctorParameters: () => [], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5432
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5433
+ /** Label slot for dropdown menu. */
4863
5434
  class FrDropdownMenuLabel {
4864
5435
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4865
5436
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -4875,6 +5446,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4875
5446
  },
4876
5447
  }]
4877
5448
  }], propDecorators: { inset: [{ type: i0.Input, args: [{ isSignal: true, alias: "inset", required: false }] }] } });
5449
+ /** Separator slot for dropdown menu. */
4878
5450
  class FrDropdownMenuSeparator {
4879
5451
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4880
5452
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrDropdownMenuSeparator, isStandalone: true, selector: "[frDropdownMenuSeparator]", host: { attributes: { "role": "separator" }, classAttribute: "frame-dropdown-menu__separator" }, ngImport: i0 });
@@ -4889,6 +5461,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4889
5461
  },
4890
5462
  }]
4891
5463
  }] });
5464
+ /** Shortcut slot for dropdown menu. */
4892
5465
  class FrDropdownMenuShortcut {
4893
5466
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4894
5467
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrDropdownMenuShortcut, isStandalone: true, selector: "[frDropdownMenuShortcut]", host: { classAttribute: "frame-dropdown-menu__shortcut" }, ngImport: i0 });
@@ -4902,6 +5475,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4902
5475
  },
4903
5476
  }]
4904
5477
  }] });
5478
+ /** Indicator slot for dropdown menu item. */
4905
5479
  class FrDropdownMenuItemIndicator {
4906
5480
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrDropdownMenuItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4907
5481
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrDropdownMenuItemIndicator, isStandalone: true, selector: "[frDropdownMenuItemIndicator]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-dropdown-menu__indicator" }, ngImport: i0 });
@@ -4917,6 +5491,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
4917
5491
  }]
4918
5492
  }] });
4919
5493
 
5494
+ /** Shared trigger behavior for root and nested dropdown menus. */
4920
5495
  class FrDropdownMenuTriggerBase {
4921
5496
  static CUSTOM_PROPERTY_PREFIX = '--frame-dropdown-menu-';
4922
5497
  cdkMenuTrigger = inject(CdkMenuTrigger);
@@ -4925,20 +5500,10 @@ class FrDropdownMenuTriggerBase {
4925
5500
  tree = inject(FrDropdownMenuTree);
4926
5501
  parent = inject(FR_DROPDOWN_MENU_PARENT);
4927
5502
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
5503
+ menuContentOverride;
4928
5504
  constructor() {
4929
5505
  this.tree.register(this);
4930
- effect(() => {
4931
- const content = this.menuContent();
4932
- this.cdkMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
4933
- this.cdkMenuTrigger.menuPosition = this.resolvePositions();
4934
- if (content?.isDebugVisible() && !this.cdkMenuTrigger.isOpen()) {
4935
- queueMicrotask(() => {
4936
- if (!this.cdkMenuTrigger.isOpen()) {
4937
- this.cdkMenuTrigger.open();
4938
- }
4939
- });
4940
- }
4941
- });
5506
+ queueMicrotask(() => this.syncCdkTrigger());
4942
5507
  this.cdkMenuTrigger.opened.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
4943
5508
  this.tree.cancelClose();
4944
5509
  this.isOpen.set(true);
@@ -4947,7 +5512,7 @@ class FrDropdownMenuTriggerBase {
4947
5512
  });
4948
5513
  });
4949
5514
  this.cdkMenuTrigger.closed.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
4950
- if (this.menuContent()?.isDebugVisible()) {
5515
+ if (this.currentMenuContent()?.isDebugVisible()) {
4951
5516
  queueMicrotask(() => {
4952
5517
  if (!this.cdkMenuTrigger.isOpen()) {
4953
5518
  this.cdkMenuTrigger.open();
@@ -4958,6 +5523,9 @@ class FrDropdownMenuTriggerBase {
4958
5523
  this.isOpen.set(false);
4959
5524
  });
4960
5525
  }
5526
+ ngDoCheck() {
5527
+ this.syncCdkTrigger();
5528
+ }
4961
5529
  get triggerMode() {
4962
5530
  return this.triggerModeInput() ?? this.parent.triggerMode();
4963
5531
  }
@@ -4965,9 +5533,24 @@ class FrDropdownMenuTriggerBase {
4965
5533
  return this.parent.closeDelay();
4966
5534
  }
4967
5535
  resolvePositions() {
4968
- return (this.menuContent()?.getPositions(this.isSubmenuTrigger) ??
5536
+ return (this.currentMenuContent()?.getPositions(this.isSubmenuTrigger) ??
4969
5537
  defaultPositions(this.isSubmenuTrigger));
4970
5538
  }
5539
+ syncCdkTrigger() {
5540
+ const content = this.currentMenuContent();
5541
+ this.cdkMenuTrigger.menuTemplateRef = content?.templateRef ?? null;
5542
+ this.cdkMenuTrigger.menuPosition = this.resolvePositions();
5543
+ if (content?.isDebugVisible() && !this.cdkMenuTrigger.isOpen()) {
5544
+ queueMicrotask(() => {
5545
+ if (!this.cdkMenuTrigger.isOpen()) {
5546
+ this.cdkMenuTrigger.open();
5547
+ }
5548
+ });
5549
+ }
5550
+ }
5551
+ currentMenuContent() {
5552
+ return this.menuContentOverride !== undefined ? this.menuContentOverride : this.menuContent();
5553
+ }
4971
5554
  openFromHover() {
4972
5555
  if (this.triggerMode === 'hover' || this.triggerMode === 'both') {
4973
5556
  this.tree.cancelClose();
@@ -4981,7 +5564,7 @@ class FrDropdownMenuTriggerBase {
4981
5564
  this.openFromHover();
4982
5565
  }
4983
5566
  handleMouseLeave() {
4984
- if (this.menuContent()?.isDebugVisible()) {
5567
+ if (this.currentMenuContent()?.isDebugVisible()) {
4985
5568
  return;
4986
5569
  }
4987
5570
  if (this.triggerMode === 'hover' || this.triggerMode === 'both') {
@@ -4989,13 +5572,23 @@ class FrDropdownMenuTriggerBase {
4989
5572
  }
4990
5573
  }
4991
5574
  close() {
4992
- if (this.menuContent()?.isDebugVisible()) {
5575
+ if (this.currentMenuContent()?.isDebugVisible()) {
4993
5576
  return;
4994
5577
  }
4995
5578
  if (this.cdkMenuTrigger.isOpen()) {
4996
5579
  this.cdkMenuTrigger.close();
4997
5580
  }
4998
5581
  }
5582
+ open() {
5583
+ this.syncCdkTrigger();
5584
+ if (!this.cdkMenuTrigger.isOpen()) {
5585
+ this.cdkMenuTrigger.open();
5586
+ }
5587
+ }
5588
+ setMenuContentOverride(content) {
5589
+ this.menuContentOverride = content;
5590
+ this.syncCdkTrigger();
5591
+ }
4999
5592
  ngOnDestroy() {
5000
5593
  this.tree.unregister(this);
5001
5594
  }
@@ -5008,6 +5601,7 @@ class FrDropdownMenuTriggerBase {
5008
5601
  }
5009
5602
  const menuPanel = overlayElement.querySelector('.frame-dropdown-menu__content') ?? overlayElement;
5010
5603
  const sourceStyles = getComputedStyle(this.elementRef.nativeElement);
5604
+ // CDK portals the menu, so trigger-scoped CSS variables must be mirrored manually.
5011
5605
  for (let index = 0; index < sourceStyles.length; index += 1) {
5012
5606
  const propertyName = sourceStyles.item(index);
5013
5607
  if (!propertyName.startsWith(FrDropdownMenuTriggerBase.CUSTOM_PROPERTY_PREFIX)) {
@@ -5030,6 +5624,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5030
5624
  },
5031
5625
  }]
5032
5626
  }], ctorParameters: () => [] });
5627
+ /** Trigger control for dropdown menu. */
5033
5628
  class FrDropdownMenuTrigger extends FrDropdownMenuTriggerBase {
5034
5629
  menuContent = input(null, { ...(ngDevMode ? { debugName: "menuContent" } : /* istanbul ignore next */ {}), alias: 'frDropdownMenuTrigger' });
5035
5630
  triggerModeInput = input(null, { ...(ngDevMode ? { debugName: "triggerModeInput" } : /* istanbul ignore next */ {}), alias: 'triggerMode' });
@@ -5048,6 +5643,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5048
5643
  },
5049
5644
  }]
5050
5645
  }], propDecorators: { menuContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "frDropdownMenuTrigger", required: false }] }], triggerModeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
5646
+ /** Trigger control for dropdown menu sub. */
5051
5647
  class FrDropdownMenuSubTrigger extends FrDropdownMenuTriggerBase {
5052
5648
  menuContent = input(null, { ...(ngDevMode ? { debugName: "menuContent" } : /* istanbul ignore next */ {}), alias: 'frDropdownMenuSubTrigger' });
5053
5649
  inset = input(false, { ...(ngDevMode ? { debugName: "inset" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -5079,6 +5675,7 @@ const FR_DROPDOWN_MENU_ITEM_VARIANTS = ['default', 'destructive'];
5079
5675
  const FR_EMPTY_MEDIA_VARIANTS = ['default', 'icon'];
5080
5676
  const FR_EMPTY_ORIENTATIONS = ['vertical', 'horizontal'];
5081
5677
  const FR_EMPTY_VARIANTS = ['default', 'outline', 'soft'];
5678
+ /** Empty-state container with orientation and variant controls. */
5082
5679
  class FrEmpty {
5083
5680
  orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
5084
5681
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -5096,6 +5693,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5096
5693
  },
5097
5694
  }]
5098
5695
  }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5696
+ /** Header slot for empty. */
5099
5697
  class FrEmptyHeader {
5100
5698
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrEmptyHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5101
5699
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrEmptyHeader, isStandalone: true, selector: "[frEmptyHeader], frame-empty-header", host: { classAttribute: "frame-empty__header" }, ngImport: i0 });
@@ -5109,6 +5707,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5109
5707
  },
5110
5708
  }]
5111
5709
  }] });
5710
+ /** Media slot for empty. */
5112
5711
  class FrEmptyMedia {
5113
5712
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5114
5713
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrEmptyMedia, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -5124,6 +5723,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5124
5723
  },
5125
5724
  }]
5126
5725
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5726
+ /** Title slot for empty. */
5127
5727
  class FrEmptyTitle {
5128
5728
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrEmptyTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5129
5729
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrEmptyTitle, isStandalone: true, selector: "[frEmptyTitle], frame-empty-title", host: { classAttribute: "frame-empty__title" }, ngImport: i0 });
@@ -5137,6 +5737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5137
5737
  },
5138
5738
  }]
5139
5739
  }] });
5740
+ /** Description slot for empty. */
5140
5741
  class FrEmptyDescription {
5141
5742
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrEmptyDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5142
5743
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrEmptyDescription, isStandalone: true, selector: "[frEmptyDescription], frame-empty-description", host: { classAttribute: "frame-empty__description" }, ngImport: i0 });
@@ -5150,6 +5751,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5150
5751
  },
5151
5752
  }]
5152
5753
  }] });
5754
+ /** Content slot for empty. */
5153
5755
  class FrEmptyContent {
5154
5756
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrEmptyContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5155
5757
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrEmptyContent, isStandalone: true, selector: "[frEmptyContent], frame-empty-content", host: { classAttribute: "frame-empty__content" }, ngImport: i0 });
@@ -5166,6 +5768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5166
5768
 
5167
5769
  const FR_FIELD_LEGEND_VARIANTS = ['legend', 'label'];
5168
5770
  const FR_FIELD_ORIENTATIONS = ['vertical', 'horizontal'];
5771
+ /** Fieldset wrapper for related form fields. */
5169
5772
  class FrFieldSet {
5170
5773
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldSet, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5171
5774
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldSet, isStandalone: true, selector: "fieldset[frFieldSet], frame-field-set", host: { classAttribute: "frame-field-set" }, ngImport: i0 });
@@ -5179,6 +5782,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5179
5782
  },
5180
5783
  }]
5181
5784
  }] });
5785
+ /** Legend slot for field. */
5182
5786
  class FrFieldLegend {
5183
5787
  variant = input('legend', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5184
5788
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldLegend, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -5194,6 +5798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5194
5798
  },
5195
5799
  }]
5196
5800
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
5801
+ /** Group slot for field. */
5197
5802
  class FrFieldGroup {
5198
5803
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5199
5804
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldGroup, isStandalone: true, selector: "[frFieldGroup], frame-field-group", host: { classAttribute: "frame-field-group" }, ngImport: i0 });
@@ -5207,6 +5812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5207
5812
  },
5208
5813
  }]
5209
5814
  }] });
5815
+ /** Form field row with orientation and responsive layout. */
5210
5816
  class FrField {
5211
5817
  orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
5212
5818
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -5227,6 +5833,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5227
5833
  },
5228
5834
  }]
5229
5835
  }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
5836
+ /** Content slot for field. */
5230
5837
  class FrFieldContent {
5231
5838
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5232
5839
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldContent, isStandalone: true, selector: "[frFieldContent], frame-field-content", host: { classAttribute: "frame-field-content" }, ngImport: i0 });
@@ -5240,6 +5847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5240
5847
  },
5241
5848
  }]
5242
5849
  }] });
5850
+ /** Label slot for field. */
5243
5851
  class FrFieldLabel {
5244
5852
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5245
5853
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldLabel, isStandalone: true, selector: "[frFieldLabel], frame-field-label", host: { classAttribute: "frame-field-label" }, ngImport: i0 });
@@ -5253,6 +5861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5253
5861
  },
5254
5862
  }]
5255
5863
  }] });
5864
+ /** Description slot for field. */
5256
5865
  class FrFieldDescription {
5257
5866
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5258
5867
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldDescription, isStandalone: true, selector: "[frFieldDescription], frame-field-description", host: { classAttribute: "frame-field-description" }, ngImport: i0 });
@@ -5266,6 +5875,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5266
5875
  },
5267
5876
  }]
5268
5877
  }] });
5878
+ /** Separator slot for field. */
5269
5879
  class FrFieldSeparator {
5270
5880
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5271
5881
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrFieldSeparator, isStandalone: true, selector: "[frFieldSeparator], frame-field-separator", host: { attributes: { "role": "separator" }, classAttribute: "frame-field-separator" }, ngImport: i0 });
@@ -5280,6 +5890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5280
5890
  },
5281
5891
  }]
5282
5892
  }] });
5893
+ /** Error slot for field. */
5283
5894
  class FrFieldError {
5284
5895
  errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
5285
5896
  message() {
@@ -5290,12 +5901,12 @@ class FrFieldError {
5290
5901
  return error?.message ?? '';
5291
5902
  }
5292
5903
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldError, deps: [], target: i0.ɵɵFactoryTarget.Component });
5293
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrFieldError, isStandalone: true, selector: "[frFieldError], frame-field-error", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-field-error" }, ngImport: i0, template: `
5294
- @if (message()) {
5295
- <span>{{ message() }}</span>
5296
- } @else {
5297
- <ng-content />
5298
- }
5904
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrFieldError, isStandalone: true, selector: "[frFieldError], frame-field-error", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-field-error" }, ngImport: i0, template: `
5905
+ @if (message()) {
5906
+ <span>{{ message() }}</span>
5907
+ } @else {
5908
+ <ng-content />
5909
+ }
5299
5910
  `, isInline: true });
5300
5911
  }
5301
5912
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrFieldError, decorators: [{
@@ -5306,12 +5917,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5306
5917
  class: 'frame-field-error',
5307
5918
  'aria-live': 'polite',
5308
5919
  },
5309
- template: `
5310
- @if (message()) {
5311
- <span>{{ message() }}</span>
5312
- } @else {
5313
- <ng-content />
5314
- }
5920
+ template: `
5921
+ @if (message()) {
5922
+ <span>{{ message() }}</span>
5923
+ } @else {
5924
+ <ng-content />
5925
+ }
5315
5926
  `,
5316
5927
  }]
5317
5928
  }], propDecorators: { errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }] } });
@@ -5323,6 +5934,7 @@ function provideDsValueAccessor(type) {
5323
5934
  multi: true,
5324
5935
  };
5325
5936
  }
5937
+ /** Base ControlValueAccessor implementation for FrameUI form controls. */
5326
5938
  class FrControlValueAccessor {
5327
5939
  injector = inject(Injector);
5328
5940
  FrControlDestroyRef = inject(DestroyRef);
@@ -5448,6 +6060,7 @@ function oppositeSide$1(side) {
5448
6060
 
5449
6061
  const FR_HOVER_CARD_CONTROLLER = new InjectionToken('FrHoverCardController');
5450
6062
 
6063
+ /** Content slot for hover card. */
5451
6064
  class FrHoverCardContent {
5452
6065
  templateRef = inject((TemplateRef));
5453
6066
  align = input('center', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
@@ -5473,6 +6086,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5473
6086
  exportAs: 'frHoverCardContent',
5474
6087
  }]
5475
6088
  }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }] } });
6089
+ /** Panel slot for hover card. */
5476
6090
  class FrHoverCardPanel {
5477
6091
  content = inject(FrHoverCardContent);
5478
6092
  root = inject(FR_HOVER_CARD_CONTROLLER);
@@ -5504,6 +6118,7 @@ const DEFAULT_POSITIONS$1 = buildHoverCardPositions({
5504
6118
  side: 'bottom',
5505
6119
  sideOffset: 8,
5506
6120
  });
6121
+ /** Root controller for hover card. */
5507
6122
  class FrHoverCardRoot {
5508
6123
  openDelay = input(700, ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
5509
6124
  closeDelay = input(300, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
@@ -5637,24 +6252,24 @@ class FrHoverCardRoot {
5637
6252
  provide: FR_HOVER_CARD_CONTROLLER,
5638
6253
  useExisting: FrHoverCardRoot,
5639
6254
  },
5640
- ], exportAs: ["frHoverCard"], ngImport: i0, template: `
5641
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-hover-card__anchor">
5642
- <ng-content />
5643
- </span>
5644
-
5645
- <ng-template
5646
- cdkConnectedOverlay
5647
- [cdkConnectedOverlayOrigin]="origin"
5648
- [cdkConnectedOverlayOpen]="isOpen()"
5649
- [cdkConnectedOverlayPositions]="positions()"
5650
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
5651
- [cdkConnectedOverlayPush]="true"
5652
- [cdkConnectedOverlayViewportMargin]="12"
5653
- (detach)="close()"
5654
- (positionChange)="handlePositionChange($event)"
5655
- >
5656
- <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
5657
- </ng-template>
6255
+ ], exportAs: ["frHoverCard"], ngImport: i0, template: `
6256
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-hover-card__anchor">
6257
+ <ng-content />
6258
+ </span>
6259
+
6260
+ <ng-template
6261
+ cdkConnectedOverlay
6262
+ [cdkConnectedOverlayOrigin]="origin"
6263
+ [cdkConnectedOverlayOpen]="isOpen()"
6264
+ [cdkConnectedOverlayPositions]="positions()"
6265
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
6266
+ [cdkConnectedOverlayPush]="true"
6267
+ [cdkConnectedOverlayViewportMargin]="12"
6268
+ (detach)="close()"
6269
+ (positionChange)="handlePositionChange($event)"
6270
+ >
6271
+ <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
6272
+ </ng-template>
5658
6273
  `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5659
6274
  }
5660
6275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrHoverCardRoot, decorators: [{
@@ -5674,40 +6289,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5674
6289
  class: 'frame-hover-card',
5675
6290
  '[attr.data-state]': 'isOpen() ? "open" : "closed"',
5676
6291
  },
5677
- template: `
5678
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-hover-card__anchor">
5679
- <ng-content />
5680
- </span>
5681
-
5682
- <ng-template
5683
- cdkConnectedOverlay
5684
- [cdkConnectedOverlayOrigin]="origin"
5685
- [cdkConnectedOverlayOpen]="isOpen()"
5686
- [cdkConnectedOverlayPositions]="positions()"
5687
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
5688
- [cdkConnectedOverlayPush]="true"
5689
- [cdkConnectedOverlayViewportMargin]="12"
5690
- (detach)="close()"
5691
- (positionChange)="handlePositionChange($event)"
5692
- >
5693
- <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
5694
- </ng-template>
6292
+ template: `
6293
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-hover-card__anchor">
6294
+ <ng-content />
6295
+ </span>
6296
+
6297
+ <ng-template
6298
+ cdkConnectedOverlay
6299
+ [cdkConnectedOverlayOrigin]="origin"
6300
+ [cdkConnectedOverlayOpen]="isOpen()"
6301
+ [cdkConnectedOverlayPositions]="positions()"
6302
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
6303
+ [cdkConnectedOverlayPush]="true"
6304
+ [cdkConnectedOverlayViewportMargin]="12"
6305
+ (detach)="close()"
6306
+ (positionChange)="handlePositionChange($event)"
6307
+ >
6308
+ <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
6309
+ </ng-template>
5695
6310
  `,
5696
6311
  }]
5697
6312
  }], ctorParameters: () => [], propDecorators: { openDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "openDelay", required: false }] }], closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
5698
6313
 
6314
+ /** Trigger control for hover card. */
5699
6315
  class FrHoverCardTrigger {
5700
6316
  content = input(null, { ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'frHoverCardTrigger' });
5701
6317
  root = inject(FR_HOVER_CARD_CONTROLLER);
5702
6318
  elementRef = inject(ElementRef);
6319
+ lastContent = null;
5703
6320
  constructor() {
5704
6321
  this.root.registerTrigger(this.elementRef.nativeElement);
5705
- effect(() => {
5706
- const content = this.content();
5707
- if (content) {
5708
- this.root.setContent(content);
5709
- }
5710
- });
6322
+ }
6323
+ ngDoCheck() {
6324
+ const content = this.content();
6325
+ if (content && content !== this.lastContent) {
6326
+ this.root.setContent(content);
6327
+ }
6328
+ this.lastContent = content;
5711
6329
  }
5712
6330
  handleMouseEnter() {
5713
6331
  this.root.setContent(this.content());
@@ -5753,6 +6371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5753
6371
  const FR_HOVER_CARD_ALIGNMENTS = ['start', 'center', 'end'];
5754
6372
  const FR_HOVER_CARD_SIDES = ['top', 'right', 'bottom', 'left'];
5755
6373
 
6374
+ /** Input wrapper for labels, controls, and validation text. */
5756
6375
  class FrInput {
5757
6376
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5758
6377
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInput, isStandalone: true, selector: "input[frInput]", host: { classAttribute: "frame-input" }, ngImport: i0 });
@@ -5766,6 +6385,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5766
6385
  },
5767
6386
  }]
5768
6387
  }] });
6388
+ /** Field slot for input. */
5769
6389
  class FrInputField {
5770
6390
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5771
6391
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputField, isStandalone: true, selector: "[frInputField], frame-input-field", host: { classAttribute: "frame-input-field" }, ngImport: i0 });
@@ -5779,6 +6399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5779
6399
  },
5780
6400
  }]
5781
6401
  }] });
6402
+ /** Header slot for input. */
5782
6403
  class FrInputHeader {
5783
6404
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5784
6405
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputHeader, isStandalone: true, selector: "[frInputHeader], frame-input-header", host: { classAttribute: "frame-input-header" }, ngImport: i0 });
@@ -5792,6 +6413,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5792
6413
  },
5793
6414
  }]
5794
6415
  }] });
6416
+ /** Control slot for input. */
5795
6417
  class FrInputControl {
5796
6418
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5797
6419
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputControl, isStandalone: true, selector: "[frInputControl], frame-input-control", host: { classAttribute: "frame-input-control" }, ngImport: i0 });
@@ -5805,6 +6427,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5805
6427
  },
5806
6428
  }]
5807
6429
  }] });
6430
+ /** Group slot for input field. */
5808
6431
  class FrInputFieldGroup {
5809
6432
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputFieldGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5810
6433
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputFieldGroup, isStandalone: true, selector: "[frInputFieldGroup], frame-input-field-group", host: { classAttribute: "frame-input-field-group" }, ngImport: i0 });
@@ -5818,6 +6441,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5818
6441
  },
5819
6442
  }]
5820
6443
  }] });
6444
+ /** Label slot for input. */
5821
6445
  class FrInputLabel {
5822
6446
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5823
6447
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputLabel, isStandalone: true, selector: "[frInputLabel], frame-input-label", host: { classAttribute: "frame-input-label" }, ngImport: i0 });
@@ -5831,6 +6455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5831
6455
  },
5832
6456
  }]
5833
6457
  }] });
6458
+ /** Description slot for input. */
5834
6459
  class FrInputDescription {
5835
6460
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5836
6461
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputDescription, isStandalone: true, selector: "[frInputDescription], frame-input-description", host: { classAttribute: "frame-input-description" }, ngImport: i0 });
@@ -5844,6 +6469,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5844
6469
  },
5845
6470
  }]
5846
6471
  }] });
6472
+ /** Error slot for input. */
5847
6473
  class FrInputError {
5848
6474
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5849
6475
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputError, isStandalone: true, selector: "[frInputError], frame-input-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-input-error" }, ngImport: i0 });
@@ -5858,6 +6484,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5858
6484
  },
5859
6485
  }]
5860
6486
  }] });
6487
+ /** Badge slot for input. */
5861
6488
  class FrInputBadge {
5862
6489
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5863
6490
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputBadge, isStandalone: true, selector: "[frInputBadge], frame-input-badge", host: { classAttribute: "frame-input-badge" }, ngImport: i0 });
@@ -5874,6 +6501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5874
6501
 
5875
6502
  const FR_INPUT_GROUP_ADDON_ALIGNS = ['inline-start', 'inline-end'];
5876
6503
  const FR_INPUT_GROUP_ADDON_VARIANTS = ['default', 'ghost'];
6504
+ /** Group slot for input. */
5877
6505
  class FrInputGroup {
5878
6506
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5879
6507
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputGroup, isStandalone: true, selector: "[frInputGroup], frame-input-group", host: { classAttribute: "frame-input-group" }, ngImport: i0 });
@@ -5887,6 +6515,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5887
6515
  },
5888
6516
  }]
5889
6517
  }] });
6518
+ /** Addon slot for grouped inputs. */
5890
6519
  class FrInputGroupAddon {
5891
6520
  align = input('inline-start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
5892
6521
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -5904,6 +6533,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5904
6533
  },
5905
6534
  }]
5906
6535
  }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
6536
+ /** Text slot for grouped inputs. */
5907
6537
  class FrInputGroupText {
5908
6538
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupText, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5909
6539
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputGroupText, isStandalone: true, selector: "[frInputGroupText], frame-input-group-text", host: { classAttribute: "frame-input-group__text" }, ngImport: i0 });
@@ -5917,6 +6547,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5917
6547
  },
5918
6548
  }]
5919
6549
  }] });
6550
+ /** Input control slot inside an input group. */
5920
6551
  class FrInputGroupInput {
5921
6552
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputGroupInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5922
6553
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputGroupInput, isStandalone: true, selector: "input[frInputGroupInput]", host: { classAttribute: "frame-input-group__input" }, hostDirectives: [{ directive: FrInput }], ngImport: i0 });
@@ -5935,6 +6566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
5935
6566
  const FR_INPUT_OTP_PATTERN_DIGITS = /^[0-9]$/;
5936
6567
  const FR_INPUT_OTP_PATTERN_DIGITS_AND_CHARS = /^[a-zA-Z0-9]$/;
5937
6568
  const FR_INPUT_OTP_CONTROLLER = new InjectionToken('FrInputOtpController');
6569
+ /** One-time-code input with grouped slots. */
5938
6570
  class FrInputOtp extends FrControlValueAccessor$1 {
5939
6571
  nativeInput = viewChild('nativeInput', ...(ngDevMode ? [{ debugName: "nativeInput" }] : /* istanbul ignore next */ []));
5940
6572
  maxLength = input(6, { ...(ngDevMode ? { debugName: "maxLength" } : /* istanbul ignore next */ {}), transform: numberAttribute });
@@ -6037,6 +6669,7 @@ class FrInputOtp extends FrControlValueAccessor$1 {
6037
6669
  replaceFrom(index, text) {
6038
6670
  const value = this.value();
6039
6671
  const start = clampNumber(index, 0, this.maxLength());
6672
+ // The hidden input is the source of truth; visual slots are projections of this string.
6040
6673
  const next = `${value.slice(0, start)}${text}${value.slice(start + text.length)}`;
6041
6674
  return this.sanitize(next);
6042
6675
  }
@@ -6134,6 +6767,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6134
6767
  `,
6135
6768
  }]
6136
6769
  }], 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"] }] } });
6770
+ /** Group slot for input otp. */
6137
6771
  class FrInputOtpGroup {
6138
6772
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6139
6773
  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 });
@@ -6147,6 +6781,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6147
6781
  },
6148
6782
  }]
6149
6783
  }] });
6784
+ /** Input slot for one OTP character. */
6150
6785
  class FrInputOtpSlot {
6151
6786
  root = inject(FR_INPUT_OTP_CONTROLLER);
6152
6787
  index = input.required(...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
@@ -6183,6 +6818,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6183
6818
  `,
6184
6819
  }]
6185
6820
  }], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
6821
+ /** Separator slot for input otp. */
6186
6822
  class FrInputOtpSeparator {
6187
6823
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrInputOtpSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6188
6824
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrInputOtpSeparator, isStandalone: true, selector: "[frInputOtpSeparator], frame-input-otp-separator", host: { attributes: { "role": "separator", "aria-hidden": "true" }, classAttribute: "frame-input-otp__separator" }, ngImport: i0 });
@@ -6215,6 +6851,7 @@ function toMatcher(pattern) {
6215
6851
  const FR_ITEM_VARIANTS = ['default', 'outline', 'muted'];
6216
6852
  const FR_ITEM_SIZES = ['default', 'sm', 'xs'];
6217
6853
  const FR_ITEM_MEDIA_VARIANTS = ['default', 'icon', 'image', 'avatar'];
6854
+ /** Composable item row for lists and menus. */
6218
6855
  class FrItem {
6219
6856
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6220
6857
  interactive = input(false, { ...(ngDevMode ? { debugName: "interactive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -6236,6 +6873,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6236
6873
  },
6237
6874
  }]
6238
6875
  }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
6876
+ /** Group slot for item. */
6239
6877
  class FrItemGroup {
6240
6878
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6241
6879
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemGroup, isStandalone: true, selector: "[frItemGroup], frame-item-group", host: { classAttribute: "frame-item-group" }, ngImport: i0 });
@@ -6249,6 +6887,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6249
6887
  },
6250
6888
  }]
6251
6889
  }] });
6890
+ /** Separator slot for item. */
6252
6891
  class FrItemSeparator {
6253
6892
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6254
6893
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemSeparator, isStandalone: true, selector: "[frItemSeparator], frame-item-separator", host: { attributes: { "role": "separator" }, classAttribute: "frame-item-separator" }, ngImport: i0 });
@@ -6263,6 +6902,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6263
6902
  },
6264
6903
  }]
6265
6904
  }] });
6905
+ /** Header slot for item. */
6266
6906
  class FrItemHeader {
6267
6907
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6268
6908
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemHeader, isStandalone: true, selector: "[frItemHeader], frame-item-header", host: { classAttribute: "frame-item__header" }, ngImport: i0 });
@@ -6276,6 +6916,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6276
6916
  },
6277
6917
  }]
6278
6918
  }] });
6919
+ /** Media slot for item. */
6279
6920
  class FrItemMedia {
6280
6921
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
6281
6922
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemMedia, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -6291,6 +6932,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6291
6932
  },
6292
6933
  }]
6293
6934
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
6935
+ /** Content slot for item. */
6294
6936
  class FrItemContent {
6295
6937
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6296
6938
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemContent, isStandalone: true, selector: "[frItemContent], frame-item-content", host: { classAttribute: "frame-item__content" }, ngImport: i0 });
@@ -6304,6 +6946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6304
6946
  },
6305
6947
  }]
6306
6948
  }] });
6949
+ /** Title slot for item. */
6307
6950
  class FrItemTitle {
6308
6951
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6309
6952
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemTitle, isStandalone: true, selector: "[frItemTitle], frame-item-title", host: { classAttribute: "frame-item__title" }, ngImport: i0 });
@@ -6317,6 +6960,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6317
6960
  },
6318
6961
  }]
6319
6962
  }] });
6963
+ /** Description slot for item. */
6320
6964
  class FrItemDescription {
6321
6965
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6322
6966
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemDescription, isStandalone: true, selector: "[frItemDescription], frame-item-description", host: { classAttribute: "frame-item__description" }, ngImport: i0 });
@@ -6330,6 +6974,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6330
6974
  },
6331
6975
  }]
6332
6976
  }] });
6977
+ /** Actions slot for item. */
6333
6978
  class FrItemActions {
6334
6979
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemActions, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6335
6980
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemActions, isStandalone: true, selector: "[frItemActions], frame-item-actions", host: { classAttribute: "frame-item__actions" }, ngImport: i0 });
@@ -6343,6 +6988,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6343
6988
  },
6344
6989
  }]
6345
6990
  }] });
6991
+ /** Footer slot for item. */
6346
6992
  class FrItemFooter {
6347
6993
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrItemFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6348
6994
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrItemFooter, isStandalone: true, selector: "[frItemFooter], frame-item-footer", host: { classAttribute: "frame-item__footer" }, ngImport: i0 });
@@ -6358,6 +7004,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6358
7004
  }] });
6359
7005
 
6360
7006
  const FR_MENUBAR_PARENT = new InjectionToken('FrMenuBarParent');
7007
+ /** Menubar root for top-level menu interactions. */
6361
7008
  class FrMenuBar {
6362
7009
  closeDelay = input(140, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
6363
7010
  triggerMode = input('both', ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
@@ -6395,6 +7042,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6395
7042
  },
6396
7043
  }]
6397
7044
  }], propDecorators: { closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
7045
+ /** Top-level menu scope inside a menubar. */
6398
7046
  class FrMenuBarMenu {
6399
7047
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6400
7048
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarMenu, isStandalone: true, selector: "[frMenuBarMenu], frame-menubar-menu", host: { attributes: { "role": "none" }, classAttribute: "frame-menubar__menu" }, ngImport: i0 });
@@ -6409,6 +7057,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6409
7057
  },
6410
7058
  }]
6411
7059
  }] });
7060
+ /** Trigger control for menu bar. */
6412
7061
  class FrMenuBarTrigger {
6413
7062
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6414
7063
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarTrigger, isStandalone: true, selector: "[frMenuBarTrigger]", host: { attributes: { "role": "menuitem" }, classAttribute: "frame-menubar__trigger" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuTrigger, inputs: ["frDropdownMenuTrigger", "frMenuBarTrigger", "triggerMode", "triggerMode"] }], ngImport: i0 });
@@ -6429,6 +7078,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6429
7078
  },
6430
7079
  }]
6431
7080
  }] });
7081
+ /** Content slot for menu bar. */
6432
7082
  class FrMenuBarContent extends FrDropdownMenuContent$1 {
6433
7083
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarContent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6434
7084
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarContent, isStandalone: true, selector: "ng-template[frMenuBarContent], ng-template[frMenuBarSubContent]", providers: [
@@ -6459,6 +7109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6459
7109
  ],
6460
7110
  }]
6461
7111
  }] });
7112
+ /** Panel slot for menu bar. */
6462
7113
  class FrMenuBarPanel {
6463
7114
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6464
7115
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarPanel, isStandalone: true, selector: "[frMenuBarPanel]", host: { classAttribute: "frame-menubar__content" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuPanel }], ngImport: i0 });
@@ -6473,6 +7124,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6473
7124
  },
6474
7125
  }]
6475
7126
  }] });
7127
+ /** Item slot for menu bar. */
6476
7128
  class FrMenuBarItem {
6477
7129
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6478
7130
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarItem, isStandalone: true, selector: "[frMenuBarItem]", host: { classAttribute: "frame-menubar__item" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuItem, inputs: ["inset", "inset", "variant", "variant"] }], ngImport: i0 });
@@ -6492,6 +7144,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6492
7144
  },
6493
7145
  }]
6494
7146
  }] });
7147
+ /** Item slot for menu bar checkbox. */
6495
7148
  class FrMenuBarCheckboxItem {
6496
7149
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarCheckboxItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6497
7150
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarCheckboxItem, isStandalone: true, selector: "button[frMenuBarCheckboxItem]", host: { classAttribute: "frame-menubar__checkbox-item" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuCheckboxItem, inputs: ["checked", "checked", "inset", "inset", "variant", "variant"] }], ngImport: i0 });
@@ -6511,6 +7164,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6511
7164
  },
6512
7165
  }]
6513
7166
  }] });
7167
+ /** Group slot for menu bar radio. */
6514
7168
  class FrMenuBarRadioGroup {
6515
7169
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarRadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6516
7170
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarRadioGroup, isStandalone: true, selector: "[frMenuBarRadioGroup]", host: { classAttribute: "frame-menubar__radio-group" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuRadioGroup }], ngImport: i0 });
@@ -6525,6 +7179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6525
7179
  },
6526
7180
  }]
6527
7181
  }] });
7182
+ /** Item slot for menu bar radio. */
6528
7183
  class FrMenuBarRadioItem {
6529
7184
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarRadioItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6530
7185
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarRadioItem, isStandalone: true, selector: "button[frMenuBarRadioItem]", host: { classAttribute: "frame-menubar__radio-item" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuRadioItem, inputs: ["checked", "checked", "inset", "inset", "variant", "variant"] }], ngImport: i0 });
@@ -6544,6 +7199,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6544
7199
  },
6545
7200
  }]
6546
7201
  }] });
7202
+ /** Label slot for menu bar. */
6547
7203
  class FrMenuBarLabel {
6548
7204
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6549
7205
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarLabel, isStandalone: true, selector: "[frMenuBarLabel]", host: { classAttribute: "frame-menubar__label" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuLabel, inputs: ["inset", "inset"] }], ngImport: i0 });
@@ -6563,6 +7219,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6563
7219
  },
6564
7220
  }]
6565
7221
  }] });
7222
+ /** Separator slot for menu bar. */
6566
7223
  class FrMenuBarSeparator {
6567
7224
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6568
7225
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarSeparator, isStandalone: true, selector: "[frMenuBarSeparator]", host: { classAttribute: "frame-menubar__separator" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuSeparator }], ngImport: i0 });
@@ -6577,6 +7234,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6577
7234
  },
6578
7235
  }]
6579
7236
  }] });
7237
+ /** Shortcut slot for menu bar. */
6580
7238
  class FrMenuBarShortcut {
6581
7239
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6582
7240
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarShortcut, isStandalone: true, selector: "[frMenuBarShortcut]", host: { classAttribute: "frame-menubar__shortcut" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuShortcut }], ngImport: i0 });
@@ -6591,6 +7249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6591
7249
  },
6592
7250
  }]
6593
7251
  }] });
7252
+ /** Indicator slot for menu bar item. */
6594
7253
  class FrMenuBarItemIndicator {
6595
7254
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6596
7255
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarItemIndicator, isStandalone: true, selector: "[frMenuBarItemIndicator]", host: { classAttribute: "frame-menubar__indicator" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuItemIndicator }], ngImport: i0 });
@@ -6605,6 +7264,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6605
7264
  },
6606
7265
  }]
6607
7266
  }] });
7267
+ /** Nested submenu scope inside a menubar. */
6608
7268
  class FrMenuBarSub {
6609
7269
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6610
7270
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarSub, isStandalone: true, selector: "[frMenuBarSub]", host: { classAttribute: "frame-menubar__sub" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuSub, inputs: ["closeDelay", "closeDelay", "triggerMode", "triggerMode"] }], ngImport: i0 });
@@ -6624,6 +7284,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6624
7284
  },
6625
7285
  }]
6626
7286
  }] });
7287
+ /** Trigger control for menu bar sub. */
6627
7288
  class FrMenuBarSubTrigger {
6628
7289
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrMenuBarSubTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6629
7290
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrMenuBarSubTrigger, isStandalone: true, selector: "[frMenuBarSubTrigger]", host: { classAttribute: "frame-menubar__sub-trigger" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuSubTrigger, inputs: ["frDropdownMenuSubTrigger", "frMenuBarSubTrigger", "inset", "inset", "triggerMode", "triggerMode", "variant", "variant"] }], ngImport: i0 });
@@ -6644,6 +7305,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6644
7305
  }]
6645
7306
  }] });
6646
7307
 
7308
+ /** Content slot for modal. */
6647
7309
  class FrModalContent {
6648
7310
  templateRef = inject((TemplateRef));
6649
7311
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -6696,6 +7358,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6696
7358
  }]
6697
7359
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], closeOnDestroy: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnDestroy", required: false }] }], closeOnNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnNavigation", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], disableClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableClose", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], minHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHeight", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
6698
7360
 
7361
+ /** Close control for modal. */
6699
7362
  class FrModalClose {
6700
7363
  dialogRef = inject(DialogRef, { optional: true });
6701
7364
  result = input(undefined, { ...(ngDevMode ? { debugName: "result" } : /* istanbul ignore next */ {}), alias: 'frModalClose' });
@@ -6715,24 +7378,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6715
7378
  },
6716
7379
  }]
6717
7380
  }], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "frModalClose", required: false }] }] } });
7381
+ /** Panel slot for modal. */
6718
7382
  class FrModalPanel {
6719
7383
  scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6720
7384
  showCloseButton = input(true, { ...(ngDevMode ? { debugName: "showCloseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6721
7385
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
6722
7386
  stickyFooter = input(false, { ...(ngDevMode ? { debugName: "stickyFooter" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6723
7387
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
6724
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalPanel, isStandalone: true, selector: "[frModalPanel], frame-modal-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, stickyFooter: { classPropertyName: "stickyFooter", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-sticky-footer": "stickyFooter() ? \"\" : null", "attr.data-size": "size()" }, classAttribute: "frame-modal__panel" }, ngImport: i0, template: `
6725
- <ng-content />
6726
- @if (showCloseButton()) {
6727
- <button
6728
- class="frame-modal__close"
6729
- frModalClose
6730
- type="button"
6731
- aria-label="Close dialog"
6732
- >
6733
- <span aria-hidden="true">×</span>
6734
- </button>
6735
- }
7388
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalPanel, isStandalone: true, selector: "[frModalPanel], frame-modal-panel", inputs: { scrollable: { classPropertyName: "scrollable", publicName: "scrollable", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, stickyFooter: { classPropertyName: "stickyFooter", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-scrollable": "scrollable() ? \"\" : null", "attr.data-sticky-footer": "stickyFooter() ? \"\" : null", "attr.data-size": "size()" }, classAttribute: "frame-modal__panel" }, ngImport: i0, template: `
7389
+ <ng-content />
7390
+ @if (showCloseButton()) {
7391
+ <button
7392
+ class="frame-modal__close"
7393
+ frModalClose
7394
+ type="button"
7395
+ aria-label="Close dialog"
7396
+ >
7397
+ <span aria-hidden="true">×</span>
7398
+ </button>
7399
+ }
6736
7400
  `, isInline: true, dependencies: [{ kind: "directive", type: FrModalClose, selector: "[frModalClose]", inputs: ["frModalClose"] }] });
6737
7401
  }
6738
7402
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalPanel, decorators: [{
@@ -6745,22 +7409,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6745
7409
  '[attr.data-sticky-footer]': 'stickyFooter() ? "" : null',
6746
7410
  '[attr.data-size]': 'size()',
6747
7411
  },
6748
- template: `
6749
- <ng-content />
6750
- @if (showCloseButton()) {
6751
- <button
6752
- class="frame-modal__close"
6753
- frModalClose
6754
- type="button"
6755
- aria-label="Close dialog"
6756
- >
6757
- <span aria-hidden="true">×</span>
6758
- </button>
6759
- }
7412
+ template: `
7413
+ <ng-content />
7414
+ @if (showCloseButton()) {
7415
+ <button
7416
+ class="frame-modal__close"
7417
+ frModalClose
7418
+ type="button"
7419
+ aria-label="Close dialog"
7420
+ >
7421
+ <span aria-hidden="true">×</span>
7422
+ </button>
7423
+ }
6760
7424
  `,
6761
7425
  imports: [FrModalClose],
6762
7426
  }]
6763
7427
  }], propDecorators: { scrollable: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollable", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], stickyFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyFooter", required: false }] }] } });
7428
+ /** Header slot for modal. */
6764
7429
  class FrModalHeader {
6765
7430
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6766
7431
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrModalHeader, isStandalone: true, selector: "[frModalHeader], frame-modal-header", host: { classAttribute: "frame-modal__header" }, ngImport: i0 });
@@ -6774,6 +7439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6774
7439
  },
6775
7440
  }]
6776
7441
  }] });
7442
+ /** Body slot for modal. */
6777
7443
  class FrModalBody {
6778
7444
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalBody, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6779
7445
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrModalBody, isStandalone: true, selector: "[frModalBody], frame-modal-body", host: { classAttribute: "frame-modal__body" }, ngImport: i0 });
@@ -6787,6 +7453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6787
7453
  },
6788
7454
  }]
6789
7455
  }] });
7456
+ /** Footer slot for modal. */
6790
7457
  class FrModalFooter {
6791
7458
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6792
7459
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrModalFooter, isStandalone: true, selector: "[frModalFooter], frame-modal-footer", host: { classAttribute: "frame-modal__footer" }, ngImport: i0 });
@@ -6800,6 +7467,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6800
7467
  },
6801
7468
  }]
6802
7469
  }] });
7470
+ /** Title slot for modal. */
6803
7471
  class FrModalTitle {
6804
7472
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6805
7473
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrModalTitle, isStandalone: true, selector: "[frModalTitle], frame-modal-title", host: { classAttribute: "frame-modal__title" }, ngImport: i0 });
@@ -6813,6 +7481,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6813
7481
  },
6814
7482
  }]
6815
7483
  }] });
7484
+ /** Description slot for modal. */
6816
7485
  class FrModalDescription {
6817
7486
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6818
7487
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrModalDescription, isStandalone: true, selector: "[frModalDescription], frame-modal-description", host: { classAttribute: "frame-modal__description" }, ngImport: i0 });
@@ -6827,12 +7496,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6827
7496
  }]
6828
7497
  }] });
6829
7498
 
7499
+ /** Reference handle for an opened modal. */
6830
7500
  class FrModalRef extends DialogRef {
6831
7501
  }
6832
7502
 
6833
7503
  const FR_MODAL_DATA = DIALOG_DATA;
6834
7504
  const FR_MODAL_REF = FrModalRef;
6835
7505
 
7506
+ /** Default shell for modal content, title, and footer actions. */
6836
7507
  class FrModalShell {
6837
7508
  dialogRef = inject((DialogRef));
6838
7509
  injector = inject(Injector);
@@ -6852,51 +7523,51 @@ class FrModalShell {
6852
7523
  }
6853
7524
  }
6854
7525
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalShell, deps: [], target: i0.ɵɵFactoryTarget.Component });
6855
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalShell, isStandalone: true, selector: "frame-modal-shell", ngImport: i0, template: `
6856
- <div
6857
- frModalPanel
6858
- [size]="options.size ?? 'md'"
6859
- [showCloseButton]="options.showCloseButton ?? true"
6860
- [scrollable]="options.scrollable ?? false"
6861
- [stickyFooter]="options.stickyFooter ?? false"
6862
- >
6863
- @if (options.title || options.description) {
6864
- <div frModalHeader>
6865
- @if (options.title) {
6866
- <h2 frModalTitle>{{ options.title }}</h2>
6867
- }
6868
-
6869
- @if (options.description) {
6870
- <p frModalDescription>{{ options.description }}</p>
6871
- }
6872
- </div>
6873
- }
6874
-
6875
- <div frModalBody>
6876
- <ng-container
6877
- [ngComponentOutlet]="options.bodyComponent"
6878
- [ngComponentOutletInputs]="options.bodyInputs ?? {}"
6879
- [ngComponentOutletInjector]="bodyInjector"
6880
- />
6881
- </div>
6882
-
6883
- @if (options.footerActions?.length) {
6884
- <div frModalFooter>
6885
- @for (action of options.footerActions; track action.label) {
6886
- <button
6887
- frButton
6888
- type="button"
6889
- [appearance]="action.appearance ?? 'primary'"
6890
- [disabled]="action.disabled ?? false"
6891
- [attr.aria-label]="action.ariaLabel ?? null"
6892
- (click)="handleAction(action)"
6893
- >
6894
- <span frButtonLabel>{{ action.label }}</span>
6895
- </button>
6896
- }
6897
- </div>
6898
- }
6899
- </div>
7526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrModalShell, isStandalone: true, selector: "frame-modal-shell", ngImport: i0, template: `
7527
+ <div
7528
+ frModalPanel
7529
+ [size]="options.size ?? 'md'"
7530
+ [showCloseButton]="options.showCloseButton ?? true"
7531
+ [scrollable]="options.scrollable ?? false"
7532
+ [stickyFooter]="options.stickyFooter ?? false"
7533
+ >
7534
+ @if (options.title || options.description) {
7535
+ <div frModalHeader>
7536
+ @if (options.title) {
7537
+ <h2 frModalTitle>{{ options.title }}</h2>
7538
+ }
7539
+
7540
+ @if (options.description) {
7541
+ <p frModalDescription>{{ options.description }}</p>
7542
+ }
7543
+ </div>
7544
+ }
7545
+
7546
+ <div frModalBody>
7547
+ <ng-container
7548
+ [ngComponentOutlet]="options.bodyComponent"
7549
+ [ngComponentOutletInputs]="options.bodyInputs ?? {}"
7550
+ [ngComponentOutletInjector]="bodyInjector"
7551
+ />
7552
+ </div>
7553
+
7554
+ @if (options.footerActions?.length) {
7555
+ <div frModalFooter>
7556
+ @for (action of options.footerActions; track action.label) {
7557
+ <button
7558
+ frButton
7559
+ type="button"
7560
+ [appearance]="action.appearance ?? 'primary'"
7561
+ [disabled]="action.disabled ?? false"
7562
+ [attr.aria-label]="action.ariaLabel ?? null"
7563
+ (click)="handleAction(action)"
7564
+ >
7565
+ <span frButtonLabel>{{ action.label }}</span>
7566
+ </button>
7567
+ }
7568
+ </div>
7569
+ }
7570
+ </div>
6900
7571
  `, isInline: true, dependencies: [{ kind: "directive", type: FrButton$1, selector: "a[frButton], button[frButton]", inputs: ["appearance", "disabled", "loading", "loadingDisplay", "radius", "size"] }, { kind: "directive", type: FrButtonLabel$1, selector: "[frButtonLabel]" }, { kind: "directive", type: FrModalBody, selector: "[frModalBody], frame-modal-body" }, { kind: "directive", type: FrModalDescription, selector: "[frModalDescription], frame-modal-description" }, { kind: "directive", type: FrModalFooter, selector: "[frModalFooter], frame-modal-footer" }, { kind: "directive", type: FrModalHeader, selector: "[frModalHeader], frame-modal-header" }, { kind: "component", type: FrModalPanel, selector: "[frModalPanel], frame-modal-panel", inputs: ["scrollable", "showCloseButton", "size", "stickyFooter"] }, { kind: "directive", type: FrModalTitle, selector: "[frModalTitle], frame-modal-title" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }] });
6901
7572
  }
6902
7573
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrModalShell, decorators: [{
@@ -6914,57 +7585,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
6914
7585
  FrModalTitle,
6915
7586
  NgComponentOutlet,
6916
7587
  ],
6917
- template: `
6918
- <div
6919
- frModalPanel
6920
- [size]="options.size ?? 'md'"
6921
- [showCloseButton]="options.showCloseButton ?? true"
6922
- [scrollable]="options.scrollable ?? false"
6923
- [stickyFooter]="options.stickyFooter ?? false"
6924
- >
6925
- @if (options.title || options.description) {
6926
- <div frModalHeader>
6927
- @if (options.title) {
6928
- <h2 frModalTitle>{{ options.title }}</h2>
6929
- }
6930
-
6931
- @if (options.description) {
6932
- <p frModalDescription>{{ options.description }}</p>
6933
- }
6934
- </div>
6935
- }
6936
-
6937
- <div frModalBody>
6938
- <ng-container
6939
- [ngComponentOutlet]="options.bodyComponent"
6940
- [ngComponentOutletInputs]="options.bodyInputs ?? {}"
6941
- [ngComponentOutletInjector]="bodyInjector"
6942
- />
6943
- </div>
6944
-
6945
- @if (options.footerActions?.length) {
6946
- <div frModalFooter>
6947
- @for (action of options.footerActions; track action.label) {
6948
- <button
6949
- frButton
6950
- type="button"
6951
- [appearance]="action.appearance ?? 'primary'"
6952
- [disabled]="action.disabled ?? false"
6953
- [attr.aria-label]="action.ariaLabel ?? null"
6954
- (click)="handleAction(action)"
6955
- >
6956
- <span frButtonLabel>{{ action.label }}</span>
6957
- </button>
6958
- }
6959
- </div>
6960
- }
6961
- </div>
7588
+ template: `
7589
+ <div
7590
+ frModalPanel
7591
+ [size]="options.size ?? 'md'"
7592
+ [showCloseButton]="options.showCloseButton ?? true"
7593
+ [scrollable]="options.scrollable ?? false"
7594
+ [stickyFooter]="options.stickyFooter ?? false"
7595
+ >
7596
+ @if (options.title || options.description) {
7597
+ <div frModalHeader>
7598
+ @if (options.title) {
7599
+ <h2 frModalTitle>{{ options.title }}</h2>
7600
+ }
7601
+
7602
+ @if (options.description) {
7603
+ <p frModalDescription>{{ options.description }}</p>
7604
+ }
7605
+ </div>
7606
+ }
7607
+
7608
+ <div frModalBody>
7609
+ <ng-container
7610
+ [ngComponentOutlet]="options.bodyComponent"
7611
+ [ngComponentOutletInputs]="options.bodyInputs ?? {}"
7612
+ [ngComponentOutletInjector]="bodyInjector"
7613
+ />
7614
+ </div>
7615
+
7616
+ @if (options.footerActions?.length) {
7617
+ <div frModalFooter>
7618
+ @for (action of options.footerActions; track action.label) {
7619
+ <button
7620
+ frButton
7621
+ type="button"
7622
+ [appearance]="action.appearance ?? 'primary'"
7623
+ [disabled]="action.disabled ?? false"
7624
+ [attr.aria-label]="action.ariaLabel ?? null"
7625
+ (click)="handleAction(action)"
7626
+ >
7627
+ <span frButtonLabel>{{ action.label }}</span>
7628
+ </button>
7629
+ }
7630
+ </div>
7631
+ }
7632
+ </div>
6962
7633
  `,
6963
7634
  }]
6964
7635
  }] });
6965
7636
 
6966
7637
  const DEFAULT_PANEL_CLASS$1 = 'frame-modal__overlay-pane';
6967
7638
  const DEFAULT_BACKDROP_CLASS$1 = 'frame-modal__backdrop';
7639
+ /** Service for opening modal dialogs. */
6968
7640
  class FrModalService {
6969
7641
  dialog = inject(Dialog);
6970
7642
  open(content, dataOrConfig, config) {
@@ -7036,6 +7708,7 @@ function resolveOpenConfig(content, dataOrConfig, config) {
7036
7708
  if (!isComponentType$1(content)) {
7037
7709
  return (dataOrConfig ?? {});
7038
7710
  }
7711
+ // Component opens support the shorthand `open(Component, data, config)` shape.
7039
7712
  if (config) {
7040
7713
  return {
7041
7714
  ...config,
@@ -7045,6 +7718,7 @@ function resolveOpenConfig(content, dataOrConfig, config) {
7045
7718
  if (dataOrConfig === undefined) {
7046
7719
  return {};
7047
7720
  }
7721
+ // Without a third argument, distinguish raw data from a full modal config by known keys.
7048
7722
  if (isModalConfig(dataOrConfig)) {
7049
7723
  return dataOrConfig;
7050
7724
  }
@@ -7112,6 +7786,7 @@ function withModalRefProvider(providers) {
7112
7786
  return [modalRefProvider, ...(providers ?? [])];
7113
7787
  }
7114
7788
 
7789
+ /** Trigger control for modal. */
7115
7790
  class FrModalTrigger {
7116
7791
  static CUSTOM_PROPERTY_PREFIX = '--frame-modal-';
7117
7792
  destroyRef = inject(DestroyRef);
@@ -7182,6 +7857,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7182
7857
  }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "frModalTrigger", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
7183
7858
 
7184
7859
  const FR_NAVIGATION_MENU_PARENT = new InjectionToken('FrNavigationMenuParent');
7860
+ /** Navigation menu root for hover and focus interactions. */
7185
7861
  class FrNavigationMenu {
7186
7862
  closeDelay = input(140, ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
7187
7863
  triggerMode = input('both', ...(ngDevMode ? [{ debugName: "triggerMode" }] : /* istanbul ignore next */ []));
@@ -7219,6 +7895,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7219
7895
  },
7220
7896
  }]
7221
7897
  }], propDecorators: { closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeDelay", required: false }] }], triggerMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerMode", required: false }] }] } });
7898
+ /** List slot for navigation menu. */
7222
7899
  class FrNavigationMenuList {
7223
7900
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7224
7901
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuList, isStandalone: true, selector: "[frNavigationMenuList], frame-navigation-menu-list", host: { attributes: { "role": "list" }, classAttribute: "frame-navigation-menu__list" }, ngImport: i0 });
@@ -7233,6 +7910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7233
7910
  },
7234
7911
  }]
7235
7912
  }] });
7913
+ /** Item slot for navigation menu. */
7236
7914
  class FrNavigationMenuItem {
7237
7915
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7238
7916
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuItem, isStandalone: true, selector: "[frNavigationMenuItem], frame-navigation-menu-item", host: { attributes: { "role": "listitem" }, classAttribute: "frame-navigation-menu__item" }, ngImport: i0 });
@@ -7247,6 +7925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7247
7925
  },
7248
7926
  }]
7249
7927
  }] });
7928
+ /** Trigger control for navigation menu. */
7250
7929
  class FrNavigationMenuTrigger {
7251
7930
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7252
7931
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuTrigger, isStandalone: true, selector: "[frNavigationMenuTrigger]", host: { attributes: { "type": "button" }, classAttribute: "frame-navigation-menu__trigger" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuTrigger, inputs: ["frDropdownMenuTrigger", "frNavigationMenuTrigger", "triggerMode", "triggerMode"] }], ngImport: i0 });
@@ -7267,6 +7946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7267
7946
  },
7268
7947
  }]
7269
7948
  }] });
7949
+ /** Content slot for navigation menu. */
7270
7950
  class FrNavigationMenuContent extends FrDropdownMenuContent$1 {
7271
7951
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuContent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
7272
7952
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuContent, isStandalone: true, selector: "ng-template[frNavigationMenuContent]", providers: [
@@ -7297,6 +7977,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7297
7977
  ],
7298
7978
  }]
7299
7979
  }] });
7980
+ /** Panel slot for navigation menu. */
7300
7981
  class FrNavigationMenuPanel {
7301
7982
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7302
7983
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuPanel, isStandalone: true, selector: "[frNavigationMenuPanel]", host: { classAttribute: "frame-navigation-menu__content" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuPanel }], ngImport: i0 });
@@ -7311,6 +7992,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7311
7992
  },
7312
7993
  }]
7313
7994
  }] });
7995
+ /** Link primitive inside a navigation menu panel. */
7314
7996
  class FrNavigationMenuLink {
7315
7997
  active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
7316
7998
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuLink, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -7326,6 +8008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7326
8008
  },
7327
8009
  }]
7328
8010
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }] } });
8011
+ /** Grid layout helper for navigation menu content. */
7329
8012
  class FrNavigationMenuGrid {
7330
8013
  columns = input(1, ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7331
8014
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuGrid, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -7341,6 +8024,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7341
8024
  },
7342
8025
  }]
7343
8026
  }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }] } });
8027
+ /** Featured content slot inside navigation menu panels. */
7344
8028
  class FrNavigationMenuFeature {
7345
8029
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuFeature, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7346
8030
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuFeature, isStandalone: true, selector: "[frNavigationMenuFeature]", host: { classAttribute: "frame-navigation-menu__feature" }, ngImport: i0 });
@@ -7354,6 +8038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7354
8038
  },
7355
8039
  }]
7356
8040
  }] });
8041
+ /** Title slot for navigation menu link. */
7357
8042
  class FrNavigationMenuLinkTitle {
7358
8043
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuLinkTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7359
8044
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuLinkTitle, isStandalone: true, selector: "[frNavigationMenuLinkTitle]", host: { classAttribute: "frame-navigation-menu__link-title" }, ngImport: i0 });
@@ -7367,6 +8052,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7367
8052
  },
7368
8053
  }]
7369
8054
  }] });
8055
+ /** Description slot for navigation menu link. */
7370
8056
  class FrNavigationMenuLinkDescription {
7371
8057
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuLinkDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7372
8058
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuLinkDescription, isStandalone: true, selector: "[frNavigationMenuLinkDescription]", host: { classAttribute: "frame-navigation-menu__link-description" }, ngImport: i0 });
@@ -7380,6 +8066,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7380
8066
  },
7381
8067
  }]
7382
8068
  }] });
8069
+ /** Separator slot for navigation link. */
7383
8070
  class FrNavigationLinkSeparator {
7384
8071
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationLinkSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7385
8072
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationLinkSeparator, isStandalone: true, selector: "[frNavigationLinkSeparator]", host: { attributes: { "role": "separator", "aria-hidden": "true" }, classAttribute: "frame-navigation-menu__link-separator" }, ngImport: i0 });
@@ -7395,6 +8082,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7395
8082
  },
7396
8083
  }]
7397
8084
  }] });
8085
+ /** Indicator slot for navigation menu. */
7398
8086
  class FrNavigationMenuIndicator {
7399
8087
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7400
8088
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuIndicator, isStandalone: true, selector: "[frNavigationMenuIndicator], frame-navigation-menu-indicator", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-navigation-menu__indicator" }, ngImport: i0 });
@@ -7409,6 +8097,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7409
8097
  },
7410
8098
  }]
7411
8099
  }] });
8100
+ /** Viewport slot for navigation menu. */
7412
8101
  class FrNavigationMenuViewport {
7413
8102
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrNavigationMenuViewport, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7414
8103
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrNavigationMenuViewport, isStandalone: true, selector: "[frNavigationMenuViewport], frame-navigation-menu-viewport", host: { classAttribute: "frame-navigation-menu__viewport" }, ngImport: i0 });
@@ -7423,6 +8112,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7423
8112
  }]
7424
8113
  }] });
7425
8114
 
8115
+ /** Pagination navigation container. */
7426
8116
  class FrPagination {
7427
8117
  ariaLabel = input('pagination', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
7428
8118
  boundaryCount = input(1, ...(ngDevMode ? [{ debugName: "boundaryCount" }] : /* istanbul ignore next */ []));
@@ -7488,6 +8178,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7488
8178
  },
7489
8179
  }]
7490
8180
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], boundaryCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "boundaryCount", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], siblingCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "siblingCount", required: false }] }], totalPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalPages", required: false }] }] } });
8181
+ /** Content slot for pagination. */
7491
8182
  class FrPaginationContent {
7492
8183
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7493
8184
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPaginationContent, isStandalone: true, selector: "ul[frPaginationContent], ol[frPaginationContent], [frPaginationContent]", host: { classAttribute: "frame-pagination__content" }, ngImport: i0 });
@@ -7501,6 +8192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7501
8192
  },
7502
8193
  }]
7503
8194
  }] });
8195
+ /** Item slot for pagination. */
7504
8196
  class FrPaginationItem {
7505
8197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7506
8198
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPaginationItem, isStandalone: true, selector: "li[frPaginationItem], [frPaginationItem]", host: { classAttribute: "frame-pagination__item" }, ngImport: i0 });
@@ -7514,6 +8206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7514
8206
  },
7515
8207
  }]
7516
8208
  }] });
8209
+ /** Page link with active and disabled states. */
7517
8210
  class FrPaginationLink {
7518
8211
  pagination = inject(FrPagination, { optional: true });
7519
8212
  active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -7555,6 +8248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7555
8248
  },
7556
8249
  }]
7557
8250
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }] } });
8251
+ /** Icon slot for pagination. */
7558
8252
  class FrPaginationIcon {
7559
8253
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7560
8254
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPaginationIcon, isStandalone: true, selector: "[frPaginationIcon]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-pagination__projected-icon" }, ngImport: i0 });
@@ -7569,6 +8263,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7569
8263
  },
7570
8264
  }]
7571
8265
  }] });
8266
+ /** Previous-page pagination control. */
7572
8267
  class FrPaginationPrevious {
7573
8268
  pagination = inject(FrPagination, { optional: true });
7574
8269
  ariaLabel = input('Go to previous page', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -7621,6 +8316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7621
8316
  `,
7622
8317
  }]
7623
8318
  }], 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 }] }] } });
8319
+ /** Next-page pagination control. */
7624
8320
  class FrPaginationNext {
7625
8321
  pagination = inject(FrPagination, { optional: true });
7626
8322
  ariaLabel = input('Go to next page', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -7673,6 +8369,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7673
8369
  `,
7674
8370
  }]
7675
8371
  }], 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 }] }] } });
8372
+ /** Ellipsis slot for pagination. */
7676
8373
  class FrPaginationEllipsis {
7677
8374
  label = input('More pages', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7678
8375
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPaginationEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -7746,6 +8443,7 @@ function oppositeSide(side) {
7746
8443
 
7747
8444
  const FR_POPOVER_CONTROLLER = new InjectionToken('FrPopoverController');
7748
8445
 
8446
+ /** Content slot for popover. */
7749
8447
  class FrPopoverContent {
7750
8448
  templateRef = inject((TemplateRef));
7751
8449
  align = input('center', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
@@ -7771,6 +8469,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7771
8469
  exportAs: 'frPopoverContent',
7772
8470
  }]
7773
8471
  }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignOffset", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "sideOffset", required: false }] }] } });
8472
+ /** Panel slot for popover. */
7774
8473
  class FrPopoverPanel {
7775
8474
  content = inject(FrPopoverContent);
7776
8475
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -7788,6 +8487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7788
8487
  },
7789
8488
  }]
7790
8489
  }] });
8490
+ /** Header slot for popover. */
7791
8491
  class FrPopoverHeader {
7792
8492
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7793
8493
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPopoverHeader, isStandalone: true, selector: "[frPopoverHeader]", host: { classAttribute: "frame-popover__header" }, ngImport: i0 });
@@ -7801,6 +8501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7801
8501
  },
7802
8502
  }]
7803
8503
  }] });
8504
+ /** Title slot for popover. */
7804
8505
  class FrPopoverTitle {
7805
8506
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7806
8507
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPopoverTitle, isStandalone: true, selector: "[frPopoverTitle]", host: { classAttribute: "frame-popover__title" }, ngImport: i0 });
@@ -7814,6 +8515,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7814
8515
  },
7815
8516
  }]
7816
8517
  }] });
8518
+ /** Description slot for popover. */
7817
8519
  class FrPopoverDescription {
7818
8520
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7819
8521
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPopoverDescription, isStandalone: true, selector: "[frPopoverDescription]", host: { classAttribute: "frame-popover__description" }, ngImport: i0 });
@@ -7827,6 +8529,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7827
8529
  },
7828
8530
  }]
7829
8531
  }] });
8532
+ /** Body slot for popover. */
7830
8533
  class FrPopoverBody {
7831
8534
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverBody, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7832
8535
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPopoverBody, isStandalone: true, selector: "[frPopoverBody]", host: { classAttribute: "frame-popover__body" }, ngImport: i0 });
@@ -7840,6 +8543,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7840
8543
  },
7841
8544
  }]
7842
8545
  }] });
8546
+ /** Footer slot for popover. */
7843
8547
  class FrPopoverFooter {
7844
8548
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7845
8549
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrPopoverFooter, isStandalone: true, selector: "[frPopoverFooter]", host: { classAttribute: "frame-popover__footer" }, ngImport: i0 });
@@ -7853,6 +8557,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
7853
8557
  },
7854
8558
  }]
7855
8559
  }] });
8560
+ /** Close control for popover. */
7856
8561
  class FrPopoverClose {
7857
8562
  root = inject(FR_POPOVER_CONTROLLER);
7858
8563
  handleClick(event) {
@@ -7879,6 +8584,7 @@ const DEFAULT_POSITIONS = buildPopoverPositions({
7879
8584
  side: 'bottom',
7880
8585
  sideOffset: 8,
7881
8586
  });
8587
+ /** Root controller for popover. */
7882
8588
  class FrPopoverRoot {
7883
8589
  defaultOpen = input(false, { ...(ngDevMode ? { debugName: "defaultOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
7884
8590
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -7969,28 +8675,28 @@ class FrPopoverRoot {
7969
8675
  provide: FR_POPOVER_CONTROLLER,
7970
8676
  useExisting: FrPopoverRoot,
7971
8677
  },
7972
- ], exportAs: ["frPopover"], ngImport: i0, template: `
7973
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-popover__anchor">
7974
- <ng-content />
7975
- </span>
7976
-
7977
- <ng-template
7978
- cdkConnectedOverlay
7979
- [cdkConnectedOverlayOrigin]="origin"
7980
- [cdkConnectedOverlayOpen]="isOpen()"
7981
- [cdkConnectedOverlayPositions]="positions()"
7982
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
7983
- [cdkConnectedOverlayPush]="true"
7984
- [cdkConnectedOverlayViewportMargin]="12"
7985
- [cdkConnectedOverlayHasBackdrop]="true"
7986
- [cdkConnectedOverlayBackdropClass]="'frame-popover__backdrop'"
7987
- (backdropClick)="close()"
7988
- (detach)="close()"
7989
- (overlayKeydown)="handleOverlayKeydown($event)"
7990
- (positionChange)="handlePositionChange($event)"
7991
- >
7992
- <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
7993
- </ng-template>
8678
+ ], exportAs: ["frPopover"], ngImport: i0, template: `
8679
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-popover__anchor">
8680
+ <ng-content />
8681
+ </span>
8682
+
8683
+ <ng-template
8684
+ cdkConnectedOverlay
8685
+ [cdkConnectedOverlayOrigin]="origin"
8686
+ [cdkConnectedOverlayOpen]="isOpen()"
8687
+ [cdkConnectedOverlayPositions]="positions()"
8688
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
8689
+ [cdkConnectedOverlayPush]="true"
8690
+ [cdkConnectedOverlayViewportMargin]="12"
8691
+ [cdkConnectedOverlayHasBackdrop]="true"
8692
+ [cdkConnectedOverlayBackdropClass]="'frame-popover__backdrop'"
8693
+ (backdropClick)="close()"
8694
+ (detach)="close()"
8695
+ (overlayKeydown)="handleOverlayKeydown($event)"
8696
+ (positionChange)="handlePositionChange($event)"
8697
+ >
8698
+ <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
8699
+ </ng-template>
7994
8700
  `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7995
8701
  }
7996
8702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrPopoverRoot, decorators: [{
@@ -8010,44 +8716,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8010
8716
  class: 'frame-popover',
8011
8717
  '[attr.data-state]': 'isOpen() ? "open" : "closed"',
8012
8718
  },
8013
- template: `
8014
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-popover__anchor">
8015
- <ng-content />
8016
- </span>
8017
-
8018
- <ng-template
8019
- cdkConnectedOverlay
8020
- [cdkConnectedOverlayOrigin]="origin"
8021
- [cdkConnectedOverlayOpen]="isOpen()"
8022
- [cdkConnectedOverlayPositions]="positions()"
8023
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
8024
- [cdkConnectedOverlayPush]="true"
8025
- [cdkConnectedOverlayViewportMargin]="12"
8026
- [cdkConnectedOverlayHasBackdrop]="true"
8027
- [cdkConnectedOverlayBackdropClass]="'frame-popover__backdrop'"
8028
- (backdropClick)="close()"
8029
- (detach)="close()"
8030
- (overlayKeydown)="handleOverlayKeydown($event)"
8031
- (positionChange)="handlePositionChange($event)"
8032
- >
8033
- <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
8034
- </ng-template>
8719
+ template: `
8720
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-popover__anchor">
8721
+ <ng-content />
8722
+ </span>
8723
+
8724
+ <ng-template
8725
+ cdkConnectedOverlay
8726
+ [cdkConnectedOverlayOrigin]="origin"
8727
+ [cdkConnectedOverlayOpen]="isOpen()"
8728
+ [cdkConnectedOverlayPositions]="positions()"
8729
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
8730
+ [cdkConnectedOverlayPush]="true"
8731
+ [cdkConnectedOverlayViewportMargin]="12"
8732
+ [cdkConnectedOverlayHasBackdrop]="true"
8733
+ [cdkConnectedOverlayBackdropClass]="'frame-popover__backdrop'"
8734
+ (backdropClick)="close()"
8735
+ (detach)="close()"
8736
+ (overlayKeydown)="handleOverlayKeydown($event)"
8737
+ (positionChange)="handlePositionChange($event)"
8738
+ >
8739
+ <ng-container [ngTemplateOutlet]="content()?.templateRef ?? null" />
8740
+ </ng-template>
8035
8741
  `,
8036
8742
  }]
8037
8743
  }], ctorParameters: () => [], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }] } });
8038
8744
 
8745
+ /** Trigger control for popover. */
8039
8746
  class FrPopoverTrigger {
8040
8747
  content = input(null, { ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'frPopoverTrigger' });
8041
8748
  root = inject(FR_POPOVER_CONTROLLER);
8042
8749
  elementRef = inject(ElementRef);
8750
+ lastContent = null;
8043
8751
  constructor() {
8044
8752
  this.root.registerTrigger(this.elementRef.nativeElement);
8045
- effect(() => {
8046
- const content = this.content();
8047
- if (content) {
8048
- this.root.setContent(content);
8049
- }
8050
- });
8753
+ }
8754
+ ngDoCheck() {
8755
+ const content = this.content();
8756
+ if (content && content !== this.lastContent) {
8757
+ this.root.setContent(content);
8758
+ }
8759
+ this.lastContent = content;
8051
8760
  }
8052
8761
  handleClick(event) {
8053
8762
  event.preventDefault();
@@ -8097,6 +8806,7 @@ function coerceProgressMax(value) {
8097
8806
  const parsed = Number(value);
8098
8807
  return Number.isFinite(parsed) && parsed > 0 ? parsed : 100;
8099
8808
  }
8809
+ /** Progress bar host with value and max state. */
8100
8810
  class FrProgress {
8101
8811
  value = input(0, { ...(ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {}), transform: coerceProgressValue });
8102
8812
  max = input(100, { ...(ngDevMode ? { debugName: "max" } : /* istanbul ignore next */ {}), transform: coerceProgressMax });
@@ -8138,6 +8848,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8138
8848
  },
8139
8849
  }]
8140
8850
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }] } });
8851
+ /** Indicator slot for progress. */
8141
8852
  class FrProgressIndicator {
8142
8853
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrProgressIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8143
8854
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrProgressIndicator, isStandalone: true, selector: "[frProgressIndicator], frame-progress-indicator", host: { classAttribute: "frame-progress__indicator" }, ngImport: i0 });
@@ -8154,6 +8865,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8154
8865
 
8155
8866
  const FR_RADIO_GROUP_ORIENTATIONS = ['vertical', 'horizontal'];
8156
8867
  const FR_RADIO_GROUP_VARIANTS = ['default', 'cards'];
8868
+ /** Radio group host with orientation and variant controls. */
8157
8869
  class FrRadioGroup {
8158
8870
  orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
8159
8871
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
@@ -8175,6 +8887,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8175
8887
  },
8176
8888
  }]
8177
8889
  }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
8890
+ /** Item slot for radio group. */
8178
8891
  class FrRadioGroupItem {
8179
8892
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrRadioGroupItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8180
8893
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrRadioGroupItem, isStandalone: true, selector: "input[type=radio][frRadioGroupItem]", host: { classAttribute: "frame-radio-group__item" }, ngImport: i0 });
@@ -8188,6 +8901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8188
8901
  },
8189
8902
  }]
8190
8903
  }] });
8904
+ /** Field slot for radio group. */
8191
8905
  class FrRadioGroupField {
8192
8906
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
8193
8907
  invalid = input(false, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -8207,6 +8921,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8207
8921
  },
8208
8922
  }]
8209
8923
  }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
8924
+ /** Card layout option for radio group choices. */
8210
8925
  class FrRadioGroupCard {
8211
8926
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrRadioGroupCard, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8212
8927
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrRadioGroupCard, isStandalone: true, selector: "label[frRadioGroupCard]", host: { classAttribute: "frame-radio-group__card" }, ngImport: i0 });
@@ -8220,6 +8935,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8220
8935
  },
8221
8936
  }]
8222
8937
  }] });
8938
+ /** Meta slot for radio group card. */
8223
8939
  class FrRadioGroupCardMeta {
8224
8940
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrRadioGroupCardMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8225
8941
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrRadioGroupCardMeta, isStandalone: true, selector: "[frRadioGroupCardMeta]", host: { classAttribute: "frame-radio-group__card-meta" }, ngImport: i0 });
@@ -8236,6 +8952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8236
8952
 
8237
8953
  const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'];
8238
8954
  let nextResizableId = 0;
8955
+ /** Resizable panel group that coordinates pane sizes. */
8239
8956
  class FrResizablePanelGroup {
8240
8957
  elementRef = inject((ElementRef));
8241
8958
  groupId = `frame-resizable-${++nextResizableId}`;
@@ -8301,6 +9018,7 @@ class FrResizablePanelGroup {
8301
9018
  const startPrevious = this.panelSize(previousPanel) ?? 0;
8302
9019
  const startNext = this.panelSize(nextPanel) ?? 0;
8303
9020
  const pairTotal = startPrevious + startNext;
9021
+ // Keep pair resizing local so adjacent panels trade space without changing total layout.
8304
9022
  const rtlMultiplier = this.orientation() === 'horizontal' && getComputedStyle(this.elementRef.nativeElement).direction === 'rtl'
8305
9023
  ? -1
8306
9024
  : 1;
@@ -8363,6 +9081,7 @@ class FrResizablePanelGroup {
8363
9081
  }
8364
9082
  }
8365
9083
  resizePair(previousPanel, nextPanel, pairTotal, requestedPreviousSize) {
9084
+ // Clamp the previous panel first; the next panel receives the remaining pair size.
8366
9085
  const previousMin = this.minSize(previousPanel);
8367
9086
  const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));
8368
9087
  const previousSize = clampNumber(requestedPreviousSize, previousMin, previousMax);
@@ -8375,6 +9094,7 @@ class FrResizablePanelGroup {
8375
9094
  applyPanelSize(panel, size) {
8376
9095
  const normalizedSize = Math.max(size, 0);
8377
9096
  const collapsedThreshold = this.collapsible(panel) ? this.collapsedSize(panel) : 0;
9097
+ // Collapsible panels snap to their collapsed size instead of shrinking below it.
8378
9098
  const collapsed = normalizedSize <= collapsedThreshold;
8379
9099
  const appliedSize = collapsed ? collapsedThreshold : normalizedSize;
8380
9100
  panel.style.flexBasis = `${appliedSize}%`;
@@ -8454,6 +9174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8454
9174
  },
8455
9175
  }]
8456
9176
  }], 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"] }] } });
9177
+ /** Panel slot for resizable. */
8457
9178
  class FrResizablePanel {
8458
9179
  defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
8459
9180
  minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
@@ -8477,6 +9198,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8477
9198
  },
8478
9199
  }]
8479
9200
  }], propDecorators: { defaultSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSize", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapsedSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedSize", required: false }] }] } });
9201
+ /** Resize handle between adjacent resizable panels. */
8480
9202
  class FrResizableHandle {
8481
9203
  group = inject(FrResizablePanelGroup);
8482
9204
  elementRef = inject((ElementRef));
@@ -8515,6 +9237,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8515
9237
  }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }] } });
8516
9238
 
8517
9239
  const FR_SELECT_POSITIONS = ['item-aligned', 'popper'];
9240
+ /** Content slot for select. */
8518
9241
  class FrSelectContent extends FrDropdownMenuContent$1 {
8519
9242
  destroyRef = inject(DestroyRef);
8520
9243
  viewContainerRef = inject(ViewContainerRef);
@@ -8542,10 +9265,12 @@ class FrSelectContent extends FrDropdownMenuContent$1 {
8542
9265
  if (this.registrationView) {
8543
9266
  return;
8544
9267
  }
9268
+ // Render once offscreen so projected items can register before the menu opens.
8545
9269
  this.registrationView = this.viewContainerRef.createEmbeddedView(this.templateRef);
8546
9270
  this.registrationView.detectChanges();
8547
9271
  const index = this.viewContainerRef.indexOf(this.registrationView);
8548
9272
  if (index >= 0) {
9273
+ // Keep registrations alive without inserting the template into the DOM twice.
8549
9274
  this.viewContainerRef.detach(index);
8550
9275
  }
8551
9276
  }
@@ -8604,6 +9329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8604
9329
  ],
8605
9330
  }]
8606
9331
  }], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
9332
+ /** Panel slot for select. */
8607
9333
  class FrSelectPanel {
8608
9334
  content = inject(FrSelectContent);
8609
9335
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -8623,14 +9349,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8623
9349
  }] });
8624
9350
 
8625
9351
  const FR_SELECT_INDICATOR_POSITIONS = ['start', 'end'];
9352
+ /** Select control backed by dropdown menu primitives. */
8626
9353
  class FrSelect extends FrControlValueAccessor$1 {
8627
9354
  destroyRef = inject(DestroyRef);
8628
9355
  dropdownTrigger = inject(FrDropdownMenuTrigger$1);
8629
9356
  elementRef = inject(ElementRef);
8630
9357
  selectedLabel = signal(null, ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
8631
9358
  labels = new Map();
9359
+ lastContent = null;
9360
+ lastContentDebugVisible = false;
9361
+ lastDebugVisible = false;
9362
+ lastTriggerWidth = 0;
8632
9363
  resizeObserver = null;
8633
9364
  value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
9365
+ menuContent = input(null, { ...(ngDevMode ? { debugName: "menuContent" } : /* istanbul ignore next */ {}), alias: 'frSelect' });
8634
9366
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
8635
9367
  disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled', transform: booleanAttribute });
8636
9368
  indicatorPosition = input('start', ...(ngDevMode ? [{ debugName: "indicatorPosition" }] : /* istanbul ignore next */ []));
@@ -8646,22 +9378,21 @@ class FrSelect extends FrControlValueAccessor$1 {
8646
9378
  }, ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
8647
9379
  constructor() {
8648
9380
  super();
8649
- effect(() => {
8650
- const content = this.dropdownTrigger.menuContent();
8651
- if (content) {
8652
- content.select = this;
8653
- content.setDebugVisibleOverride(this.debugVisible() ? true : null);
8654
- content.setTriggerWidth(this.elementRef.nativeElement.offsetWidth);
8655
- content.ensureItemsRegistered();
8656
- }
8657
- });
9381
+ afterNextRender(() => this.syncContent());
8658
9382
  queueMicrotask(() => {
9383
+ this.syncContent();
8659
9384
  this.attachResizeObserver();
8660
9385
  });
8661
9386
  this.destroyRef.onDestroy(() => {
8662
9387
  this.resizeObserver?.disconnect();
8663
9388
  });
8664
9389
  }
9390
+ ngDoCheck() {
9391
+ this.syncContent();
9392
+ }
9393
+ ngAfterViewChecked() {
9394
+ this.syncContent();
9395
+ }
8665
9396
  registerItem(value, label) {
8666
9397
  this.labels.set(value, label);
8667
9398
  if (this.value() === value) {
@@ -8689,13 +9420,45 @@ class FrSelect extends FrControlValueAccessor$1 {
8689
9420
  }
8690
9421
  const element = this.elementRef.nativeElement;
8691
9422
  this.resizeObserver = new ResizeObserver(() => {
8692
- const content = this.dropdownTrigger.menuContent();
9423
+ const content = this.resolveContent();
8693
9424
  content?.setTriggerWidth(element.offsetWidth);
8694
9425
  });
8695
9426
  this.resizeObserver.observe(element);
8696
9427
  }
9428
+ syncContent() {
9429
+ const content = this.resolveContent();
9430
+ if (!content) {
9431
+ this.lastContent = null;
9432
+ this.dropdownTrigger.setMenuContentOverride(null);
9433
+ return;
9434
+ }
9435
+ const debugVisible = this.debugVisible();
9436
+ const contentDebugVisible = debugVisible || content.debugVisible();
9437
+ const triggerWidth = this.elementRef.nativeElement.offsetWidth;
9438
+ if (content === this.lastContent &&
9439
+ debugVisible === this.lastDebugVisible &&
9440
+ contentDebugVisible === this.lastContentDebugVisible &&
9441
+ triggerWidth === this.lastTriggerWidth) {
9442
+ return;
9443
+ }
9444
+ content.select = this;
9445
+ content.setDebugVisibleOverride(debugVisible ? true : null);
9446
+ content.setTriggerWidth(triggerWidth);
9447
+ content.ensureItemsRegistered();
9448
+ this.dropdownTrigger.setMenuContentOverride(content);
9449
+ if (content.isDebugVisible()) {
9450
+ queueMicrotask(() => this.dropdownTrigger.open());
9451
+ }
9452
+ this.lastContent = content;
9453
+ this.lastContentDebugVisible = contentDebugVisible;
9454
+ this.lastDebugVisible = debugVisible;
9455
+ this.lastTriggerWidth = triggerWidth;
9456
+ }
9457
+ resolveContent() {
9458
+ return this.menuContent() ?? this.dropdownTrigger.menuContent();
9459
+ }
8697
9460
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8698
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSelect, isStandalone: true, selector: "button[frSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indicatorPosition: { classPropertyName: "indicatorPosition", publicName: "indicatorPosition", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "aria-autocomplete": "none", "aria-haspopup": "listbox", "type": "button", "role": "combobox" }, properties: { "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-invalid": "invalid() ? \"true\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.disabled": "disabled() ? \"\" : null" }, classAttribute: "frame-select__trigger" }, providers: [provideDsValueAccessor$1(FrSelect)], usesInheritance: true, hostDirectives: [{ directive: i1$3.FrDropdownMenu, inputs: ["closeDelay", "closeDelay", "triggerMode", "triggerMode"] }, { directive: i1$3.FrDropdownMenuTrigger, inputs: ["frDropdownMenuTrigger", "frSelect"] }], ngImport: i0 });
9461
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSelect, isStandalone: true, selector: "button[frSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, menuContent: { classPropertyName: "menuContent", publicName: "frSelect", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indicatorPosition: { classPropertyName: "indicatorPosition", publicName: "indicatorPosition", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "aria-autocomplete": "none", "aria-haspopup": "listbox", "type": "button", "role": "combobox" }, properties: { "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-invalid": "invalid() ? \"true\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.disabled": "disabled() ? \"\" : null" }, classAttribute: "frame-select__trigger" }, providers: [provideDsValueAccessor$1(FrSelect)], usesInheritance: true, hostDirectives: [{ directive: i1$3.FrDropdownMenu, inputs: ["closeDelay", "closeDelay", "triggerMode", "triggerMode"] }, { directive: i1$3.FrDropdownMenuTrigger }], ngImport: i0 });
8699
9462
  }
8700
9463
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelect, decorators: [{
8701
9464
  type: Directive,
@@ -8708,7 +9471,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8708
9471
  },
8709
9472
  {
8710
9473
  directive: FrDropdownMenuTrigger$1,
8711
- inputs: ['frDropdownMenuTrigger: frSelect'],
8712
9474
  },
8713
9475
  ],
8714
9476
  providers: [provideDsValueAccessor$1(FrSelect)],
@@ -8725,9 +9487,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8725
9487
  role: 'combobox',
8726
9488
  },
8727
9489
  }]
8728
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indicatorPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorPosition", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
9490
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], menuContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "frSelect", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indicatorPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorPosition", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
8729
9491
 
8730
9492
  const FR_SELECT_ICON_POSITIONS = ['leading', 'trailing'];
9493
+ /** Value slot for select. */
8731
9494
  class FrSelectValue {
8732
9495
  select = inject(FrSelect);
8733
9496
  placeholder = input('Select an option', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -8747,6 +9510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8747
9510
  },
8748
9511
  }]
8749
9512
  }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
9513
+ /** Indicator slot for select item. */
8750
9514
  class FrSelectItemIndicator {
8751
9515
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8752
9516
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectItemIndicator, isStandalone: true, selector: "[frSelectItemIndicator], frame-select-item-indicator", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-select__item-indicator" }, ngImport: i0 });
@@ -8761,6 +9525,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8761
9525
  },
8762
9526
  }]
8763
9527
  }] });
9528
+ /** Icon slot for select. */
8764
9529
  class FrSelectIcon {
8765
9530
  position = input('trailing', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
8766
9531
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -8777,6 +9542,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8777
9542
  },
8778
9543
  }]
8779
9544
  }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
9545
+ /** Error slot for select. */
8780
9546
  class FrSelectError {
8781
9547
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8782
9548
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectError, isStandalone: true, selector: "[frSelectError], frame-select-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-select__error" }, ngImport: i0 });
@@ -8792,6 +9558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8792
9558
  }]
8793
9559
  }] });
8794
9560
 
9561
+ /** Group slot for select. */
8795
9562
  class FrSelectGroup {
8796
9563
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8797
9564
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectGroup, isStandalone: true, selector: "[frSelectGroup], frame-select-group", host: { classAttribute: "frame-select__group" }, ngImport: i0 });
@@ -8805,6 +9572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8805
9572
  },
8806
9573
  }]
8807
9574
  }] });
9575
+ /** Label slot for select. */
8808
9576
  class FrSelectLabel {
8809
9577
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8810
9578
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectLabel, isStandalone: true, selector: "[frSelectLabel], frame-select-label", host: { classAttribute: "frame-select__label" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuLabel }], ngImport: i0 });
@@ -8819,6 +9587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8819
9587
  },
8820
9588
  }]
8821
9589
  }] });
9590
+ /** Separator slot for select. */
8822
9591
  class FrSelectSeparator {
8823
9592
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
8824
9593
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectSeparator, isStandalone: true, selector: "[frSelectSeparator], frame-select-separator", host: { classAttribute: "frame-select__separator" }, hostDirectives: [{ directive: i1$3.FrDropdownMenuSeparator }], ngImport: i0 });
@@ -8833,6 +9602,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
8833
9602
  },
8834
9603
  }]
8835
9604
  }] });
9605
+ /** Item slot for select. */
8836
9606
  class FrSelectItem {
8837
9607
  elementRef = inject((ElementRef));
8838
9608
  content = inject(FrSelectContent);
@@ -8895,10 +9665,12 @@ function coerceValue(value) {
8895
9665
  }
8896
9666
  return [coerceNumber(value, 0)];
8897
9667
  }
9668
+ /** Slider control with single and range value support. */
8898
9669
  class FrSlider extends FrControlValueAccessor$1 {
8899
9670
  elementRef = inject(ElementRef);
8900
9671
  document = inject(DOCUMENT);
8901
9672
  controlledByInput = false;
9673
+ lastInputKey = '';
8902
9674
  min = input(0, { ...(ngDevMode ? { debugName: "min" } : /* istanbul ignore next */ {}), transform: numberAttribute });
8903
9675
  max = input(100, { ...(ngDevMode ? { debugName: "max" } : /* istanbul ignore next */ {}), transform: numberAttribute });
8904
9676
  step = input(1, { ...(ngDevMode ? { debugName: "step" } : /* istanbul ignore next */ {}), transform: numberAttribute });
@@ -8924,19 +9696,28 @@ class FrSlider extends FrControlValueAccessor$1 {
8924
9696
  const values = this.values();
8925
9697
  return this.percentForValue(values.at(-1) ?? this.min());
8926
9698
  }, ...(ngDevMode ? [{ debugName: "rangeEndPercent" }] : /* istanbul ignore next */ []));
8927
- constructor() {
8928
- super();
8929
- effect(() => {
8930
- const controlledValue = this.valueInput();
8931
- if (controlledValue !== null) {
8932
- this.controlledByInput = true;
8933
- this.values.set(this.normalizeValues(coerceValue(controlledValue)));
8934
- return;
8935
- }
8936
- if (!this.controlledByInput) {
8937
- this.values.set(this.normalizeValues(coerceValue(this.defaultValue())));
8938
- }
8939
- });
9699
+ ngDoCheck() {
9700
+ const inputKey = [
9701
+ this.valueInput(),
9702
+ this.defaultValue(),
9703
+ this.min(),
9704
+ this.max(),
9705
+ this.step(),
9706
+ this.minStepsBetweenThumbs(),
9707
+ ].map((value) => (Array.isArray(value) ? value.join(',') : String(value))).join('|');
9708
+ if (inputKey === this.lastInputKey) {
9709
+ return;
9710
+ }
9711
+ this.lastInputKey = inputKey;
9712
+ const controlledValue = this.valueInput();
9713
+ if (controlledValue !== null) {
9714
+ this.controlledByInput = true;
9715
+ this.values.set(this.normalizeValues(coerceValue(controlledValue)));
9716
+ return;
9717
+ }
9718
+ if (!this.controlledByInput) {
9719
+ this.values.set(this.normalizeValues(coerceValue(this.defaultValue())));
9720
+ }
8940
9721
  }
8941
9722
  setViewValue(value) {
8942
9723
  if (value === null || value === undefined) {
@@ -9016,6 +9797,7 @@ class FrSlider extends FrControlValueAccessor$1 {
9016
9797
  const step = Math.max(this.step(), 0.000001);
9017
9798
  const minDistance = Math.max(this.minStepsBetweenThumbs(), 0) * step;
9018
9799
  const normalized = values.length ? values : [min];
9800
+ // Only the active thumb is bounded by neighbors; passive thumbs keep their full range.
9019
9801
  return normalized.map((value, index) => {
9020
9802
  const previous = index > 0 ? normalized[index - 1] + minDistance : min;
9021
9803
  const next = index < normalized.length - 1 ? normalized[index + 1] - minDistance : max;
@@ -9038,6 +9820,7 @@ class FrSlider extends FrControlValueAccessor$1 {
9038
9820
  const offset = horizontal ? event.clientX - rect.left : rect.bottom - event.clientY;
9039
9821
  const direction = horizontal && this.isRtl() ? -1 : 1;
9040
9822
  let percent = size > 0 ? offset / size : 0;
9823
+ // Convert visual position into logical value direction for RTL and inverted sliders.
9041
9824
  if (direction === -1) {
9042
9825
  percent = 1 - percent;
9043
9826
  }
@@ -9056,7 +9839,7 @@ class FrSlider extends FrControlValueAccessor$1 {
9056
9839
  isRtl() {
9057
9840
  return getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';
9058
9841
  }
9059
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
9842
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSlider, deps: null, target: i0.ɵɵFactoryTarget.Component });
9060
9843
  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
9844
  <span class="frame-slider__track">
9062
9845
  <span class="frame-slider__range"></span>
@@ -9128,12 +9911,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9128
9911
  }
9129
9912
  `,
9130
9913
  }]
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"] }] } });
9914
+ }], 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"] }] } });
9132
9915
 
9133
9916
  const FR_SEPARATOR_ORIENTATIONS = ['horizontal', 'vertical'];
9134
9917
  function coerceSeparatorOrientation(value) {
9135
9918
  return value === 'vertical' ? 'vertical' : 'horizontal';
9136
9919
  }
9920
+ /** Visual or semantic separator with orientation support. */
9137
9921
  class FrSeparator {
9138
9922
  orientation = input('horizontal', { ...(ngDevMode ? { debugName: "orientation" } : /* istanbul ignore next */ {}), transform: coerceSeparatorOrientation });
9139
9923
  decorative = input(true, { ...(ngDevMode ? { debugName: "decorative" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -9155,6 +9939,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9155
9939
  }]
9156
9940
  }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], decorative: [{ type: i0.Input, args: [{ isSignal: true, alias: "decorative", required: false }] }] } });
9157
9941
 
9942
+ /** Content slot for sheet. */
9158
9943
  class FrSheetContent {
9159
9944
  templateRef = inject((TemplateRef));
9160
9945
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9211,6 +9996,7 @@ const FR_SHEET_SIDES = ['top', 'right', 'bottom', 'left'];
9211
9996
  function coerceSheetSide(value) {
9212
9997
  return value === 'top' || value === 'bottom' || value === 'left' ? value : 'right';
9213
9998
  }
9999
+ /** Close control for sheet. */
9214
10000
  class FrSheetClose {
9215
10001
  dialogRef = inject(DialogRef, { optional: true });
9216
10002
  result = input(undefined, { ...(ngDevMode ? { debugName: "result" } : /* istanbul ignore next */ {}), alias: 'frSheetClose' });
@@ -9230,6 +10016,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9230
10016
  },
9231
10017
  }]
9232
10018
  }], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "frSheetClose", required: false }] }] } });
10019
+ /** Panel slot for sheet. */
9233
10020
  class FrSheetPanel {
9234
10021
  dialogRef = inject(DialogRef, { optional: true });
9235
10022
  scrollable = input(false, { ...(ngDevMode ? { debugName: "scrollable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -9267,6 +10054,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9267
10054
  `,
9268
10055
  }]
9269
10056
  }], 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 }] }] } });
10057
+ /** Header slot for sheet. */
9270
10058
  class FrSheetHeader {
9271
10059
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9272
10060
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSheetHeader, isStandalone: true, selector: "[frSheetHeader], frame-sheet-header", host: { classAttribute: "frame-sheet__header" }, ngImport: i0 });
@@ -9280,6 +10068,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9280
10068
  },
9281
10069
  }]
9282
10070
  }] });
10071
+ /** Body slot for sheet. */
9283
10072
  class FrSheetBody {
9284
10073
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetBody, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9285
10074
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSheetBody, isStandalone: true, selector: "[frSheetBody], frame-sheet-body", host: { classAttribute: "frame-sheet__body" }, ngImport: i0 });
@@ -9293,6 +10082,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9293
10082
  },
9294
10083
  }]
9295
10084
  }] });
10085
+ /** Footer slot for sheet. */
9296
10086
  class FrSheetFooter {
9297
10087
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9298
10088
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSheetFooter, isStandalone: true, selector: "[frSheetFooter], frame-sheet-footer", host: { classAttribute: "frame-sheet__footer" }, ngImport: i0 });
@@ -9306,6 +10096,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9306
10096
  },
9307
10097
  }]
9308
10098
  }] });
10099
+ /** Title slot for sheet. */
9309
10100
  class FrSheetTitle {
9310
10101
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9311
10102
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSheetTitle, isStandalone: true, selector: "[frSheetTitle], frame-sheet-title", host: { classAttribute: "frame-sheet__title" }, ngImport: i0 });
@@ -9319,6 +10110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9319
10110
  },
9320
10111
  }]
9321
10112
  }] });
10113
+ /** Description slot for sheet. */
9322
10114
  class FrSheetDescription {
9323
10115
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9324
10116
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSheetDescription, isStandalone: true, selector: "[frSheetDescription], frame-sheet-description", host: { classAttribute: "frame-sheet__description" }, ngImport: i0 });
@@ -9335,6 +10127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9335
10127
 
9336
10128
  const FR_SHEET_DATA = DIALOG_DATA;
9337
10129
 
10130
+ /** Default shell for sheet content, title, and footer actions. */
9338
10131
  class FrSheetShell {
9339
10132
  dialogRef = inject((DialogRef));
9340
10133
  injector = inject(Injector);
@@ -9354,50 +10147,50 @@ class FrSheetShell {
9354
10147
  }
9355
10148
  }
9356
10149
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetShell, deps: [], target: i0.ɵɵFactoryTarget.Component });
9357
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSheetShell, isStandalone: true, selector: "frame-sheet-shell", ngImport: i0, template: `
9358
- <div
9359
- frSheetPanel
9360
- [side]="options.side ?? 'right'"
9361
- [showCloseButton]="options.showCloseButton ?? true"
9362
- [scrollable]="options.scrollable ?? false"
9363
- >
9364
- @if (options.title || options.description) {
9365
- <div frSheetHeader>
9366
- @if (options.title) {
9367
- <h2 frSheetTitle>{{ options.title }}</h2>
9368
- }
9369
-
9370
- @if (options.description) {
9371
- <p frSheetDescription>{{ options.description }}</p>
9372
- }
9373
- </div>
9374
- }
9375
-
9376
- <div frSheetBody>
9377
- <ng-container
9378
- [ngComponentOutlet]="options.bodyComponent"
9379
- [ngComponentOutletInputs]="options.bodyInputs ?? {}"
9380
- [ngComponentOutletInjector]="bodyInjector"
9381
- />
9382
- </div>
9383
-
9384
- @if (options.footerActions?.length) {
9385
- <div frSheetFooter>
9386
- @for (action of options.footerActions; track action.label) {
9387
- <button
9388
- frButton
9389
- type="button"
9390
- [appearance]="action.appearance ?? 'primary'"
9391
- [disabled]="action.disabled ?? false"
9392
- [attr.aria-label]="action.ariaLabel ?? null"
9393
- (click)="handleAction(action)"
9394
- >
9395
- <span frButtonLabel>{{ action.label }}</span>
9396
- </button>
9397
- }
9398
- </div>
9399
- }
9400
- </div>
10150
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrSheetShell, isStandalone: true, selector: "frame-sheet-shell", ngImport: i0, template: `
10151
+ <div
10152
+ frSheetPanel
10153
+ [side]="options.side ?? 'right'"
10154
+ [showCloseButton]="options.showCloseButton ?? true"
10155
+ [scrollable]="options.scrollable ?? false"
10156
+ >
10157
+ @if (options.title || options.description) {
10158
+ <div frSheetHeader>
10159
+ @if (options.title) {
10160
+ <h2 frSheetTitle>{{ options.title }}</h2>
10161
+ }
10162
+
10163
+ @if (options.description) {
10164
+ <p frSheetDescription>{{ options.description }}</p>
10165
+ }
10166
+ </div>
10167
+ }
10168
+
10169
+ <div frSheetBody>
10170
+ <ng-container
10171
+ [ngComponentOutlet]="options.bodyComponent"
10172
+ [ngComponentOutletInputs]="options.bodyInputs ?? {}"
10173
+ [ngComponentOutletInjector]="bodyInjector"
10174
+ />
10175
+ </div>
10176
+
10177
+ @if (options.footerActions?.length) {
10178
+ <div frSheetFooter>
10179
+ @for (action of options.footerActions; track action.label) {
10180
+ <button
10181
+ frButton
10182
+ type="button"
10183
+ [appearance]="action.appearance ?? 'primary'"
10184
+ [disabled]="action.disabled ?? false"
10185
+ [attr.aria-label]="action.ariaLabel ?? null"
10186
+ (click)="handleAction(action)"
10187
+ >
10188
+ <span frButtonLabel>{{ action.label }}</span>
10189
+ </button>
10190
+ }
10191
+ </div>
10192
+ }
10193
+ </div>
9401
10194
  `, isInline: true, dependencies: [{ kind: "directive", type: FrButton$1, selector: "a[frButton], button[frButton]", inputs: ["appearance", "disabled", "loading", "loadingDisplay", "radius", "size"] }, { kind: "directive", type: FrButtonLabel$1, selector: "[frButtonLabel]" }, { kind: "directive", type: FrSheetBody, selector: "[frSheetBody], frame-sheet-body" }, { kind: "directive", type: FrSheetDescription, selector: "[frSheetDescription], frame-sheet-description" }, { kind: "directive", type: FrSheetFooter, selector: "[frSheetFooter], frame-sheet-footer" }, { kind: "directive", type: FrSheetHeader, selector: "[frSheetHeader], frame-sheet-header" }, { kind: "component", type: FrSheetPanel, selector: "[frSheetPanel], frame-sheet-panel", inputs: ["scrollable", "showCloseButton", "side"] }, { kind: "directive", type: FrSheetTitle, selector: "[frSheetTitle], frame-sheet-title" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }] });
9402
10195
  }
9403
10196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSheetShell, decorators: [{
@@ -9415,56 +10208,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9415
10208
  FrSheetTitle,
9416
10209
  NgComponentOutlet,
9417
10210
  ],
9418
- template: `
9419
- <div
9420
- frSheetPanel
9421
- [side]="options.side ?? 'right'"
9422
- [showCloseButton]="options.showCloseButton ?? true"
9423
- [scrollable]="options.scrollable ?? false"
9424
- >
9425
- @if (options.title || options.description) {
9426
- <div frSheetHeader>
9427
- @if (options.title) {
9428
- <h2 frSheetTitle>{{ options.title }}</h2>
9429
- }
9430
-
9431
- @if (options.description) {
9432
- <p frSheetDescription>{{ options.description }}</p>
9433
- }
9434
- </div>
9435
- }
9436
-
9437
- <div frSheetBody>
9438
- <ng-container
9439
- [ngComponentOutlet]="options.bodyComponent"
9440
- [ngComponentOutletInputs]="options.bodyInputs ?? {}"
9441
- [ngComponentOutletInjector]="bodyInjector"
9442
- />
9443
- </div>
9444
-
9445
- @if (options.footerActions?.length) {
9446
- <div frSheetFooter>
9447
- @for (action of options.footerActions; track action.label) {
9448
- <button
9449
- frButton
9450
- type="button"
9451
- [appearance]="action.appearance ?? 'primary'"
9452
- [disabled]="action.disabled ?? false"
9453
- [attr.aria-label]="action.ariaLabel ?? null"
9454
- (click)="handleAction(action)"
9455
- >
9456
- <span frButtonLabel>{{ action.label }}</span>
9457
- </button>
9458
- }
9459
- </div>
9460
- }
9461
- </div>
10211
+ template: `
10212
+ <div
10213
+ frSheetPanel
10214
+ [side]="options.side ?? 'right'"
10215
+ [showCloseButton]="options.showCloseButton ?? true"
10216
+ [scrollable]="options.scrollable ?? false"
10217
+ >
10218
+ @if (options.title || options.description) {
10219
+ <div frSheetHeader>
10220
+ @if (options.title) {
10221
+ <h2 frSheetTitle>{{ options.title }}</h2>
10222
+ }
10223
+
10224
+ @if (options.description) {
10225
+ <p frSheetDescription>{{ options.description }}</p>
10226
+ }
10227
+ </div>
10228
+ }
10229
+
10230
+ <div frSheetBody>
10231
+ <ng-container
10232
+ [ngComponentOutlet]="options.bodyComponent"
10233
+ [ngComponentOutletInputs]="options.bodyInputs ?? {}"
10234
+ [ngComponentOutletInjector]="bodyInjector"
10235
+ />
10236
+ </div>
10237
+
10238
+ @if (options.footerActions?.length) {
10239
+ <div frSheetFooter>
10240
+ @for (action of options.footerActions; track action.label) {
10241
+ <button
10242
+ frButton
10243
+ type="button"
10244
+ [appearance]="action.appearance ?? 'primary'"
10245
+ [disabled]="action.disabled ?? false"
10246
+ [attr.aria-label]="action.ariaLabel ?? null"
10247
+ (click)="handleAction(action)"
10248
+ >
10249
+ <span frButtonLabel>{{ action.label }}</span>
10250
+ </button>
10251
+ }
10252
+ </div>
10253
+ }
10254
+ </div>
9462
10255
  `,
9463
10256
  }]
9464
10257
  }] });
9465
10258
 
9466
10259
  const DEFAULT_PANEL_CLASS = 'frame-sheet__overlay-pane';
9467
10260
  const DEFAULT_BACKDROP_CLASS = 'frame-sheet__backdrop';
10261
+ /** Service for opening sheet dialogs. */
9468
10262
  class FrSheetService {
9469
10263
  dialog = inject(Dialog);
9470
10264
  open(content, config = {}) {
@@ -9537,6 +10331,7 @@ function mergeClassList(classList, defaultClass) {
9537
10331
  return Array.from(new Set([defaultClass, ...classes].filter(Boolean)));
9538
10332
  }
9539
10333
 
10334
+ /** Trigger control for sheet. */
9540
10335
  class FrSheetTrigger {
9541
10336
  static CUSTOM_PROPERTY_PREFIX = '--frame-sheet-';
9542
10337
  destroyRef = inject(DestroyRef);
@@ -9634,10 +10429,11 @@ function coerceOptionalNumber(value) {
9634
10429
  const coerced = numberAttribute(value, Number.NaN);
9635
10430
  return Number.isFinite(coerced) ? coerced : null;
9636
10431
  }
10432
+ /** Shared state provider for sidebar. */
9637
10433
  class FrSidebarProvider {
9638
10434
  document = inject(DOCUMENT);
9639
10435
  elementRef = inject(ElementRef);
9640
- internalOpen = signal(true, ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
10436
+ internalOpen = linkedSignal(() => this.defaultOpen(), ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
9641
10437
  internalOpenMobile = signal(false, ...(ngDevMode ? [{ debugName: "internalOpenMobile" }] : /* istanbul ignore next */ []));
9642
10438
  resizing = signal(false, ...(ngDevMode ? [{ debugName: "resizing" }] : /* istanbul ignore next */ []));
9643
10439
  defaultOpen = input(true, { ...(ngDevMode ? { debugName: "defaultOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -9651,15 +10447,6 @@ class FrSidebarProvider {
9651
10447
  openMobile = computed(() => this.internalOpenMobile(), ...(ngDevMode ? [{ debugName: "openMobile" }] : /* istanbul ignore next */ []));
9652
10448
  state = computed(() => (this.open() ? 'expanded' : 'collapsed'), ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
9653
10449
  constructor() {
9654
- this.internalOpen.set(this.defaultOpen());
9655
- effect(() => {
9656
- if (this.openInput() === null) {
9657
- this.internalOpen.set(this.defaultOpen());
9658
- }
9659
- });
9660
- effect(() => {
9661
- this.elementRef.nativeElement.style.setProperty('--frame-sidebar-state', this.state());
9662
- });
9663
10450
  const defaultView = this.document.defaultView;
9664
10451
  if (!defaultView?.matchMedia) {
9665
10452
  return;
@@ -9704,7 +10491,7 @@ class FrSidebarProvider {
9704
10491
  this.toggleSidebar();
9705
10492
  }
9706
10493
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarProvider, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9707
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSidebarProvider, isStandalone: true, selector: "[frSidebarProvider], frame-sidebar-provider", inputs: { defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, openInput: { classPropertyName: "openInput", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, shortcut: { classPropertyName: "shortcut", publicName: "shortcut", isSignal: true, isRequired: false, transformFunction: null }, keyboardShortcut: { classPropertyName: "keyboardShortcut", publicName: "keyboardShortcut", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openChange: "openChange", openMobileChange: "openMobileChange" }, host: { listeners: { "document:keydown": "handleKeydown($event)" }, properties: { "attr.data-state": "state()", "attr.data-open": "open()", "attr.data-mobile-open": "openMobile()", "attr.data-mobile": "isMobile() ? \"\" : null", "attr.data-resizing": "resizing() ? \"\" : null" }, classAttribute: "frame-sidebar-provider" }, providers: [
10494
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSidebarProvider, isStandalone: true, selector: "[frSidebarProvider], frame-sidebar-provider", inputs: { defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, openInput: { classPropertyName: "openInput", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, shortcut: { classPropertyName: "shortcut", publicName: "shortcut", isSignal: true, isRequired: false, transformFunction: null }, keyboardShortcut: { classPropertyName: "keyboardShortcut", publicName: "keyboardShortcut", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openChange: "openChange", openMobileChange: "openMobileChange" }, host: { listeners: { "document:keydown": "handleKeydown($event)" }, properties: { "attr.data-state": "state()", "attr.data-open": "open()", "attr.data-mobile-open": "openMobile()", "attr.data-mobile": "isMobile() ? \"\" : null", "attr.data-resizing": "resizing() ? \"\" : null", "style.--frame-sidebar-state": "state()" }, classAttribute: "frame-sidebar-provider" }, providers: [
9708
10495
  {
9709
10496
  provide: FR_SIDEBAR_PROVIDER,
9710
10497
  useExisting: FrSidebarProvider,
@@ -9729,10 +10516,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9729
10516
  '[attr.data-mobile-open]': 'openMobile()',
9730
10517
  '[attr.data-mobile]': 'isMobile() ? "" : null',
9731
10518
  '[attr.data-resizing]': 'resizing() ? "" : null',
10519
+ '[style.--frame-sidebar-state]': 'state()',
9732
10520
  '(document:keydown)': 'handleKeydown($event)',
9733
10521
  },
9734
10522
  }]
9735
10523
  }], 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 }] }] } });
10524
+ /** Sidebar root driven by provider state. */
9736
10525
  class FrSidebar {
9737
10526
  elementRef = inject(ElementRef);
9738
10527
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
@@ -9760,6 +10549,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9760
10549
  },
9761
10550
  }]
9762
10551
  }], 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 }] }] } });
10552
+ /** Trigger control for sidebar. */
9763
10553
  class FrSidebarTrigger {
9764
10554
  provider = inject(FR_SIDEBAR_PROVIDER, { optional: true });
9765
10555
  ariaLabel = input('Toggle sidebar', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
@@ -9782,6 +10572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9782
10572
  },
9783
10573
  }]
9784
10574
  }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
10575
+ /** Rail slot for sidebar. */
9785
10576
  class FrSidebarRail {
9786
10577
  document = inject(DOCUMENT);
9787
10578
  sidebar = inject(FrSidebar, { optional: true });
@@ -9851,6 +10642,7 @@ class FrSidebarRail {
9851
10642
  if (this.frameId !== -1) {
9852
10643
  return;
9853
10644
  }
10645
+ // Batch rapid pointer moves into one width write per animation frame.
9854
10646
  this.frameId = requestAnimationFrame(() => {
9855
10647
  this.provider?.setSidebarWidth(this.pendingWidth);
9856
10648
  this.frameId = -1;
@@ -9878,6 +10670,7 @@ class FrSidebarRail {
9878
10670
  if (!this.sidebar) {
9879
10671
  return 192;
9880
10672
  }
10673
+ // Use rendered child width as a fallback min-size when consumers do not provide one.
9881
10674
  const sidebarElement = this.sidebar.elementRef.nativeElement;
9882
10675
  const sidebarRect = sidebarElement.getBoundingClientRect();
9883
10676
  let measuredWidth = 0;
@@ -9911,6 +10704,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9911
10704
  },
9912
10705
  }]
9913
10706
  }] });
10707
+ /** Inset slot for sidebar. */
9914
10708
  class FrSidebarInset {
9915
10709
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarInset, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9916
10710
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarInset, isStandalone: true, selector: "[frSidebarInset], frame-sidebar-inset", host: { classAttribute: "frame-sidebar-inset" }, ngImport: i0 });
@@ -9924,6 +10718,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9924
10718
  },
9925
10719
  }]
9926
10720
  }] });
10721
+ /** Header slot for sidebar. */
9927
10722
  class FrSidebarHeader {
9928
10723
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9929
10724
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarHeader, isStandalone: true, selector: "[frSidebarHeader], frame-sidebar-header", host: { classAttribute: "frame-sidebar__header" }, ngImport: i0 });
@@ -9937,6 +10732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9937
10732
  },
9938
10733
  }]
9939
10734
  }] });
10735
+ /** Footer slot for sidebar. */
9940
10736
  class FrSidebarFooter {
9941
10737
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9942
10738
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarFooter, isStandalone: true, selector: "[frSidebarFooter], frame-sidebar-footer", host: { classAttribute: "frame-sidebar__footer" }, ngImport: i0 });
@@ -9950,6 +10746,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9950
10746
  },
9951
10747
  }]
9952
10748
  }] });
10749
+ /** Content slot for sidebar. */
9953
10750
  class FrSidebarContent {
9954
10751
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9955
10752
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarContent, isStandalone: true, selector: "[frSidebarContent], frame-sidebar-content", host: { classAttribute: "frame-sidebar__content" }, ngImport: i0 });
@@ -9963,6 +10760,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9963
10760
  },
9964
10761
  }]
9965
10762
  }] });
10763
+ /** Group slot for sidebar. */
9966
10764
  class FrSidebarGroup {
9967
10765
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9968
10766
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarGroup, isStandalone: true, selector: "[frSidebarGroup], frame-sidebar-group", host: { classAttribute: "frame-sidebar__group" }, ngImport: i0 });
@@ -9976,6 +10774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9976
10774
  },
9977
10775
  }]
9978
10776
  }] });
10777
+ /** Label slot for sidebar group. */
9979
10778
  class FrSidebarGroupLabel {
9980
10779
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarGroupLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9981
10780
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarGroupLabel, isStandalone: true, selector: "[frSidebarGroupLabel], frame-sidebar-group-label", host: { classAttribute: "frame-sidebar__group-label" }, ngImport: i0 });
@@ -9989,6 +10788,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
9989
10788
  },
9990
10789
  }]
9991
10790
  }] });
10791
+ /** Action slot for sidebar group. */
9992
10792
  class FrSidebarGroupAction {
9993
10793
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarGroupAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
9994
10794
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarGroupAction, isStandalone: true, selector: "[frSidebarGroupAction], frame-sidebar-group-action", host: { attributes: { "type": "button" }, classAttribute: "frame-sidebar__group-action" }, ngImport: i0 });
@@ -10003,6 +10803,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10003
10803
  },
10004
10804
  }]
10005
10805
  }] });
10806
+ /** Content slot for sidebar group. */
10006
10807
  class FrSidebarGroupContent {
10007
10808
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarGroupContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10008
10809
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarGroupContent, isStandalone: true, selector: "[frSidebarGroupContent], frame-sidebar-group-content", host: { classAttribute: "frame-sidebar__group-content" }, ngImport: i0 });
@@ -10016,6 +10817,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10016
10817
  },
10017
10818
  }]
10018
10819
  }] });
10820
+ /** Menu list inside sidebar navigation. */
10019
10821
  class FrSidebarMenu {
10020
10822
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10021
10823
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarMenu, isStandalone: true, selector: "[frSidebarMenu], frame-sidebar-menu", host: { attributes: { "role": "list" }, classAttribute: "frame-sidebar__menu" }, ngImport: i0 });
@@ -10030,6 +10832,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10030
10832
  },
10031
10833
  }]
10032
10834
  }] });
10835
+ /** Item slot for sidebar menu. */
10033
10836
  class FrSidebarMenuItem {
10034
10837
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10035
10838
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarMenuItem, isStandalone: true, selector: "[frSidebarMenuItem], frame-sidebar-menu-item", host: { attributes: { "role": "listitem" }, classAttribute: "frame-sidebar__menu-item" }, ngImport: i0 });
@@ -10044,6 +10847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10044
10847
  },
10045
10848
  }]
10046
10849
  }] });
10850
+ /** Interactive button or link inside a sidebar menu item. */
10047
10851
  class FrSidebarMenuButton {
10048
10852
  active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
10049
10853
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -10075,6 +10879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10075
10879
  },
10076
10880
  }]
10077
10881
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: false }] }] } });
10882
+ /** Action slot for sidebar menu. */
10078
10883
  class FrSidebarMenuAction {
10079
10884
  showOnHover = input(false, { ...(ngDevMode ? { debugName: "showOnHover" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
10080
10885
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenuAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -10091,6 +10896,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10091
10896
  },
10092
10897
  }]
10093
10898
  }], propDecorators: { showOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOnHover", required: false }] }] } });
10899
+ /** Badge slot for sidebar menu. */
10094
10900
  class FrSidebarMenuBadge {
10095
10901
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenuBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10096
10902
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarMenuBadge, isStandalone: true, selector: "[frSidebarMenuBadge], frame-sidebar-menu-badge", host: { classAttribute: "frame-sidebar__menu-badge" }, ngImport: i0 });
@@ -10104,6 +10910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10104
10910
  },
10105
10911
  }]
10106
10912
  }] });
10913
+ /** Nested menu list inside sidebar navigation. */
10107
10914
  class FrSidebarMenuSub {
10108
10915
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenuSub, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10109
10916
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarMenuSub, isStandalone: true, selector: "[frSidebarMenuSub], frame-sidebar-menu-sub", host: { attributes: { "role": "list" }, classAttribute: "frame-sidebar__menu-sub" }, ngImport: i0 });
@@ -10118,6 +10925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10118
10925
  },
10119
10926
  }]
10120
10927
  }] });
10928
+ /** Item slot for sidebar menu sub. */
10121
10929
  class FrSidebarMenuSubItem {
10122
10930
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSidebarMenuSubItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10123
10931
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSidebarMenuSubItem, isStandalone: true, selector: "[frSidebarMenuSubItem], frame-sidebar-menu-sub-item", host: { attributes: { "role": "listitem" }, classAttribute: "frame-sidebar__menu-sub-item" }, ngImport: i0 });
@@ -10132,6 +10940,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10132
10940
  },
10133
10941
  }]
10134
10942
  }] });
10943
+ /** Interactive button or link inside a sidebar submenu. */
10135
10944
  class FrSidebarMenuSubButton {
10136
10945
  active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
10137
10946
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -10157,6 +10966,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10157
10966
  },
10158
10967
  }]
10159
10968
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
10969
+ /** Skeleton slot for sidebar menu. */
10160
10970
  class FrSidebarMenuSkeleton {
10161
10971
  showIcon = input(false, { ...(ngDevMode ? { debugName: "showIcon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
10162
10972
  width = input('72%', ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
@@ -10176,6 +10986,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10176
10986
  }], propDecorators: { showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
10177
10987
 
10178
10988
  const FR_SWITCH_SIZES = ['sm', 'default'];
10989
+ /** Switch input styled as a FrameUI control. */
10179
10990
  class FrSwitch {
10180
10991
  size = input('default', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
10181
10992
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitch, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -10192,6 +11003,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10192
11003
  },
10193
11004
  }]
10194
11005
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
11006
+ /** Field slot for switch. */
10195
11007
  class FrSwitchField {
10196
11008
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitchField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10197
11009
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSwitchField, isStandalone: true, selector: "[frSwitchField], frame-switch-field", host: { classAttribute: "frame-switch-field" }, ngImport: i0 });
@@ -10205,6 +11017,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10205
11017
  },
10206
11018
  }]
10207
11019
  }] });
11020
+ /** Content slot for switch. */
10208
11021
  class FrSwitchContent {
10209
11022
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitchContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10210
11023
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSwitchContent, isStandalone: true, selector: "[frSwitchContent], frame-switch-content", host: { classAttribute: "frame-switch-content" }, ngImport: i0 });
@@ -10218,6 +11031,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10218
11031
  },
10219
11032
  }]
10220
11033
  }] });
11034
+ /** Label slot for switch. */
10221
11035
  class FrSwitchLabel {
10222
11036
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitchLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10223
11037
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSwitchLabel, isStandalone: true, selector: "[frSwitchLabel], frame-switch-label", host: { classAttribute: "frame-switch-label" }, ngImport: i0 });
@@ -10231,6 +11045,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10231
11045
  },
10232
11046
  }]
10233
11047
  }] });
11048
+ /** Description slot for switch. */
10234
11049
  class FrSwitchDescription {
10235
11050
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitchDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10236
11051
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSwitchDescription, isStandalone: true, selector: "[frSwitchDescription], frame-switch-description", host: { classAttribute: "frame-switch-description" }, ngImport: i0 });
@@ -10244,6 +11059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10244
11059
  },
10245
11060
  }]
10246
11061
  }] });
11062
+ /** Error slot for switch. */
10247
11063
  class FrSwitchError {
10248
11064
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSwitchError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10249
11065
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSwitchError, isStandalone: true, selector: "[frSwitchError], frame-switch-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-switch-error" }, ngImport: i0 });
@@ -10259,6 +11075,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10259
11075
  }]
10260
11076
  }] });
10261
11077
 
11078
+ /** Textarea control with FrameUI field styling. */
10262
11079
  class FrTextarea {
10263
11080
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrTextarea, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10264
11081
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrTextarea, isStandalone: true, selector: "textarea[frTextarea]", host: { classAttribute: "frame-textarea" }, ngImport: i0 });
@@ -10316,6 +11133,7 @@ function calculateScrollOffsetForIndex(index, alignment, itemSize, viewportSize,
10316
11133
  }
10317
11134
  }
10318
11135
 
11136
+ /** Viewport controller for virtual scrolling. */
10319
11137
  class FrVirtualViewport {
10320
11138
  destroyRef = inject(DestroyRef);
10321
11139
  elementRef = inject(ElementRef);
@@ -10359,6 +11177,7 @@ class FrVirtualViewport {
10359
11177
  }
10360
11178
  scrollToIndex(index, alignment = 'auto') {
10361
11179
  const element = this.elementRef.nativeElement;
11180
+ // Virtual scrolling assumes fixed item heights, so index math can stay O(1).
10362
11181
  const nextScrollTop = calculateScrollOffsetForIndex(index, alignment, this.itemSize(), element.clientHeight, this.totalCount(), element.scrollTop);
10363
11182
  element.scrollTop = nextScrollTop;
10364
11183
  this.scrollTop.set(nextScrollTop);
@@ -10392,6 +11211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10392
11211
  }]
10393
11212
  }], ctorParameters: () => [], propDecorators: { itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], overscan: [{ type: i0.Input, args: [{ isSignal: true, alias: "overscan", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
10394
11213
 
11214
+ /** Measured content wrapper for virtual scrolling. */
10395
11215
  class FrVirtualContent {
10396
11216
  viewport = inject(FrVirtualViewport);
10397
11217
  before = computed(() => this.viewport.before(), ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
@@ -10411,6 +11231,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10411
11231
  }]
10412
11232
  }] });
10413
11233
 
11234
+ /** Structural directive for rendering virtualized ranges. */
10414
11235
  class FrVirtualFor {
10415
11236
  templateRef = inject(TemplateRef);
10416
11237
  viewContainerRef = inject(ViewContainerRef);
@@ -10418,6 +11239,7 @@ class FrVirtualFor {
10418
11239
  views = [];
10419
11240
  frVirtualForOf = input.required(...(ngDevMode ? [{ debugName: "frVirtualForOf" }] : /* istanbul ignore next */ []));
10420
11241
  frVirtualForTrackBy = input(null, ...(ngDevMode ? [{ debugName: "frVirtualForTrackBy" }] : /* istanbul ignore next */ []));
11242
+ lastRenderKey = '';
10421
11243
  slice = computed(() => {
10422
11244
  const items = this.frVirtualForOf();
10423
11245
  const start = this.viewport.startIndex();
@@ -10428,12 +11250,21 @@ class FrVirtualFor {
10428
11250
  visible: items.slice(start, end),
10429
11251
  };
10430
11252
  }, ...(ngDevMode ? [{ debugName: "slice" }] : /* istanbul ignore next */ []));
10431
- constructor() {
10432
- effect(() => {
10433
- const items = this.frVirtualForOf();
10434
- this.viewport.setTotalCount(items.length);
10435
- this.render();
10436
- });
11253
+ ngDoCheck() {
11254
+ const items = this.frVirtualForOf();
11255
+ const renderKey = [
11256
+ items,
11257
+ items.length,
11258
+ this.viewport.startIndex(),
11259
+ this.viewport.endIndex(),
11260
+ this.frVirtualForTrackBy(),
11261
+ ].map(String).join('|');
11262
+ this.viewport.setTotalCount(items.length);
11263
+ if (renderKey === this.lastRenderKey) {
11264
+ return;
11265
+ }
11266
+ this.lastRenderKey = renderKey;
11267
+ this.render();
10437
11268
  }
10438
11269
  static ngTemplateContextGuard(_directive, _context) {
10439
11270
  return true;
@@ -10486,8 +11317,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10486
11317
  args: [{
10487
11318
  selector: '[frVirtualFor][frVirtualForOf]',
10488
11319
  }]
10489
- }], ctorParameters: () => [], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
11320
+ }], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
10490
11321
 
11322
+ /** List wrapper for virtualized items. */
10491
11323
  class FrVirtualList {
10492
11324
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10493
11325
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualList, isStandalone: true, selector: "[frVirtualList], frame-virtual-list", host: { classAttribute: "frame-virtual-scroll__list" }, ngImport: i0 });
@@ -10501,6 +11333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10501
11333
  },
10502
11334
  }]
10503
11335
  }] });
11336
+ /** Panel wrapper for virtualized content. */
10504
11337
  class FrVirtualPanel {
10505
11338
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10506
11339
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualPanel, isStandalone: true, selector: "[frVirtualPanel], frame-virtual-panel", host: { classAttribute: "frame-virtual-scroll__panel" }, ngImport: i0 });
@@ -10514,6 +11347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10514
11347
  },
10515
11348
  }]
10516
11349
  }] });
11350
+ /** Item wrapper for virtualized rows. */
10517
11351
  class FrVirtualItem {
10518
11352
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10519
11353
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItem, isStandalone: true, selector: "[frVirtualItem], frame-virtual-item", host: { classAttribute: "frame-virtual-scroll__item" }, ngImport: i0 });
@@ -10527,6 +11361,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10527
11361
  },
10528
11362
  }]
10529
11363
  }] });
11364
+ /** Meta slot for virtual item. */
10530
11365
  class FrVirtualItemMeta {
10531
11366
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItemMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10532
11367
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItemMeta, isStandalone: true, selector: "[frVirtualItemMeta], frame-virtual-item-meta", host: { classAttribute: "frame-virtual-scroll__item-meta" }, ngImport: i0 });
@@ -10545,5 +11380,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
10545
11380
  * Generated bundle index. Do not edit.
10546
11381
  */
10547
11382
 
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 };
11383
+ 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, FrConfirmPopover, FrConfirmPopoverPanel, 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 };
10549
11384
  //# sourceMappingURL=frame-ui-ng-components.mjs.map