@breadstone/mosaik-elements-angular 0.0.285 → 0.0.286

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.0.286 (2026-05-20)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **order-management:** add filter option to select components and enhance focus management ([97c9824f16](https://github.com/RueDeRennes/mosaik/commit/97c9824f16))
6
+
1
7
  ## 0.0.285 (2026-05-20)
2
8
 
3
9
  This was a version bump only for mosaik-elements-angular to align it with other projects, there were no code changes.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, ChangeDetectorRef, ElementRef, DestroyRef, input, effect, output, ChangeDetectionStrategy, Component, makeEnvironmentProviders, Injectable, Renderer2, Input, Directive, isDevMode, ViewContainerRef, TemplateRef, EnvironmentInjector, runInInjectionContext, signal, booleanAttribute, forwardRef, ContentChildren, computed, HostListener, untracked, Injector, afterNextRender, ContentChild, DOCUMENT, provideEnvironmentInitializer, Pipe, ViewChild, ViewEncapsulation, Optional, Inject, SkipSelf, provideAppInitializer } from '@angular/core';
3
3
  import * as i2 from '@breadstone/mosaik-elements-foundation';
4
- import { AbsoluteItemElement, AbsoluteElement, ActionbarGroupElement, ActionbarItemElement, ActionbarSeparatorElement, ActionbarElement, AnchorElement, AppHeaderElement, AppElement, AttachmentChatToolElement, AudioElement, AnimationPlayer, Animation, BREAKPOINTS, PerspectiveElement, RippleElement, ScaleElement, ProgressRingElement, ExpandableElement, FlipElement, TooltipElement, dataListElementValueAccessor, DataListElement, dataTableElementValueAccessor, DataTableElement, StepperElement, WizardElement, Size, Spacing, TextFormatters, DIALOG_STACK_BEHAVIOR_DEFAULT_CONFIG, ButtonElement, DialogActionsElement, DialogElement, DialogFooterElement, DialogHeaderElement, DialogHeaderSubTextElement, DialogHeaderTextElement, Key, EID, DRAWER_STACK_BEHAVIOR_DEFAULT_CONFIG, DrawerActionsElement, DrawerElement, DrawerContentElement, DrawerFooterElement, DrawerHeaderElement, DrawerHeaderSubTextElement, DrawerHeaderTextElement, DismissElement, MessageBoxElement, MessageBoxResult, SheetElement, SheetContentElement, SheetFooterElement, SheetHeaderElement, SheetHeaderSubTextElement, SheetHeaderTextElement, ToastElement, DateAgoIntl, TimeAgoIntl, ThemeService as ThemeService$1, TranslatorService, Translator, TranslatorServiceLocator, autoCompleteBoxElementValueAccessor, AutoCompleteBoxElement, AvatarGroupElement, avatarElementValueAccessor, AvatarElement, BackdropElement, BadgeElement, BannerGroupElement, BannerHeaderElement, BannerSubHeaderElement, BannerElement, BoxElement, BreadcrumbItemElement, BreadcrumbElement, BusyStateElement, ButtonGroupElement, CalendarHeaderElement, CalendarItemElement, CalendarSubHeaderElement, calendarElementValueAccessor, CalendarElement, CameraElement, CardActionsElement, CardContentElement, CardFooterElement, CardHeaderElement, CardSubTitleElement, CardTitleElement, CardElement, Carousel2Element, CarouselItem2Element, CarouselItemElement, CarouselElement, CellGroupElement, CellElement, ChartElement, ChatHeaderElement, ChatInputAttachmentListElement, ChatInputElement, ChatMarkerElement, ChatMessageAvatarElement, ChatMessageDividerElement, ChatMessageReactionElement, ChatMessageElement, ChatElement, checkBoxGroupElementValueAccessor, CheckBoxGroupElement, checkboxElementValueAccessor, CheckboxElement, CheckmarkElement, chipGroupElementValueAccessor, ChipGroupElement, ChipElement, chipBoxElementValueAccessor, ChipBoxElement, ChoiceGroupHeaderElement, choiceGroupElementValueAccessor, ChoiceGroupElement, choiceElementValueAccessor, ChoiceElement, CodeElement, ColorAreaElement, colorEditorAlphaSliderElementValueAccessor, ColorEditorAlphaSliderElement, colorEditorAreaElementValueAccessor, ColorEditorAreaElement, colorEditorHueSliderElementValueAccessor, ColorEditorHueSliderElement, colorEditorInputsElementValueAccessor, ColorEditorInputsElement, colorEditorPaletteElementValueAccessor, ColorEditorPaletteElement, colorEditorShadeSliderElementValueAccessor, ColorEditorShadeSliderElement, colorEditorSwatchElementValueAccessor, ColorEditorSwatchElement, colorEditorElementValueAccessor, ColorEditorElement, ColorPickerElement, ColorSliderElement, ColorSwatchGroupElement, ColorSwatchElement, ColorThumbElement, colorBoxElementValueAccessor, ColorBoxElement, ComboItemElement, comboElementValueAccessor, ComboElement, CommentElement, CompoundButtonElement, CookiesConsentElement, dateBoxElementValueAccessor, DateBoxElement, dateTimeBoxElementValueAccessor, DateTimeBoxElement, DesignerCanvasElement, DesignerContentElement, DesignerFrameElement, DesignerElement, DialogContentElement, DisclosureElement, DividerElement, DockPanelElement, DotGroupElement, DotElement, DrawerContainerElement, DropZoneElement, DropDownButtonElement, DurationBoxElement, ElevationElement, EmojiElement, EmptyStateElement, EpgChannelElement, EpgProgramElement, EpgElement, ErrorStateElement, ErrorElement, ExpanderGroupElement, ExpanderHeaderElement, ExpanderSubHeaderElement, ExpanderElement, FloatingActionButtonGroupElement, FloatingActionButtonElement, FilePickerElement, FileUploadItemElement, fileUploadElementValueAccessor, FileUploadElement, fileBoxElementValueAccessor, FileBoxElement, FloatingTriggerElement, FloatingElement, FlowBoardColumnComposerElement, FlowBoardColumnItemComposerElement, FlowBoardColumnItemElement, FlowBoardColumnElement, FlowBoardElement, FocusRingElement, FontEditorElement, FooterItemGroupElement, FooterItemElement, FooterElement, FormFieldElement, FormElement, GhostElement, GridItemElement, GridElement, HelmetElement, HintElement, IconElement, ImageElement, IndicatorElement, JumbotronHeaderElement, JumbotronSubHeaderElement, JumbotronElement, KbdShortcutElement, KbdElement, LightChainElement, ListItemGroupElement, ListItemElement, listElementValueAccessor, ListElement, ListingItemMarkerElement, ListingItemElement, ListingElement, MapElement, MarqueeElement, MasonryElement, MenuItemGroupElement, MenuItemElement, MenuElement, MessageContentElement, MessageElement, MeterBarElement, MeterRingElement, NumberCounterElement, NumberElement, numberBoxElementValueAccessor, NumberBoxElement, PageContentElement, PageHeaderElement, PagePreContentElement, PagePreHeaderElement, PageElement, PageMenuElement, PaginatorElement, passwordBoxElementValueAccessor, PasswordBoxElement, PatternElement, PersonaElement, pinBoxElementValueAccessor, PinBoxElement, PipElement, PlaceholderElement, PopupElement, PortalHostElement, PortalProjectionElement, PortalElement, PressButtonElement, ProgressBarElement, QRCodeElement, radioGroupElementValueAccessor, RadioGroupElement, radioElementValueAccessor, RadioElement, RatingElement, ReactionChatToolElement, RegionViewElement, RegionElement, RepeatButtonElement, ResizeAdornerElement, ResizeThumbElement, ResizeElement, RibbonElement, richTextBoxElementValueAccessor, RichTextBoxElement, SchedulerEventElement, SchedulerElement, ScrollElement, scrubSliderElementValueAccessor, ScrubSliderElement, searchBoxElementValueAccessor, SearchBoxElement, SegmentItemElement, SegmentElement, SelectItemGroupElement, SelectItemElement, selectElementValueAccessor, SelectElement, signaturePadElementValueAccessor, SignaturePadElement, SkeletonElement, sliderElementValueAccessor, SliderElement, Slider2ThumbElement, Slider2Element, SpacerElement, SplitButtonElement, SplitElement, StackElement, StepperItemElement, StickyElement, SuccessStateElement, SummaryElement, SwipeElement, TabItemElement, TabPanelElement, TabStripItemElement, TabStripElement, TabElement, TableBodyCellElement, TableBodyRowElement, TableBodyElement, TableColumnEditorElement, TableFooterCellElement, TableFooterRowElement, TableFooterElement, TableHeaderCellElement, TableHeaderRowElement, TableHeaderElement, TableElement, TextFormatElement, TextElement, textBoxElementValueAccessor, TextBoxElement, Theme2Element, ThumbElement, ThumbnailElement, TickBarElement, TileListItemElement, TileListElement, TileManagerTileElement, TileManagerElement, TileElement, timeBoxElementValueAccessor, TimeBoxElement, TimelineContentElement, TimelineItemElement, TimelineMarkerElement, TimelineOppositeElement, TimelineElement, toggleButtonGroupElementValueAccessor, ToggleButtonGroupElement, toggleButtonElementValueAccessor, ToggleButtonElement, toggleSwitchElementValueAccessor, ToggleSwitchElement, ToggleTipElement, ToolbarElement, TourAnchorElement, TourStepElement, TourElement, TreeItemElement, treeElementValueAccessor, TreeElement, UpDownSpinnerElement, VideoElement, VirtualizeElement, VoiceRecorderChatToolElement, WheelPickerElement, WizardStepElement, WrapElement } from '@breadstone/mosaik-elements-foundation';
4
+ import { AbsoluteItemElement, AbsoluteElement, ActionbarGroupElement, ActionbarItemElement, ActionbarSeparatorElement, ActionbarElement, AnchorElement, AppHeaderElement, AppElement, AttachmentChatToolElement, AudioElement, AnimationPlayer, Animation, BREAKPOINTS, PerspectiveElement, RippleElement, ScaleElement, ProgressRingElement, ExpandableElement, FlipElement, TooltipElement, dataListElementValueAccessor, DataListElement, dataTableElementValueAccessor, DataTableElement, StepperElement, WizardElement, Size, Spacing, TextFormatters, DIALOG_STACK_BEHAVIOR_DEFAULT_CONFIG, ButtonElement, DialogActionsElement, DialogElement, DialogFooterElement, DialogHeaderElement, DialogHeaderSubTextElement, DialogHeaderTextElement, MOSAIK_PORTAL_SCOPE_ATTRIBUTE, Key, EID, DRAWER_STACK_BEHAVIOR_DEFAULT_CONFIG, DrawerActionsElement, DrawerElement, DrawerContentElement, DrawerFooterElement, DrawerHeaderElement, DrawerHeaderSubTextElement, DrawerHeaderTextElement, DismissElement, MessageBoxElement, MessageBoxResult, SheetElement, SheetContentElement, SheetFooterElement, SheetHeaderElement, SheetHeaderSubTextElement, SheetHeaderTextElement, ToastElement, DateAgoIntl, TimeAgoIntl, ThemeService as ThemeService$1, TranslatorService, Translator, TranslatorServiceLocator, autoCompleteBoxElementValueAccessor, AutoCompleteBoxElement, AvatarGroupElement, avatarElementValueAccessor, AvatarElement, BackdropElement, BadgeElement, BannerGroupElement, BannerHeaderElement, BannerSubHeaderElement, BannerElement, BoxElement, BreadcrumbItemElement, BreadcrumbElement, BusyStateElement, ButtonGroupElement, CalendarHeaderElement, CalendarItemElement, CalendarSubHeaderElement, calendarElementValueAccessor, CalendarElement, CameraElement, CardActionsElement, CardContentElement, CardFooterElement, CardHeaderElement, CardSubTitleElement, CardTitleElement, CardElement, Carousel2Element, CarouselItem2Element, CarouselItemElement, CarouselElement, CellGroupElement, CellElement, ChartElement, ChatHeaderElement, ChatInputAttachmentListElement, ChatInputElement, ChatMarkerElement, ChatMessageAvatarElement, ChatMessageDividerElement, ChatMessageReactionElement, ChatMessageElement, ChatElement, checkBoxGroupElementValueAccessor, CheckBoxGroupElement, checkboxElementValueAccessor, CheckboxElement, CheckmarkElement, chipGroupElementValueAccessor, ChipGroupElement, ChipElement, chipBoxElementValueAccessor, ChipBoxElement, ChoiceGroupHeaderElement, choiceGroupElementValueAccessor, ChoiceGroupElement, choiceElementValueAccessor, ChoiceElement, CodeElement, ColorAreaElement, colorEditorAlphaSliderElementValueAccessor, ColorEditorAlphaSliderElement, colorEditorAreaElementValueAccessor, ColorEditorAreaElement, colorEditorHueSliderElementValueAccessor, ColorEditorHueSliderElement, colorEditorInputsElementValueAccessor, ColorEditorInputsElement, colorEditorPaletteElementValueAccessor, ColorEditorPaletteElement, colorEditorShadeSliderElementValueAccessor, ColorEditorShadeSliderElement, colorEditorSwatchElementValueAccessor, ColorEditorSwatchElement, colorEditorElementValueAccessor, ColorEditorElement, ColorPickerElement, ColorSliderElement, ColorSwatchGroupElement, ColorSwatchElement, ColorThumbElement, colorBoxElementValueAccessor, ColorBoxElement, ComboItemElement, comboElementValueAccessor, ComboElement, CommentElement, CompoundButtonElement, CookiesConsentElement, dateBoxElementValueAccessor, DateBoxElement, dateTimeBoxElementValueAccessor, DateTimeBoxElement, DesignerCanvasElement, DesignerContentElement, DesignerFrameElement, DesignerElement, DialogContentElement, DisclosureElement, DividerElement, DockPanelElement, DotGroupElement, DotElement, DrawerContainerElement, DropZoneElement, DropDownButtonElement, DurationBoxElement, ElevationElement, EmojiElement, EmptyStateElement, EpgChannelElement, EpgProgramElement, EpgElement, ErrorStateElement, ErrorElement, ExpanderGroupElement, ExpanderHeaderElement, ExpanderSubHeaderElement, ExpanderElement, FloatingActionButtonGroupElement, FloatingActionButtonElement, FilePickerElement, FileUploadItemElement, fileUploadElementValueAccessor, FileUploadElement, fileBoxElementValueAccessor, FileBoxElement, FloatingTriggerElement, FloatingElement, FlowBoardColumnComposerElement, FlowBoardColumnItemComposerElement, FlowBoardColumnItemElement, FlowBoardColumnElement, FlowBoardElement, FocusRingElement, FontEditorElement, FooterItemGroupElement, FooterItemElement, FooterElement, FormFieldElement, FormElement, GhostElement, GridItemElement, GridElement, HelmetElement, HintElement, IconElement, ImageElement, IndicatorElement, JumbotronHeaderElement, JumbotronSubHeaderElement, JumbotronElement, KbdShortcutElement, KbdElement, LightChainElement, ListItemGroupElement, ListItemElement, listElementValueAccessor, ListElement, ListingItemMarkerElement, ListingItemElement, ListingElement, MapElement, MarqueeElement, MasonryElement, MenuItemGroupElement, MenuItemElement, MenuElement, MessageContentElement, MessageElement, MeterBarElement, MeterRingElement, NumberCounterElement, NumberElement, numberBoxElementValueAccessor, NumberBoxElement, PageContentElement, PageHeaderElement, PagePreContentElement, PagePreHeaderElement, PageElement, PageMenuElement, PaginatorElement, passwordBoxElementValueAccessor, PasswordBoxElement, PatternElement, PersonaElement, pinBoxElementValueAccessor, PinBoxElement, PipElement, PlaceholderElement, PopupElement, PortalHostElement, PortalProjectionElement, PortalElement, PressButtonElement, ProgressBarElement, QRCodeElement, radioGroupElementValueAccessor, RadioGroupElement, radioElementValueAccessor, RadioElement, RatingElement, ReactionChatToolElement, RegionViewElement, RegionElement, RepeatButtonElement, ResizeAdornerElement, ResizeThumbElement, ResizeElement, RibbonElement, richTextBoxElementValueAccessor, RichTextBoxElement, SchedulerEventElement, SchedulerElement, ScrollElement, scrubSliderElementValueAccessor, ScrubSliderElement, searchBoxElementValueAccessor, SearchBoxElement, SegmentItemElement, SegmentElement, SelectItemGroupElement, SelectItemElement, selectElementValueAccessor, SelectElement, signaturePadElementValueAccessor, SignaturePadElement, SkeletonElement, sliderElementValueAccessor, SliderElement, Slider2ThumbElement, Slider2Element, SpacerElement, SplitButtonElement, SplitElement, StackElement, StepperItemElement, StickyElement, SuccessStateElement, SummaryElement, SwipeElement, TabItemElement, TabPanelElement, TabStripItemElement, TabStripElement, TabElement, TableBodyCellElement, TableBodyRowElement, TableBodyElement, TableColumnEditorElement, TableFooterCellElement, TableFooterRowElement, TableFooterElement, TableHeaderCellElement, TableHeaderRowElement, TableHeaderElement, TableElement, TextFormatElement, TextElement, textBoxElementValueAccessor, TextBoxElement, Theme2Element, ThumbElement, ThumbnailElement, TickBarElement, TileListItemElement, TileListElement, TileManagerTileElement, TileManagerElement, TileElement, timeBoxElementValueAccessor, TimeBoxElement, TimelineContentElement, TimelineItemElement, TimelineMarkerElement, TimelineOppositeElement, TimelineElement, toggleButtonGroupElementValueAccessor, ToggleButtonGroupElement, toggleButtonElementValueAccessor, ToggleButtonElement, toggleSwitchElementValueAccessor, ToggleSwitchElement, ToggleTipElement, ToolbarElement, TourAnchorElement, TourStepElement, TourElement, TreeItemElement, treeElementValueAccessor, TreeElement, UpDownSpinnerElement, VideoElement, VirtualizeElement, VoiceRecorderChatToolElement, WheelPickerElement, WizardStepElement, WrapElement } from '@breadstone/mosaik-elements-foundation';
5
5
  import { AbstractControl, FormGroupDirective, NgControl, TouchedChangeEvent, NG_VALUE_ACCESSOR, FormControl, FormArray, FormGroup } from '@angular/forms';
6
6
  import { BreakpointObserver } from '@angular/cdk/layout';
7
7
  import { Subject, map, Subscription, filter, of, isObservable, BehaviorSubject, merge, fromEvent, take, takeUntil, timer, share, Observable } from 'rxjs';
@@ -11426,6 +11426,146 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImpo
11426
11426
  }]
