@flusys/ng-ui 8.1.3 → 8.1.5

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.
@@ -957,12 +957,18 @@ const SEVERITY_CLASSES = {
957
957
  class UiIconComponent {
958
958
  name = input('', /* @ts-ignore */
959
959
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
960
- size = input(16, /* @ts-ignore */
960
+ // Unset by default so the icon renders at `1em` — it then scales with
961
+ // whatever font-size context (e.g. a Tailwind text-* class) surrounds it,
962
+ // instead of always rendering at a fixed pixel size regardless of that
963
+ // context. Pass an explicit size to opt out and pin an exact pixel value.
964
+ size = input(undefined, /* @ts-ignore */
961
965
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
962
966
  spin = input(false, { ...(ngDevMode ? { debugName: "spin" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
963
967
  fill = input(false, { ...(ngDevMode ? { debugName: "fill" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
964
968
  severity = input(null, /* @ts-ignore */
965
969
  ...(ngDevMode ? [{ debugName: "severity" }] : /* istanbul ignore next */ []));
970
+ resolvedSize = computed(() => this.size() ?? '1em', /* @ts-ignore */
971
+ ...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
966
972
  lucideName = computed(() => {
967
973
  const n = this.name();
968
974
  return PI_TO_LUCIDE[n] ?? n;
@@ -981,32 +987,31 @@ class UiIconComponent {
981
987
  }, /* @ts-ignore */
982
988
  ...(ngDevMode ? [{ debugName: "iconClass" }] : /* istanbul ignore next */ []));
983
989
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
984
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiIconComponent, isStandalone: true, selector: "ui-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spin: { classPropertyName: "spin", publicName: "spin", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--ui-icon-size": "size() + 'px'" }, classAttribute: "inline-flex items-center leading-none" }, providers: [provideLucideIcons(...allLucideIcons)], ngImport: i0, template: `
990
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiIconComponent, isStandalone: true, selector: "ui-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spin: { classPropertyName: "spin", publicName: "spin", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex items-center leading-none" }, providers: [provideLucideIcons(...allLucideIcons)], ngImport: i0, template: `
985
991
  @if (lucideName()) {
986
992
  <svg
987
993
  ngSkipHydration
988
994
  [lucideIcon]="lucideName()"
989
- [size]="size()"
995
+ [size]="resolvedSize()"
990
996
  [class]="iconClass()"
991
997
  ></svg>
992
998
  }
993
- `, isInline: true, styles: [":host ::ng-deep svg[lucideIcon]{width:var(--ui-icon-size);height:var(--ui-icon-size);display:block}\n"], dependencies: [{ kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }] });
999
+ `, isInline: true, styles: [":host ::ng-deep svg[lucideIcon]{display:block}\n"], dependencies: [{ kind: "component", type: LucideDynamicIcon, selector: "svg[lucideIcon]", inputs: ["lucideIcon"] }] });
994
1000
  }
995
1001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiIconComponent, decorators: [{
996
1002
  type: Component,
997
1003
  args: [{ selector: 'ui-icon', imports: [LucideDynamicIcon], providers: [provideLucideIcons(...allLucideIcons)], host: {
998
1004
  class: 'inline-flex items-center leading-none',
999
- '[style.--ui-icon-size]': "size() + 'px'",
1000
1005
  }, template: `
1001
1006
  @if (lucideName()) {
1002
1007
  <svg
1003
1008
  ngSkipHydration
1004
1009
  [lucideIcon]="lucideName()"
1005
- [size]="size()"
1010
+ [size]="resolvedSize()"
1006
1011
  [class]="iconClass()"
1007
1012
  ></svg>
1008
1013
  }
1009
- `, styles: [":host ::ng-deep svg[lucideIcon]{width:var(--ui-icon-size);height:var(--ui-icon-size);display:block}\n"] }]
1014
+ `, styles: [":host ::ng-deep svg[lucideIcon]{display:block}\n"] }]
1010
1015
  }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spin: [{ type: i0.Input, args: [{ isSignal: true, alias: "spin", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], severity: [{ type: i0.Input, args: [{ isSignal: true, alias: "severity", required: false }] }] } });
1011
1016
 
1012
1017
  class ButtonComponent {
@@ -3257,17 +3262,170 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
3257
3262
  }]
3258
3263
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }], scrollHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollHeight", required: false }] }], scrollWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollWidth", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], onScrollIndexChange: [{ type: i0.Output, args: ["onScrollIndexChange"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }], loaderTpl: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }] } });
3259
3264
 
3260
- // `capture: true` is required because scroll events on inner scroll containers don't bubble to window.
3261
- function repositionOnScroll(isActive, reposition) {
3262
- effect(onCleanup => {
3263
- if (!isActive() || typeof window === 'undefined')
3265
+ const DEFAULT_GAP = 4;
3266
+ const DEFAULT_MARGIN = 8;
3267
+ const DEFAULT_MIN_HEIGHT = 120;
3268
+ /**
3269
+ * Places a panel against an anchor inside the viewport: flips above the anchor
3270
+ * when there is more room there, clamps horizontally, and hands back a
3271
+ * `maxHeight` when the panel would otherwise be cut off by a viewport edge, so
3272
+ * it scrolls internally instead.
3273
+ */
3274
+ function computeOverlayPlacement(anchor, panel, viewport, options = {}) {
3275
+ const gap = options.gap ?? DEFAULT_GAP;
3276
+ const margin = options.margin ?? DEFAULT_MARGIN;
3277
+ const align = options.align ?? 'start';
3278
+ const minHeight = Math.min(options.minHeight ?? DEFAULT_MIN_HEIGHT, Math.max(0, viewport.height - margin * 2));
3279
+ const spaceBelow = viewport.height - anchor.bottom - gap - margin;
3280
+ const spaceAbove = anchor.top - gap - margin;
3281
+ const direction = panel.height <= spaceBelow || spaceBelow >= spaceAbove ? 'down' : 'up';
3282
+ const room = direction === 'down' ? spaceBelow : spaceAbove;
3283
+ const maxHeight = Math.max(minHeight, Math.round(room));
3284
+ const height = Math.min(panel.height, maxHeight);
3285
+ // Only take over the height when the panel genuinely doesn't fit; otherwise
3286
+ // leave it to the panel's own CSS (a design cap like `max-h-56`).
3287
+ const clamped = options.clampHeight !== false && panel.height > maxHeight ? maxHeight : null;
3288
+ const top = direction === 'down'
3289
+ ? Math.min(anchor.bottom + gap, Math.max(margin, viewport.height - margin - height))
3290
+ : Math.max(margin, anchor.top - gap - height);
3291
+ const width = options.matchAnchorWidth ? anchor.width : panel.width;
3292
+ const rawLeft = align === 'end' ? anchor.right - width : anchor.left;
3293
+ const left = width + margin * 2 > viewport.width
3294
+ ? margin
3295
+ : Math.max(margin, Math.min(rawLeft, viewport.width - width - margin));
3296
+ return {
3297
+ top: Math.round(top),
3298
+ left: Math.round(left),
3299
+ width: options.matchAnchorWidth ? Math.round(anchor.width) : null,
3300
+ maxHeight: clamped,
3301
+ direction,
3302
+ };
3303
+ }
3304
+ function overlayPlacementStyle(placement) {
3305
+ if (!placement)
3306
+ return {};
3307
+ const style = {
3308
+ top: `${placement.top}px`,
3309
+ left: `${placement.left}px`,
3310
+ };
3311
+ if (placement.maxHeight !== null)
3312
+ style['max-height'] = `${placement.maxHeight}px`;
3313
+ if (placement.width !== null)
3314
+ style['width'] = `${placement.width}px`;
3315
+ return style;
3316
+ }
3317
+ function overlayPlacementEquals(a, b) {
3318
+ if (a === b)
3319
+ return true;
3320
+ if (!a || !b)
3321
+ return false;
3322
+ return (a.top === b.top &&
3323
+ a.left === b.left &&
3324
+ a.width === b.width &&
3325
+ a.maxHeight === b.maxHeight &&
3326
+ a.direction === b.direction);
3327
+ }
3328
+ /**
3329
+ * How tall the panel wants to be, with our own `max-height` lifted for the
3330
+ * measurement — otherwise a panel we clamped once would report the clamped
3331
+ * height forever and could never claim more room after a scroll.
3332
+ */
3333
+ function measureNaturalSize(panel) {
3334
+ const previous = panel.style.maxHeight;
3335
+ // Cleared, not `none`: the panel's own CSS cap must still apply, so a panel
3336
+ // that fits inside its design cap never asks for more room than that.
3337
+ panel.style.maxHeight = '';
3338
+ // offsetWidth/Height, not getBoundingClientRect: several panels animate in
3339
+ // with a `scale()` transform, which would otherwise make us measure — and
3340
+ // place — a panel mid-animation at the wrong size.
3341
+ const size = { width: panel.offsetWidth, height: panel.offsetHeight };
3342
+ panel.style.maxHeight = previous;
3343
+ return size;
3344
+ }
3345
+ /**
3346
+ * Keeps a fixed-position panel glued to its anchor while it is open.
3347
+ *
3348
+ * Repositions on window scroll (capture: inner scroll containers don't bubble),
3349
+ * on resize, and — the case every hand-rolled copy of this math used to miss —
3350
+ * when the panel's own content resizes, e.g. a lazily loaded option list
3351
+ * arriving after the panel opened and pushing it past the bottom of the screen.
3352
+ * Work is coalesced into an animation frame so a scroll burst costs one layout.
3353
+ */
3354
+ function createOverlayPositioner(anchor, panel, options, emit) {
3355
+ let frame = null;
3356
+ let measuring = false;
3357
+ const update = () => {
3358
+ frame = null;
3359
+ if (typeof anchor.getBoundingClientRect !== 'function')
3360
+ return;
3361
+ measuring = true;
3362
+ const size = measureNaturalSize(panel);
3363
+ measuring = false;
3364
+ emit(computeOverlayPlacement(anchor.getBoundingClientRect(), size, { width: window.innerWidth, height: window.innerHeight }, options));
3365
+ };
3366
+ const schedule = () => {
3367
+ if (frame !== null)
3264
3368
  return;
3265
- window.addEventListener('scroll', reposition, true);
3266
- window.addEventListener('resize', reposition);
3267
- onCleanup(() => {
3268
- window.removeEventListener('scroll', reposition, true);
3269
- window.removeEventListener('resize', reposition);
3369
+ frame = requestAnimationFrame(update);
3370
+ };
3371
+ update();
3372
+ window.addEventListener('scroll', schedule, true);
3373
+ window.addEventListener('resize', schedule);
3374
+ const observer = typeof ResizeObserver === 'undefined'
3375
+ ? null
3376
+ : new ResizeObserver(() => {
3377
+ if (!measuring)
3378
+ schedule();
3270
3379
  });
3380
+ observer?.observe(panel);
3381
+ return () => {
3382
+ if (frame !== null)
3383
+ cancelAnimationFrame(frame);
3384
+ window.removeEventListener('scroll', schedule, true);
3385
+ window.removeEventListener('resize', schedule);
3386
+ observer?.disconnect();
3387
+ };
3388
+ }
3389
+ /**
3390
+ * Signal-based placement for components that render their panel from a
3391
+ * template. Bind the result through `overlayPlacementStyle()`. Must be called
3392
+ * in an injection context.
3393
+ */
3394
+ function overlayPosition(config) {
3395
+ const placement = signal(null, { ...(ngDevMode ? { debugName: "placement" } : /* istanbul ignore next */ {}), equal: overlayPlacementEquals });
3396
+ effect((onCleanup) => {
3397
+ const anchorEl = config.anchor();
3398
+ const panelEl = config.panel();
3399
+ const options = config.options?.() ?? {};
3400
+ if (!config.active() ||
3401
+ !anchorEl ||
3402
+ !panelEl ||
3403
+ typeof window === 'undefined') {
3404
+ placement.set(null);
3405
+ return;
3406
+ }
3407
+ onCleanup(createOverlayPositioner(anchorEl, panelEl, options, (next) => placement.set(next)));
3408
+ });
3409
+ return placement.asReadonly();
3410
+ }
3411
+ /**
3412
+ * Imperative twin of `overlayPosition()` for overlays that portal a plain DOM
3413
+ * node instead of rendering a template. Returns a dispose function.
3414
+ */
3415
+ function attachOverlayPosition(anchor, panel, options = {}) {
3416
+ if (typeof window === 'undefined')
3417
+ return () => undefined;
3418
+ let current = null;
3419
+ return createOverlayPositioner(anchor, panel, options, (placement) => {
3420
+ if (overlayPlacementEquals(current, placement))
3421
+ return;
3422
+ current = placement;
3423
+ panel.style.top = `${placement.top}px`;
3424
+ panel.style.left = `${placement.left}px`;
3425
+ panel.style.maxHeight =
3426
+ placement.maxHeight === null ? '' : `${placement.maxHeight}px`;
3427
+ if (placement.width !== null)
3428
+ panel.style.width = `${placement.width}px`;
3271
3429
  });
3272
3430
  }
3273
3431
 
@@ -3293,7 +3451,6 @@ class SelectComponent {
3293
3451
  queueMicrotask(() => this._filterInputRef()?.nativeElement.focus());
3294
3452
  }
3295
3453
  });
3296
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => { this.position(); this.adjustForViewport(); });
3297
3454
  }
3298
3455
  onDocumentClick(e) {
3299
3456
  if (this.open() && !this._el.nativeElement.contains(e.target)) {
@@ -3342,7 +3499,7 @@ class SelectComponent {
3342
3499
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
3343
3500
  style = input(null, /* @ts-ignore */
3344
3501
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
3345
- appendTo = input('self', /* @ts-ignore */
3502
+ appendTo = input('body', /* @ts-ignore */
3346
3503
  ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
3347
3504
  editable = input(false, { ...(ngDevMode ? { debugName: "editable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3348
3505
  readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -3357,6 +3514,14 @@ class SelectComponent {
3357
3514
  virtualScrollItemSize = input(36, /* @ts-ignore */
3358
3515
  ...(ngDevMode ? [{ debugName: "virtualScrollItemSize" }] : /* istanbul ignore next */ []));
3359
3516
  lazy = input(false, { ...(ngDevMode ? { debugName: "lazy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3517
+ /**
3518
+ * Full option object for the current `value()`, supplied by the consumer.
3519
+ * Pinned into the option pool (deduped by `optionValue`) whenever a lazy-loaded
3520
+ * or filtered `options()` page doesn't happen to contain it, so the trigger
3521
+ * label, checkmark and list row always resolve correctly on edit forms.
3522
+ */
3523
+ selectedObject = input(null, /* @ts-ignore */
3524
+ ...(ngDevMode ? [{ debugName: "selectedObject" }] : /* istanbul ignore next */ []));
3360
3525
  hostClass = computed(() => `block w-full ${this.styleClass()}`, /* @ts-ignore */
3361
3526
  ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
3362
3527
  onFilter = output();
@@ -3387,49 +3552,19 @@ class SelectComponent {
3387
3552
  ...(ngDevMode ? [{ debugName: "_filterInputRef" }] : /* istanbul ignore next */ []));
3388
3553
  _panelRef = viewChild('panel', /* @ts-ignore */
3389
3554
  ...(ngDevMode ? [{ debugName: "_panelRef" }] : /* istanbul ignore next */ []));
3390
- _panelTop = signal(0, /* @ts-ignore */
3391
- ...(ngDevMode ? [{ debugName: "_panelTop" }] : /* istanbul ignore next */ []));
3392
- _panelLeft = signal(0, /* @ts-ignore */
3393
- ...(ngDevMode ? [{ debugName: "_panelLeft" }] : /* istanbul ignore next */ []));
3394
- _panelWidth = signal(0, /* @ts-ignore */
3395
- ...(ngDevMode ? [{ debugName: "_panelWidth" }] : /* istanbul ignore next */ []));
3555
+ _placement = overlayPosition({
3556
+ active: () => this.open() && this.appendTo() === 'body',
3557
+ anchor: () => this._triggerRef()?.nativeElement,
3558
+ panel: () => this._panelRef()?.nativeElement,
3559
+ options: () => ({ matchAnchorWidth: true }),
3560
+ });
3396
3561
  panelClass = computed(() => {
3397
3562
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute w-full mt-1';
3398
- return `${position} z-50 bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
3563
+ return `${position} z-50 flex flex-col bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
3399
3564
  }, /* @ts-ignore */
3400
3565
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
3401
- panelStyle = computed(() => {
3402
- if (this.appendTo() !== 'body')
3403
- return {};
3404
- return {
3405
- top: `${this._panelTop()}px`,
3406
- left: `${this._panelLeft()}px`,
3407
- width: `${this._panelWidth()}px`,
3408
- };
3409
- }, /* @ts-ignore */
3566
+ panelStyle = computed(() => this.appendTo() === 'body' ? overlayPlacementStyle(this._placement()) : {}, /* @ts-ignore */
3410
3567
  ...(ngDevMode ? [{ debugName: "panelStyle" }] : /* istanbul ignore next */ []));
3411
- position() {
3412
- const anchorEl = this._triggerRef()?.nativeElement;
3413
- if (!anchorEl || typeof window === 'undefined')
3414
- return;
3415
- const rect = anchorEl.getBoundingClientRect();
3416
- this._panelTop.set(rect.bottom + 4);
3417
- this._panelLeft.set(Math.max(8, rect.left));
3418
- this._panelWidth.set(rect.width);
3419
- }
3420
- adjustForViewport() {
3421
- const panelEl = this._panelRef()?.nativeElement;
3422
- const anchorEl = this._triggerRef()?.nativeElement;
3423
- if (!panelEl || !anchorEl || typeof window === 'undefined')
3424
- return;
3425
- const anchorRect = anchorEl.getBoundingClientRect();
3426
- const panelRect = panelEl.getBoundingClientRect();
3427
- const gap = 4;
3428
- this._panelLeft.set(Math.max(8, Math.min(anchorRect.left, window.innerWidth - panelRect.width - 8)));
3429
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
3430
- this._panelTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
3431
- }
3432
- }
3433
3568
  selectedItemRef = contentChild('selectedItem', /* @ts-ignore */
3434
3569
  ...(ngDevMode ? [{ debugName: "selectedItemRef" }] : /* istanbul ignore next */ []));
3435
3570
  itemRef = contentChild('item', /* @ts-ignore */
@@ -3521,8 +3656,28 @@ class SelectComponent {
3521
3656
  const rec = opt;
3522
3657
  return this.filterFieldList().some((f) => this.matchesFilter(rec[f], query));
3523
3658
  }
3659
+ // The pinned object only counts as "selected" once it actually matches the
3660
+ // current value — a stale/irrelevant selectedObject is never injected.
3661
+ selectedObjectEntry = computed(() => {
3662
+ const sel = this.selectedObject();
3663
+ if (sel == null)
3664
+ return null;
3665
+ return this.getOptionValue(sel) === this.value() ? sel : null;
3666
+ }, /* @ts-ignore */
3667
+ ...(ngDevMode ? [{ debugName: "selectedObjectEntry" }] : /* istanbul ignore next */ []));
3668
+ mergeSelected(base) {
3669
+ const sel = this.selectedObjectEntry();
3670
+ if (sel == null)
3671
+ return base;
3672
+ const selVal = this.getOptionValue(sel);
3673
+ return base.some((o) => this.getOptionValue(o) === selVal)
3674
+ ? base
3675
+ : [sel, ...base];
3676
+ }
3677
+ optionsWithSelected = computed(() => this.mergeSelected(this.options()), /* @ts-ignore */
3678
+ ...(ngDevMode ? [{ debugName: "optionsWithSelected" }] : /* istanbul ignore next */ []));
3524
3679
  filteredOptions = computed(() => {
3525
- const opts = this.options();
3680
+ const opts = this.group() ? this.options() : this.optionsWithSelected();
3526
3681
  const q = this.filterText();
3527
3682
  if (!q)
3528
3683
  return opts;
@@ -3531,9 +3686,10 @@ class SelectComponent {
3531
3686
  ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
3532
3687
  allLeafOptions = computed(() => {
3533
3688
  if (!this.group())
3534
- return this.options();
3689
+ return this.optionsWithSelected();
3535
3690
  const groups = this.options();
3536
- return groups.flatMap((g) => g[this.optionGroupChildren()] ?? []);
3691
+ const leaves = groups.flatMap((g) => g[this.optionGroupChildren()] ?? []);
3692
+ return this.mergeSelected(leaves);
3537
3693
  }, /* @ts-ignore */
3538
3694
  ...(ngDevMode ? [{ debugName: "allLeafOptions" }] : /* istanbul ignore next */ []));
3539
3695
  flatItems = computed(() => {
@@ -3671,10 +3827,6 @@ class SelectComponent {
3671
3827
  this.onShow.emit();
3672
3828
  if (this.lazy())
3673
3829
  this.onLazyLoad.emit({ filter: this.filterText() });
3674
- if (this.appendTo() === 'body') {
3675
- this.position();
3676
- setTimeout(() => this.adjustForViewport(), 0);
3677
- }
3678
3830
  }
3679
3831
  closeList() {
3680
3832
  this._open.set(false);
@@ -3810,7 +3962,7 @@ class SelectComponent {
3810
3962
  }
3811
3963
  setDisabledState() { }
3812
3964
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3813
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: SelectComponent, isStandalone: true, selector: "f-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, filterMatchMode: { classPropertyName: "filterMatchMode", publicName: "filterMatchMode", isSignal: true, isRequired: false, transformFunction: null }, filterLocale: { classPropertyName: "filterLocale", publicName: "filterLocale", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, resetFilterOnHide: { classPropertyName: "resetFilterOnHide", publicName: "resetFilterOnHide", isSignal: true, isRequired: false, transformFunction: null }, autofocusFilter: { classPropertyName: "autofocusFilter", publicName: "autofocusFilter", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyFilterMessage: { classPropertyName: "emptyFilterMessage", publicName: "emptyFilterMessage", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, clearIcon: { classPropertyName: "clearIcon", publicName: "clearIcon", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onFilter: "onFilter", onChange: "onChange", onShow: "onShow", onHide: "onHide", onBlur: "onBlur", onFocus: "onFocus", onClear: "onClear", onLazyLoad: "onLazyLoad" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class": "hostClass()", "style": "style()" } }, providers: [
3965
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: SelectComponent, isStandalone: true, selector: "f-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, filterMatchMode: { classPropertyName: "filterMatchMode", publicName: "filterMatchMode", isSignal: true, isRequired: false, transformFunction: null }, filterLocale: { classPropertyName: "filterLocale", publicName: "filterLocale", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, resetFilterOnHide: { classPropertyName: "resetFilterOnHide", publicName: "resetFilterOnHide", isSignal: true, isRequired: false, transformFunction: null }, autofocusFilter: { classPropertyName: "autofocusFilter", publicName: "autofocusFilter", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyFilterMessage: { classPropertyName: "emptyFilterMessage", publicName: "emptyFilterMessage", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, clearIcon: { classPropertyName: "clearIcon", publicName: "clearIcon", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, selectedObject: { classPropertyName: "selectedObject", publicName: "selectedObject", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onFilter: "onFilter", onChange: "onChange", onShow: "onShow", onHide: "onHide", onBlur: "onBlur", onFocus: "onFocus", onClear: "onClear", onLazyLoad: "onLazyLoad" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class": "hostClass()", "style": "style()" } }, providers: [
3814
3966
  {
3815
3967
  provide: NG_VALUE_ACCESSOR,
3816
3968
  useExisting: forwardRef(() => SelectComponent),
@@ -3931,7 +4083,7 @@ class SelectComponent {
3931
4083
  data-select-list
3932
4084
  [id]="listId()"
3933
4085
  role="listbox"
3934
- class="max-h-56 overflow-auto py-1"
4086
+ class="flex-1 min-h-0 max-h-56 overflow-auto py-1"
3935
4087
  >
3936
4088
  @if (loading()) {
3937
4089
  @if (loaderTpl()) {
@@ -4184,7 +4336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4184
4336
  data-select-list
4185
4337
  [id]="listId()"
4186
4338
  role="listbox"
4187
- class="max-h-56 overflow-auto py-1"
4339
+ class="flex-1 min-h-0 max-h-56 overflow-auto py-1"
4188
4340
  >
4189
4341
  @if (loading()) {
4190
4342
  @if (loaderTpl()) {
@@ -4305,7 +4457,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4305
4457
  </ng-template>
4306
4458
  `,
4307
4459
  }]
4308
- }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], filterMatchMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMatchMode", required: false }] }], filterLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocale", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], resetFilterOnHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetFilterOnHide", required: false }] }], autofocusFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocusFilter", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], emptyFilterMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyFilterMessage", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], clearIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearIcon", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], checkmark: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkmark", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], onFilter: [{ type: i0.Output, args: ["onFilter"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], _triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], _editableInputRef: [{ type: i0.ViewChild, args: ['editableInputEl', { isSignal: true }] }], _filterInputRef: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], _panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], emptyFilterRef: [{ type: i0.ContentChild, args: ['emptyfilter', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], filterRef: [{ type: i0.ContentChild, args: ['filter', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
4460
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], filterMatchMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMatchMode", required: false }] }], filterLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocale", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], resetFilterOnHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetFilterOnHide", required: false }] }], autofocusFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocusFilter", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], emptyFilterMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyFilterMessage", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], clearIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearIcon", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], checkmark: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkmark", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], selectedObject: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedObject", required: false }] }], onFilter: [{ type: i0.Output, args: ["onFilter"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], _triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], _editableInputRef: [{ type: i0.ViewChild, args: ['editableInputEl', { isSignal: true }] }], _filterInputRef: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], _panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], emptyFilterRef: [{ type: i0.ContentChild, args: ['emptyfilter', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], filterRef: [{ type: i0.ContentChild, args: ['filter', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
4309
4461
 
4310
4462
  class MultiSelectComponent {
4311
4463
  _el = inject(ElementRef);
@@ -4327,10 +4479,6 @@ class MultiSelectComponent {
4327
4479
  queueMicrotask(() => this._filterInputRef()?.nativeElement.focus());
4328
4480
  }
4329
4481
  });
4330
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => {
4331
- this.position();
4332
- this.adjustForViewport();
4333
- });
4334
4482
  }
4335
4483
  onDocumentClick(e) {
4336
4484
  if (this.open() && !this._el.nativeElement.contains(e.target)) {
@@ -4343,49 +4491,19 @@ class MultiSelectComponent {
4343
4491
  ...(ngDevMode ? [{ debugName: "_filterInputRef" }] : /* istanbul ignore next */ []));
4344
4492
  _panelRef = viewChild('panel', /* @ts-ignore */
4345
4493
  ...(ngDevMode ? [{ debugName: "_panelRef" }] : /* istanbul ignore next */ []));
4346
- _panelTop = signal(0, /* @ts-ignore */
4347
- ...(ngDevMode ? [{ debugName: "_panelTop" }] : /* istanbul ignore next */ []));
4348
- _panelLeft = signal(0, /* @ts-ignore */
4349
- ...(ngDevMode ? [{ debugName: "_panelLeft" }] : /* istanbul ignore next */ []));
4350
- _panelWidth = signal(0, /* @ts-ignore */
4351
- ...(ngDevMode ? [{ debugName: "_panelWidth" }] : /* istanbul ignore next */ []));
4494
+ _placement = overlayPosition({
4495
+ active: () => this.open() && this.appendTo() === 'body',
4496
+ anchor: () => this._triggerRef()?.nativeElement,
4497
+ panel: () => this._panelRef()?.nativeElement,
4498
+ options: () => ({ matchAnchorWidth: true }),
4499
+ });
4352
4500
  panelClass = computed(() => {
4353
4501
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute w-full mt-1';
4354
- return `${position} z-50 bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
4502
+ return `${position} z-50 flex flex-col bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
4355
4503
  }, /* @ts-ignore */
4356
4504
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
4357
- panelStyle = computed(() => {
4358
- if (this.appendTo() !== 'body')
4359
- return {};
4360
- return {
4361
- top: `${this._panelTop()}px`,
4362
- left: `${this._panelLeft()}px`,
4363
- width: `${this._panelWidth()}px`,
4364
- };
4365
- }, /* @ts-ignore */
4505
+ panelStyle = computed(() => this.appendTo() === 'body' ? overlayPlacementStyle(this._placement()) : {}, /* @ts-ignore */
4366
4506
  ...(ngDevMode ? [{ debugName: "panelStyle" }] : /* istanbul ignore next */ []));
4367
- position() {
4368
- const anchorEl = this._triggerRef()?.nativeElement;
4369
- if (!anchorEl || typeof window === 'undefined')
4370
- return;
4371
- const rect = anchorEl.getBoundingClientRect();
4372
- this._panelTop.set(rect.bottom + 4);
4373
- this._panelLeft.set(Math.max(8, rect.left));
4374
- this._panelWidth.set(rect.width);
4375
- }
4376
- adjustForViewport() {
4377
- const panelEl = this._panelRef()?.nativeElement;
4378
- const anchorEl = this._triggerRef()?.nativeElement;
4379
- if (!panelEl || !anchorEl || typeof window === 'undefined')
4380
- return;
4381
- const anchorRect = anchorEl.getBoundingClientRect();
4382
- const panelRect = panelEl.getBoundingClientRect();
4383
- const gap = 4;
4384
- this._panelLeft.set(Math.max(8, Math.min(anchorRect.left, window.innerWidth - panelRect.width - 8)));
4385
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
4386
- this._panelTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
4387
- }
4388
- }
4389
4507
  triggerClass = computed(() => {
4390
4508
  const base = 'w-full min-h-[34px] flex items-center gap-2 f-field-compact text-sm border bg-(--f-form-field-background) focus:outline-none focus-visible:ring-focus transition-all duration-[var(--f-transition-duration)]';
4391
4509
  const showInvalid = this.invalid() && this.touched();
@@ -4448,7 +4566,7 @@ class MultiSelectComponent {
4448
4566
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
4449
4567
  style = input(null, /* @ts-ignore */
4450
4568
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
4451
- appendTo = input('self', /* @ts-ignore */
4569
+ appendTo = input('body', /* @ts-ignore */
4452
4570
  ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
4453
4571
  readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4454
4572
  autofocus = input(false, { ...(ngDevMode ? { debugName: "autofocus" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -4468,6 +4586,14 @@ class MultiSelectComponent {
4468
4586
  virtualScrollItemSize = input(36, /* @ts-ignore */
4469
4587
  ...(ngDevMode ? [{ debugName: "virtualScrollItemSize" }] : /* istanbul ignore next */ []));
4470
4588
  lazy = input(false, { ...(ngDevMode ? { debugName: "lazy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4589
+ /**
4590
+ * Full option objects for the currently selected `values()`, supplied by the
4591
+ * consumer. Pinned into the option pool (deduped by `optionValue`) whenever a
4592
+ * lazy-loaded or filtered `options()` page doesn't contain one of them, so
4593
+ * chips/labels always resolve correctly on edit forms.
4594
+ */
4595
+ selectedObjects = input([], /* @ts-ignore */
4596
+ ...(ngDevMode ? [{ debugName: "selectedObjects" }] : /* istanbul ignore next */ []));
4471
4597
  hostClass = computed(() => `block w-full ${this.styleClass()}`, /* @ts-ignore */
4472
4598
  ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
4473
4599
  onBlur = output();
@@ -4582,8 +4708,21 @@ class MultiSelectComponent {
4582
4708
  const rec = opt;
4583
4709
  return this.filterFieldList().some((f) => this.matchesFilter(rec[f], query));
4584
4710
  }
4711
+ // Only the selectedObjects entries that actually match a currently selected
4712
+ // value are pinned — anything stale/irrelevant is ignored.
4713
+ selectedObjectEntries = computed(() => {
4714
+ const vals = this.values();
4715
+ return this.selectedObjects().filter((o) => vals.includes(this.getOptionValue(o)));
4716
+ }, /* @ts-ignore */
4717
+ ...(ngDevMode ? [{ debugName: "selectedObjectEntries" }] : /* istanbul ignore next */ []));
4718
+ mergeSelected(base) {
4719
+ const extras = this.selectedObjectEntries().filter((sel) => !base.some((o) => this.getOptionValue(o) === this.getOptionValue(sel)));
4720
+ return extras.length ? [...extras, ...base] : base;
4721
+ }
4722
+ optionsWithSelected = computed(() => this.mergeSelected(this.options()), /* @ts-ignore */
4723
+ ...(ngDevMode ? [{ debugName: "optionsWithSelected" }] : /* istanbul ignore next */ []));
4585
4724
  filteredOptions = computed(() => {
4586
- const opts = this.options();
4725
+ const opts = this.group() ? this.options() : this.optionsWithSelected();
4587
4726
  const q = this.filterText();
4588
4727
  if (!q)
4589
4728
  return opts;
@@ -4592,9 +4731,10 @@ class MultiSelectComponent {
4592
4731
  ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
4593
4732
  allLeafOptions = computed(() => {
4594
4733
  if (!this.group())
4595
- return this.options();
4734
+ return this.optionsWithSelected();
4596
4735
  const groups = this.options();
4597
- return groups.flatMap((g) => g[this.optionGroupChildren()] ?? []);
4736
+ const leaves = groups.flatMap((g) => g[this.optionGroupChildren()] ?? []);
4737
+ return this.mergeSelected(leaves);
4598
4738
  }, /* @ts-ignore */
4599
4739
  ...(ngDevMode ? [{ debugName: "allLeafOptions" }] : /* istanbul ignore next */ []));
4600
4740
  flatItems = computed(() => {
@@ -4690,10 +4830,6 @@ class MultiSelectComponent {
4690
4830
  this.onShow.emit();
4691
4831
  if (this.lazy())
4692
4832
  this.onLazyLoad.emit({ filter: this.filterText() });
4693
- if (this.appendTo() === 'body') {
4694
- this.position();
4695
- setTimeout(() => this.adjustForViewport(), 0);
4696
- }
4697
4833
  }
4698
4834
  closeList() {
4699
4835
  this._open.set(false);
@@ -4869,7 +5005,7 @@ class MultiSelectComponent {
4869
5005
  }
4870
5006
  setDisabledState() { }
4871
5007
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: MultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4872
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: MultiSelectComponent, isStandalone: true, selector: "f-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, filterMatchMode: { classPropertyName: "filterMatchMode", publicName: "filterMatchMode", isSignal: true, isRequired: false, transformFunction: null }, filterLocale: { classPropertyName: "filterLocale", publicName: "filterLocale", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, resetFilterOnHide: { classPropertyName: "resetFilterOnHide", publicName: "resetFilterOnHide", isSignal: true, isRequired: false, transformFunction: null }, autofocusFilter: { classPropertyName: "autofocusFilter", publicName: "autofocusFilter", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyFilterMessage: { classPropertyName: "emptyFilterMessage", publicName: "emptyFilterMessage", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, optionDisabled: { classPropertyName: "optionDisabled", publicName: "optionDisabled", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, selectionLimit: { classPropertyName: "selectionLimit", publicName: "selectionLimit", isSignal: true, isRequired: false, transformFunction: null }, showToggleAll: { classPropertyName: "showToggleAll", publicName: "showToggleAll", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, clearIcon: { classPropertyName: "clearIcon", publicName: "clearIcon", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onBlur: "onBlur", onFocus: "onFocus", onChange: "onChange", onFilter: "onFilter", onShow: "onShow", onHide: "onHide", onClear: "onClear", onLazyLoad: "onLazyLoad", onSelectAllChange: "onSelectAllChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class": "hostClass()", "style": "style()" } }, providers: [
5008
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: MultiSelectComponent, isStandalone: true, selector: "f-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, filterMatchMode: { classPropertyName: "filterMatchMode", publicName: "filterMatchMode", isSignal: true, isRequired: false, transformFunction: null }, filterLocale: { classPropertyName: "filterLocale", publicName: "filterLocale", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, resetFilterOnHide: { classPropertyName: "resetFilterOnHide", publicName: "resetFilterOnHide", isSignal: true, isRequired: false, transformFunction: null }, autofocusFilter: { classPropertyName: "autofocusFilter", publicName: "autofocusFilter", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyFilterMessage: { classPropertyName: "emptyFilterMessage", publicName: "emptyFilterMessage", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, optionDisabled: { classPropertyName: "optionDisabled", publicName: "optionDisabled", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, selectionLimit: { classPropertyName: "selectionLimit", publicName: "selectionLimit", isSignal: true, isRequired: false, transformFunction: null }, showToggleAll: { classPropertyName: "showToggleAll", publicName: "showToggleAll", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, clearIcon: { classPropertyName: "clearIcon", publicName: "clearIcon", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, selectedObjects: { classPropertyName: "selectedObjects", publicName: "selectedObjects", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onBlur: "onBlur", onFocus: "onFocus", onChange: "onChange", onFilter: "onFilter", onShow: "onShow", onHide: "onHide", onClear: "onClear", onLazyLoad: "onLazyLoad", onSelectAllChange: "onSelectAllChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class": "hostClass()", "style": "style()" } }, providers: [
4873
5009
  {
4874
5010
  provide: NG_VALUE_ACCESSOR,
4875
5011
  useExisting: forwardRef(() => MultiSelectComponent),
@@ -5030,7 +5166,7 @@ class MultiSelectComponent {
5030
5166
  [id]="listId()"
5031
5167
  role="listbox"
5032
5168
  [attr.aria-multiselectable]="true"
5033
- class="max-h-56 overflow-auto py-1"
5169
+ class="flex-1 min-h-0 max-h-56 overflow-auto py-1"
5034
5170
  >
5035
5171
  @if (loading()) {
5036
5172
  @if (loaderTpl()) {
@@ -5333,7 +5469,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
5333
5469
  [id]="listId()"
5334
5470
  role="listbox"
5335
5471
  [attr.aria-multiselectable]="true"
5336
- class="max-h-56 overflow-auto py-1"
5472
+ class="flex-1 min-h-0 max-h-56 overflow-auto py-1"
5337
5473
  >
5338
5474
  @if (loading()) {
5339
5475
  @if (loaderTpl()) {
@@ -5464,7 +5600,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
5464
5600
  </ng-template>
5465
5601
  `,
5466
5602
  }]
5467
- }], ctorParameters: () => [], propDecorators: { _triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], _filterInputRef: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], _panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], filterMatchMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMatchMode", required: false }] }], filterLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocale", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], resetFilterOnHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetFilterOnHide", required: false }] }], autofocusFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocusFilter", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], emptyFilterMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyFilterMessage", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], optionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionDisabled", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], maxSelectedLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelectedLabels", required: false }] }], selectionLimit: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionLimit", required: false }] }], showToggleAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToggleAll", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], clearIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearIcon", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onFilter: [{ type: i0.Output, args: ["onFilter"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], onSelectAllChange: [{ type: i0.Output, args: ["onSelectAllChange"] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], emptyFilterRef: [{ type: i0.ContentChild, args: ['emptyfilter', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], filterRef: [{ type: i0.ContentChild, args: ['filter', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
5603
+ }], ctorParameters: () => [], propDecorators: { _triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], _filterInputRef: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], _panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], filterMatchMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterMatchMode", required: false }] }], filterLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterLocale", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], resetFilterOnHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetFilterOnHide", required: false }] }], autofocusFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocusFilter", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], emptyFilterMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyFilterMessage", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], optionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionDisabled", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], maxSelectedLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelectedLabels", required: false }] }], selectionLimit: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionLimit", required: false }] }], showToggleAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToggleAll", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], clearIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearIcon", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], selectedObjects: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedObjects", required: false }] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onFilter: [{ type: i0.Output, args: ["onFilter"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], onSelectAllChange: [{ type: i0.Output, args: ["onSelectAllChange"] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], emptyFilterRef: [{ type: i0.ContentChild, args: ['emptyfilter', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], filterRef: [{ type: i0.ContentChild, args: ['filter', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
5468
5604
 
5469
5605
  class CheckboxComponent {
5470
5606
  label = input('', /* @ts-ignore */
@@ -6861,13 +6997,22 @@ class InputIconComponent {
6861
6997
  const sideClass = this._resolvedPosition() === 'right'
6862
6998
  ? 'right-(--f-field-padding-x)'
6863
6999
  : 'left-(--f-field-padding-x)';
6864
- return `absolute ${sideClass} top-1/2 -translate-y-1/2 text-(--f-form-field-placeholder-color) ${this.styleClass()}`;
7000
+ // `position: absolute` blockifies this custom element, so its single
7001
+ // inline-flex child (`ui-icon`) would otherwise sit in a line box using
7002
+ // the browser's default baseline alignment, not true geometric centering
7003
+ // — inline-flex + items-center makes this element itself a flex
7004
+ // container so the icon centers against the box's real vertical
7005
+ // midpoint instead of ambient font baseline metrics.
7006
+ // Geometric center lands 1px low for a search-glass-shaped icon next to
7007
+ // text (its visual weight sits toward the bottom via the handle stroke),
7008
+ // so nudge up 1px for correct optical alignment.
7009
+ return `absolute inline-flex items-center ${sideClass} top-1/2 -translate-y-[calc(50%+1px)] text-(--f-form-field-placeholder-color) ${this.styleClass()}`;
6865
7010
  }, /* @ts-ignore */
6866
7011
  ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
6867
7012
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: InputIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6868
7013
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: InputIconComponent, isStandalone: true, selector: "f-inputicon", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClass()", "style": "style()" } }, ngImport: i0, template: `
6869
7014
  @if (icon()) {
6870
- <ui-icon [name]="icon()"></ui-icon>
7015
+ <ui-icon [name]="icon()" [size]="17"></ui-icon>
6871
7016
  }
6872
7017
  <ng-content />
6873
7018
  `, isInline: true, dependencies: [{ kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }] });
@@ -6880,7 +7025,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
6880
7025
  host: { '[class]': 'hostClass()', '[style]': 'style()' },
6881
7026
  template: `
6882
7027
  @if (icon()) {
6883
- <ui-icon [name]="icon()"></ui-icon>
7028
+ <ui-icon [name]="icon()" [size]="17"></ui-icon>
6884
7029
  }
6885
7030
  <ng-content />
6886
7031
  `,
@@ -6939,14 +7084,20 @@ class PopoverComponent {
6939
7084
  _visible = signal(false, /* @ts-ignore */
6940
7085
  ...(ngDevMode ? [{ debugName: "_visible" }] : /* istanbul ignore next */ []));
6941
7086
  visible = this._visible.asReadonly();
6942
- _top = signal(0, /* @ts-ignore */
6943
- ...(ngDevMode ? [{ debugName: "_top" }] : /* istanbul ignore next */ []));
6944
- top = this._top.asReadonly();
6945
- _left = signal(0, /* @ts-ignore */
6946
- ...(ngDevMode ? [{ debugName: "_left" }] : /* istanbul ignore next */ []));
6947
- left = this._left.asReadonly();
6948
7087
  panelRef = viewChild('panel', /* @ts-ignore */
6949
7088
  ...(ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []));
7089
+ _placement = overlayPosition({
7090
+ active: () => this.visible() && this.appendTo() === 'body',
7091
+ anchor: () => this._anchor,
7092
+ panel: () => this.panelRef()?.nativeElement,
7093
+ options: () => ({ gap: 6 }),
7094
+ });
7095
+ top = computed(() => this._placement()?.top ?? 0, /* @ts-ignore */
7096
+ ...(ngDevMode ? [{ debugName: "top" }] : /* istanbul ignore next */ []));
7097
+ left = computed(() => this._placement()?.left ?? 0, /* @ts-ignore */
7098
+ ...(ngDevMode ? [{ debugName: "left" }] : /* istanbul ignore next */ []));
7099
+ maxHeight = computed(() => this._placement()?.maxHeight ?? null, /* @ts-ignore */
7100
+ ...(ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []));
6950
7101
  _anchor = null;
6951
7102
  _previouslyFocused = null;
6952
7103
  _windowWidth = signal(typeof window !== 'undefined' ? window.innerWidth : Number.POSITIVE_INFINITY, /* @ts-ignore */
@@ -6975,7 +7126,7 @@ class PopoverComponent {
6975
7126
  // positioning, which already escapes ancestor overflow clipping without a real
6976
7127
  // DOM reparent.
6977
7128
  panelClass = computed(() => {
6978
- const position = this.appendTo() === 'self' ? 'absolute top-full left-0 mt-1.5' : 'fixed';
7129
+ const position = this.appendTo() === 'self' ? 'absolute top-full left-0 mt-1.5' : 'fixed overflow-auto';
6979
7130
  return `popover-panel ${position} z-50 bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay min-w-48 max-w-sm ${this.styleClass()}`;
6980
7131
  }, /* @ts-ignore */
6981
7132
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
@@ -6985,7 +7136,6 @@ class PopoverComponent {
6985
7136
  .pipe(takeUntilDestroyed())
6986
7137
  .subscribe(() => this._windowWidth.set(window.innerWidth));
6987
7138
  }
6988
- repositionOnScroll(() => this.visible() && this.appendTo() === 'body', () => { this.position(); this.adjustForViewport(); });
6989
7139
  }
6990
7140
  toggle(event) {
6991
7141
  this._anchor = event.target;
@@ -7001,11 +7151,9 @@ class PopoverComponent {
7001
7151
  }
7002
7152
  showInternal() {
7003
7153
  this._previouslyFocused = typeof document !== 'undefined' ? document.activeElement : null;
7004
- this.position();
7005
7154
  this._visible.set(true);
7006
7155
  this.onShow.emit();
7007
7156
  setTimeout(() => {
7008
- this.adjustForViewport();
7009
7157
  if (this.focusOnShow())
7010
7158
  this.focusPanel();
7011
7159
  }, 0);
@@ -7026,32 +7174,6 @@ class PopoverComponent {
7026
7174
  const focusable = panelEl.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
7027
7175
  (focusable ?? panelEl).focus();
7028
7176
  }
7029
- position() {
7030
- if (!this._anchor || this.appendTo() === 'self')
7031
- return;
7032
- const rect = this._anchor.getBoundingClientRect();
7033
- const gap = 6;
7034
- let top = rect.bottom + gap;
7035
- let left = rect.left;
7036
- if (typeof window !== 'undefined') {
7037
- left = Math.min(left, window.innerWidth - 200 - 8);
7038
- }
7039
- this._top.set(top);
7040
- this._left.set(Math.max(8, left));
7041
- }
7042
- adjustForViewport() {
7043
- if (this.appendTo() === 'self')
7044
- return;
7045
- const panelEl = this.panelRef()?.nativeElement;
7046
- if (!panelEl || !this._anchor || typeof window === 'undefined')
7047
- return;
7048
- const anchorRect = this._anchor.getBoundingClientRect();
7049
- const panelRect = panelEl.getBoundingClientRect();
7050
- const gap = 6;
7051
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
7052
- this._top.set(Math.max(8, anchorRect.top - panelRect.height - gap));
7053
- }
7054
- }
7055
7177
  onCloseIconClick(event) {
7056
7178
  event.stopPropagation();
7057
7179
  this.hide();
@@ -7078,6 +7200,7 @@ class PopoverComponent {
7078
7200
  [style]="panelStyle()"
7079
7201
  [style.top.px]="appendTo() === 'body' ? top() : null"
7080
7202
  [style.left.px]="appendTo() === 'body' ? left() : null"
7203
+ [style.max-height.px]="appendTo() === 'body' ? maxHeight() : null"
7081
7204
  (click)="$event.stopPropagation()"
7082
7205
  >
7083
7206
  @if (showCloseIcon()) {
@@ -7113,6 +7236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
7113
7236
  [style]="panelStyle()"
7114
7237
  [style.top.px]="appendTo() === 'body' ? top() : null"
7115
7238
  [style.left.px]="appendTo() === 'body' ? left() : null"
7239
+ [style.max-height.px]="appendTo() === 'body' ? maxHeight() : null"
7116
7240
  (click)="$event.stopPropagation()"
7117
7241
  >
7118
7242
  @if (showCloseIcon()) {
@@ -11094,8 +11218,8 @@ class StepsComponent {
11094
11218
  } @else {
11095
11219
  <div role="tablist" [attr.aria-label]="ariaLabel()" [class]="'flex items-start w-full ' + styleClass()" [style]="style()">
11096
11220
  @for (item of model(); track $index; let i = $index; let last = $last) {
11097
- <div class="flex items-center" [class.flex-1]="!last">
11098
- <div class="flex flex-col items-center gap-2">
11221
+ <div class="flex items-start min-w-0" [class.flex-1]="!last">
11222
+ <div class="flex flex-col items-center gap-2 min-w-0">
11099
11223
  <button
11100
11224
  #stepBtn
11101
11225
  type="button"
@@ -11116,14 +11240,14 @@ class StepsComponent {
11116
11240
  }
11117
11241
  </button>
11118
11242
  @if (item.label) {
11119
- <span class="text-xs whitespace-nowrap transition-all duration-[var(--f-transition-duration)] leading-tight text-center max-w-[80px]"
11243
+ <span class="text-xs transition-all duration-[var(--f-transition-duration)] leading-tight text-center max-w-[120px] break-words"
11120
11244
  [class]="i === activeIndex() ? 'font-semibold text-primary' : i < activeIndex() ? 'font-medium text-(--f-text-muted-color)' : 'text-(--f-text-muted-color)'">
11121
11245
  {{ item.label }}
11122
11246
  </span>
11123
11247
  }
11124
11248
  </div>
11125
11249
  @if (!last) {
11126
- <div class="flex-1 h-[1.5px] mx-3 -mt-4 rounded-full transition-all duration-[var(--f-transition-duration)]" [class]="i < activeIndex() ? 'bg-primary' : 'bg-(--f-content-border-color)'"></div>
11250
+ <div class="flex-1 h-[1.5px] mx-3 mt-[15px] rounded-full transition-all duration-[var(--f-transition-duration)]" [class]="i < activeIndex() ? 'bg-primary' : 'bg-(--f-content-border-color)'"></div>
11127
11251
  }
11128
11252
  </div>
11129
11253
  }
@@ -11178,8 +11302,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
11178
11302
  } @else {
11179
11303
  <div role="tablist" [attr.aria-label]="ariaLabel()" [class]="'flex items-start w-full ' + styleClass()" [style]="style()">
11180
11304
  @for (item of model(); track $index; let i = $index; let last = $last) {
11181
- <div class="flex items-center" [class.flex-1]="!last">
11182
- <div class="flex flex-col items-center gap-2">
11305
+ <div class="flex items-start min-w-0" [class.flex-1]="!last">
11306
+ <div class="flex flex-col items-center gap-2 min-w-0">
11183
11307
  <button
11184
11308
  #stepBtn
11185
11309
  type="button"
@@ -11200,14 +11324,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
11200
11324
  }
11201
11325
  </button>
11202
11326
  @if (item.label) {
11203
- <span class="text-xs whitespace-nowrap transition-all duration-[var(--f-transition-duration)] leading-tight text-center max-w-[80px]"
11327
+ <span class="text-xs transition-all duration-[var(--f-transition-duration)] leading-tight text-center max-w-[120px] break-words"
11204
11328
  [class]="i === activeIndex() ? 'font-semibold text-primary' : i < activeIndex() ? 'font-medium text-(--f-text-muted-color)' : 'text-(--f-text-muted-color)'">
11205
11329
  {{ item.label }}
11206
11330
  </span>
11207
11331
  }
11208
11332
  </div>
11209
11333
  @if (!last) {
11210
- <div class="flex-1 h-[1.5px] mx-3 -mt-4 rounded-full transition-all duration-[var(--f-transition-duration)]" [class]="i < activeIndex() ? 'bg-primary' : 'bg-(--f-content-border-color)'"></div>
11334
+ <div class="flex-1 h-[1.5px] mx-3 mt-[15px] rounded-full transition-all duration-[var(--f-transition-duration)]" [class]="i < activeIndex() ? 'bg-primary' : 'bg-(--f-content-border-color)'"></div>
11211
11335
  }
11212
11336
  </div>
11213
11337
  }
@@ -14301,59 +14425,22 @@ class AutoCompleteComponent {
14301
14425
  ...(ngDevMode ? [{ debugName: "anchorRef" }] : /* istanbul ignore next */ []));
14302
14426
  panelRef = viewChild('panel', /* @ts-ignore */
14303
14427
  ...(ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []));
14304
- _panelTop = signal(0, /* @ts-ignore */
14305
- ...(ngDevMode ? [{ debugName: "_panelTop" }] : /* istanbul ignore next */ []));
14306
- _panelLeft = signal(0, /* @ts-ignore */
14307
- ...(ngDevMode ? [{ debugName: "_panelLeft" }] : /* istanbul ignore next */ []));
14308
- _panelWidth = signal(0, /* @ts-ignore */
14309
- ...(ngDevMode ? [{ debugName: "_panelWidth" }] : /* istanbul ignore next */ []));
14428
+ _placement = overlayPosition({
14429
+ active: () => this.open() && this.appendTo() === 'body',
14430
+ anchor: () => this.anchorRef()?.nativeElement,
14431
+ panel: () => this.panelRef()?.nativeElement,
14432
+ options: () => ({ matchAnchorWidth: true }),
14433
+ });
14310
14434
  panelClass = computed(() => {
14311
14435
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute w-full mt-1';
14312
- return `${position} z-50 bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
14436
+ return `${position} z-50 flex flex-col bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
14313
14437
  }, /* @ts-ignore */
14314
14438
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
14315
- panelStyle = computed(() => {
14316
- if (this.appendTo() !== 'body')
14317
- return {};
14318
- return {
14319
- top: `${this._panelTop()}px`,
14320
- left: `${this._panelLeft()}px`,
14321
- width: `${this._panelWidth()}px`,
14322
- };
14323
- }, /* @ts-ignore */
14439
+ panelStyle = computed(() => this.appendTo() === 'body' ? overlayPlacementStyle(this._placement()) : {}, /* @ts-ignore */
14324
14440
  ...(ngDevMode ? [{ debugName: "panelStyle" }] : /* istanbul ignore next */ []));
14325
- position() {
14326
- const anchorEl = this.anchorRef()?.nativeElement;
14327
- if (!anchorEl || typeof window === 'undefined')
14328
- return;
14329
- const rect = anchorEl.getBoundingClientRect();
14330
- this._panelTop.set(rect.bottom + 4);
14331
- this._panelLeft.set(Math.max(8, rect.left));
14332
- this._panelWidth.set(rect.width);
14333
- }
14334
- adjustForViewport() {
14335
- const panelEl = this.panelRef()?.nativeElement;
14336
- const anchorEl = this.anchorRef()?.nativeElement;
14337
- if (!panelEl || !anchorEl || typeof window === 'undefined')
14338
- return;
14339
- const anchorRect = anchorEl.getBoundingClientRect();
14340
- const panelRect = panelEl.getBoundingClientRect();
14341
- const gap = 4;
14342
- this._panelLeft.set(Math.max(8, Math.min(anchorRect.left, window.innerWidth - panelRect.width - 8)));
14343
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
14344
- this._panelTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
14345
- }
14346
- }
14347
14441
  openPanel() {
14348
- if (this.appendTo() === 'body') {
14349
- this.position();
14350
- setTimeout(() => this.adjustForViewport(), 0);
14351
- }
14352
14442
  this._open.set(true);
14353
14443
  }
14354
- constructor() {
14355
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => { this.position(); this.adjustForViewport(); });
14356
- }
14357
14444
  onDocumentClick(e) {
14358
14445
  if (this.open() && !this._el.nativeElement.contains(e.target)) {
14359
14446
  this._open.set(false);
@@ -14385,7 +14472,7 @@ class AutoCompleteComponent {
14385
14472
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
14386
14473
  style = input(null, /* @ts-ignore */
14387
14474
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
14388
- appendTo = input('self', /* @ts-ignore */
14475
+ appendTo = input('body', /* @ts-ignore */
14389
14476
  ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
14390
14477
  virtualScroll = input(false, { ...(ngDevMode ? { debugName: "virtualScroll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
14391
14478
  virtualScrollItemSize = input(38, { ...(ngDevMode ? { debugName: "virtualScrollItemSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
@@ -14857,7 +14944,7 @@ class AutoCompleteComponent {
14857
14944
  } @else {
14858
14945
  <ul
14859
14946
  [id]="listboxId"
14860
- class="overflow-auto py-1"
14947
+ class="flex-1 min-h-0 max-h-64 overflow-auto py-1"
14861
14948
  [style.max-height]="scrollHeight()"
14862
14949
  role="listbox"
14863
14950
  [attr.aria-multiselectable]="multiple()"
@@ -15125,7 +15212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
15125
15212
  } @else {
15126
15213
  <ul
15127
15214
  [id]="listboxId"
15128
- class="overflow-auto py-1"
15215
+ class="flex-1 min-h-0 max-h-64 overflow-auto py-1"
15129
15216
  [style.max-height]="scrollHeight()"
15130
15217
  role="listbox"
15131
15218
  [attr.aria-multiselectable]="multiple()"
@@ -15187,7 +15274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
15187
15274
  </div>
15188
15275
  `,
15189
15276
  }]
15190
- }], ctorParameters: () => [], propDecorators: { anchorRef: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }], field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdown", required: false }] }], forceSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceSelection", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], completeOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "completeOnFocus", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], scrollHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollHeight", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], completeMethod: [{ type: i0.Output, args: ["completeMethod"] }], onSelect: [{ type: i0.Output, args: ["onSelect"] }], onUnselect: [{ type: i0.Output, args: ["onUnselect"] }], onDropdownClick: [{ type: i0.Output, args: ["onDropdownClick"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], focusEvent: [{ type: i0.Output, args: ["focusEvent"] }], blurEvent: [{ type: i0.Output, args: ["blurEvent"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
15277
+ }], propDecorators: { anchorRef: [{ type: i0.ViewChild, args: ['anchor', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }], field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdown", required: false }] }], forceSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceSelection", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], completeOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "completeOnFocus", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], scrollHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollHeight", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], completeMethod: [{ type: i0.Output, args: ["completeMethod"] }], onSelect: [{ type: i0.Output, args: ["onSelect"] }], onUnselect: [{ type: i0.Output, args: ["onUnselect"] }], onDropdownClick: [{ type: i0.Output, args: ["onDropdownClick"] }], onClear: [{ type: i0.Output, args: ["onClear"] }], focusEvent: [{ type: i0.Output, args: ["focusEvent"] }], blurEvent: [{ type: i0.Output, args: ["blurEvent"] }], onChange: [{ type: i0.Output, args: ["onChange"] }], onLazyLoad: [{ type: i0.Output, args: ["onLazyLoad"] }], itemRef: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], selectedItemRef: [{ type: i0.ContentChild, args: ['selectedItem', { isSignal: true }] }], loaderRef: [{ type: i0.ContentChild, args: ['loader', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
15191
15278
 
15192
15279
  function hexToRgb(hex) {
15193
15280
  const clean = hex.replace('#', '');
@@ -16131,15 +16218,18 @@ class SplitButtonComponent {
16131
16218
  _open = signal(false, /* @ts-ignore */
16132
16219
  ...(ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []));
16133
16220
  open = this._open.asReadonly();
16134
- _menuTop = signal(0, /* @ts-ignore */
16135
- ...(ngDevMode ? [{ debugName: "_menuTop" }] : /* istanbul ignore next */ []));
16136
- _menuLeft = signal(0, /* @ts-ignore */
16137
- ...(ngDevMode ? [{ debugName: "_menuLeft" }] : /* istanbul ignore next */ []));
16138
- menuTop = this._menuTop.asReadonly();
16139
- menuLeft = this._menuLeft.asReadonly();
16140
- constructor() {
16141
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => { this.positionMenu(); this.adjustMenuForViewport(); });
16142
- }
16221
+ _placement = overlayPosition({
16222
+ active: () => this.open() && this.appendTo() === 'body',
16223
+ anchor: () => this._group()?.nativeElement,
16224
+ panel: () => this._menuPanel()?.nativeElement,
16225
+ options: () => ({ align: 'end' }),
16226
+ });
16227
+ menuTop = computed(() => this._placement()?.top ?? 0, /* @ts-ignore */
16228
+ ...(ngDevMode ? [{ debugName: "menuTop" }] : /* istanbul ignore next */ []));
16229
+ menuLeft = computed(() => this._placement()?.left ?? 0, /* @ts-ignore */
16230
+ ...(ngDevMode ? [{ debugName: "menuLeft" }] : /* istanbul ignore next */ []));
16231
+ menuMaxHeight = computed(() => this._placement()?.maxHeight ?? null, /* @ts-ignore */
16232
+ ...(ngDevMode ? [{ debugName: "menuMaxHeight" }] : /* istanbul ignore next */ []));
16143
16233
  groupClass = computed(() => {
16144
16234
  const shape = this.rounded() ? 'rounded-full' : 'rounded-lg';
16145
16235
  const raisedCls = this.raised() ? 'shadow-md' : '';
@@ -16163,7 +16253,7 @@ class SplitButtonComponent {
16163
16253
  }, /* @ts-ignore */
16164
16254
  ...(ngDevMode ? [{ debugName: "dropdownClass" }] : /* istanbul ignore next */ []));
16165
16255
  menuPanelClass = computed(() => {
16166
- const base = 'z-50 min-w-[10rem] bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden';
16256
+ const base = 'z-50 flex flex-col min-w-[10rem] bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden';
16167
16257
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute right-0 top-full mt-1';
16168
16258
  return `${position} ${base} ${this.menuStyleClass()}`;
16169
16259
  }, /* @ts-ignore */
@@ -16242,10 +16332,6 @@ class SplitButtonComponent {
16242
16332
  if (this.open())
16243
16333
  return;
16244
16334
  this._open.set(true);
16245
- if (this.appendTo() === 'body') {
16246
- this.positionMenu();
16247
- queueMicrotask(() => this.adjustMenuForViewport());
16248
- }
16249
16335
  this.onShow.emit();
16250
16336
  }
16251
16337
  close(returnFocus) {
@@ -16266,29 +16352,6 @@ class SplitButtonComponent {
16266
16352
  const target = index === -1 ? items[items.length - 1] : items[index];
16267
16353
  target?.focus();
16268
16354
  }
16269
- positionMenu() {
16270
- const anchor = this._group()?.nativeElement;
16271
- if (!anchor || typeof window === 'undefined')
16272
- return;
16273
- const rect = anchor.getBoundingClientRect();
16274
- this._menuTop.set(rect.bottom + 4);
16275
- this._menuLeft.set(Math.max(8, rect.right - 160));
16276
- }
16277
- adjustMenuForViewport() {
16278
- const anchor = this._group()?.nativeElement;
16279
- const panel = this._menuPanel()?.nativeElement;
16280
- if (!anchor || !panel || typeof window === 'undefined')
16281
- return;
16282
- const anchorRect = anchor.getBoundingClientRect();
16283
- const panelRect = panel.getBoundingClientRect();
16284
- const gap = 4;
16285
- let left = anchorRect.right - panelRect.width;
16286
- left = Math.max(8, Math.min(left, window.innerWidth - panelRect.width - 8));
16287
- this._menuLeft.set(left);
16288
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
16289
- this._menuTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
16290
- }
16291
- }
16292
16355
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SplitButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16293
16356
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: SplitButtonComponent, isStandalone: true, selector: "f-splitbutton", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, raised: { classPropertyName: "raised", publicName: "raised", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, outlined: { classPropertyName: "outlined", publicName: "outlined", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, iconPos: { classPropertyName: "iconPos", publicName: "iconPos", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, menuStyleClass: { classPropertyName: "menuStyleClass", publicName: "menuStyleClass", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, dropdownIcon: { classPropertyName: "dropdownIcon", publicName: "dropdownIcon", isSignal: true, isRequired: false, transformFunction: null }, expandAriaLabel: { classPropertyName: "expandAriaLabel", publicName: "expandAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onClick: "onClick", onDropdownClick: "onDropdownClick", onShow: "onShow", onHide: "onHide" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, classAttribute: "inline-flex" }, viewQueries: [{ propertyName: "_group", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "_dropdownBtn", first: true, predicate: ["dropdownButton"], descendants: true, isSignal: true }, { propertyName: "_menuPanel", first: true, predicate: ["menuPanel"], descendants: true, isSignal: true }], ngImport: i0, template: `
16294
16357
  <div class="relative inline-flex" [class.opacity-60]="disabled()" [class.pointer-events-none]="disabled()">
@@ -16328,11 +16391,12 @@ class SplitButtonComponent {
16328
16391
  [class]="menuPanelClass()"
16329
16392
  [style.top.px]="appendTo() === 'body' ? menuTop() : null"
16330
16393
  [style.left.px]="appendTo() === 'body' ? menuLeft() : null"
16394
+ [style.max-height.px]="appendTo() === 'body' ? menuMaxHeight() : null"
16331
16395
  role="menu"
16332
16396
  [attr.aria-label]="expandAriaLabel() || null"
16333
16397
  (keydown)="onMenuKeydown($event)"
16334
16398
  >
16335
- <ul class="py-1">
16399
+ <ul class="flex-1 min-h-0 overflow-auto py-1">
16336
16400
  @for (item of model(); track $index) {
16337
16401
  @if (item.separator) {
16338
16402
  <li role="separator" class="my-1 border-t border-(--f-content-border-color)"></li>
@@ -16410,11 +16474,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
16410
16474
  [class]="menuPanelClass()"
16411
16475
  [style.top.px]="appendTo() === 'body' ? menuTop() : null"
16412
16476
  [style.left.px]="appendTo() === 'body' ? menuLeft() : null"
16477
+ [style.max-height.px]="appendTo() === 'body' ? menuMaxHeight() : null"
16413
16478
  role="menu"
16414
16479
  [attr.aria-label]="expandAriaLabel() || null"
16415
16480
  (keydown)="onMenuKeydown($event)"
16416
16481
  >
16417
- <ul class="py-1">
16482
+ <ul class="flex-1 min-h-0 overflow-auto py-1">
16418
16483
  @for (item of model(); track $index) {
16419
16484
  @if (item.separator) {
16420
16485
  <li role="separator" class="my-1 border-t border-(--f-content-border-color)"></li>
@@ -16445,7 +16510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
16445
16510
  </div>
16446
16511
  `,
16447
16512
  }]
16448
- }], ctorParameters: () => [], propDecorators: { _group: [{ type: i0.ViewChild, args: ['group', { isSignal: true }] }], _dropdownBtn: [{ type: i0.ViewChild, args: ['dropdownButton', { isSignal: true }] }], _menuPanel: [{ type: i0.ViewChild, args: ['menuPanel', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }], severity: [{ type: i0.Input, args: [{ isSignal: true, alias: "severity", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], raised: [{ type: i0.Input, args: [{ isSignal: true, alias: "raised", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], outlined: [{ type: i0.Input, args: [{ isSignal: true, alias: "outlined", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], iconPos: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPos", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], menuStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuStyleClass", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], expandAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandAriaLabel", required: false }] }], onClick: [{ type: i0.Output, args: ["onClick"] }], onDropdownClick: [{ type: i0.Output, args: ["onDropdownClick"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }] } });
16513
+ }], propDecorators: { _group: [{ type: i0.ViewChild, args: ['group', { isSignal: true }] }], _dropdownBtn: [{ type: i0.ViewChild, args: ['dropdownButton', { isSignal: true }] }], _menuPanel: [{ type: i0.ViewChild, args: ['menuPanel', { isSignal: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }], severity: [{ type: i0.Input, args: [{ isSignal: true, alias: "severity", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], raised: [{ type: i0.Input, args: [{ isSignal: true, alias: "raised", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], outlined: [{ type: i0.Input, args: [{ isSignal: true, alias: "outlined", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], iconPos: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPos", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], menuStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuStyleClass", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], expandAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandAriaLabel", required: false }] }], onClick: [{ type: i0.Output, args: ["onClick"] }], onDropdownClick: [{ type: i0.Output, args: ["onDropdownClick"] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }] } });
16449
16514
 
16450
16515
  let _uidCounter$2 = 0;
16451
16516
  function assignKey$2(node) {
@@ -16456,12 +16521,6 @@ function assignKey$2(node) {
16456
16521
  }
16457
16522
  class TreeSelectComponent {
16458
16523
  _el = inject(ElementRef);
16459
- constructor() {
16460
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => {
16461
- this.position();
16462
- this.adjustForViewport();
16463
- });
16464
- }
16465
16524
  options = input([], /* @ts-ignore */
16466
16525
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
16467
16526
  placeholder = input('Select', /* @ts-ignore */
@@ -16490,7 +16549,7 @@ class TreeSelectComponent {
16490
16549
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
16491
16550
  style = input(null, /* @ts-ignore */
16492
16551
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
16493
- appendTo = input('self', /* @ts-ignore */
16552
+ appendTo = input('body', /* @ts-ignore */
16494
16553
  ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
16495
16554
  hostClass = computed(() => `block w-full ${this.styleClass()}`, /* @ts-ignore */
16496
16555
  ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
@@ -16498,49 +16557,19 @@ class TreeSelectComponent {
16498
16557
  ...(ngDevMode ? [{ debugName: "triggerRef" }] : /* istanbul ignore next */ []));
16499
16558
  panelRef = viewChild('panel', /* @ts-ignore */
16500
16559
  ...(ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []));
16501
- _panelTop = signal(0, /* @ts-ignore */
16502
- ...(ngDevMode ? [{ debugName: "_panelTop" }] : /* istanbul ignore next */ []));
16503
- _panelLeft = signal(0, /* @ts-ignore */
16504
- ...(ngDevMode ? [{ debugName: "_panelLeft" }] : /* istanbul ignore next */ []));
16505
- _panelWidth = signal(0, /* @ts-ignore */
16506
- ...(ngDevMode ? [{ debugName: "_panelWidth" }] : /* istanbul ignore next */ []));
16560
+ _placement = overlayPosition({
16561
+ active: () => this.open() && this.appendTo() === 'body',
16562
+ anchor: () => this.triggerRef()?.nativeElement,
16563
+ panel: () => this.panelRef()?.nativeElement,
16564
+ options: () => ({ matchAnchorWidth: true }),
16565
+ });
16507
16566
  panelClass = computed(() => {
16508
16567
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute w-full mt-1';
16509
- return `${position} z-50 bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
16568
+ return `${position} z-50 flex flex-col bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
16510
16569
  }, /* @ts-ignore */
16511
16570
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
16512
- panelStyle = computed(() => {
16513
- if (this.appendTo() !== 'body')
16514
- return {};
16515
- return {
16516
- top: `${this._panelTop()}px`,
16517
- left: `${this._panelLeft()}px`,
16518
- width: `${this._panelWidth()}px`,
16519
- };
16520
- }, /* @ts-ignore */
16571
+ panelStyle = computed(() => this.appendTo() === 'body' ? overlayPlacementStyle(this._placement()) : {}, /* @ts-ignore */
16521
16572
  ...(ngDevMode ? [{ debugName: "panelStyle" }] : /* istanbul ignore next */ []));
16522
- position() {
16523
- const anchorEl = this.triggerRef()?.nativeElement;
16524
- if (!anchorEl || typeof window === 'undefined')
16525
- return;
16526
- const rect = anchorEl.getBoundingClientRect();
16527
- this._panelTop.set(rect.bottom + 4);
16528
- this._panelLeft.set(Math.max(8, rect.left));
16529
- this._panelWidth.set(rect.width);
16530
- }
16531
- adjustForViewport() {
16532
- const panelEl = this.panelRef()?.nativeElement;
16533
- const anchorEl = this.triggerRef()?.nativeElement;
16534
- if (!panelEl || !anchorEl || typeof window === 'undefined')
16535
- return;
16536
- const anchorRect = anchorEl.getBoundingClientRect();
16537
- const panelRect = panelEl.getBoundingClientRect();
16538
- const gap = 4;
16539
- this._panelLeft.set(Math.max(8, Math.min(anchorRect.left, window.innerWidth - panelRect.width - 8)));
16540
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
16541
- this._panelTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
16542
- }
16543
- }
16544
16573
  _open = signal(false, /* @ts-ignore */
16545
16574
  ...(ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []));
16546
16575
  open = this._open.asReadonly();
@@ -16672,10 +16701,6 @@ class TreeSelectComponent {
16672
16701
  this._onTouched();
16673
16702
  return;
16674
16703
  }
16675
- if (this.appendTo() === 'body') {
16676
- this.position();
16677
- setTimeout(() => this.adjustForViewport(), 0);
16678
- }
16679
16704
  }
16680
16705
  onTriggerKeyDown(e) {
16681
16706
  if (this.disabled())
@@ -16973,7 +16998,7 @@ class TreeSelectComponent {
16973
16998
  </ng-template>
16974
16999
  </f-scroller>
16975
17000
  } @else {
16976
- <div class="max-h-64 overflow-auto py-1" role="tree">
17001
+ <div class="flex-1 min-h-0 max-h-64 overflow-auto py-1" role="tree">
16977
17002
  @for (row of visibleFlatNodes(); track row.key) {
16978
17003
  <ng-container
16979
17004
  [ngTemplateOutlet]="rowTpl"
@@ -17214,7 +17239,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
17214
17239
  </ng-template>
17215
17240
  </f-scroller>
17216
17241
  } @else {
17217
- <div class="max-h-64 overflow-auto py-1" role="tree">
17242
+ <div class="flex-1 min-h-0 max-h-64 overflow-auto py-1" role="tree">
17218
17243
  @for (row of visibleFlatNodes(); track row.key) {
17219
17244
  <ng-container
17220
17245
  [ngTemplateOutlet]="rowTpl"
@@ -17301,7 +17326,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
17301
17326
  </ng-template>
17302
17327
  `,
17303
17328
  }]
17304
- }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], propagateSelectionDown: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionDown", required: false }] }], propagateSelectionUp: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionUp", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], valueRef: [{ type: i0.ContentChild, args: ['value', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
17329
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterBy", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], propagateSelectionDown: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionDown", required: false }] }], propagateSelectionUp: [{ type: i0.Input, args: [{ isSignal: true, alias: "propagateSelectionUp", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollItemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollItemSize", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], valueRef: [{ type: i0.ContentChild, args: ['value', { isSignal: true }] }], headerRef: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], footerRef: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
17305
17330
 
17306
17331
  class OverlayBadgeComponent {
17307
17332
  value = input('', /* @ts-ignore */
@@ -17934,15 +17959,13 @@ class MenuComponent {
17934
17959
  _visible = signal(false, /* @ts-ignore */
17935
17960
  ...(ngDevMode ? [{ debugName: "_visible" }] : /* istanbul ignore next */ []));
17936
17961
  visible = this._visible.asReadonly();
17937
- _top = signal(0, /* @ts-ignore */
17938
- ...(ngDevMode ? [{ debugName: "_top" }] : /* istanbul ignore next */ []));
17939
- _left = signal(0, /* @ts-ignore */
17940
- ...(ngDevMode ? [{ debugName: "_left" }] : /* istanbul ignore next */ []));
17962
+ _placement = overlayPosition({
17963
+ active: () => this.popup() && this.visible() && this.appendTo() === 'body',
17964
+ anchor: () => this._anchor,
17965
+ panel: () => this.containerRef()?.nativeElement,
17966
+ });
17941
17967
  _openedAt = 0;
17942
17968
  _anchor = null;
17943
- constructor() {
17944
- repositionOnScroll(() => this.popup() && this.visible() && this.appendTo() === 'body', () => { this.position(); this.adjustForViewport(); });
17945
- }
17946
17969
  fTemplates = contentChildren(FTemplateDirective, /* @ts-ignore */
17947
17970
  ...(ngDevMode ? [{ debugName: "fTemplates" }] : /* istanbul ignore next */ []));
17948
17971
  namedTemplate(name) {
@@ -17962,13 +17985,13 @@ class MenuComponent {
17962
17985
  return `w-full bg-(--f-content-background) border border-(--f-content-border-color) rounded-lg overflow-hidden ${this.styleClass()}`;
17963
17986
  }
17964
17987
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute mt-1';
17965
- return `${position} z-50 shadow-lg ${base} ${this.styleClass()}`;
17988
+ return `${position} z-50 flex flex-col shadow-lg ${base} ${this.styleClass()}`;
17966
17989
  }, /* @ts-ignore */
17967
17990
  ...(ngDevMode ? [{ debugName: "containerClass" }] : /* istanbul ignore next */ []));
17968
17991
  containerStyle = computed(() => {
17969
17992
  const style = this.style() ?? {};
17970
17993
  if (this.popup() && this.appendTo() === 'body') {
17971
- return { ...style, top: `${this._top()}px`, left: `${this._left()}px` };
17994
+ return { ...style, ...overlayPlacementStyle(this._placement()) };
17972
17995
  }
17973
17996
  return style;
17974
17997
  }, /* @ts-ignore */
@@ -17982,13 +18005,8 @@ class MenuComponent {
17982
18005
  show(event) {
17983
18006
  this._anchor = event?.currentTarget ?? null;
17984
18007
  this._openedAt = Date.now();
17985
- if (this.appendTo() === 'body')
17986
- this.position();
17987
18008
  this._visible.set(true);
17988
18009
  this.onShow.emit();
17989
- if (this.appendTo() === 'body') {
17990
- setTimeout(() => this.adjustForViewport(), 0);
17991
- }
17992
18010
  }
17993
18011
  hide() {
17994
18012
  if (!this._visible())
@@ -17996,27 +18014,6 @@ class MenuComponent {
17996
18014
  this._visible.set(false);
17997
18015
  this.onHide.emit();
17998
18016
  }
17999
- position() {
18000
- if (!this._anchor || typeof window === 'undefined')
18001
- return;
18002
- const rect = this._anchor.getBoundingClientRect();
18003
- this._top.set(rect.bottom + 4);
18004
- this._left.set(rect.left);
18005
- }
18006
- adjustForViewport() {
18007
- const el = this.containerRef()?.nativeElement;
18008
- if (!el || !this._anchor || typeof window === 'undefined')
18009
- return;
18010
- const anchorRect = this._anchor.getBoundingClientRect();
18011
- const panelRect = el.getBoundingClientRect();
18012
- const gap = 4;
18013
- let left = anchorRect.left;
18014
- left = Math.max(8, Math.min(left, window.innerWidth - panelRect.width - 8));
18015
- this._left.set(left);
18016
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
18017
- this._top.set(Math.max(8, anchorRect.top - panelRect.height - gap));
18018
- }
18019
- }
18020
18017
  onDocumentClick(e) {
18021
18018
  if (Date.now() - this._openedAt < 50)
18022
18019
  return;
@@ -18152,7 +18149,7 @@ class MenuComponent {
18152
18149
  <ng-container [ngTemplateOutlet]="startTpl()" />
18153
18150
  </div>
18154
18151
  }
18155
- <ul class="py-1" role="menu" (keydown)="onKeydown($event)">
18152
+ <ul class="flex-1 min-h-0 overflow-auto py-1" role="menu" (keydown)="onKeydown($event)">
18156
18153
  @if (hasGroups()) {
18157
18154
  @for (group of model(); track $index) {
18158
18155
  @if (group.separator) {
@@ -18268,7 +18265,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
18268
18265
  <ng-container [ngTemplateOutlet]="startTpl()" />
18269
18266
  </div>
18270
18267
  }
18271
- <ul class="py-1" role="menu" (keydown)="onKeydown($event)">
18268
+ <ul class="flex-1 min-h-0 overflow-auto py-1" role="menu" (keydown)="onKeydown($event)">
18272
18269
  @if (hasGroups()) {
18273
18270
  @for (group of model(); track $index) {
18274
18271
  @if (group.separator) {
@@ -18300,7 +18297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
18300
18297
  }
18301
18298
  `,
18302
18299
  }]
18303
- }], ctorParameters: () => [], propDecorators: { containerRef: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }], popup: [{ type: i0.Input, args: [{ isSignal: true, alias: "popup", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
18300
+ }], propDecorators: { containerRef: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }], popup: [{ type: i0.Input, args: [{ isSignal: true, alias: "popup", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], onShow: [{ type: i0.Output, args: ["onShow"] }], onHide: [{ type: i0.Output, args: ["onHide"] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
18304
18301
 
18305
18302
  const SUBMENU_ESTIMATED_WIDTH$2 = 192;
18306
18303
  class MenubarComponent {
@@ -18921,12 +18918,17 @@ class TieredMenuComponent {
18921
18918
  _visible = signal(false, /* @ts-ignore */
18922
18919
  ...(ngDevMode ? [{ debugName: "_visible" }] : /* istanbul ignore next */ []));
18923
18920
  visible = this._visible.asReadonly();
18924
- _top = signal(0, /* @ts-ignore */
18925
- ...(ngDevMode ? [{ debugName: "_top" }] : /* istanbul ignore next */ []));
18926
- top = this._top.asReadonly();
18927
- _left = signal(0, /* @ts-ignore */
18928
- ...(ngDevMode ? [{ debugName: "_left" }] : /* istanbul ignore next */ []));
18929
- left = this._left.asReadonly();
18921
+ _placement = overlayPosition({
18922
+ active: () => this.popup() && this.visible(),
18923
+ anchor: () => this._anchor,
18924
+ panel: () => this.containerRef()?.nativeElement,
18925
+ // Submenus fly out of the container, so it must stay overflow-visible.
18926
+ options: () => ({ clampHeight: false }),
18927
+ });
18928
+ top = computed(() => this._placement()?.top ?? 0, /* @ts-ignore */
18929
+ ...(ngDevMode ? [{ debugName: "top" }] : /* istanbul ignore next */ []));
18930
+ left = computed(() => this._placement()?.left ?? 0, /* @ts-ignore */
18931
+ ...(ngDevMode ? [{ debugName: "left" }] : /* istanbul ignore next */ []));
18930
18932
  _openedAt = 0;
18931
18933
  _anchor = null;
18932
18934
  _activeItemPath = signal([], /* @ts-ignore */
@@ -18963,11 +18965,8 @@ class TieredMenuComponent {
18963
18965
  this._openedAt = Date.now();
18964
18966
  this._activeItemPath.set([]);
18965
18967
  this._flipByLevel.set({});
18966
- if (this._anchor)
18967
- this.position();
18968
18968
  this._visible.set(true);
18969
18969
  this.onShow.emit();
18970
- setTimeout(() => this.adjustForViewport(), 0);
18971
18970
  }
18972
18971
  hide() {
18973
18972
  if (!this._visible())
@@ -18976,27 +18975,6 @@ class TieredMenuComponent {
18976
18975
  this._activeItemPath.set([]);
18977
18976
  this.onHide.emit();
18978
18977
  }
18979
- position() {
18980
- if (!this._anchor || typeof window === 'undefined')
18981
- return;
18982
- const rect = this._anchor.getBoundingClientRect();
18983
- this._top.set(rect.bottom + 4);
18984
- this._left.set(rect.left);
18985
- }
18986
- adjustForViewport() {
18987
- const el = this.containerRef()?.nativeElement;
18988
- if (!el || !this._anchor || typeof window === 'undefined')
18989
- return;
18990
- const anchorRect = this._anchor.getBoundingClientRect();
18991
- const panelRect = el.getBoundingClientRect();
18992
- const gap = 4;
18993
- let left = anchorRect.left;
18994
- left = Math.max(8, Math.min(left, window.innerWidth - panelRect.width - 8));
18995
- this._left.set(left);
18996
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
18997
- this._top.set(Math.max(8, anchorRect.top - panelRect.height - gap));
18998
- }
18999
- }
19000
18978
  isItemActive(item, level) {
19001
18979
  return this._activeItemPath()[level] === item;
19002
18980
  }
@@ -21960,12 +21938,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
21960
21938
 
21961
21939
  class CascadeSelectComponent {
21962
21940
  _el = inject(ElementRef);
21963
- constructor() {
21964
- repositionOnScroll(() => this.open() && this.appendTo() === 'body', () => {
21965
- this.position();
21966
- this.adjustForViewport();
21967
- });
21968
- }
21969
21941
  options = input([], /* @ts-ignore */
21970
21942
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
21971
21943
  optionLabel = input('label', /* @ts-ignore */
@@ -21992,7 +21964,7 @@ class CascadeSelectComponent {
21992
21964
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
21993
21965
  style = input(null, /* @ts-ignore */
21994
21966
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
21995
- appendTo = input('self', /* @ts-ignore */
21967
+ appendTo = input('body', /* @ts-ignore */
21996
21968
  ...(ngDevMode ? [{ debugName: "appendTo" }] : /* istanbul ignore next */ []));
21997
21969
  hostClass = computed(() => `block w-full ${this.styleClass()}`, /* @ts-ignore */
21998
21970
  ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
@@ -22000,42 +21972,18 @@ class CascadeSelectComponent {
22000
21972
  ...(ngDevMode ? [{ debugName: "triggerRef" }] : /* istanbul ignore next */ []));
22001
21973
  panelRef = viewChild('panel', /* @ts-ignore */
22002
21974
  ...(ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []));
22003
- _panelTop = signal(0, /* @ts-ignore */
22004
- ...(ngDevMode ? [{ debugName: "_panelTop" }] : /* istanbul ignore next */ []));
22005
- _panelLeft = signal(0, /* @ts-ignore */
22006
- ...(ngDevMode ? [{ debugName: "_panelLeft" }] : /* istanbul ignore next */ []));
21975
+ _placement = overlayPosition({
21976
+ active: () => this.open() && this.appendTo() === 'body',
21977
+ anchor: () => this.triggerRef()?.nativeElement,
21978
+ panel: () => this.panelRef()?.nativeElement,
21979
+ });
22007
21980
  panelClass = computed(() => {
22008
21981
  const position = this.appendTo() === 'body' ? 'fixed' : 'absolute mt-1';
22009
21982
  return `${position} z-50 flex bg-(--f-overlay-popover-background) border border-(--f-content-border-color) f-overlay overflow-hidden`;
22010
21983
  }, /* @ts-ignore */
22011
21984
  ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
22012
- panelStyle = computed(() => {
22013
- if (this.appendTo() !== 'body')
22014
- return {};
22015
- return { top: `${this._panelTop()}px`, left: `${this._panelLeft()}px` };
22016
- }, /* @ts-ignore */
21985
+ panelStyle = computed(() => this.appendTo() === 'body' ? overlayPlacementStyle(this._placement()) : {}, /* @ts-ignore */
22017
21986
  ...(ngDevMode ? [{ debugName: "panelStyle" }] : /* istanbul ignore next */ []));
22018
- position() {
22019
- const anchorEl = this.triggerRef()?.nativeElement;
22020
- if (!anchorEl || typeof window === 'undefined')
22021
- return;
22022
- const rect = anchorEl.getBoundingClientRect();
22023
- this._panelTop.set(rect.bottom + 4);
22024
- this._panelLeft.set(Math.max(8, rect.left));
22025
- }
22026
- adjustForViewport() {
22027
- const panelEl = this.panelRef()?.nativeElement;
22028
- const anchorEl = this.triggerRef()?.nativeElement;
22029
- if (!panelEl || !anchorEl || typeof window === 'undefined')
22030
- return;
22031
- const anchorRect = anchorEl.getBoundingClientRect();
22032
- const panelRect = panelEl.getBoundingClientRect();
22033
- const gap = 4;
22034
- this._panelLeft.set(Math.max(8, Math.min(anchorRect.left, window.innerWidth - panelRect.width - 8)));
22035
- if (anchorRect.bottom + panelRect.height + gap > window.innerHeight) {
22036
- this._panelTop.set(Math.max(8, anchorRect.top - panelRect.height - gap));
22037
- }
22038
- }
22039
21987
  _open = signal(false, /* @ts-ignore */
22040
21988
  ...(ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []));
22041
21989
  open = this._open.asReadonly();
@@ -22143,10 +22091,6 @@ class CascadeSelectComponent {
22143
22091
  this._activePath.set([]);
22144
22092
  this._focusedPath.set([]);
22145
22093
  }
22146
- if (this.appendTo() === 'body') {
22147
- this.position();
22148
- setTimeout(() => this.adjustForViewport(), 0);
22149
- }
22150
22094
  }
22151
22095
  closePanel() {
22152
22096
  this._open.set(false);
@@ -22619,7 +22563,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
22619
22563
  </div>
22620
22564
  `,
22621
22565
  }]
22622
- }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], optionChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionChildren", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], valueRef: [{ type: i0.ContentChild, args: ['value', { isSignal: true }] }], optionRef: [{ type: i0.ContentChild, args: ['option', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
22566
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], optionChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionChildren", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], dropdownIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownIcon", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], triggerRef: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], valueRef: [{ type: i0.ContentChild, args: ['value', { isSignal: true }] }], optionRef: [{ type: i0.ContentChild, args: ['option', { isSignal: true }] }], groupRef: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], emptyRef: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], fTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FTemplateDirective), { isSignal: true }] }] } });
22623
22567
 
22624
22568
  const PRESETS = {
22625
22569
  pint: /\d/,
@@ -22696,12 +22640,17 @@ class ConfirmPopupComponent {
22696
22640
  ...(ngDevMode ? [{ debugName: "styleClass" }] : /* istanbul ignore next */ []));
22697
22641
  style = input(null, /* @ts-ignore */
22698
22642
  ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
22699
- _top = signal(0, /* @ts-ignore */
22700
- ...(ngDevMode ? [{ debugName: "_top" }] : /* istanbul ignore next */ []));
22701
- top = this._top.asReadonly();
22702
- _left = signal(0, /* @ts-ignore */
22703
- ...(ngDevMode ? [{ debugName: "_left" }] : /* istanbul ignore next */ []));
22704
- left = this._left.asReadonly();
22643
+ _placement = overlayPosition({
22644
+ active: () => !!this.activeConfirmation()?.target,
22645
+ anchor: () => this.activeConfirmation()?.target,
22646
+ panel: () => this.panelRef()?.nativeElement,
22647
+ // A confirm popup is short; clamping it could hide the action buttons.
22648
+ options: () => ({ gap: 8, clampHeight: false }),
22649
+ });
22650
+ top = computed(() => this._placement()?.top ?? 0, /* @ts-ignore */
22651
+ ...(ngDevMode ? [{ debugName: "top" }] : /* istanbul ignore next */ []));
22652
+ left = computed(() => this._placement()?.left ?? 0, /* @ts-ignore */
22653
+ ...(ngDevMode ? [{ debugName: "left" }] : /* istanbul ignore next */ []));
22705
22654
  _zIndex = signal(null, /* @ts-ignore */
22706
22655
  ...(ngDevMode ? [{ debugName: "_zIndex" }] : /* istanbul ignore next */ []));
22707
22656
  zIndex = this._zIndex.asReadonly();
@@ -22719,10 +22668,6 @@ class ConfirmPopupComponent {
22719
22668
  const c = this.activeConfirmation();
22720
22669
  if (c?.target) {
22721
22670
  this._zIndex.set(this._overlayStack.open());
22722
- this.position(c.target);
22723
- setTimeout(() => {
22724
- this.adjustForViewport(c.target);
22725
- }, 0);
22726
22671
  }
22727
22672
  else {
22728
22673
  this._zIndex.set(null);
@@ -22752,28 +22697,6 @@ class ConfirmPopupComponent {
22752
22697
  resolvedRejectIcon(c) {
22753
22698
  return c.rejectIcon || this.rejectIcon();
22754
22699
  }
22755
- position(target) {
22756
- const rect = target.getBoundingClientRect?.();
22757
- if (!rect)
22758
- return;
22759
- const gap = 8;
22760
- let left = rect.left;
22761
- if (typeof window !== 'undefined')
22762
- left = Math.min(left, window.innerWidth - 288 - 8);
22763
- this._top.set(rect.bottom + gap);
22764
- this._left.set(Math.max(8, left));
22765
- }
22766
- adjustForViewport(target) {
22767
- const panelEl = this.panelRef()?.nativeElement;
22768
- const rect = target.getBoundingClientRect?.();
22769
- if (!panelEl || !rect || typeof window === 'undefined')
22770
- return;
22771
- const gap = 8;
22772
- const panelRect = panelEl.getBoundingClientRect();
22773
- if (rect.bottom + panelRect.height + gap > window.innerHeight) {
22774
- this._top.set(Math.max(8, rect.top - panelRect.height - gap));
22775
- }
22776
- }
22777
22700
  onEscape() {
22778
22701
  const c = this.activeConfirmation();
22779
22702
  const closeOnEscape = c?.closeOnEscape ?? this.closeOnEscape();
@@ -27254,5 +27177,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
27254
27177
  * Generated bundle index. Do not edit.
27255
27178
  */
27256
27179
 
27257
- export { AURA_PRESET, AccordionComponent, AccordionContentComponent, AccordionContext, AccordionHeaderComponent, AccordionPanelComponent, AnimateOnScrollDirective, AutoCompleteComponent, AutoFocusDirective, AvatarComponent, AvatarGroupComponent, BadgeComponent, BlockUiComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CarouselComponent, CascadeSelectComponent, ChartComponent, CheckboxComponent, ChipComponent, ColorPickerComponent, ConfirmDialog, ConfirmPopupComponent, ConfirmationService, ContextMenuComponent, DYNAMIC_DIALOG_DATA, DYNAMIC_DIALOG_REF, DataViewComponent, DatePickerComponent, DialogComponent, DividerComponent, DockComponent, DrawerComponent, DynamicDialogComponent, DynamicDialogRef, DynamicDialogService, EditorComponent, FButtonDirective, FTemplateDirective, FieldsetComponent, FileUploadComponent, FloatLabelComponent, FluidComponent, GalleriaComponent, IconFieldComponent, IftaLabelComponent, ImageCompareComponent, ImageComponent, InplaceComponent, InputGroupAddonComponent, InputGroupComponent, InputIconComponent, InputMaskDirective, InputNumberComponent, InputOtpComponent, InputPasswordDirective, InputTextDirective, KeyFilterDirective, KnobComponent, LARA_PRESET, ListboxComponent, MegaMenuComponent, MenuComponent, MenubarComponent, MessageComponent, MessageService, MeterGroupComponent, MultiSelectComponent, NOIR_PRIMARY, NORA_PRESET, NgUIConfig, OrderListComponent, OrganizationChartComponent, OverlayBadgeComponent, PRESETS$1 as PRESETS, PRESET_NAMES, PRIMARY_PALETTES, PaginatorComponent, PanelComponent, PanelMenuComponent, PasswordComponent, PickListComponent, PopoverComponent, ProgressSpinnerComponent, ProgressbarComponent, RadioButtonComponent, RatingComponent, RippleDirective, SURFACE_PALETTES, ScrollPanelComponent, ScrollTopComponent, ScrollerComponent, SelectButtonComponent, SelectComponent, SkeletonComponent, SliderComponent, SortIconComponent, SortableColumnDirective, SpeedDialComponent, SplitButtonComponent, SplitterComponent, SplitterPanelComponent, StepsComponent, StyleClassDirective, TabComponent, TabListComponent, TabPanelComponent, TabPanelsComponent, TableComponent, TabsComponent, TabsContext, TagComponent, TerminalComponent, TextareaDirective, TieredMenuComponent, TimelineComponent, ToastComponent, ToggleButtonComponent, ToggleSwitchComponent, ToolbarComponent, TooltipDirective, TreeComponent, TreeSelectComponent, TreeTableComponent, TreeTableService, TreeTableTogglerComponent, UiIconComponent, applyDarkSemantics, applyLightSemantics, applyPreset, applyPrimaryPalette, applySurfacePalette, applyTheme, buildBootstrapPreset, provideNgUI };
27180
+ export { AURA_PRESET, AccordionComponent, AccordionContentComponent, AccordionContext, AccordionHeaderComponent, AccordionPanelComponent, AnimateOnScrollDirective, AutoCompleteComponent, AutoFocusDirective, AvatarComponent, AvatarGroupComponent, BadgeComponent, BlockUiComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CardComponent, CarouselComponent, CascadeSelectComponent, ChartComponent, CheckboxComponent, ChipComponent, ColorPickerComponent, ConfirmDialog, ConfirmPopupComponent, ConfirmationService, ContextMenuComponent, DYNAMIC_DIALOG_DATA, DYNAMIC_DIALOG_REF, DataViewComponent, DatePickerComponent, DialogComponent, DividerComponent, DockComponent, DrawerComponent, DynamicDialogComponent, DynamicDialogRef, DynamicDialogService, EditorComponent, FButtonDirective, FTemplateDirective, FieldsetComponent, FileUploadComponent, FloatLabelComponent, FluidComponent, GalleriaComponent, IconFieldComponent, IftaLabelComponent, ImageCompareComponent, ImageComponent, InplaceComponent, InputGroupAddonComponent, InputGroupComponent, InputIconComponent, InputMaskDirective, InputNumberComponent, InputOtpComponent, InputPasswordDirective, InputTextDirective, KeyFilterDirective, KnobComponent, LARA_PRESET, ListboxComponent, MegaMenuComponent, MenuComponent, MenubarComponent, MessageComponent, MessageService, MeterGroupComponent, MultiSelectComponent, NOIR_PRIMARY, NORA_PRESET, NgUIConfig, OrderListComponent, OrganizationChartComponent, OverlayBadgeComponent, OverlayStackService, PRESETS$1 as PRESETS, PRESET_NAMES, PRIMARY_PALETTES, PaginatorComponent, PanelComponent, PanelMenuComponent, PasswordComponent, PickListComponent, PopoverComponent, ProgressSpinnerComponent, ProgressbarComponent, RadioButtonComponent, RatingComponent, RippleDirective, SURFACE_PALETTES, ScrollPanelComponent, ScrollTopComponent, ScrollerComponent, SelectButtonComponent, SelectComponent, SkeletonComponent, SliderComponent, SortIconComponent, SortableColumnDirective, SpeedDialComponent, SplitButtonComponent, SplitterComponent, SplitterPanelComponent, StepsComponent, StyleClassDirective, TabComponent, TabListComponent, TabPanelComponent, TabPanelsComponent, TableComponent, TabsComponent, TabsContext, TagComponent, TerminalComponent, TextareaDirective, TieredMenuComponent, TimelineComponent, ToastComponent, ToggleButtonComponent, ToggleSwitchComponent, ToolbarComponent, TooltipDirective, TreeComponent, TreeSelectComponent, TreeTableComponent, TreeTableService, TreeTableTogglerComponent, UiIconComponent, applyDarkSemantics, applyLightSemantics, applyPreset, applyPrimaryPalette, applySurfacePalette, applyTheme, attachOverlayPosition, buildBootstrapPreset, computeOverlayPlacement, overlayPlacementStyle, overlayPosition, provideNgUI };
27258
27181
  //# sourceMappingURL=flusys-ng-ui.mjs.map