UNPKG

@clr/angular

Version:

Angular components for Clarity

1 lines 69.1 kB
{"version":3,"file":"clr-angular-popover-common.mjs","sources":["../../../projects/angular/popover/common/providers/popover.service.ts","../../../projects/angular/popover/common/utils/popover-positions.ts","../../../projects/angular/popover/common/popover-content.ts","../../../projects/angular/popover/common/popover-origin.ts","../../../projects/angular/popover/common/popover-host-origin.token.ts","../../../projects/angular/popover/common/stop-escape-propagation.directive.ts","../../../projects/angular/popover/common/popover-host.directive.ts","../../../projects/angular/popover/common/if-open.directive.ts","../../../projects/angular/popover/common/popover-close-button.ts","../../../projects/angular/popover/common/popover-open-close-button.ts","../../../projects/angular/popover/common/popover.module.ts","../../../projects/angular/popover/common/index.ts","../../../projects/angular/popover/common/clr-angular-popover-common.ts"],"sourcesContent":["/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { FlexibleConnectedPositionStrategyOrigin } from '@angular/cdk/overlay';\nimport { ElementRef, Injectable } from '@angular/core';\nimport { preventArrowKeyScroll } from '@clr/angular/utils';\nimport { Observable, Subject } from 'rxjs';\n\nimport { ClrPopoverPosition } from '../utils/popover-positions';\n\nexport interface ClrPopoverPoint {\n x: number;\n y: number;\n}\n\n@Injectable()\nexport class ClrPopoverService {\n pointTargetElement: HTMLElement | undefined;\n origin: FlexibleConnectedPositionStrategyOrigin;\n closeButtonRef: ElementRef;\n panelClass: string[] = [];\n\n private _open = false;\n private _openChange = new Subject<boolean>();\n private _openEvent: Event;\n private _openEventChange = new Subject<Event>();\n private _positionChange = new Subject<string>();\n private _resetPositions = new Subject<void>();\n private _updatePosition = new Subject<void>();\n private _popoverVisible = new Subject<boolean>();\n\n get originElement(): ElementRef<HTMLElement> | null {\n return this.origin instanceof ElementRef ? this.origin : null;\n }\n\n get originPoint(): ClrPopoverPoint | null {\n return this.origin && 'x' in this.origin && 'y' in this.origin ? (this.origin as ClrPopoverPoint) : null;\n }\n\n get openChange(): Observable<boolean> {\n return this._openChange.asObservable();\n }\n\n get popoverVisible(): Observable<boolean> {\n return this._popoverVisible.asObservable();\n }\n\n get openEvent(): Event {\n return this._openEvent;\n }\n set openEvent(event: Event) {\n this._openEvent = event;\n this._openEventChange.next(event);\n }\n\n get open(): boolean {\n return this._open;\n }\n set open(value: boolean) {\n value = !!value;\n if (this._open !== value) {\n this._open = value;\n this._openChange.next(value);\n }\n }\n\n get resetPositionsChange(): Observable<void> {\n return this._resetPositions.asObservable();\n }\n\n positionChange(position: ClrPopoverPosition) {\n this._positionChange.next(position);\n }\n\n updatePositionChange(): Observable<void> {\n return this._updatePosition.asObservable();\n }\n\n getPositionChange(): Observable<string> {\n return this._positionChange.asObservable();\n }\n\n getEventChange(): Observable<Event> {\n return this._openEventChange.asObservable();\n }\n\n /**\n * Sometimes, we need to remember the event that triggered the toggling to avoid loops.\n * This is for instance the case of components that open on a click, but close on a click outside.\n */\n toggleWithEvent(event: any) {\n preventArrowKeyScroll(event);\n\n this.openEvent = event;\n this.open = !this.open;\n }\n\n /**\n * Opens the popover at a specific screen coordinate.\n * Useful for context menus where the popover should appear at the cursor position.\n */\n openAtPoint(point: ClrPopoverPoint, targetElement?: HTMLElement) {\n if (this._open) {\n this._open = false;\n this._openChange.next(false);\n }\n\n this.origin = point;\n this.pointTargetElement = targetElement;\n this.open = true;\n }\n\n popoverVisibleEmit(visible: boolean) {\n this._popoverVisible.next(visible);\n }\n\n resetPositions() {\n this._resetPositions.next();\n }\n\n updatePosition() {\n this._updatePosition.next();\n }\n\n focusCloseButton(): void {\n this.closeButtonRef.nativeElement?.focus();\n }\n\n focusOrigin(): void {\n this.originElement?.nativeElement?.focus({ preventScroll: true });\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { ConnectedPosition } from '@angular/cdk/overlay';\nimport { ClrPosition } from '@clr/angular/utils';\n\nexport enum ClrPopoverType {\n SIGNPOST,\n TOOLTIP,\n DROPDOWN,\n DEFAULT,\n}\n\nexport enum ClrPopoverPosition {\n TOP_RIGHT = 'top-right',\n TOP_MIDDLE = 'top-middle',\n TOP_LEFT = 'top-left',\n RIGHT = 'right',\n RIGHT_TOP = 'right-top',\n RIGHT_MIDDLE = 'right-middle',\n RIGHT_BOTTOM = 'right-bottom',\n LEFT = 'left',\n LEFT_TOP = 'left-top',\n LEFT_MIDDLE = 'left-middle',\n LEFT_BOTTOM = 'left-bottom',\n BOTTOM_RIGHT = 'bottom-right',\n BOTTOM_MIDDLE = 'bottom-middle',\n BOTTOM_LEFT = 'bottom-left',\n}\n\nexport const TOOLTIP_POSITIONS: ClrPopoverPosition[] = [\n ClrPopoverPosition.RIGHT, // default. must be at index 0\n ClrPopoverPosition.LEFT,\n ClrPopoverPosition.BOTTOM_RIGHT,\n ClrPopoverPosition.BOTTOM_LEFT,\n ClrPopoverPosition.TOP_RIGHT,\n ClrPopoverPosition.TOP_LEFT,\n];\n\nexport const DROPDOWN_POSITIONS: ClrPopoverPosition[] = [\n ClrPopoverPosition.BOTTOM_LEFT, // default. must be at index 0\n ClrPopoverPosition.BOTTOM_RIGHT,\n ClrPopoverPosition.TOP_LEFT,\n ClrPopoverPosition.TOP_RIGHT,\n ClrPopoverPosition.RIGHT_TOP,\n ClrPopoverPosition.RIGHT_BOTTOM,\n ClrPopoverPosition.LEFT_TOP,\n ClrPopoverPosition.LEFT_BOTTOM,\n];\n\nexport const SIGNPOST_POSITIONS: ClrPopoverPosition[] = [\n ClrPopoverPosition.RIGHT_MIDDLE, // default. must be at index 0\n ClrPopoverPosition.RIGHT_TOP,\n ClrPopoverPosition.RIGHT_BOTTOM,\n ClrPopoverPosition.TOP_RIGHT,\n ClrPopoverPosition.TOP_LEFT,\n ClrPopoverPosition.TOP_MIDDLE,\n ClrPopoverPosition.BOTTOM_RIGHT,\n ClrPopoverPosition.BOTTOM_MIDDLE,\n ClrPopoverPosition.BOTTOM_LEFT,\n ClrPopoverPosition.LEFT_BOTTOM,\n ClrPopoverPosition.LEFT_MIDDLE,\n ClrPopoverPosition.LEFT_TOP,\n];\n\nexport function getPositionsArray(type: ClrPopoverType) {\n switch (type) {\n case ClrPopoverType.TOOLTIP:\n return TOOLTIP_POSITIONS;\n case ClrPopoverType.DROPDOWN:\n return DROPDOWN_POSITIONS;\n case ClrPopoverType.SIGNPOST:\n case ClrPopoverType.DEFAULT:\n default:\n return SIGNPOST_POSITIONS;\n }\n}\n\nexport function getConnectedPositions(type: ClrPopoverType): ConnectedPosition[] {\n const result: ConnectedPosition[] = [];\n\n getPositionsArray(type).forEach(position => {\n result.push(mapPopoverKeyToPosition(position, type));\n });\n\n return result;\n}\n\nconst POPOVER_OFFSETS: Record<ClrPopoverType, number> = {\n [ClrPopoverType.SIGNPOST]: 16,\n [ClrPopoverType.TOOLTIP]: 21,\n [ClrPopoverType.DROPDOWN]: 2,\n [ClrPopoverType.DEFAULT]: 0,\n};\n\nfunction getOffset(key: ClrPopoverPosition, type: ClrPopoverType): Partial<ConnectedPosition> {\n const offset = POPOVER_OFFSETS[type] || 0;\n\n switch (key) {\n // TOP\n case ClrPopoverPosition.TOP_LEFT:\n case ClrPopoverPosition.TOP_MIDDLE:\n case ClrPopoverPosition.TOP_RIGHT:\n return {\n offsetY: -offset,\n offsetX: 0,\n } as ConnectedPosition;\n\n // LEFT\n case ClrPopoverPosition.LEFT_TOP:\n case ClrPopoverPosition.LEFT_MIDDLE:\n case ClrPopoverPosition.LEFT:\n case ClrPopoverPosition.LEFT_BOTTOM:\n return {\n offsetY: 0,\n offsetX: -offset,\n } as ConnectedPosition;\n\n // RIGHT\n case ClrPopoverPosition.RIGHT_TOP:\n case ClrPopoverPosition.RIGHT_MIDDLE:\n case ClrPopoverPosition.RIGHT:\n case ClrPopoverPosition.RIGHT_BOTTOM:\n return {\n offsetY: 0,\n offsetX: offset,\n } as ConnectedPosition;\n\n // BOTTOM and DEFAULT\n case ClrPopoverPosition.BOTTOM_RIGHT:\n case ClrPopoverPosition.BOTTOM_MIDDLE:\n case ClrPopoverPosition.BOTTOM_LEFT:\n default:\n return {\n offsetY: offset,\n offsetX: 0,\n } as ConnectedPosition;\n }\n}\n\nconst STANDARD_ORIGINS = {\n // TOP\n [ClrPopoverPosition.TOP_RIGHT]: { origin: ClrPosition.TOP_CENTER, content: ClrPosition.BOTTOM_LEFT },\n [ClrPopoverPosition.TOP_MIDDLE]: { origin: ClrPosition.TOP_CENTER, content: ClrPosition.BOTTOM_CENTER },\n [ClrPopoverPosition.TOP_LEFT]: { origin: ClrPosition.TOP_CENTER, content: ClrPosition.BOTTOM_RIGHT },\n\n // LEFT\n [ClrPopoverPosition.LEFT]: { origin: ClrPosition.LEFT_CENTER, content: ClrPosition.RIGHT_TOP },\n [ClrPopoverPosition.LEFT_TOP]: { origin: ClrPosition.LEFT_CENTER, content: ClrPosition.RIGHT_BOTTOM },\n [ClrPopoverPosition.LEFT_MIDDLE]: { origin: ClrPosition.LEFT_CENTER, content: ClrPosition.RIGHT_CENTER },\n [ClrPopoverPosition.LEFT_BOTTOM]: { origin: ClrPosition.LEFT_CENTER, content: ClrPosition.RIGHT_TOP },\n\n // RIGHT\n [ClrPopoverPosition.RIGHT]: { origin: ClrPosition.RIGHT_CENTER, content: ClrPosition.LEFT_TOP },\n [ClrPopoverPosition.RIGHT_TOP]: { origin: ClrPosition.RIGHT_CENTER, content: ClrPosition.LEFT_BOTTOM },\n [ClrPopoverPosition.RIGHT_MIDDLE]: { origin: ClrPosition.RIGHT_CENTER, content: ClrPosition.LEFT_CENTER },\n [ClrPopoverPosition.RIGHT_BOTTOM]: { origin: ClrPosition.RIGHT_CENTER, content: ClrPosition.LEFT_TOP },\n\n // BOTTOM\n [ClrPopoverPosition.BOTTOM_RIGHT]: { origin: ClrPosition.BOTTOM_CENTER, content: ClrPosition.TOP_LEFT },\n [ClrPopoverPosition.BOTTOM_MIDDLE]: { origin: ClrPosition.BOTTOM_CENTER, content: ClrPosition.TOP_CENTER },\n [ClrPopoverPosition.BOTTOM_LEFT]: { origin: ClrPosition.BOTTOM_CENTER, content: ClrPosition.TOP_RIGHT },\n};\n\nconst DROPDOWN_ORIGINS = {\n // TOP\n [ClrPopoverPosition.TOP_RIGHT]: { origin: ClrPosition.TOP_RIGHT, content: ClrPosition.BOTTOM_RIGHT },\n [ClrPopoverPosition.TOP_LEFT]: { origin: ClrPosition.TOP_LEFT, content: ClrPosition.BOTTOM_LEFT },\n\n // LEFT\n [ClrPopoverPosition.LEFT_TOP]: { origin: ClrPosition.LEFT_TOP, content: ClrPosition.TOP_RIGHT },\n [ClrPopoverPosition.LEFT_BOTTOM]: { origin: ClrPosition.LEFT_BOTTOM, content: ClrPosition.BOTTOM_RIGHT },\n\n // RIGHT\n [ClrPopoverPosition.RIGHT_TOP]: { origin: ClrPosition.RIGHT_TOP, content: ClrPosition.LEFT_TOP },\n [ClrPopoverPosition.RIGHT_BOTTOM]: { origin: ClrPosition.RIGHT_BOTTOM, content: ClrPosition.LEFT_BOTTOM },\n\n // BOTTOM\n [ClrPopoverPosition.BOTTOM_RIGHT]: { origin: ClrPosition.BOTTOM_LEFT, content: ClrPosition.TOP_RIGHT },\n [ClrPopoverPosition.BOTTOM_LEFT]: { origin: ClrPosition.BOTTOM_RIGHT, content: ClrPosition.TOP_LEFT },\n};\n\nexport function mapPopoverKeyToPosition(key: ClrPopoverPosition, type: ClrPopoverType): ConnectedPosition {\n let offset = getOffset(key, type);\n\n const defaultPosition = { origin: ClrPosition.BOTTOM_LEFT, content: ClrPosition.TOP_LEFT };\n const { origin, content } =\n (type === ClrPopoverType.DROPDOWN ? DROPDOWN_ORIGINS[key] : STANDARD_ORIGINS[key]) ?? defaultPosition;\n\n return {\n ...getOriginPosition(origin),\n ...getContentPosition(content),\n ...offset,\n panelClass: key,\n } as ConnectedPosition;\n}\n\nexport function getOriginPosition(key: ClrPosition): Partial<ConnectedPosition> {\n switch (key) {\n // TOP Positions\n case ClrPosition.TOP_LEFT:\n return {\n originX: 'start',\n originY: 'top',\n };\n case ClrPosition.TOP_CENTER:\n return {\n originX: 'center',\n originY: 'top',\n };\n case ClrPosition.TOP_RIGHT:\n return {\n originX: 'end',\n originY: 'top',\n };\n // LEFT Positions\n case ClrPosition.LEFT_TOP:\n return {\n originX: 'start',\n originY: 'top',\n };\n case ClrPosition.LEFT_CENTER:\n return {\n originX: 'start',\n originY: 'center',\n };\n case ClrPosition.LEFT_BOTTOM:\n return {\n originX: 'start',\n originY: 'bottom',\n };\n // RIGHT Positions\n case ClrPosition.RIGHT_TOP:\n return {\n originX: 'end',\n originY: 'top',\n };\n case ClrPosition.RIGHT_CENTER:\n return {\n originX: 'end',\n originY: 'center',\n };\n case ClrPosition.RIGHT_BOTTOM:\n return {\n originX: 'end',\n originY: 'bottom',\n };\n // BOTTOM positions and default\n case ClrPosition.BOTTOM_LEFT:\n return {\n originX: 'end',\n originY: 'bottom',\n };\n case ClrPosition.BOTTOM_CENTER:\n return {\n originX: 'center',\n originY: 'bottom',\n };\n case ClrPosition.BOTTOM_RIGHT:\n default:\n return {\n originX: 'start',\n originY: 'bottom',\n };\n }\n}\n\nexport function getContentPosition(key: ClrPosition): Partial<ConnectedPosition> {\n switch (key) {\n // TOP Positions\n case ClrPosition.TOP_LEFT:\n return {\n overlayX: 'start',\n overlayY: 'top',\n };\n case ClrPosition.TOP_CENTER:\n return {\n overlayX: 'center',\n overlayY: 'top',\n };\n case ClrPosition.TOP_RIGHT:\n return {\n overlayX: 'end',\n overlayY: 'top',\n };\n\n // LEFT Positions\n case ClrPosition.LEFT_TOP:\n return {\n overlayX: 'start',\n overlayY: 'top',\n };\n case ClrPosition.LEFT_CENTER:\n return {\n overlayX: 'start',\n overlayY: 'center',\n };\n case ClrPosition.LEFT_BOTTOM:\n return {\n overlayX: 'start',\n overlayY: 'bottom',\n };\n\n // RIGHT Positions\n case ClrPosition.RIGHT_TOP:\n return {\n overlayX: 'end',\n overlayY: 'top',\n };\n case ClrPosition.RIGHT_CENTER:\n return {\n overlayX: 'end',\n overlayY: 'center',\n };\n case ClrPosition.RIGHT_BOTTOM:\n return {\n overlayX: 'end',\n overlayY: 'bottom',\n };\n\n // BOTTOM positions and default\n case ClrPosition.BOTTOM_LEFT:\n return {\n overlayX: 'start',\n overlayY: 'bottom',\n };\n case ClrPosition.BOTTOM_CENTER:\n return {\n overlayX: 'center',\n overlayY: 'bottom',\n };\n case ClrPosition.BOTTOM_RIGHT:\n default:\n return {\n overlayX: 'end',\n overlayY: 'bottom',\n };\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { hasModifierKey } from '@angular/cdk/keycodes';\nimport {\n ConnectedPosition,\n FlexibleConnectedPositionStrategyOrigin,\n Overlay,\n OverlayConfig,\n OverlayContainer,\n OverlayRef,\n} from '@angular/cdk/overlay';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewInit,\n Directive,\n ElementRef,\n EmbeddedViewRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n PLATFORM_ID,\n SkipSelf,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { Keys } from '@clr/angular/utils';\nimport { fromEvent, merge, Subscription, switchMap, timer } from 'rxjs';\n\nimport { ClrPopoverService } from './providers/popover.service';\nimport {\n ClrPopoverPosition,\n ClrPopoverType,\n getConnectedPositions,\n mapPopoverKeyToPosition,\n} from './utils/popover-positions';\n\n/** @dynamic */\n@Directive({\n selector: '[clrPopoverContent]',\n})\nexport class ClrPopoverContent implements OnDestroy, AfterViewInit {\n private _outsideClickClose = true;\n private _scrollToClose = false;\n private view: EmbeddedViewRef<void>;\n private elementRef: ElementRef;\n private overlayRef: OverlayRef;\n private popoverType: ClrPopoverType = ClrPopoverType.DEFAULT;\n private _availablePositions: ConnectedPosition[] = [];\n private _position = ClrPopoverPosition.BOTTOM_LEFT;\n\n private subscriptions: Subscription[] = [];\n private openCloseSubscription: Subscription;\n private domPortal: DomPortal;\n private preferredPositionIsSet = false;\n private availablePositionsAreSet = false;\n private _preferredPosition: ConnectedPosition = {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top',\n panelClass: ClrPopoverPosition.LEFT_TOP,\n };\n private intersectionObserver: IntersectionObserver;\n\n constructor(\n element: ElementRef,\n private container: ViewContainerRef,\n @Optional() private template: TemplateRef<any>,\n overlayContainer: OverlayContainer,\n\n @Optional() @SkipSelf() private parent: ClrPopoverContent,\n private overlay: Overlay,\n @Inject(ClrPopoverService) private popoverService: ClrPopoverService,\n private zone: NgZone,\n @Inject(PLATFORM_ID) private platformId: any\n ) {\n popoverService.panelClass.push('clr-popover-content');\n\n overlayContainer.getContainerElement().classList.add('clr-overlay-container');\n\n if (!template) {\n this.elementRef = element;\n }\n }\n\n @Input('clrPopoverContent')\n set open(value: boolean) {\n this.popoverService.open = !!value;\n }\n\n @Input('clrPopoverContentAt')\n get contentAt(): string | ClrPopoverPosition | ConnectedPosition {\n return this.preferredPositionIsSet ? this._preferredPosition : this._position;\n }\n set contentAt(position: string | ClrPopoverPosition | ConnectedPosition) {\n if (typeof position === 'string') {\n if (!position || Object.values(ClrPopoverPosition).indexOf(position as ClrPopoverPosition) === -1) {\n return;\n }\n\n // set the popover values based on menu position\n this._position = position as ClrPopoverPosition;\n this.popoverService.positionChange(this._position);\n } else {\n this.preferredPositionIsSet = true;\n this._preferredPosition = position;\n }\n }\n\n @Input('clrPopoverContentAvailablePositions')\n set availablePositions(positions: ConnectedPosition[]) {\n this.availablePositionsAreSet = true;\n\n this._availablePositions = positions;\n }\n\n @Input('clrPopoverContentType')\n set contentType(type: ClrPopoverType) {\n this.popoverType = type;\n\n if (!this.availablePositionsAreSet) {\n this._availablePositions = getConnectedPositions(type);\n }\n }\n\n @Input('clrPopoverContentOutsideClickToClose')\n get outsideClickClose() {\n return this._outsideClickClose;\n }\n set outsideClickClose(clickToClose: boolean) {\n this._outsideClickClose = !!clickToClose;\n }\n\n @Input('clrPopoverContentScrollToClose')\n get scrollToClose() {\n return this._scrollToClose;\n }\n set scrollToClose(scrollToClose: boolean) {\n this._scrollToClose = !!scrollToClose;\n }\n\n @Input('clrPopoverContentOrigin')\n set contentOrigin(origin: FlexibleConnectedPositionStrategyOrigin) {\n if (origin instanceof Element) {\n this.popoverService.origin = new ElementRef(origin as HTMLElement);\n } else {\n this.popoverService.origin = origin;\n }\n }\n\n private get positionStrategy() {\n return this.overlay\n .position()\n .flexibleConnectedTo(this.popoverService.origin)\n .setOrigin(this.popoverService.origin)\n .withPush(true)\n .withPositions([this.preferredPosition, ...this._availablePositions])\n .withFlexibleDimensions(true);\n }\n\n private get preferredPosition(): ConnectedPosition {\n if (this.preferredPositionIsSet) {\n return this._preferredPosition;\n }\n\n // Default position is \"bottom-left\"\n return mapPopoverKeyToPosition(this._position, this.popoverType);\n }\n\n ngAfterViewInit() {\n if (this.popoverService.open) {\n this.showOverlay();\n }\n\n this.openCloseSubscription = this.popoverService.openChange.subscribe(change => {\n if (change) {\n this.showOverlay();\n } else {\n this.closePopover();\n }\n });\n }\n\n ngOnDestroy() {\n this.removeOverlay();\n this.openCloseSubscription?.unsubscribe();\n }\n\n private _createOverlayRef() {\n this.overlayRef = this.overlay.create(\n new OverlayConfig({\n // This is where we can pass externally facing inputs into the angular overlay API, and essentially proxy behaviors our users want directly to the CDK if they have them.\n positionStrategy: this.positionStrategy,\n // the scrolling behaviour is controlled by this popover content directive\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n panelClass: this.popoverService.panelClass,\n hasBackdrop: false,\n })\n );\n\n this.subscriptions.push(\n merge(this.popoverService.resetPositionsChange, this.popoverService.getPositionChange()).subscribe(() => {\n this.resetPosition();\n }),\n this.popoverService.updatePositionChange().subscribe(() => {\n this.overlayRef?.updatePosition();\n }),\n this.overlayRef.keydownEvents().subscribe(event => {\n if (event && event.key && event.key === Keys.Escape && !hasModifierKey(event)) {\n event.preventDefault();\n this.closePopover();\n }\n }),\n\n this.popoverService.originPoint\n ? this.createPointBasedOutsideClickSubscription()\n : this.createElementBasedOutsideClickSubscription()\n );\n }\n\n /**\n * Point-based origins (context menus) delay the subscription to avoid the\n * mouseup from the same right-click that opened the popover.\n */\n private createPointBasedOutsideClickSubscription(): Subscription {\n return timer(500)\n .pipe(switchMap(() => this.overlayRef.outsidePointerEvents()))\n .subscribe(event => {\n if (this.elementRef?.nativeElement?.contains(event.target)) {\n return;\n }\n\n if (this._outsideClickClose) {\n this.closePopover();\n }\n });\n }\n\n /**\n * Element-based origins close on outside clicks and suppress toggle-button\n * re-clicks so the popover doesn't immediately reopen.\n */\n private createElementBasedOutsideClickSubscription(): Subscription {\n return this.overlayRef.outsidePointerEvents().subscribe(event => {\n // web components (cds-icon) register as outside pointer events, so if the event target is inside the content panel return early\n if (this.elementRef?.nativeElement?.contains(event.target)) {\n return;\n }\n\n // Check if the same element that opened the popover is the same element triggering the outside pointer events (toggle button)\n const isToggleButton =\n this.popoverService.openEvent &&\n ((this.popoverService.openEvent.target as Element).contains(event.target as Element) ||\n (this.popoverService.openEvent.target as Element).parentElement.contains(event.target as Element) ||\n this.popoverService.openEvent.target === event.target);\n\n if (isToggleButton) {\n event.stopPropagation();\n }\n\n if (this._outsideClickClose || isToggleButton) {\n this.closePopover();\n }\n });\n }\n\n private resetPosition() {\n if (this.overlayRef) {\n this.overlayRef.updatePositionStrategy(this.positionStrategy);\n this.overlayRef.updatePosition();\n }\n }\n\n private closePopover() {\n if (!this.overlayRef) {\n return;\n }\n\n this.removeOverlay();\n this.popoverService.open = false;\n\n if (this.popoverService.originElement) {\n const shouldFocusTrigger =\n this.popoverType !== ClrPopoverType.TOOLTIP &&\n (document.activeElement === document.body ||\n document.activeElement === this.popoverService.originElement.nativeElement);\n\n if (shouldFocusTrigger) {\n this.popoverService.focusOrigin();\n }\n }\n }\n\n private showOverlay() {\n if (!this.overlayRef) {\n this._createOverlayRef();\n }\n\n if (!this.view && this.template) {\n this.view = this.container.createEmbeddedView(this.template);\n\n if (!this.elementRef) {\n const [rootNode] = this.view.rootNodes;\n this.elementRef = new ElementRef(rootNode); // So we know where/what to set close focus on\n }\n }\n\n if (!this.domPortal) {\n this.domPortal = new DomPortal<HTMLElement>(this.elementRef);\n this.overlayRef.attach(this.domPortal);\n }\n\n if (this.popoverService.originElement) {\n this.popoverService.originElement.nativeElement.scrollIntoView({\n behavior: 'instant',\n block: 'nearest',\n inline: 'nearest',\n });\n\n this.setupIntersectionObserver();\n }\n\n setTimeout(() => {\n // Get Scrollable Parents\n this.listenToScrollEvents();\n\n this.popoverService.popoverVisibleEmit(true);\n\n if (this.elementRef?.nativeElement?.focus) {\n this.elementRef.nativeElement.focus();\n }\n });\n }\n\n private removeOverlay(): void {\n this.subscriptions.forEach(s => s.unsubscribe());\n this.subscriptions = [];\n\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n this.overlayRef.dispose();\n }\n\n if (this.domPortal?.isAttached) {\n this.domPortal.detach();\n }\n\n if (this.view) {\n this.view.destroy();\n }\n\n this.overlayRef = null;\n this.domPortal = null;\n if (this.template) {\n this.elementRef = null;\n }\n this.view = null;\n\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n\n this.popoverService.popoverVisibleEmit(false);\n }\n\n private getScrollableParents(node: HTMLElement) {\n let parent = node;\n const overflowScrollKeys = ['auto', 'scroll', 'clip'];\n const scrollableParents: (HTMLDocument | HTMLElement)[] = [window.document];\n\n while (parent && !(parent instanceof HTMLHtmlElement)) {\n if (parent instanceof ShadowRoot) {\n parent = parent.host as HTMLElement;\n }\n\n const { overflowY, overflowX } = window.getComputedStyle(parent);\n\n if (overflowScrollKeys.includes(overflowY) || overflowScrollKeys.includes(overflowX)) {\n scrollableParents.push(parent);\n }\n\n parent = parent.parentNode as HTMLElement;\n }\n\n return scrollableParents;\n }\n\n /**\n * Uses IntersectionObserver to detect when the origin element leaves the screen.\n * This handles the \"Close on Scroll\" logic much cheaper than getBoundingClientRect.\n */\n private setupIntersectionObserver() {\n if (!this.popoverService.originElement || this.intersectionObserver) {\n return;\n }\n\n this.intersectionObserver = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n // If the origin is no longer visible (scrolled out of view)\n if (!entry.isIntersecting && this.popoverService.open) {\n this.zone.run(() => this.closePopover());\n }\n });\n },\n { root: null, threshold: 0.8 }\n );\n\n this.intersectionObserver.observe(this.popoverService.originElement.nativeElement);\n }\n\n private listenToScrollEvents() {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const originEl = this.popoverService.originPoint\n ? this.popoverService.pointTargetElement\n : this.getRootPopover(this)?.popoverService?.originElement?.nativeElement;\n\n this.listenToScrollForElementOrigin(originEl);\n }\n\n // Element origins track ancestor scroll containers to reposition or close.\n private listenToScrollForElementOrigin(originEl: HTMLElement) {\n const scrollableParents = this.getScrollableParents(originEl);\n\n this.zone.runOutsideAngular(() => {\n this.subscriptions.push(\n merge(...scrollableParents.map(parent => fromEvent(parent, 'scroll', { passive: true }))).subscribe(() => {\n if (this._scrollToClose) {\n this.zone.run(() => this.closePopover());\n return;\n }\n\n this.overlayRef?.updatePosition();\n })\n );\n });\n }\n\n private getRootPopover(popover: ClrPopoverContent): ClrPopoverContent {\n if (popover && popover.parent) {\n return this.getRootPopover(popover.parent);\n }\n\n return popover;\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { Directive, ElementRef } from '@angular/core';\n\nimport { ClrPopoverService } from './providers/popover.service';\n\n@Directive({\n selector: '[clrPopoverOrigin]',\n host: {\n '[class.clr-popover-origin]': 'true',\n },\n standalone: false,\n})\nexport class ClrPopoverOrigin {\n constructor(popoverService: ClrPopoverService, element: ElementRef<HTMLButtonElement>) {\n popoverService.origin = element;\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { ElementRef, InjectionToken } from '@angular/core';\n\nexport const POPOVER_HOST_ORIGIN = new InjectionToken<ElementRef>('POPOVER_HOST_ORIGIN');\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { Directive, HostListener, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { ClrPopoverService } from './providers/popover.service';\n\n@Directive({\n standalone: true,\n})\nexport class ClrStopEscapePropagationDirective implements OnInit, OnDestroy {\n private subscription: Subscription;\n private lastOpenChange: boolean | null = null;\n\n constructor(private popoverService: ClrPopoverService) {}\n\n ngOnInit() {\n this.subscription = this.popoverService.openChange.subscribe(open => {\n this.lastOpenChange = open;\n });\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n\n @HostListener('keyup.escape', ['$event'])\n onEscapeKey(event: KeyboardEvent) {\n if (this.lastOpenChange !== null) {\n if (this.lastOpenChange === false) {\n event.stopPropagation();\n }\n\n this.lastOpenChange = null;\n }\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { Directive, ElementRef } from '@angular/core';\n\nimport { POPOVER_HOST_ORIGIN } from './popover-host-origin.token';\nimport { ClrPopoverService } from './providers/popover.service';\nimport { ClrStopEscapePropagationDirective } from './stop-escape-propagation.directive';\n\n@Directive({\n standalone: true,\n providers: [ClrPopoverService, { provide: POPOVER_HOST_ORIGIN, useExisting: ElementRef }],\n hostDirectives: [ClrStopEscapePropagationDirective],\n})\nexport class ClrPopoverHostDirective {}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { Directive, EventEmitter, Input, OnDestroy, Output, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { ClrPopoverService } from './providers/popover.service';\n\n/**********\n *\n * @class ClrIfOpen\n *\n * @description\n * A structural directive that controls whether or not the associated TemplateRef is instantiated or not.\n * It makes use of a Component instance level service: ClrPopoverService to maintain state between itself and the component\n * using it in the component template.\n *\n */\n@Directive({\n selector: '[clrIfOpen]',\n})\nexport class ClrIfOpen implements OnDestroy {\n static ngAcceptInputType_open: boolean | '';\n\n /**********\n * @property openChange\n *\n * @description\n * An event emitter that emits when the open property is set to allow for 2way binding when the directive is\n * used with de-structured / de-sugared syntax.\n */\n @Output('clrIfOpenChange') openChange = new EventEmitter<boolean>(false);\n\n private subscriptions: Subscription[] = [];\n\n constructor(\n private popoverService: ClrPopoverService,\n private template: TemplateRef<any>,\n private container: ViewContainerRef\n ) {\n this.subscriptions.push(\n popoverService.openChange.subscribe(change => {\n // OPEN before overlay is built\n if (change) {\n container.createEmbeddedView(template);\n this.openChange.emit(change);\n }\n }),\n popoverService.popoverVisible.subscribe(change => {\n // CLOSE after overlay is destroyed\n if (!change) {\n container.clear();\n this.openChange.emit(change);\n }\n })\n );\n }\n\n /**\n * @description\n * A property that gets/sets ClrPopoverService.open with value.\n */\n @Input('clrIfOpen')\n get open() {\n return this.popoverService.open;\n }\n set open(value: boolean | string) {\n this.popoverService.open = value as boolean;\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n }\n\n /**\n * @description\n * Function that takes a boolean value and either created an embedded view for the associated ViewContainerRef or,\n * Clears all views from the ViewContainerRef\n *\n * @param value\n */\n updateView(value: boolean) {\n if (value) {\n this.container.createEmbeddedView(this.template);\n } else {\n this.container.clear();\n }\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { AfterViewInit, Directive, ElementRef, EventEmitter, HostListener, OnDestroy, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport { ClrPopoverService } from './providers/popover.service';\n\n@Directive({\n selector: '[clrPopoverCloseButton]',\n host: {\n '[class.clr-smart-close-button]': 'true',\n },\n standalone: false,\n})\nexport class ClrPopoverCloseButton implements OnDestroy, AfterViewInit {\n @Output('clrPopoverOnCloseChange') closeChange = new EventEmitter<void>();\n\n private subscriptions: Subscription[] = [];\n\n constructor(\n private elementRef: ElementRef<HTMLButtonElement>,\n private popoverService: ClrPopoverService\n ) {\n this.subscriptions.push(\n popoverService.openChange.pipe(filter(value => !value)).subscribe(() => {\n this.closeChange.emit();\n })\n );\n }\n\n @HostListener('click', ['$event'])\n handleClick(event: MouseEvent) {\n this.popoverService.toggleWithEvent(event);\n this.popoverService.focusOrigin();\n }\n\n ngAfterViewInit() {\n this.popoverService.closeButtonRef = this.elementRef;\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { Directive, EventEmitter, HostListener, OnDestroy, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { ClrPopoverService } from './providers/popover.service';\n\n@Directive({\n selector: '[clrPopoverOpenCloseButton]',\n host: {\n '[class.clr-smart-open-close]': 'true',\n },\n standalone: false,\n})\nexport class ClrPopoverOpenCloseButton implements OnDestroy {\n @Output('clrPopoverOpenCloseChange') openCloseChange = new EventEmitter<boolean>();\n\n private subscriptions: Subscription[] = [];\n\n constructor(private popoverService: ClrPopoverService) {\n this.subscriptions.push(\n popoverService.openChange.subscribe(change => {\n this.openCloseChange.emit(change);\n })\n );\n }\n\n @HostListener('click', ['$event'])\n handleClick(event: MouseEvent) {\n this.popoverService.toggleWithEvent(event);\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n }\n}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nimport { NgModule } from '@angular/core';\n\nimport { ClrIfOpen } from './if-open.directive';\nimport { ClrPopoverCloseButton } from './popover-close-button';\nimport { ClrPopoverContent } from './popover-content';\nimport { ClrPopoverOpenCloseButton } from './popover-open-close-button';\nimport { ClrPopoverOrigin } from './popover-origin';\n\n@NgModule({\n imports: [ClrPopoverContent, ClrIfOpen],\n declarations: [ClrPopoverOrigin, ClrPopoverCloseButton, ClrPopoverOpenCloseButton],\n exports: [ClrPopoverOrigin, ClrPopoverCloseButton, ClrPopoverOpenCloseButton, ClrPopoverContent, ClrIfOpen],\n})\nexport class ClrPopoverModuleNext {}\n","/*\n * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n * The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n\nexport * from './popover-content';\nexport * from './providers/popover.service';\nexport * from './popover-origin';\nexport * from './popover-host.directive';\nexport * from './stop-escape-propagation.directive';\nexport * from './popover-host-origin.token';\nexport * from './if-open.directive';\nexport * from './utils/popover-positions';\n\nexport { ClrPopoverModuleNext } from './popover.module';\nexport { ClrPopoverCloseButton } from './popover-close-button';\nexport { ClrPopoverOpenCloseButton } from './popover-open-close-button';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ClrPopoverService","i1.ClrStopEscapePropagationDirective"],"mappings":"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