11427
11427
  }] });
11428
11428
 
11429
+ // #region Imports
11430
+ const OVERLAY_INTERACTION_STATE = getOverlayInteractionState();
11431
+ /**
11432
+ * Coordinates close interactions across stacked CDK overlays.
11433
+ *
11434
+ * @internal
11435
+ */
11436
+ class OverlayInteractionCoordinator {
11437
+ // #region Methods
11438
+ /**
11439
+ * Registers an overlay as active for global close interaction arbitration.
11440
+ *
11441
+ * @internal
11442
+ */
11443
+ static register(overlayRef) {
11444
+ const focusTrap = OverlayInteractionCoordinator.findEntry(overlayRef)?.focusTrap ?? null;
11445
+ OverlayInteractionCoordinator.remove(overlayRef);
11446
+ OVERLAY_INTERACTION_STATE.entries.push({
11447
+ overlayRef: overlayRef,
11448
+ order: ++OVERLAY_INTERACTION_STATE.order,
11449
+ focusTrap: focusTrap
11450
+ });
11451
+ OverlayInteractionCoordinator.updateFocusTrapStates();
11452
+ }
11453
+ /**
11454
+ * Removes an overlay from global close interaction arbitration.
11455
+ *
11456
+ * @internal
11457
+ */
11458
+ static unregister(overlayRef) {
11459
+ OverlayInteractionCoordinator.remove(overlayRef);
11460
+ OverlayInteractionCoordinator.updateFocusTrapStates();
11461
+ }
11462
+ /**
11463
+ * Registers a focus trap for an overlay and enables only the uppermost attached overlay trap.
11464
+ *
11465
+ * @internal
11466
+ */
11467
+ static registerFocusTrap(overlayRef, focusTrap) {
11468
+ let entry = OverlayInteractionCoordinator.findEntry(overlayRef);
11469
+ if (!entry) {
11470
+ entry = {
11471
+ overlayRef: overlayRef,
11472
+ order: ++OVERLAY_INTERACTION_STATE.order,
11473
+ focusTrap: null
11474
+ };
11475
+ OVERLAY_INTERACTION_STATE.entries.push(entry);
11476
+ }
11477
+ entry.focusTrap = focusTrap;
11478
+ OverlayInteractionCoordinator.updateFocusTrapStates();
11479
+ }
11480
+ /**
11481
+ * Removes the focus trap for an overlay and re-enables the next uppermost attached overlay trap.
11482
+ *
11483
+ * @internal
11484
+ */
11485
+ static unregisterFocusTrap(overlayRef) {
11486
+ const entry = OverlayInteractionCoordinator.findEntry(overlayRef);
11487
+ if (entry) {
11488
+ if (entry.focusTrap) {
11489
+ entry.focusTrap.enabled = false;
11490
+ }
11491
+ entry.focusTrap = null;
11492
+ }
11493
+ OverlayInteractionCoordinator.updateFocusTrapStates();
11494
+ }
11495
+ /**
11496
+ * Returns whether the overlay is the uppermost currently attached overlay.
11497
+ *
11498
+ * @internal
11499
+ */
11500
+ static isTopMost(overlayRef) {
11501
+ return OverlayInteractionCoordinator.getTopMostOverlayRef() === overlayRef;
11502
+ }
11503
+ /**
11504
+ * Returns whether the overlay owned the uppermost position when the interaction event started.
11505
+ *
11506
+ * @internal
11507
+ */
11508
+ static isTopMostForInteraction(overlayRef, event) {
11509
+ return OverlayInteractionCoordinator.getOrCreateInteractionOwner(event) === overlayRef;
11510
+ }
11511
+ static remove(overlayRef) {
11512
+ const index = OVERLAY_INTERACTION_STATE.entries.findIndex((entry) => entry.overlayRef === overlayRef);
11513
+ if (index >= 0) {
11514
+ const entry = OVERLAY_INTERACTION_STATE.entries[index];
11515
+ if (entry.focusTrap) {
11516
+ entry.focusTrap.enabled = false;
11517
+ }
11518
+ OVERLAY_INTERACTION_STATE.entries.splice(index, 1);
11519
+ }
11520
+ }
11521
+ static getOrCreateInteractionOwner(event) {
11522
+ if (!OVERLAY_INTERACTION_STATE.eventOwners.has(event)) {
11523
+ OVERLAY_INTERACTION_STATE.eventOwners.set(event, OverlayInteractionCoordinator.getTopMostOverlayRef());
11524
+ }
11525
+ return OVERLAY_INTERACTION_STATE.eventOwners.get(event) ?? null;
11526
+ }
11527
+ static findEntry(overlayRef) {
11528
+ return OVERLAY_INTERACTION_STATE.entries.find((entry) => entry.overlayRef === overlayRef) ?? null;
11529
+ }
11530
+ static getTopMostOverlayRef() {
11531
+ let topMostEntry = null;
11532
+ for (const entry of OVERLAY_INTERACTION_STATE.entries) {
11533
+ if (entry.overlayRef.hasAttached() && (!topMostEntry || entry.order > topMostEntry.order)) {
11534
+ topMostEntry = entry;
11535
+ }
11536
+ }
11537
+ return topMostEntry?.overlayRef ?? null;
11538
+ }
11539
+ static updateFocusTrapStates() {
11540
+ const topMostOverlayRef = OverlayInteractionCoordinator.getTopMostOverlayRef();
11541
+ for (const entry of OVERLAY_INTERACTION_STATE.entries) {
11542
+ if (entry.focusTrap) {
11543
+ entry.focusTrap.enabled = entry.overlayRef === topMostOverlayRef;
11544
+ }
11545
+ }
11546
+ }
11547
+ }
11548
+ function getOverlayInteractionState() {
11549
+ const root = globalThis;
11550
+ root.__mosaikOverlayInteractionState__ ??= {
11551
+ entries: new Array(),
11552
+ eventOwners: new WeakMap(),
11553
+ order: 0
11554
+ };
11555
+ return root.__mosaikOverlayInteractionState__;
11556
+ }
11557
+
11558
+ // #region Imports
11559
+ // #endregion
11560
+ // #region Constants
11561
+ /**
11562
+ * Injection token for the CDK overlay reference that hosts a Mosaik portal component.
11563
+ *
11564
+ * @internal
11565
+ */
11566
+ const PORTAL_OVERLAY_REF = new InjectionToken('MOSAIK_PORTAL_OVERLAY_REF');
11567
+ // #endregion
11568
+
11429
11569
  // #region Imports
