ng-primitives 0.112.0 → 0.112.2
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/fesm2022/ng-primitives-internal.mjs +24 -1
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs +1 -1
- package/fesm2022/ng-primitives-portal.mjs +93 -8
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-progress.mjs +1 -1
- package/fesm2022/ng-primitives-progress.mjs.map +1 -1
- package/fesm2022/ng-primitives-separator.mjs +1 -1
- package/fesm2022/ng-primitives-separator.mjs.map +1 -1
- package/internal/index.d.ts +2 -0
- package/menu/index.d.ts +48 -1
- package/package.json +1 -1
- package/portal/index.d.ts +23 -0
- package/progress/index.d.ts +44 -20
- package/separator/index.d.ts +33 -7
|
@@ -75,6 +75,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
75
75
|
}], ctorParameters: () => [] });
|
|
76
76
|
function setupExitAnimation({ element, immediate, }) {
|
|
77
77
|
let state = 'enter';
|
|
78
|
+
let exitResolve = null;
|
|
78
79
|
function setState(newState) {
|
|
79
80
|
state = newState;
|
|
80
81
|
// remove all current animation state attributes
|
|
@@ -98,13 +99,18 @@ function setupExitAnimation({ element, immediate, }) {
|
|
|
98
99
|
return {
|
|
99
100
|
exit: () => {
|
|
100
101
|
return new Promise((resolve, reject) => {
|
|
102
|
+
exitResolve = resolve;
|
|
101
103
|
setState('exit');
|
|
102
104
|
const animations = element.getAnimations();
|
|
103
105
|
// Wait for the exit animations to finish
|
|
104
106
|
if (animations.length > 0) {
|
|
105
107
|
Promise.all(animations.map(anim => anim.finished))
|
|
106
|
-
.then(() =>
|
|
108
|
+
.then(() => {
|
|
109
|
+
exitResolve = null;
|
|
110
|
+
resolve();
|
|
111
|
+
})
|
|
107
112
|
.catch(err => {
|
|
113
|
+
exitResolve = null;
|
|
108
114
|
// AbortError is expected when element is removed during animation
|
|
109
115
|
// e.g. when the user navigates away to another page
|
|
110
116
|
// Note: Animation.finished can reject with DOMException which may not pass instanceof Error
|
|
@@ -117,10 +123,27 @@ function setupExitAnimation({ element, immediate, }) {
|
|
|
117
123
|
});
|
|
118
124
|
}
|
|
119
125
|
else {
|
|
126
|
+
exitResolve = null;
|
|
120
127
|
resolve();
|
|
121
128
|
}
|
|
122
129
|
});
|
|
123
130
|
},
|
|
131
|
+
cancel: () => {
|
|
132
|
+
if (state === 'exit') {
|
|
133
|
+
// Cancel any running animations
|
|
134
|
+
const animations = element.getAnimations();
|
|
135
|
+
for (const anim of animations) {
|
|
136
|
+
anim.cancel();
|
|
137
|
+
}
|
|
138
|
+
// Transition back to enter state
|
|
139
|
+
setState('enter');
|
|
140
|
+
// Resolve the pending exit promise so detach() completes
|
|
141
|
+
if (exitResolve) {
|
|
142
|
+
exitResolve();
|
|
143
|
+
exitResolve = null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
124
147
|
};
|
|
125
148
|
}
|
|
126
149
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-primitives-internal.mjs","sources":["../../../../packages/ng-primitives/internal/src/utilities/element-ref.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation-manager.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.ts","../../../../packages/ng-primitives/internal/src/utilities/resize.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-sort.ts","../../../../packages/ng-primitives/internal/src/utilities/mutation-observer.ts","../../../../packages/ng-primitives/internal/src/utilities/overflow.ts","../../../../packages/ng-primitives/internal/src/utilities/scrolling.ts","../../../../packages/ng-primitives/internal/src/ng-primitives-internal.ts"],"sourcesContent":["import { ElementRef, inject } from '@angular/core';\n\n/**\n * A simple utility function to inject an element reference with less boilerplate.\n * @returns The element reference.\n */\nexport function injectElementRef<T extends HTMLElement>(): ElementRef<T> {\n return inject(ElementRef);\n}\n","import { ClassProvider, inject, Injectable } from '@angular/core';\nimport type { NgpExitAnimation } from './exit-animation';\n\n@Injectable()\nexport class NgpExitAnimationManager {\n /** Store the instances of the exit animation directive. */\n private readonly instances: NgpExitAnimation[] = [];\n\n /** Add an instance to the manager. */\n add(instance: NgpExitAnimation): void {\n this.instances.push(instance);\n }\n\n /** Remove an instance from the manager. */\n remove(instance: NgpExitAnimation): void {\n const index = this.instances.indexOf(instance);\n if (index !== -1) {\n this.instances.splice(index, 1);\n }\n }\n\n /** Exit all instances. */\n async exit(): Promise<void> {\n await Promise.all(this.instances.map(instance => instance.exit()));\n }\n}\n\nexport function provideExitAnimationManager(): ClassProvider {\n return { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager };\n}\n\nexport function injectExitAnimationManager(): NgpExitAnimationManager {\n return inject(NgpExitAnimationManager);\n}\n","import { Directive, OnDestroy } from '@angular/core';\nimport { injectElementRef } from '../utilities/element-ref';\nimport { injectExitAnimationManager } from './exit-animation-manager';\n\n@Directive({\n selector: '[ngpExitAnimation]',\n exportAs: 'ngpExitAnimation',\n})\nexport class NgpExitAnimation implements OnDestroy {\n /** The animation manager. */\n private readonly animationManager = injectExitAnimationManager();\n /** Access the element reference. */\n protected readonly elementRef = injectElementRef();\n\n /** Exist animation reference. */\n protected readonly ref = setupExitAnimation({ element: this.elementRef.nativeElement });\n\n constructor() {\n this.animationManager.add(this);\n }\n\n ngOnDestroy(): void {\n this.animationManager.remove(this);\n }\n\n /** Mark the element as exiting. */\n async exit(): Promise<void> {\n await this.ref.exit();\n }\n}\n\ninterface NgpExitAnimationOptions {\n /** The element to animate. */\n element: HTMLElement;\n /** If true, skip requestAnimationFrame delay and set enter state immediately. */\n immediate?: boolean;\n}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n}\n\nexport function setupExitAnimation({\n element,\n immediate,\n}: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\n\n function setState(newState: 'enter' | 'exit') {\n state = newState;\n\n // remove all current animation state attributes\n element.removeAttribute('data-enter');\n element.removeAttribute('data-exit');\n\n // add the new animation state attribute\n if (state === 'enter') {\n element.setAttribute('data-enter', '');\n } else if (state === 'exit') {\n element.setAttribute('data-exit', '');\n }\n }\n\n // Set the initial state to 'enter' - immediately if instant, otherwise next frame\n if (immediate) {\n setState('enter');\n } else {\n requestAnimationFrame(() => setState('enter'));\n }\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\n setState('exit');\n\n const animations = element.getAnimations();\n\n // Wait for the exit animations to finish\n if (animations.length > 0) {\n Promise.all(animations.map(anim => anim.finished))\n .then(() => resolve())\n .catch(err => {\n // AbortError is expected when element is removed during animation\n // e.g. when the user navigates away to another page\n // Note: Animation.finished can reject with DOMException which may not pass instanceof Error\n if ((err as { name?: string })?.name === 'AbortError') {\n resolve();\n } else {\n reject(err);\n }\n });\n } else {\n resolve();\n }\n });\n },\n };\n}\n","/**\n * This implementation is heavily inspired by the great work on ngextension!\n * https://github.com/ngxtension/ngxtension-platform/blob/main/libs/ngxtension/explicit-effect/src/explicit-effect.ts\n */\nimport {\n CreateEffectOptions,\n EffectCleanupRegisterFn,\n EffectRef,\n effect,\n untracked,\n} from '@angular/core';\n\n/**\n * We want to have the Tuple in order to use the types in the function signature\n */\ntype ExplicitEffectValues<T> = {\n [K in keyof T]: () => T[K];\n};\n\n/**\n * This explicit effect function will take the dependencies and the function to run when the dependencies change.\n * @param deps - The dependencies that the effect will run on\n * @param fn - The function to run when the dependencies change\n * @param options - The options for the effect with the addition of defer (it allows the computation to run on first change, not immediately)\n */\nexport function explicitEffect<Input extends readonly unknown[], Params = Input>(\n deps: readonly [...ExplicitEffectValues<Input>],\n fn: (deps: Params, onCleanup: EffectCleanupRegisterFn) => void,\n options?: CreateEffectOptions,\n): EffectRef {\n return effect(onCleanup => {\n const depValues = deps.map(s => s());\n untracked(() => fn(depValues as Params, onCleanup));\n }, options);\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { CSP_NONCE, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\n/**\n * A utility service for injecting styles into the document.\n * Angular doesn't allow directives to specify styles, only components.\n * As we ship directives, occasionally we need to associate styles with them.\n * This service allows us to programmatically inject styles into the document.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StyleInjector {\n /**\n * Access the CSP nonce\n */\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Detect the platform.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n /**\n * Store the map of style elements with their unique identifiers.\n */\n private readonly styleElements = new Map<string, HTMLStyleElement>();\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.collectServerStyles();\n }\n }\n\n /**\n * Inject a style into the document.\n * @param id The unique identifier for the style.\n * @param style The style to inject.\n */\n add(id: string, style: string): void {\n if (this.styleElements.has(id)) {\n return;\n }\n\n const styleElement = this.document.createElement('style');\n styleElement.setAttribute('data-ngp-style', id);\n styleElement.textContent = style;\n\n // If a CSP nonce is provided, set it on the style element\n if (this.cspNonce) {\n styleElement.setAttribute('nonce', this.cspNonce);\n }\n\n this.document.head.appendChild(styleElement);\n this.styleElements.set(id, styleElement);\n }\n\n /**\n * Remove a style from the document.\n * @param id The unique identifier for the style.\n */\n remove(id: string): void {\n const styleElement = this.styleElements.get(id);\n\n if (styleElement) {\n this.document.head.removeChild(styleElement);\n this.styleElements.delete(id);\n }\n }\n\n /**\n * Collect any styles that were rendered by the server.\n */\n private collectServerStyles(): void {\n const styleElements = this.document.querySelectorAll<HTMLStyleElement>('style[data-ngp-style]');\n\n styleElements.forEach(styleElement => {\n const id = styleElement.getAttribute('data-ngp-style');\n\n if (id) {\n this.styleElements.set(id, styleElement);\n }\n });\n }\n}\n\nexport function injectStyleInjector(): StyleInjector {\n return inject(StyleInjector);\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n DestroyRef,\n effect,\n inject,\n Injector,\n PLATFORM_ID,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { isUndefined, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { explicitEffect } from '../signals/explicit-effect';\nimport { injectElementRef } from './element-ref';\n\ninterface NgpResizeObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\n/**\n * A simple helper function to create a resize observer as an RxJS Observable.\n * @param element The element to observe for resize events.\n * @returns The resize event as an Observable.\n */\nexport function fromResizeEvent(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpResizeObserverOptions = {},\n): Observable<Dimensions> {\n const platformId = injector?.get(PLATFORM_ID) ?? inject(PLATFORM_ID);\n\n return new Observable(observable => {\n // ResizeObserver may not be available in all environments, so check for its existence\n if (isPlatformServer(platformId) || isUndefined(window?.ResizeObserver)) {\n // ResizeObserver is not available (SSR or unsupported browser)\n // Complete the observable without emitting any values\n observable.complete();\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n if (!observer) {\n observer = new ResizeObserver(entries => {\n // if there are no entries, ignore the event\n if (!entries.length) {\n return;\n }\n\n // otherwise, take the first entry and emit the dimensions\n const entry = entries[0];\n\n let width: number, height: number;\n\n if ('borderBoxSize' in entry) {\n const borderSizeEntry = entry['borderBoxSize'];\n // this may be different across browsers so normalize it\n const borderSize = Array.isArray(borderSizeEntry)\n ? borderSizeEntry[0]\n : borderSizeEntry;\n\n width = borderSize['inlineSize'];\n height = borderSize['blockSize'];\n } else {\n // fallback for browsers that don't support borderBoxSize\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n // For inline elements, ResizeObserver may report 0,0 dimensions\n // Use getBoundingClientRect as fallback for inline elements with zero dimensions\n if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {\n const rect = element.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n\n observable.next({ width, height });\n });\n\n observer.observe(element);\n }\n }\n\n setupOrTeardownObserver();\n\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n\n/**\n * A utility function to observe any element for resize events and return the dimensions as a signal.\n */\nexport function observeResize(elementFn: () => HTMLElement | undefined): Signal<Dimensions> {\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n\n // store the subscription to the resize event\n let subscription: Subscription | null = null;\n\n effect(() => {\n const targetElement = elementFn();\n\n untracked(() => {\n if (!targetElement) {\n return;\n }\n\n // if we already have a subscription, unsubscribe from it\n subscription?.unsubscribe();\n\n // create a new subscription to the resize event\n subscription = fromResizeEvent(targetElement, { injector })\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(event => dimensions.set({ width: event.width, height: event.height }));\n });\n });\n\n return dimensions;\n}\n\nexport interface Dimensions {\n width: number;\n height: number;\n}\n\n/**\n * A simple utility to get the dimensions of an element as a signal.\n */\nexport function injectDimensions(): Signal<Dimensions> {\n const elementRef = injectElementRef<HTMLElement>();\n const destroyRef = inject(DestroyRef);\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n\n fromResizeEvent(elementRef.nativeElement)\n .pipe(\n safeTakeUntilDestroyed(destroyRef),\n map(({ width, height }) => ({ width, height })),\n )\n .subscribe(event => dimensions.set(event));\n\n return dimensions;\n}\n","import { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromResizeEvent } from './resize';\n\n/**\n * Whenever an element is removed from the DOM, we call the callback.\n * @param element The element to watch for removal.\n * @param callback The callback to call when the element is removed.\n */\nexport function onDomRemoval(element: HTMLElement, callback: () => void): void {\n const platform = inject(PLATFORM_ID);\n\n // Dont run this on the server\n if (isPlatformServer(platform)) {\n return;\n }\n\n // This is a bit of a hack, but it works. If the element dimensions become zero,\n // it's likely that the element has been removed from the DOM.\n fromResizeEvent(element)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(dimensions => {\n // we check the dimensions first to short-circuit the check as it's faster\n if (dimensions.width === 0 && dimensions.height === 0 && !document.body.contains(element)) {\n callback();\n }\n });\n}\n","/**\n * This function sorts DOM elements based on their position in the document.\n * However items can also explitly define their index in which case it will be used\n * to sort the elements first. This allows for both natural DOM order sorting as well\n * as custom order for cases like virtual scrolling where items might be rendered\n * out of order.\n */\nexport function domSort<T>(\n items: T[],\n getElement: (item: T) => HTMLElement,\n getIndex?: (item: T) => number | undefined,\n): T[] {\n return items.slice().sort((a, b) => {\n const indexA = getIndex?.(a);\n const indexB = getIndex?.(b);\n\n if (indexA !== undefined && indexB !== undefined) {\n return indexA - indexB;\n }\n\n if (indexA !== undefined) {\n return -1;\n }\n\n if (indexB !== undefined) {\n return 1;\n }\n\n const elementA = getElement(a);\n const elementB = getElement(b);\n\n return elementA.compareDocumentPosition(elementB) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n","import { Injector, Signal, signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { explicitEffect } from '../signals/explicit-effect';\n\ninterface NgpMutationObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n /**\n * Whether the childList should be observed.\n */\n childList?: boolean;\n /**\n * Whether the subtree should be observed.\n */\n subtree?: boolean;\n /**\n * Whether the attributes should be observed.\n */\n attributes?: boolean;\n /**\n * Whether the characterData should be observed.\n */\n characterData?: boolean;\n /**\n * Whether the attributeFilter should be observed.\n */\n attributeFilter?: string[];\n}\n\n/**\n * This function sets up a mutation observer to listen for changes in the DOM.\n * It will stop listening when the `disabled` signal is true, and re-enable when it is false.\n * @param options - Options for the mutation observer\n */\nexport function fromMutationObserver(\n element: HTMLElement,\n {\n childList,\n subtree,\n attributes,\n characterData,\n disabled = signal(false),\n injector,\n }: NgpMutationObserverOptions = {},\n): Observable<MutationRecord[]> {\n return new Observable<MutationRecord[]>(observable => {\n let observer: MutationObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n observer = new MutationObserver(mutations => observable.next(mutations));\n observer.observe(element, { childList, subtree, attributes, characterData });\n }\n\n setupOrTeardownObserver();\n\n // any time the disabled state changes, we need to re-evaluate the observer\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n","import { DestroyRef, inject, Injector, Signal, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { merge } from 'rxjs';\nimport { fromMutationObserver } from './mutation-observer';\nimport { fromResizeEvent } from './resize';\n\ninterface NgpOverflowListenerOptions {\n /**\n * Whether to listen for overflow changes.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\nexport function setupOverflowListener(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpOverflowListenerOptions,\n): Signal<boolean> {\n const hasOverflow = signal<boolean>(false);\n const destroyRef = injector?.get(DestroyRef) ?? inject(DestroyRef);\n\n // Merge both observables and update hasOverflow on any event\n\n merge(\n fromResizeEvent(element, { disabled, injector }),\n fromMutationObserver(element, { disabled, injector, characterData: true }),\n )\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(() =>\n hasOverflow.set(\n element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight,\n ),\n );\n\n return hasOverflow;\n}\n","function getScrollableAncestor(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll)/.test(style.overflowY) || /(auto|scroll)/.test(style.overflowX)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\nexport function scrollIntoViewIfNeeded(element: HTMLElement): void {\n const scrollableAncestor = getScrollableAncestor(element);\n if (!scrollableAncestor) return;\n\n const parentRect = scrollableAncestor.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n if (elementRect.top < parentRect.top) {\n scrollableAncestor.scrollTop -= parentRect.top - elementRect.top;\n } else if (elementRect.bottom > parentRect.bottom) {\n scrollableAncestor.scrollTop += elementRect.bottom - parentRect.bottom;\n }\n\n if (elementRect.left < parentRect.left) {\n scrollableAncestor.scrollLeft -= parentRect.left - elementRect.left;\n } else if (elementRect.right > parentRect.right) {\n scrollableAncestor.scrollLeft += elementRect.right - parentRect.right;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-primitives-internal.mjs","sources":["../../../../packages/ng-primitives/internal/src/utilities/element-ref.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation-manager.ts","../../../../packages/ng-primitives/internal/src/exit-animation/exit-animation.ts","../../../../packages/ng-primitives/internal/src/signals/explicit-effect.ts","../../../../packages/ng-primitives/internal/src/style-injector/style-injector.ts","../../../../packages/ng-primitives/internal/src/utilities/resize.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-removal.ts","../../../../packages/ng-primitives/internal/src/utilities/dom-sort.ts","../../../../packages/ng-primitives/internal/src/utilities/mutation-observer.ts","../../../../packages/ng-primitives/internal/src/utilities/overflow.ts","../../../../packages/ng-primitives/internal/src/utilities/scrolling.ts","../../../../packages/ng-primitives/internal/src/ng-primitives-internal.ts"],"sourcesContent":["import { ElementRef, inject } from '@angular/core';\n\n/**\n * A simple utility function to inject an element reference with less boilerplate.\n * @returns The element reference.\n */\nexport function injectElementRef<T extends HTMLElement>(): ElementRef<T> {\n return inject(ElementRef);\n}\n","import { ClassProvider, inject, Injectable } from '@angular/core';\nimport type { NgpExitAnimation } from './exit-animation';\n\n@Injectable()\nexport class NgpExitAnimationManager {\n /** Store the instances of the exit animation directive. */\n private readonly instances: NgpExitAnimation[] = [];\n\n /** Add an instance to the manager. */\n add(instance: NgpExitAnimation): void {\n this.instances.push(instance);\n }\n\n /** Remove an instance from the manager. */\n remove(instance: NgpExitAnimation): void {\n const index = this.instances.indexOf(instance);\n if (index !== -1) {\n this.instances.splice(index, 1);\n }\n }\n\n /** Exit all instances. */\n async exit(): Promise<void> {\n await Promise.all(this.instances.map(instance => instance.exit()));\n }\n}\n\nexport function provideExitAnimationManager(): ClassProvider {\n return { provide: NgpExitAnimationManager, useClass: NgpExitAnimationManager };\n}\n\nexport function injectExitAnimationManager(): NgpExitAnimationManager {\n return inject(NgpExitAnimationManager);\n}\n","import { Directive, OnDestroy } from '@angular/core';\nimport { injectElementRef } from '../utilities/element-ref';\nimport { injectExitAnimationManager } from './exit-animation-manager';\n\n@Directive({\n selector: '[ngpExitAnimation]',\n exportAs: 'ngpExitAnimation',\n})\nexport class NgpExitAnimation implements OnDestroy {\n /** The animation manager. */\n private readonly animationManager = injectExitAnimationManager();\n /** Access the element reference. */\n protected readonly elementRef = injectElementRef();\n\n /** Exist animation reference. */\n protected readonly ref = setupExitAnimation({ element: this.elementRef.nativeElement });\n\n constructor() {\n this.animationManager.add(this);\n }\n\n ngOnDestroy(): void {\n this.animationManager.remove(this);\n }\n\n /** Mark the element as exiting. */\n async exit(): Promise<void> {\n await this.ref.exit();\n }\n}\n\ninterface NgpExitAnimationOptions {\n /** The element to animate. */\n element: HTMLElement;\n /** If true, skip requestAnimationFrame delay and set enter state immediately. */\n immediate?: boolean;\n}\n\nexport interface NgpExitAnimationRef {\n /** Mark the element as exiting and wait for the animation to finish. */\n exit: () => Promise<void>;\n /** Cancel an in-progress exit animation and transition back to enter state. */\n cancel: () => void;\n}\n\nexport function setupExitAnimation({\n element,\n immediate,\n}: NgpExitAnimationOptions): NgpExitAnimationRef {\n let state: 'enter' | 'exit' = 'enter';\n let exitResolve: (() => void) | null = null;\n\n function setState(newState: 'enter' | 'exit') {\n state = newState;\n\n // remove all current animation state attributes\n element.removeAttribute('data-enter');\n element.removeAttribute('data-exit');\n\n // add the new animation state attribute\n if (state === 'enter') {\n element.setAttribute('data-enter', '');\n } else if (state === 'exit') {\n element.setAttribute('data-exit', '');\n }\n }\n\n // Set the initial state to 'enter' - immediately if instant, otherwise next frame\n if (immediate) {\n setState('enter');\n } else {\n requestAnimationFrame(() => setState('enter'));\n }\n\n return {\n exit: () => {\n return new Promise((resolve, reject) => {\n exitResolve = resolve;\n setState('exit');\n\n const animations = element.getAnimations();\n\n // Wait for the exit animations to finish\n if (animations.length > 0) {\n Promise.all(animations.map(anim => anim.finished))\n .then(() => {\n exitResolve = null;\n resolve();\n })\n .catch(err => {\n exitResolve = null;\n // AbortError is expected when element is removed during animation\n // e.g. when the user navigates away to another page\n // Note: Animation.finished can reject with DOMException which may not pass instanceof Error\n if ((err as { name?: string })?.name === 'AbortError') {\n resolve();\n } else {\n reject(err);\n }\n });\n } else {\n exitResolve = null;\n resolve();\n }\n });\n },\n cancel: () => {\n if (state === 'exit') {\n // Cancel any running animations\n const animations = element.getAnimations();\n for (const anim of animations) {\n anim.cancel();\n }\n // Transition back to enter state\n setState('enter');\n // Resolve the pending exit promise so detach() completes\n if (exitResolve) {\n exitResolve();\n exitResolve = null;\n }\n }\n },\n };\n}\n","/**\n * This implementation is heavily inspired by the great work on ngextension!\n * https://github.com/ngxtension/ngxtension-platform/blob/main/libs/ngxtension/explicit-effect/src/explicit-effect.ts\n */\nimport {\n CreateEffectOptions,\n EffectCleanupRegisterFn,\n EffectRef,\n effect,\n untracked,\n} from '@angular/core';\n\n/**\n * We want to have the Tuple in order to use the types in the function signature\n */\ntype ExplicitEffectValues<T> = {\n [K in keyof T]: () => T[K];\n};\n\n/**\n * This explicit effect function will take the dependencies and the function to run when the dependencies change.\n * @param deps - The dependencies that the effect will run on\n * @param fn - The function to run when the dependencies change\n * @param options - The options for the effect with the addition of defer (it allows the computation to run on first change, not immediately)\n */\nexport function explicitEffect<Input extends readonly unknown[], Params = Input>(\n deps: readonly [...ExplicitEffectValues<Input>],\n fn: (deps: Params, onCleanup: EffectCleanupRegisterFn) => void,\n options?: CreateEffectOptions,\n): EffectRef {\n return effect(onCleanup => {\n const depValues = deps.map(s => s());\n untracked(() => fn(depValues as Params, onCleanup));\n }, options);\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { CSP_NONCE, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\n/**\n * A utility service for injecting styles into the document.\n * Angular doesn't allow directives to specify styles, only components.\n * As we ship directives, occasionally we need to associate styles with them.\n * This service allows us to programmatically inject styles into the document.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StyleInjector {\n /**\n * Access the CSP nonce\n */\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n /**\n * Access the document.\n */\n private readonly document = inject(DOCUMENT);\n\n /**\n * Detect the platform.\n */\n private readonly platformId = inject(PLATFORM_ID);\n\n /**\n * Store the map of style elements with their unique identifiers.\n */\n private readonly styleElements = new Map<string, HTMLStyleElement>();\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.collectServerStyles();\n }\n }\n\n /**\n * Inject a style into the document.\n * @param id The unique identifier for the style.\n * @param style The style to inject.\n */\n add(id: string, style: string): void {\n if (this.styleElements.has(id)) {\n return;\n }\n\n const styleElement = this.document.createElement('style');\n styleElement.setAttribute('data-ngp-style', id);\n styleElement.textContent = style;\n\n // If a CSP nonce is provided, set it on the style element\n if (this.cspNonce) {\n styleElement.setAttribute('nonce', this.cspNonce);\n }\n\n this.document.head.appendChild(styleElement);\n this.styleElements.set(id, styleElement);\n }\n\n /**\n * Remove a style from the document.\n * @param id The unique identifier for the style.\n */\n remove(id: string): void {\n const styleElement = this.styleElements.get(id);\n\n if (styleElement) {\n this.document.head.removeChild(styleElement);\n this.styleElements.delete(id);\n }\n }\n\n /**\n * Collect any styles that were rendered by the server.\n */\n private collectServerStyles(): void {\n const styleElements = this.document.querySelectorAll<HTMLStyleElement>('style[data-ngp-style]');\n\n styleElements.forEach(styleElement => {\n const id = styleElement.getAttribute('data-ngp-style');\n\n if (id) {\n this.styleElements.set(id, styleElement);\n }\n });\n }\n}\n\nexport function injectStyleInjector(): StyleInjector {\n return inject(StyleInjector);\n}\n","import { isPlatformServer } from '@angular/common';\nimport {\n DestroyRef,\n effect,\n inject,\n Injector,\n PLATFORM_ID,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { isUndefined, safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { explicitEffect } from '../signals/explicit-effect';\nimport { injectElementRef } from './element-ref';\n\ninterface NgpResizeObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\n/**\n * A simple helper function to create a resize observer as an RxJS Observable.\n * @param element The element to observe for resize events.\n * @returns The resize event as an Observable.\n */\nexport function fromResizeEvent(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpResizeObserverOptions = {},\n): Observable<Dimensions> {\n const platformId = injector?.get(PLATFORM_ID) ?? inject(PLATFORM_ID);\n\n return new Observable(observable => {\n // ResizeObserver may not be available in all environments, so check for its existence\n if (isPlatformServer(platformId) || isUndefined(window?.ResizeObserver)) {\n // ResizeObserver is not available (SSR or unsupported browser)\n // Complete the observable without emitting any values\n observable.complete();\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n if (!observer) {\n observer = new ResizeObserver(entries => {\n // if there are no entries, ignore the event\n if (!entries.length) {\n return;\n }\n\n // otherwise, take the first entry and emit the dimensions\n const entry = entries[0];\n\n let width: number, height: number;\n\n if ('borderBoxSize' in entry) {\n const borderSizeEntry = entry['borderBoxSize'];\n // this may be different across browsers so normalize it\n const borderSize = Array.isArray(borderSizeEntry)\n ? borderSizeEntry[0]\n : borderSizeEntry;\n\n width = borderSize['inlineSize'];\n height = borderSize['blockSize'];\n } else {\n // fallback for browsers that don't support borderBoxSize\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n // For inline elements, ResizeObserver may report 0,0 dimensions\n // Use getBoundingClientRect as fallback for inline elements with zero dimensions\n if ((width === 0 || height === 0) && getComputedStyle(element).display === 'inline') {\n const rect = element.getBoundingClientRect();\n width = rect.width;\n height = rect.height;\n }\n\n observable.next({ width, height });\n });\n\n observer.observe(element);\n }\n }\n\n setupOrTeardownObserver();\n\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n\n/**\n * A utility function to observe any element for resize events and return the dimensions as a signal.\n */\nexport function observeResize(elementFn: () => HTMLElement | undefined): Signal<Dimensions> {\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n\n // store the subscription to the resize event\n let subscription: Subscription | null = null;\n\n effect(() => {\n const targetElement = elementFn();\n\n untracked(() => {\n if (!targetElement) {\n return;\n }\n\n // if we already have a subscription, unsubscribe from it\n subscription?.unsubscribe();\n\n // create a new subscription to the resize event\n subscription = fromResizeEvent(targetElement, { injector })\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(event => dimensions.set({ width: event.width, height: event.height }));\n });\n });\n\n return dimensions;\n}\n\nexport interface Dimensions {\n width: number;\n height: number;\n}\n\n/**\n * A simple utility to get the dimensions of an element as a signal.\n */\nexport function injectDimensions(): Signal<Dimensions> {\n const elementRef = injectElementRef<HTMLElement>();\n const destroyRef = inject(DestroyRef);\n const dimensions = signal<Dimensions>({ width: 0, height: 0 });\n\n fromResizeEvent(elementRef.nativeElement)\n .pipe(\n safeTakeUntilDestroyed(destroyRef),\n map(({ width, height }) => ({ width, height })),\n )\n .subscribe(event => dimensions.set(event));\n\n return dimensions;\n}\n","import { isPlatformServer } from '@angular/common';\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { fromResizeEvent } from './resize';\n\n/**\n * Whenever an element is removed from the DOM, we call the callback.\n * @param element The element to watch for removal.\n * @param callback The callback to call when the element is removed.\n */\nexport function onDomRemoval(element: HTMLElement, callback: () => void): void {\n const platform = inject(PLATFORM_ID);\n\n // Dont run this on the server\n if (isPlatformServer(platform)) {\n return;\n }\n\n // This is a bit of a hack, but it works. If the element dimensions become zero,\n // it's likely that the element has been removed from the DOM.\n fromResizeEvent(element)\n .pipe(safeTakeUntilDestroyed())\n .subscribe(dimensions => {\n // we check the dimensions first to short-circuit the check as it's faster\n if (dimensions.width === 0 && dimensions.height === 0 && !document.body.contains(element)) {\n callback();\n }\n });\n}\n","/**\n * This function sorts DOM elements based on their position in the document.\n * However items can also explitly define their index in which case it will be used\n * to sort the elements first. This allows for both natural DOM order sorting as well\n * as custom order for cases like virtual scrolling where items might be rendered\n * out of order.\n */\nexport function domSort<T>(\n items: T[],\n getElement: (item: T) => HTMLElement,\n getIndex?: (item: T) => number | undefined,\n): T[] {\n return items.slice().sort((a, b) => {\n const indexA = getIndex?.(a);\n const indexB = getIndex?.(b);\n\n if (indexA !== undefined && indexB !== undefined) {\n return indexA - indexB;\n }\n\n if (indexA !== undefined) {\n return -1;\n }\n\n if (indexB !== undefined) {\n return 1;\n }\n\n const elementA = getElement(a);\n const elementB = getElement(b);\n\n return elementA.compareDocumentPosition(elementB) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n}\n","import { Injector, Signal, signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { explicitEffect } from '../signals/explicit-effect';\n\ninterface NgpMutationObserverOptions {\n /**\n * Whether to listen for events.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n /**\n * Whether the childList should be observed.\n */\n childList?: boolean;\n /**\n * Whether the subtree should be observed.\n */\n subtree?: boolean;\n /**\n * Whether the attributes should be observed.\n */\n attributes?: boolean;\n /**\n * Whether the characterData should be observed.\n */\n characterData?: boolean;\n /**\n * Whether the attributeFilter should be observed.\n */\n attributeFilter?: string[];\n}\n\n/**\n * This function sets up a mutation observer to listen for changes in the DOM.\n * It will stop listening when the `disabled` signal is true, and re-enable when it is false.\n * @param options - Options for the mutation observer\n */\nexport function fromMutationObserver(\n element: HTMLElement,\n {\n childList,\n subtree,\n attributes,\n characterData,\n disabled = signal(false),\n injector,\n }: NgpMutationObserverOptions = {},\n): Observable<MutationRecord[]> {\n return new Observable<MutationRecord[]>(observable => {\n let observer: MutationObserver | null = null;\n\n function setupOrTeardownObserver() {\n if (disabled()) {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n return;\n }\n\n observer = new MutationObserver(mutations => observable.next(mutations));\n observer.observe(element, { childList, subtree, attributes, characterData });\n }\n\n setupOrTeardownObserver();\n\n // any time the disabled state changes, we need to re-evaluate the observer\n explicitEffect([disabled], () => setupOrTeardownObserver(), { injector });\n\n return () => observer?.disconnect();\n });\n}\n","import { DestroyRef, inject, Injector, Signal, signal } from '@angular/core';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { merge } from 'rxjs';\nimport { fromMutationObserver } from './mutation-observer';\nimport { fromResizeEvent } from './resize';\n\ninterface NgpOverflowListenerOptions {\n /**\n * Whether to listen for overflow changes.\n */\n disabled?: Signal<boolean>;\n /**\n * The injector to use when called from outside of the injector context.\n */\n injector?: Injector;\n}\n\nexport function setupOverflowListener(\n element: HTMLElement,\n { disabled = signal(false), injector }: NgpOverflowListenerOptions,\n): Signal<boolean> {\n const hasOverflow = signal<boolean>(false);\n const destroyRef = injector?.get(DestroyRef) ?? inject(DestroyRef);\n\n // Merge both observables and update hasOverflow on any event\n\n merge(\n fromResizeEvent(element, { disabled, injector }),\n fromMutationObserver(element, { disabled, injector, characterData: true }),\n )\n .pipe(safeTakeUntilDestroyed(destroyRef))\n .subscribe(() =>\n hasOverflow.set(\n element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight,\n ),\n );\n\n return hasOverflow;\n}\n","function getScrollableAncestor(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll)/.test(style.overflowY) || /(auto|scroll)/.test(style.overflowX)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\nexport function scrollIntoViewIfNeeded(element: HTMLElement): void {\n const scrollableAncestor = getScrollableAncestor(element);\n if (!scrollableAncestor) return;\n\n const parentRect = scrollableAncestor.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n if (elementRect.top < parentRect.top) {\n scrollableAncestor.scrollTop -= parentRect.top - elementRect.top;\n } else if (elementRect.bottom > parentRect.bottom) {\n scrollableAncestor.scrollTop += elementRect.bottom - parentRect.bottom;\n }\n\n if (elementRect.left < parentRect.left) {\n scrollableAncestor.scrollLeft -= parentRect.left - elementRect.left;\n } else if (elementRect.right > parentRect.right) {\n scrollableAncestor.scrollLeft += elementRect.right - parentRect.right;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1186,5 +1186,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
1186
1186
|
* Generated bundle index. Do not edit.
|
|
1187
1187
|
*/
|
|
1188
1188
|
|
|
1189
|
-
export { NgpMenu, NgpMenuItem, NgpMenuItemCheckbox, NgpMenuItemIndicator, NgpMenuItemRadio, NgpMenuItemRadioGroup, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemCheckboxState, injectMenuItemRadioGroupState, injectMenuItemRadioState, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, provideMenuConfig, provideMenuItemCheckboxState, provideMenuItemRadioGroupState, provideMenuItemRadioState, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
1189
|
+
export { NgpMenu, NgpMenuItem, NgpMenuItemCheckbox, NgpMenuItemIndicator, NgpMenuItemRadio, NgpMenuItemRadioGroup, NgpMenuTrigger, NgpSubmenuTrigger, injectMenuItemCheckboxState, injectMenuItemRadioGroupState, injectMenuItemRadioState, injectMenuItemState, injectMenuState, injectMenuTriggerState, injectSubmenuTriggerState, ngpMenu, ngpMenuItem, ngpMenuItemCheckbox, ngpMenuItemRadio, ngpMenuItemRadioGroup, ngpMenuTrigger, ngpSubmenuTrigger, provideMenuConfig, provideMenuItemCheckboxState, provideMenuItemRadioGroupState, provideMenuItemRadioState, provideMenuItemState, provideMenuState, provideMenuTriggerState, provideSubmenuTriggerState };
|
|
1190
1190
|
//# sourceMappingURL=ng-primitives-menu.mjs.map
|
|
@@ -184,6 +184,7 @@ class NgpComponentPortal extends NgpPortal {
|
|
|
184
184
|
super(viewContainerRef, injector);
|
|
185
185
|
this.viewRef = null;
|
|
186
186
|
this.isDestroying = false;
|
|
187
|
+
this.detachCancelled = false;
|
|
187
188
|
this.exitAnimationRef = null;
|
|
188
189
|
this.componentPortal = new ComponentPortal(component, viewContainerRef, injector);
|
|
189
190
|
}
|
|
@@ -221,6 +222,16 @@ class NgpComponentPortal extends NgpPortal {
|
|
|
221
222
|
getAttached() {
|
|
222
223
|
return !!this.viewRef && this.viewRef.location.nativeElement.isConnected;
|
|
223
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Cancel an in-progress detach operation.
|
|
227
|
+
*/
|
|
228
|
+
cancelDetach() {
|
|
229
|
+
if (this.isDestroying) {
|
|
230
|
+
this.detachCancelled = true;
|
|
231
|
+
this.exitAnimationRef?.cancel();
|
|
232
|
+
this.isDestroying = false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
224
235
|
/**
|
|
225
236
|
* Detach the portal from the DOM.
|
|
226
237
|
* @param immediate If true, skip exit animations and remove immediately
|
|
@@ -230,10 +241,16 @@ class NgpComponentPortal extends NgpPortal {
|
|
|
230
241
|
return;
|
|
231
242
|
}
|
|
232
243
|
this.isDestroying = true;
|
|
244
|
+
this.detachCancelled = false;
|
|
233
245
|
// Only wait for exit animation if not immediate
|
|
234
246
|
if (!immediate) {
|
|
235
247
|
await this.exitAnimationRef?.exit();
|
|
236
248
|
}
|
|
249
|
+
// If cancelled during exit animation, don't destroy
|
|
250
|
+
if (this.detachCancelled) {
|
|
251
|
+
this.detachCancelled = false;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
237
254
|
if (this.viewRef) {
|
|
238
255
|
this.viewRef.destroy();
|
|
239
256
|
this.viewRef = null;
|
|
@@ -246,6 +263,7 @@ class NgpTemplatePortal extends NgpPortal {
|
|
|
246
263
|
this.viewRef = null;
|
|
247
264
|
this.exitAnimationRefs = [];
|
|
248
265
|
this.isDestroying = false;
|
|
266
|
+
this.detachCancelled = false;
|
|
249
267
|
this.templatePortal = new TemplatePortal(template, viewContainerRef, context, injector);
|
|
250
268
|
}
|
|
251
269
|
/**
|
|
@@ -286,6 +304,18 @@ class NgpTemplatePortal extends NgpPortal {
|
|
|
286
304
|
getAttached() {
|
|
287
305
|
return !!this.viewRef && this.viewRef.rootNodes.length > 0;
|
|
288
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* Cancel an in-progress detach operation.
|
|
309
|
+
*/
|
|
310
|
+
cancelDetach() {
|
|
311
|
+
if (this.isDestroying) {
|
|
312
|
+
this.detachCancelled = true;
|
|
313
|
+
for (const ref of this.exitAnimationRefs) {
|
|
314
|
+
ref.cancel();
|
|
315
|
+
}
|
|
316
|
+
this.isDestroying = false;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
289
319
|
/**
|
|
290
320
|
* Detach the portal from the DOM.
|
|
291
321
|
* @param immediate If true, skip exit animations and remove immediately
|
|
@@ -295,10 +325,16 @@ class NgpTemplatePortal extends NgpPortal {
|
|
|
295
325
|
return;
|
|
296
326
|
}
|
|
297
327
|
this.isDestroying = true;
|
|
328
|
+
this.detachCancelled = false;
|
|
298
329
|
// Only wait for exit animations if not immediate
|
|
299
330
|
if (!immediate) {
|
|
300
331
|
await Promise.all(this.exitAnimationRefs.map(ref => ref.exit()));
|
|
301
332
|
}
|
|
333
|
+
// If cancelled during exit animation, don't destroy
|
|
334
|
+
if (this.detachCancelled) {
|
|
335
|
+
this.detachCancelled = false;
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
302
338
|
if (this.viewRef) {
|
|
303
339
|
this.viewRef.destroy();
|
|
304
340
|
this.viewRef = null;
|
|
@@ -587,6 +623,8 @@ class NgpOverlay {
|
|
|
587
623
|
this.availableHeight = signal(null, ...(ngDevMode ? [{ debugName: "availableHeight" }] : []));
|
|
588
624
|
/** Signal tracking the final placement of the overlay */
|
|
589
625
|
this.finalPlacement = signal(undefined, ...(ngDevMode ? [{ debugName: "finalPlacement" }] : []));
|
|
626
|
+
/** Portal currently being destroyed (for cancel support during exit animations) */
|
|
627
|
+
this.destroyingPortal = null;
|
|
590
628
|
/** Signal tracking whether the overlay is open */
|
|
591
629
|
this.isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
592
630
|
/** A unique id for the overlay */
|
|
@@ -704,6 +742,13 @@ class NgpOverlay {
|
|
|
704
742
|
this.closeTimeout();
|
|
705
743
|
this.closeTimeout = undefined;
|
|
706
744
|
}
|
|
745
|
+
// If destruction is in progress (exit animation running), cancel it
|
|
746
|
+
// and reuse the existing overlay instead of creating a new one.
|
|
747
|
+
if (this.destroyingPortal) {
|
|
748
|
+
this.cancelDestruction();
|
|
749
|
+
resolve();
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
707
752
|
// Don't proceed if already opening or open
|
|
708
753
|
if (this.openTimeout || this.isOpen()) {
|
|
709
754
|
return;
|
|
@@ -743,6 +788,38 @@ class NgpOverlay {
|
|
|
743
788
|
this.closeTimeout();
|
|
744
789
|
this.closeTimeout = undefined;
|
|
745
790
|
}
|
|
791
|
+
// Also cancel in-progress destruction (exit animation running)
|
|
792
|
+
if (this.destroyingPortal) {
|
|
793
|
+
this.cancelDestruction();
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Cancel an in-progress overlay destruction. This cancels exit animations,
|
|
798
|
+
* restores the portal, and re-enables positioning and scroll strategy.
|
|
799
|
+
* Used when show() or cancelPendingClose() is called during exit animation.
|
|
800
|
+
*/
|
|
801
|
+
cancelDestruction() {
|
|
802
|
+
const portal = this.destroyingPortal;
|
|
803
|
+
if (!portal) {
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
this.destroyingPortal = null;
|
|
807
|
+
portal.cancelDetach();
|
|
808
|
+
// Restore the portal
|
|
809
|
+
this.portal.set(portal);
|
|
810
|
+
// Re-setup positioning
|
|
811
|
+
const elements = portal.getElements();
|
|
812
|
+
const outletElement = elements.find(el => el.hasAttribute('data-overlay')) ?? elements[0];
|
|
813
|
+
if (outletElement) {
|
|
814
|
+
this.setupPositioning(outletElement);
|
|
815
|
+
}
|
|
816
|
+
// Re-enable scroll strategy
|
|
817
|
+
this.scrollStrategy = this.createScrollStrategy();
|
|
818
|
+
this.scrollStrategy.enable();
|
|
819
|
+
// Re-register with cooldown if needed
|
|
820
|
+
if (this.config.overlayType) {
|
|
821
|
+
this.cooldownManager.registerActive(this.config.overlayType, this, this.config.cooldown ?? 0);
|
|
822
|
+
}
|
|
746
823
|
}
|
|
747
824
|
/**
|
|
748
825
|
* Hide the overlay with the specified delay
|
|
@@ -1098,17 +1175,25 @@ class NgpOverlay {
|
|
|
1098
1175
|
// Clean up positioning
|
|
1099
1176
|
this.disposePositioning?.();
|
|
1100
1177
|
this.disposePositioning = undefined;
|
|
1101
|
-
//
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
this.isOpen.set(false);
|
|
1105
|
-
// Reset final placement
|
|
1106
|
-
this.finalPlacement.set(undefined);
|
|
1107
|
-
// Reset instant transition flag
|
|
1108
|
-
this.instantTransition.set(false);
|
|
1178
|
+
// Track the destroying portal so cancelDestruction() can restore it
|
|
1179
|
+
// if show() is called during the exit animation.
|
|
1180
|
+
this.destroyingPortal = portal;
|
|
1109
1181
|
// disable scroll strategy
|
|
1110
1182
|
this.scrollStrategy.disable();
|
|
1111
1183
|
this.scrollStrategy = new NoopScrollStrategy();
|
|
1184
|
+
// Detach the portal (waits for exit animations unless immediate).
|
|
1185
|
+
// During this await, cancelDestruction() may be called if the user
|
|
1186
|
+
// re-hovers the trigger. (See: https://github.com/ng-primitives/ng-primitives/issues/681)
|
|
1187
|
+
await portal.detach(immediate);
|
|
1188
|
+
// Only complete destruction if it was not cancelled during exit animation.
|
|
1189
|
+
// finalPlacement and instantTransition are intentionally cleared here
|
|
1190
|
+
// (not before the await) so they remain valid if destruction is cancelled.
|
|
1191
|
+
if (this.destroyingPortal === portal) {
|
|
1192
|
+
this.destroyingPortal = null;
|
|
1193
|
+
this.isOpen.set(false);
|
|
1194
|
+
this.finalPlacement.set(undefined);
|
|
1195
|
+
this.instantTransition.set(false);
|
|
1196
|
+
}
|
|
1112
1197
|
}
|
|
1113
1198
|
/**
|
|
1114
1199
|
* Get the transform origin for the overlay
|