11430
11570
  // #endregion
11431
11571
  /**
@@ -11436,6 +11576,7 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11436
11576
  _element;
11437
11577
  _focusTrapFactory;
11438
11578
  _document;
11579
+ _overlayRef;
11439
11580
  _focusTrap;
11440
11581
  _elementFocusedBeforeOpened;
11441
11582
  // #endregion
@@ -11450,8 +11591,11 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11450
11591
  this._element = inject(ElementRef);
11451
11592
  this._focusTrapFactory = inject(ConfigurableFocusTrapFactory);
11452
11593
  this._document = inject(DOCUMENT);
11594
+ this._overlayRef = inject(PORTAL_OVERLAY_REF, { optional: true });
11453
11595
  this._focusTrap = null;
11454
11596
  this._elementFocusedBeforeOpened = null;
11597
+ this._element.nativeElement.setAttribute(MOSAIK_PORTAL_SCOPE_ATTRIBUTE, '');
11598
+ this._element.nativeElement.tabIndex = -1;
11455
11599
  }
11456
11600
  // #endregion
11457
11601
  // #region Methods
@@ -11475,7 +11619,9 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11475
11619
  */
11476
11620
  attachComponentPortal(portal) {
11477
11621
  this.savePreviouslyFocusedElement();
11478
- return this.portal.attachComponentPortal(portal);
11622
+ const componentRef = this.portal.attachComponentPortal(portal);
11623
+ this.trapFocus();
11624
+ return componentRef;
11479
11625
  }
11480
11626
  /**
11481
11627
  * Attach a TemplatePortal as content to this dialog container.
@@ -11485,7 +11631,9 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11485
11631
  */
11486
11632
  attachTemplatePortal(portal) {
11487
11633
  this.savePreviouslyFocusedElement();
11488
- return this.portal.attachTemplatePortal(portal);
11634
+ const embeddedViewRef = this.portal.attachTemplatePortal(portal);
11635
+ this.trapFocus();
11636
+ return embeddedViewRef;
11489
11637
  }
11490
11638
  /**
11491
11639
  * @public
@@ -11493,22 +11641,38 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11493
11641
  trapFocus() {
11494
11642
  const element = this._element.nativeElement;
11495
11643
  this._focusTrap ??= this._focusTrapFactory.create(element);
11496
- void this._focusTrap.focusInitialElementWhenReady();
11644
+ if (this._overlayRef) {
11645
+ OverlayInteractionCoordinator.registerFocusTrap(this._overlayRef, this._focusTrap);
11646
+ }
11647
+ const focusPromise = this._focusTrap.focusInitialElementWhenReady();
11497
11648
  const activeElement = this._document.activeElement;
11498
11649
  if (activeElement !== element && !element.contains(activeElement)) {
11499
11650
  element.focus();
11651
+ this.focusFirstTabbableDescendant(element);
11500
11652
  }
11653
+ void focusPromise.then((focused) => {
11654
+ if (!this._focusTrap || !element.isConnected) {
11655
+ return;
11656
+ }
11657
+ if (!focused || this._document.activeElement === element || !element.contains(this._document.activeElement)) {
11658
+ this.focusFirstTabbableDescendant(element);
11659
+ }
11660
+ });
11501
11661
  }
11502
11662
  /**
11503
11663
  * @public
11504
11664
  */
11505
11665
  restoreFocus() {
11506
11666
  const toFocus = this._elementFocusedBeforeOpened;
11667
+ if (this._overlayRef) {
11668
+ OverlayInteractionCoordinator.unregisterFocusTrap(this._overlayRef);
11669
+ }
11507
11670
  if (toFocus && typeof toFocus.focus === 'function') {
11508
11671
  toFocus.focus();
11509
11672
  }
11510
11673
  if (this._focusTrap) {
11511
11674
  this._focusTrap.destroy();
11675
+ this._focusTrap = null;
11512
11676
  }
11513
11677
  }
11514
11678
  /**
@@ -11520,6 +11684,39 @@ let PortalComponent$1 = class PortalComponent extends BasePortalOutlet {
11520
11684
  void Promise.resolve().then(() => this._element.nativeElement.focus());
11521
11685
  }
11522
11686
  }
11687
+ /**
11688
+ * @private
11689
+ */
11690
+ focusFirstTabbableDescendant(element) {
11691
+ this.findFirstTabbableDescendant(element)?.focus();
11692
+ }
11693
+ /**
11694
+ * @private
11695
+ */
11696
+ findFirstTabbableDescendant(element) {
11697
+ for (const child of Array.from(element.children)) {
11698
+ if (!(child instanceof HTMLElement)) {
11699
+ continue;
11700
+ }
11701
+ if (this.isTabbable(child)) {
11702
+ return child;
11703
+ }
11704
+ const descendant = this.findFirstTabbableDescendant(child);
11705
+ if (descendant) {
11706
+ return descendant;
11707
+ }
11708
+ }
11709
+ return null;
11710
+ }
11711
+ /**
11712
+ * @private
11713
+ */
11714
+ isTabbable(element) {
11715
+ if (element.tabIndex < 0 || element.hidden || element.hasAttribute('disabled') || element.getAttribute('aria-hidden') === 'true') {
11716
+ return false;
11717
+ }
11718
+ return element.getClientRects().length > 0;
11719
+ }
11523
11720
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: PortalComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
11524
11721
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.13", type: PortalComponent, isStandalone: true, usesInheritance: true, ngImport: i0 });
11525
11722
  };
@@ -12043,80 +12240,6 @@ class OverlayBackdropStackCoordinator {
12043
12240
  }
12044
12241
  }
12045
12242
 
12046
- // #region Imports
12047
- const OVERLAY_INTERACTION_STATE = getOverlayInteractionState();
12048
- /**
12049
- * Coordinates close interactions across stacked CDK overlays.
12050
- *
12051
- * @internal
12052
- */
12053
- class OverlayInteractionCoordinator {
12054
- // #region Methods
12055
- /**
12056
- * Registers an overlay as active for global close interaction arbitration.
12057
- *
12058
- * @internal
12059
- */
12060
- static register(overlayRef) {
12061
- OverlayInteractionCoordinator.unregister(overlayRef);
12062
- OVERLAY_INTERACTION_STATE.entries.push({
12063
- overlayRef: overlayRef,
12064
- order: ++OVERLAY_INTERACTION_STATE.order
12065
- });
12066
- }
12067
- /**
12068
- * Removes an overlay from global close interaction arbitration.
12069
- *
12070
- * @internal
12071
- */
12072
- static unregister(overlayRef) {
12073
- const index = OVERLAY_INTERACTION_STATE.entries.findIndex((entry) => entry.overlayRef === overlayRef);
12074
- if (index >= 0) {
12075
- OVERLAY_INTERACTION_STATE.entries.splice(index, 1);
12076
- }
12077
- }
12078
- /**
12079
- * Returns whether the overlay is the uppermost currently attached overlay.
12080
- *
12081
- * @internal
12082
- */
12083
- static isTopMost(overlayRef) {
12084
- return OverlayInteractionCoordinator.getTopMostOverlayRef() === overlayRef;
12085
- }
12086
- /**
12087
- * Returns whether the overlay owned the uppermost position when the interaction event started.
12088
- *
12089
- * @internal
12090
- */
12091
- static isTopMostForInteraction(overlayRef, event) {
12092
- return OverlayInteractionCoordinator.getOrCreateInteractionOwner(event) === overlayRef;
12093
- }
12094
- static getOrCreateInteractionOwner(event) {
12095
- if (!OVERLAY_INTERACTION_STATE.eventOwners.has(event)) {
12096
- OVERLAY_INTERACTION_STATE.eventOwners.set(event, OverlayInteractionCoordinator.getTopMostOverlayRef());
12097
- }
12098
- return OVERLAY_INTERACTION_STATE.eventOwners.get(event) ?? null;
12099
- }
12100
- static getTopMostOverlayRef() {
12101
- let topMostEntry = null;
12102
- for (const entry of OVERLAY_INTERACTION_STATE.entries) {
12103
- if (entry.overlayRef.hasAttached() && (!topMostEntry || entry.order > topMostEntry.order)) {
12104
- topMostEntry = entry;
12105
- }
12106
- }
12107
- return topMostEntry?.overlayRef ?? null;
12108
- }
12109
- }
12110
- function getOverlayInteractionState() {
12111
- const root = globalThis;
12112
- root.__mosaikOverlayInteractionState__ ??= {
12113
- entries: new Array(),
12114
- eventOwners: new WeakMap(),
12115
- order: 0
12116
- };
12117
- return root.__mosaikOverlayInteractionState__;
12118
- }
12119
-
12120
12243
  // #region Imports
12121
12244
  // #endregion
12122
12245
  // #region Constants
@@ -12214,8 +12337,11 @@ class PortalProvider {
12214
12337
  /**
12215
12338
  * @protected
12216
12339
  */
12217
- createPortal(component, config) {
12218
- return new ComponentPortal(component, null, this.createPortalInjector(config));
12340
+ createPortal(component, overlayRef, config) {
12341
+ const portalInjector = new StatelessInjector(this.createPortalInjector(config), [
12342
+ [PORTAL_OVERLAY_REF, overlayRef]
12343
+ ]);
12344
+ return new ComponentPortal(component, null, portalInjector);
12219
12345
  }
12220
12346
  /**
12221
12347
  * @protected
@@ -12426,7 +12552,7 @@ class DialogService extends PortalProvider {
12426
12552
  backdropStackKey: 'dialog',
12427
12553
  backdropStrategy: config?.backdropStrategy
12428
12554
  });
12429
- const portal = this.createPortal(DialogPortalComponent, config);
12555
+ const portal = this.createPortal(DialogPortalComponent, overlayRef, config);
12430
12556
  const componentRef = this.createComponent(portal, overlayRef, DialogPortalComponent, config);
12431
12557
  this._portalInjector = componentRef.injector;
12432
12558
  const dialogRef = new DialogRef(this.createId(), componentRef.instance.dialog, overlayRef, config?.data);
@@ -15280,7 +15406,7 @@ class DrawerService extends PortalProvider {
15280
15406
  backdropStackKey: 'drawer',
15281
15407
  backdropStrategy: config?.backdropStrategy
15282
15408
  });
15283
- const portal = this.createPortal(DrawerPortalComponent, config);
15409
+ const portal = this.createPortal(DrawerPortalComponent, overlayRef, config);
15284
15410
  const componentRef = this.createComponent(portal, overlayRef, DrawerPortalComponent, config);
15285
15411
  this._portalInjector = componentRef.injector;
15286
15412
  const drawerRef = new DrawerRef(this.createId(), componentRef.instance.drawer, overlayRef, config?.data);
@@ -16239,7 +16365,7 @@ class MessageBoxService extends PortalProvider {
16239
16365
  backdropStackKey: 'message-box',
16240
16366
  backdropStrategy: config?.backdropStrategy
16241
16367
  });
16242
- const portal = this.createPortal(MessageBoxPortalComponent, config);
16368
+ const portal = this.createPortal(MessageBoxPortalComponent, overlayRef, config);
16243
16369
  const componentRef = this.createComponent(portal, overlayRef, MessageBoxPortalComponent, config);
16244
16370
  const messageBoxRef = new MessageBoxRef(this.createId(), componentRef.instance.messageBox, overlayRef, config?.data);
16245
16371
  this.prepareComponent(overlayRef, componentRef.instance.messageBox, messageBoxRef, config);
@@ -17898,7 +18024,7 @@ class SheetService extends PortalProvider {
17898
18024
  backdropStackKey: 'sheet',
17899
18025
  backdropStrategy: config?.backdropStrategy
17900
18026
  });
17901
- const portal = this.createPortal(SheetPortalComponent, config);
18027
+ const portal = this.createPortal(SheetPortalComponent, overlayRef, config);
17902
18028
  const componentRef = this.createComponent(portal, overlayRef, SheetPortalComponent, config);
17903
18029
  this._portalInjector = componentRef.injector;
17904
18030
  const sheetRef = new SheetRef(this.createId(), componentRef.instance.sheet, overlayRef, config?.data);
@@ -18660,7 +18786,7 @@ class ToastService extends PortalProvider {
18660
18786
  backdropStackKey: 'toast',
18661
18787
  backdropStrategy: resolvedConfig?.backdropStrategy
18662
18788
  });
18663
- const portal = this.createPortal(ToastPortalComponent, resolvedConfig);
18789
+ const portal = this.createPortal(ToastPortalComponent, overlayRef, resolvedConfig);
18664
18790
  const componentRef = this.createComponent(portal, overlayRef, ToastPortalComponent, resolvedConfig);
18665
18791
  const toastRef = new ToastRef(this.createId(), componentRef.instance.toast, overlayRef, resolvedConfig?.data);
18666
18792
  if (componentTypeOrTemplateRef) {