ngx-kit 8.0.2 → 8.1.0

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.
@@ -256,6 +256,7 @@ class NgxInfiniteScroll {
256
256
  return explicit;
257
257
  }
258
258
  const container = this.infiniteScrollContainer();
259
+ //TODO: not safe instanceof: node.nodeType === Node.ELEMENT_NODE
259
260
  if (container instanceof HTMLElement) {
260
261
  return container;
261
262
  }
@@ -329,7 +330,9 @@ class NgxInfiniteScroll {
329
330
  getDocumentScroller() {
330
331
  if (typeof document === 'undefined')
331
332
  return null;
332
- return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;
333
+ return document.scrollingElement?.nodeType === Node.ELEMENT_NODE
334
+ ? document.scrollingElement
335
+ : null;
333
336
  }
334
337
  getScrollMetrics() {
335
338
  const element = this.root ?? this.getDocumentScroller();
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-infinite-scroll.mjs","sources":["../../../projects/libs/infinite-scroll/directives/infinite-scroll.directive.ts","../../../projects/libs/infinite-scroll/ngx-kit-infinite-scroll.ts"],"sourcesContent":["import {\n AfterViewInit,\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n input,\n output,\n inject,\n signal,\n effect,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { NgxInfiniteScrollDirection, NgxInfiniteScrollEvent } from '../types/infinite-scroll.types';\n\nconst DEFAULT_DISTANCE = 200;\nconst DEFAULT_MIN_INTERVAL = 100;\nconst PREPEND_MAX_WAIT_MS = 5000;\nconst MANUAL_CHECK_DELAY_MS = 0;\n\n@Directive({\n selector: '[infiniteScroll]',\n standalone: true,\n exportAs: 'infiniteScroll',\n})\nexport class NgxInfiniteScroll implements AfterViewInit {\n readonly infiniteScrollDistance = input(DEFAULT_DISTANCE, {\n alias: 'infiniteScrollDistance',\n transform: numberInput,\n });\n\n readonly infiniteScrollDisabled = input(false, {\n alias: 'infiniteScrollDisabled',\n transform: booleanInput,\n });\n\n readonly infiniteScrollImmediateCheck = input(true, {\n alias: 'infiniteScrollImmediateCheck',\n transform: booleanInput,\n });\n\n readonly infiniteScrollMinInterval = input(DEFAULT_MIN_INTERVAL, {\n alias: 'infiniteScrollMinInterval',\n transform: numberInput,\n });\n\n readonly infiniteScrollUpDistance = input<number | null>(null, {\n alias: 'infiniteScrollUpDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDownDistance = input<number | null>(null, {\n alias: 'infiniteScrollDownDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDirection = input<NgxInfiniteScrollDirection>('down', {\n alias: 'infiniteScrollDirection',\n });\n\n readonly infiniteScrollContainer = input<string | HTMLElement | null>(null, {\n alias: 'infiniteScrollContainer',\n });\n\n readonly infiniteScrollRoot = input<HTMLElement | null>(null, {\n alias: 'infiniteScrollRoot',\n });\n\n readonly scrollWindow = input(true, {\n alias: 'scrollWindow',\n transform: booleanInput,\n });\n\n readonly fromRoot = input(false, {\n alias: 'fromRoot',\n transform: booleanInput,\n });\n\n /** Preserve the visual scroll position when older content is prepended. */\n readonly infiniteScrollMaintainScrollPosition = input(true, {\n alias: 'infiniteScrollMaintainScrollPosition',\n transform: booleanInput,\n });\n\n /** Optional CSS scroll behavior used while compensating a prepend. */\n readonly infiniteScrollPreserveScrollBehavior = input<ScrollBehavior>('auto', {\n alias: 'infiniteScrollPreserveScrollBehavior',\n });\n\n readonly scrolled = output<NgxInfiniteScrollEvent>();\n readonly scrolledUp = output<NgxInfiniteScrollEvent>();\n readonly scrolledDown = output<NgxInfiniteScrollEvent>();\n readonly scrollStartReached = output<NgxInfiniteScrollEvent>();\n readonly scrollEndReached = output<NgxInfiniteScrollEvent>();\n\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly ready = signal(false);\n private previousConfiguration?: {\n distance: number;\n upDistance: number | null;\n downDistance: number | null;\n direction: NgxInfiniteScrollDirection;\n scrollWindow: boolean;\n fromRoot: boolean;\n container: string | HTMLElement | null;\n root: HTMLElement | null;\n };\n private observer?: IntersectionObserver;\n private resizeObserver?: ResizeObserver;\n private mutationObserver?: MutationObserver;\n private topSentinel?: HTMLElement;\n private bottomSentinel?: HTMLElement;\n private root: HTMLElement | null = null;\n private lastTriggerAt = Number.NEGATIVE_INFINITY;\n private armedUp = true;\n private armedDown = true;\n private destroyRequested = false;\n private prependFrame = 0;\n\n private prependSnapshot?: {\n scrollTop: number;\n scrollHeight: number;\n };\n\n constructor() {\n effect(() => {\n const disabled = this.infiniteScrollDisabled();\n const configuration = {\n distance: this.infiniteScrollDistance(),\n upDistance: this.infiniteScrollUpDistance(),\n downDistance: this.infiniteScrollDownDistance(),\n direction: this.infiniteScrollDirection(),\n scrollWindow: this.scrollWindow(),\n fromRoot: this.fromRoot(),\n container: this.infiniteScrollContainer(),\n root: this.infiniteScrollRoot(),\n };\n\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n if (!this.sameConfiguration(configuration)) {\n this.previousConfiguration = configuration;\n this.setup();\n }\n\n if (disabled) {\n this.armedUp = true;\n this.armedDown = true;\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyRequested = true;\n this.destroyObserver();\n this.clearSentinels();\n this.cancelPrependWatcher();\n });\n }\n\n ngAfterViewInit(): void {\n this.ready.set(true);\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n this.previousConfiguration = undefined;\n this.setup();\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n }\n\n /**\n * Re-check the sentinels after application code has appended/prepended data.\n * Usually not needed, but useful for custom rendering pipelines.\n */\n check(): void {\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n this.scheduleCheck();\n }\n\n /**\n * Explicitly finish a pending prepend operation.\n * Useful when an application knows exactly when its async batch has rendered.\n */\n completePrepend(): void {\n this.tryCompensatePrepend(true);\n }\n\n private sameConfiguration(next: NonNullable<typeof this.previousConfiguration>): boolean {\n const previous = this.previousConfiguration;\n if (!previous) return false;\n\n return (\n previous.distance === next.distance &&\n previous.upDistance === next.upDistance &&\n previous.downDistance === next.downDistance &&\n previous.direction === next.direction &&\n previous.scrollWindow === next.scrollWindow &&\n previous.fromRoot === next.fromRoot &&\n previous.container === next.container &&\n previous.root === next.root\n );\n }\n\n private setup(): void {\n this.destroyObserver();\n this.clearSentinels();\n\n this.root = this.resolveRoot();\n\n this.topSentinel = this.createSentinel('top');\n this.bottomSentinel = this.createSentinel('bottom');\n\n const host = this.hostRef.nativeElement;\n\n host.prepend(this.topSentinel);\n host.append(this.bottomSentinel);\n\n this.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n if (entry.target === this.topSentinel) this.armedUp = true;\n if (entry.target === this.bottomSentinel) this.armedDown = true;\n continue;\n }\n\n if (entry.target === this.topSentinel && this.allowsDirection('up')) {\n this.trigger('up');\n }\n\n if (entry.target === this.bottomSentinel && this.allowsDirection('down')) {\n this.trigger('down');\n }\n }\n },\n {\n root: this.root,\n rootMargin: this.buildRootMargin(),\n threshold: 0,\n },\n );\n\n this.observer.observe(this.topSentinel);\n this.observer.observe(this.bottomSentinel);\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n const observedRoot = this.root ?? this.getDocumentScroller();\n if (observedRoot) {\n this.resizeObserver.observe(observedRoot);\n }\n this.resizeObserver.observe(host);\n\n this.mutationObserver = new MutationObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n this.mutationObserver.observe(host, {\n childList: true,\n subtree: true,\n });\n }\n\n private trigger(direction: 'up' | 'down'): void {\n if (this.infiniteScrollDisabled()) {\n return;\n }\n\n const armed = direction === 'up' ? this.armedUp : this.armedDown;\n if (!armed) {\n return;\n }\n\n const now = performance.now();\n if (now - this.lastTriggerAt < Math.max(0, this.infiniteScrollMinInterval())) {\n return;\n }\n\n const target = this.hostRef.nativeElement;\n const event: NgxInfiniteScrollEvent = {\n direction,\n distance: this.distanceFor(direction),\n target,\n root: this.root,\n };\n\n this.lastTriggerAt = now;\n\n if (direction === 'up') {\n this.armedUp = false;\n if (this.infiniteScrollMaintainScrollPosition()) {\n this.capturePrependSnapshot();\n }\n } else {\n this.armedDown = false;\n }\n\n this.zone.run(() => {\n this.scrolled.emit(event);\n if (direction === 'up') {\n this.scrolledUp.emit(event);\n this.scrollStartReached.emit(event);\n } else {\n this.scrolledDown.emit(event);\n this.scrollEndReached.emit(event);\n }\n });\n }\n\n private allowsDirection(direction: 'up' | 'down'): boolean {\n const configured = this.infiniteScrollDirection();\n return configured === 'both' || configured === direction;\n }\n\n private resolveRoot(): HTMLElement | null {\n if (this.scrollWindow()) {\n return null;\n }\n\n const explicit = this.infiniteScrollRoot();\n if (explicit) {\n return explicit;\n }\n\n const container = this.infiniteScrollContainer();\n\n if (container instanceof HTMLElement) {\n return container;\n }\n\n if (typeof container === 'string' && container.trim()) {\n const scope: ParentNode = this.fromRoot() ? document : this.hostRef.nativeElement;\n return scope.querySelector<HTMLElement>(container) ?? this.hostRef.nativeElement;\n }\n\n return this.hostRef.nativeElement;\n }\n\n private buildRootMargin(): string {\n const up = this.distanceFor('up');\n const down = this.distanceFor('down');\n const direction = this.infiniteScrollDirection();\n\n if (direction === 'up') {\n return `${up}px 0px 0px 0px`;\n }\n\n if (direction === 'down') {\n return `0px 0px ${down}px 0px`;\n }\n\n return `${up}px 0px ${down}px 0px`;\n }\n\n private createSentinel(position: 'top' | 'bottom'): HTMLElement {\n const node = document.createElement('span');\n node.dataset['ngxInfiniteScrollSentinel'] = position;\n node.setAttribute('aria-hidden', 'true');\n node.style.display = 'block';\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.margin = '0';\n node.style.padding = '0';\n node.style.border = '0';\n node.style.pointerEvents = 'none';\n node.style.visibility = 'hidden';\n return node;\n }\n\n private scheduleCheck(): void {\n window.setTimeout(() => {\n if (this.destroyRequested || this.infiniteScrollDisabled()) return;\n this.checkVisibilityDirectly();\n }, MANUAL_CHECK_DELAY_MS);\n }\n\n private checkVisibilityDirectly(): void {\n if (!this.topSentinel || !this.bottomSentinel || this.infiniteScrollDisabled()) {\n return;\n }\n\n const rootRect = this.root\n ? this.root.getBoundingClientRect()\n : { top: 0, bottom: window.innerHeight };\n\n const rootTop = rootRect.top;\n const rootBottom = rootRect.bottom;\n const upDistance = this.distanceFor('up');\n const downDistance = this.distanceFor('down');\n\n if (this.allowsDirection('up') && this.armedUp) {\n const rect = this.topSentinel.getBoundingClientRect();\n if (rect.bottom >= rootTop - upDistance && rect.top <= rootBottom) {\n this.trigger('up');\n }\n }\n\n if (this.allowsDirection('down') && this.armedDown) {\n const rect = this.bottomSentinel.getBoundingClientRect();\n if (rect.top <= rootBottom + downDistance && rect.bottom >= rootTop) {\n this.trigger('down');\n }\n }\n }\n\n private distanceFor(direction: 'up' | 'down'): number {\n const override =\n direction === 'up' ? this.infiniteScrollUpDistance() : this.infiniteScrollDownDistance();\n return Math.max(0, override ?? this.infiniteScrollDistance());\n }\n\n private getDocumentScroller(): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n }\n\n private getScrollMetrics(): {\n element: HTMLElement | null;\n scrollTop: number;\n scrollHeight: number;\n } {\n const element = this.root ?? this.getDocumentScroller();\n if (element) {\n return {\n element,\n scrollTop: element.scrollTop,\n scrollHeight: element.scrollHeight,\n };\n }\n\n return {\n element: null,\n scrollTop: window.scrollY,\n scrollHeight: Math.max(\n document.documentElement.scrollHeight,\n document.body?.scrollHeight ?? 0,\n ),\n };\n }\n\n private capturePrependSnapshot(): void {\n const metrics = this.getScrollMetrics();\n this.prependSnapshot = {\n scrollTop: metrics.scrollTop,\n scrollHeight: metrics.scrollHeight,\n };\n\n this.watchPrepend();\n }\n\n private watchPrepend(): void {\n this.cancelPrependWatcher();\n\n const startedAt = performance.now();\n\n const frame = () => {\n if (!this.prependSnapshot || this.destroyRequested) {\n this.prependFrame = 0;\n return;\n }\n\n const compensated = this.tryCompensatePrepend(false);\n if (compensated || performance.now() - startedAt >= PREPEND_MAX_WAIT_MS) {\n this.prependFrame = 0;\n return;\n }\n\n this.prependFrame = window.requestAnimationFrame(frame);\n };\n\n this.prependFrame = window.requestAnimationFrame(frame);\n }\n\n private tryCompensatePrepend(force: boolean): boolean {\n const snapshot = this.prependSnapshot;\n if (!snapshot) return true;\n\n const metrics = this.getScrollMetrics();\n const delta = metrics.scrollHeight - snapshot.scrollHeight;\n\n if (delta <= 0) {\n if (force) {\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n }\n return false;\n }\n\n /*\n * Do not fight an intentional user scroll while the request is in-flight.\n * A tiny tolerance absorbs layout rounding and browser scroll anchoring.\n */\n const currentTop = metrics.scrollTop;\n const movedByUser = Math.abs(currentTop - snapshot.scrollTop) > 4;\n\n if (!movedByUser || force) {\n const nextTop = snapshot.scrollTop + delta;\n\n if (metrics.element) {\n metrics.element.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n } else {\n window.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n }\n\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n return true;\n }\n\n return false;\n }\n\n private cancelPrependWatcher(): void {\n if (this.prependFrame) {\n window.cancelAnimationFrame(this.prependFrame);\n this.prependFrame = 0;\n }\n }\n\n private destroyObserver(): void {\n this.observer?.disconnect();\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.observer = undefined;\n this.resizeObserver = undefined;\n this.mutationObserver = undefined;\n }\n\n private clearSentinels(): void {\n this.topSentinel?.remove();\n this.bottomSentinel?.remove();\n this.topSentinel = undefined;\n this.bottomSentinel = undefined;\n }\n}\n\nfunction numberInput(value: number | string | null | undefined): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction nullableNumberInput(value: number | string | null | undefined | unknown): number | null {\n if (value == null || value === '') return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction booleanInput(value: boolean | string | null | undefined): boolean {\n if (value === '' || value === true) return true;\n if (value === 'false' || value === false || value == null) return false;\n return Boolean(value);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-infinite-scroll.mjs","sources":["../../../projects/libs/infinite-scroll/directives/infinite-scroll.directive.ts","../../../projects/libs/infinite-scroll/ngx-kit-infinite-scroll.ts"],"sourcesContent":["import {\n AfterViewInit,\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n input,\n output,\n inject,\n signal,\n effect,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { NgxInfiniteScrollDirection, NgxInfiniteScrollEvent } from '../types/infinite-scroll.types';\n\nconst DEFAULT_DISTANCE = 200;\nconst DEFAULT_MIN_INTERVAL = 100;\nconst PREPEND_MAX_WAIT_MS = 5000;\nconst MANUAL_CHECK_DELAY_MS = 0;\n\n@Directive({\n selector: '[infiniteScroll]',\n standalone: true,\n exportAs: 'infiniteScroll',\n})\nexport class NgxInfiniteScroll implements AfterViewInit {\n readonly infiniteScrollDistance = input(DEFAULT_DISTANCE, {\n alias: 'infiniteScrollDistance',\n transform: numberInput,\n });\n\n readonly infiniteScrollDisabled = input(false, {\n alias: 'infiniteScrollDisabled',\n transform: booleanInput,\n });\n\n readonly infiniteScrollImmediateCheck = input(true, {\n alias: 'infiniteScrollImmediateCheck',\n transform: booleanInput,\n });\n\n readonly infiniteScrollMinInterval = input(DEFAULT_MIN_INTERVAL, {\n alias: 'infiniteScrollMinInterval',\n transform: numberInput,\n });\n\n readonly infiniteScrollUpDistance = input<number | null>(null, {\n alias: 'infiniteScrollUpDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDownDistance = input<number | null>(null, {\n alias: 'infiniteScrollDownDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDirection = input<NgxInfiniteScrollDirection>('down', {\n alias: 'infiniteScrollDirection',\n });\n\n readonly infiniteScrollContainer = input<string | HTMLElement | null>(null, {\n alias: 'infiniteScrollContainer',\n });\n\n readonly infiniteScrollRoot = input<HTMLElement | null>(null, {\n alias: 'infiniteScrollRoot',\n });\n\n readonly scrollWindow = input(true, {\n alias: 'scrollWindow',\n transform: booleanInput,\n });\n\n readonly fromRoot = input(false, {\n alias: 'fromRoot',\n transform: booleanInput,\n });\n\n /** Preserve the visual scroll position when older content is prepended. */\n readonly infiniteScrollMaintainScrollPosition = input(true, {\n alias: 'infiniteScrollMaintainScrollPosition',\n transform: booleanInput,\n });\n\n /** Optional CSS scroll behavior used while compensating a prepend. */\n readonly infiniteScrollPreserveScrollBehavior = input<ScrollBehavior>('auto', {\n alias: 'infiniteScrollPreserveScrollBehavior',\n });\n\n readonly scrolled = output<NgxInfiniteScrollEvent>();\n readonly scrolledUp = output<NgxInfiniteScrollEvent>();\n readonly scrolledDown = output<NgxInfiniteScrollEvent>();\n readonly scrollStartReached = output<NgxInfiniteScrollEvent>();\n readonly scrollEndReached = output<NgxInfiniteScrollEvent>();\n\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly ready = signal(false);\n private previousConfiguration?: {\n distance: number;\n upDistance: number | null;\n downDistance: number | null;\n direction: NgxInfiniteScrollDirection;\n scrollWindow: boolean;\n fromRoot: boolean;\n container: string | HTMLElement | null;\n root: HTMLElement | null;\n };\n private observer?: IntersectionObserver;\n private resizeObserver?: ResizeObserver;\n private mutationObserver?: MutationObserver;\n private topSentinel?: HTMLElement;\n private bottomSentinel?: HTMLElement;\n private root: HTMLElement | null = null;\n private lastTriggerAt = Number.NEGATIVE_INFINITY;\n private armedUp = true;\n private armedDown = true;\n private destroyRequested = false;\n private prependFrame = 0;\n\n private prependSnapshot?: {\n scrollTop: number;\n scrollHeight: number;\n };\n\n constructor() {\n effect(() => {\n const disabled = this.infiniteScrollDisabled();\n const configuration = {\n distance: this.infiniteScrollDistance(),\n upDistance: this.infiniteScrollUpDistance(),\n downDistance: this.infiniteScrollDownDistance(),\n direction: this.infiniteScrollDirection(),\n scrollWindow: this.scrollWindow(),\n fromRoot: this.fromRoot(),\n container: this.infiniteScrollContainer(),\n root: this.infiniteScrollRoot(),\n };\n\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n if (!this.sameConfiguration(configuration)) {\n this.previousConfiguration = configuration;\n this.setup();\n }\n\n if (disabled) {\n this.armedUp = true;\n this.armedDown = true;\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyRequested = true;\n this.destroyObserver();\n this.clearSentinels();\n this.cancelPrependWatcher();\n });\n }\n\n ngAfterViewInit(): void {\n this.ready.set(true);\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n this.previousConfiguration = undefined;\n this.setup();\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n }\n\n /**\n * Re-check the sentinels after application code has appended/prepended data.\n * Usually not needed, but useful for custom rendering pipelines.\n */\n check(): void {\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n this.scheduleCheck();\n }\n\n /**\n * Explicitly finish a pending prepend operation.\n * Useful when an application knows exactly when its async batch has rendered.\n */\n completePrepend(): void {\n this.tryCompensatePrepend(true);\n }\n\n private sameConfiguration(next: NonNullable<typeof this.previousConfiguration>): boolean {\n const previous = this.previousConfiguration;\n if (!previous) return false;\n\n return (\n previous.distance === next.distance &&\n previous.upDistance === next.upDistance &&\n previous.downDistance === next.downDistance &&\n previous.direction === next.direction &&\n previous.scrollWindow === next.scrollWindow &&\n previous.fromRoot === next.fromRoot &&\n previous.container === next.container &&\n previous.root === next.root\n );\n }\n\n private setup(): void {\n this.destroyObserver();\n this.clearSentinels();\n\n this.root = this.resolveRoot();\n\n this.topSentinel = this.createSentinel('top');\n this.bottomSentinel = this.createSentinel('bottom');\n\n const host = this.hostRef.nativeElement;\n\n host.prepend(this.topSentinel);\n host.append(this.bottomSentinel);\n\n this.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n if (entry.target === this.topSentinel) this.armedUp = true;\n if (entry.target === this.bottomSentinel) this.armedDown = true;\n continue;\n }\n\n if (entry.target === this.topSentinel && this.allowsDirection('up')) {\n this.trigger('up');\n }\n\n if (entry.target === this.bottomSentinel && this.allowsDirection('down')) {\n this.trigger('down');\n }\n }\n },\n {\n root: this.root,\n rootMargin: this.buildRootMargin(),\n threshold: 0,\n },\n );\n\n this.observer.observe(this.topSentinel);\n this.observer.observe(this.bottomSentinel);\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n const observedRoot = this.root ?? this.getDocumentScroller();\n if (observedRoot) {\n this.resizeObserver.observe(observedRoot);\n }\n this.resizeObserver.observe(host);\n\n this.mutationObserver = new MutationObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n this.mutationObserver.observe(host, {\n childList: true,\n subtree: true,\n });\n }\n\n private trigger(direction: 'up' | 'down'): void {\n if (this.infiniteScrollDisabled()) {\n return;\n }\n\n const armed = direction === 'up' ? this.armedUp : this.armedDown;\n if (!armed) {\n return;\n }\n\n const now = performance.now();\n if (now - this.lastTriggerAt < Math.max(0, this.infiniteScrollMinInterval())) {\n return;\n }\n\n const target = this.hostRef.nativeElement;\n const event: NgxInfiniteScrollEvent = {\n direction,\n distance: this.distanceFor(direction),\n target,\n root: this.root,\n };\n\n this.lastTriggerAt = now;\n\n if (direction === 'up') {\n this.armedUp = false;\n if (this.infiniteScrollMaintainScrollPosition()) {\n this.capturePrependSnapshot();\n }\n } else {\n this.armedDown = false;\n }\n\n this.zone.run(() => {\n this.scrolled.emit(event);\n if (direction === 'up') {\n this.scrolledUp.emit(event);\n this.scrollStartReached.emit(event);\n } else {\n this.scrolledDown.emit(event);\n this.scrollEndReached.emit(event);\n }\n });\n }\n\n private allowsDirection(direction: 'up' | 'down'): boolean {\n const configured = this.infiniteScrollDirection();\n return configured === 'both' || configured === direction;\n }\n\n private resolveRoot(): HTMLElement | null {\n if (this.scrollWindow()) {\n return null;\n }\n\n const explicit = this.infiniteScrollRoot();\n if (explicit) {\n return explicit;\n }\n\n const container = this.infiniteScrollContainer();\n //TODO: not safe instanceof: node.nodeType === Node.ELEMENT_NODE\n if (container instanceof HTMLElement) {\n return container;\n }\n\n if (typeof container === 'string' && container.trim()) {\n const scope: ParentNode = this.fromRoot() ? document : this.hostRef.nativeElement;\n return scope.querySelector<HTMLElement>(container) ?? this.hostRef.nativeElement;\n }\n\n return this.hostRef.nativeElement;\n }\n\n private buildRootMargin(): string {\n const up = this.distanceFor('up');\n const down = this.distanceFor('down');\n const direction = this.infiniteScrollDirection();\n\n if (direction === 'up') {\n return `${up}px 0px 0px 0px`;\n }\n\n if (direction === 'down') {\n return `0px 0px ${down}px 0px`;\n }\n\n return `${up}px 0px ${down}px 0px`;\n }\n\n private createSentinel(position: 'top' | 'bottom'): HTMLElement {\n const node = document.createElement('span');\n node.dataset['ngxInfiniteScrollSentinel'] = position;\n node.setAttribute('aria-hidden', 'true');\n node.style.display = 'block';\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.margin = '0';\n node.style.padding = '0';\n node.style.border = '0';\n node.style.pointerEvents = 'none';\n node.style.visibility = 'hidden';\n return node;\n }\n\n private scheduleCheck(): void {\n window.setTimeout(() => {\n if (this.destroyRequested || this.infiniteScrollDisabled()) return;\n this.checkVisibilityDirectly();\n }, MANUAL_CHECK_DELAY_MS);\n }\n\n private checkVisibilityDirectly(): void {\n if (!this.topSentinel || !this.bottomSentinel || this.infiniteScrollDisabled()) {\n return;\n }\n\n const rootRect = this.root\n ? this.root.getBoundingClientRect()\n : { top: 0, bottom: window.innerHeight };\n\n const rootTop = rootRect.top;\n const rootBottom = rootRect.bottom;\n const upDistance = this.distanceFor('up');\n const downDistance = this.distanceFor('down');\n\n if (this.allowsDirection('up') && this.armedUp) {\n const rect = this.topSentinel.getBoundingClientRect();\n if (rect.bottom >= rootTop - upDistance && rect.top <= rootBottom) {\n this.trigger('up');\n }\n }\n\n if (this.allowsDirection('down') && this.armedDown) {\n const rect = this.bottomSentinel.getBoundingClientRect();\n if (rect.top <= rootBottom + downDistance && rect.bottom >= rootTop) {\n this.trigger('down');\n }\n }\n }\n\n private distanceFor(direction: 'up' | 'down'): number {\n const override =\n direction === 'up' ? this.infiniteScrollUpDistance() : this.infiniteScrollDownDistance();\n return Math.max(0, override ?? this.infiniteScrollDistance());\n }\n\n private getDocumentScroller(): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return document.scrollingElement?.nodeType === Node.ELEMENT_NODE\n ? (document.scrollingElement as HTMLElement)\n : null;\n }\n\n private getScrollMetrics(): {\n element: HTMLElement | null;\n scrollTop: number;\n scrollHeight: number;\n } {\n const element = this.root ?? this.getDocumentScroller();\n if (element) {\n return {\n element,\n scrollTop: element.scrollTop,\n scrollHeight: element.scrollHeight,\n };\n }\n\n return {\n element: null,\n scrollTop: window.scrollY,\n scrollHeight: Math.max(\n document.documentElement.scrollHeight,\n document.body?.scrollHeight ?? 0,\n ),\n };\n }\n\n private capturePrependSnapshot(): void {\n const metrics = this.getScrollMetrics();\n this.prependSnapshot = {\n scrollTop: metrics.scrollTop,\n scrollHeight: metrics.scrollHeight,\n };\n\n this.watchPrepend();\n }\n\n private watchPrepend(): void {\n this.cancelPrependWatcher();\n\n const startedAt = performance.now();\n\n const frame = () => {\n if (!this.prependSnapshot || this.destroyRequested) {\n this.prependFrame = 0;\n return;\n }\n\n const compensated = this.tryCompensatePrepend(false);\n if (compensated || performance.now() - startedAt >= PREPEND_MAX_WAIT_MS) {\n this.prependFrame = 0;\n return;\n }\n\n this.prependFrame = window.requestAnimationFrame(frame);\n };\n\n this.prependFrame = window.requestAnimationFrame(frame);\n }\n\n private tryCompensatePrepend(force: boolean): boolean {\n const snapshot = this.prependSnapshot;\n if (!snapshot) return true;\n\n const metrics = this.getScrollMetrics();\n const delta = metrics.scrollHeight - snapshot.scrollHeight;\n\n if (delta <= 0) {\n if (force) {\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n }\n return false;\n }\n\n /*\n * Do not fight an intentional user scroll while the request is in-flight.\n * A tiny tolerance absorbs layout rounding and browser scroll anchoring.\n */\n const currentTop = metrics.scrollTop;\n const movedByUser = Math.abs(currentTop - snapshot.scrollTop) > 4;\n\n if (!movedByUser || force) {\n const nextTop = snapshot.scrollTop + delta;\n\n if (metrics.element) {\n metrics.element.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n } else {\n window.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n }\n\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n return true;\n }\n\n return false;\n }\n\n private cancelPrependWatcher(): void {\n if (this.prependFrame) {\n window.cancelAnimationFrame(this.prependFrame);\n this.prependFrame = 0;\n }\n }\n\n private destroyObserver(): void {\n this.observer?.disconnect();\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.observer = undefined;\n this.resizeObserver = undefined;\n this.mutationObserver = undefined;\n }\n\n private clearSentinels(): void {\n this.topSentinel?.remove();\n this.bottomSentinel?.remove();\n this.topSentinel = undefined;\n this.bottomSentinel = undefined;\n }\n}\n\nfunction numberInput(value: number | string | null | undefined): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction nullableNumberInput(value: number | string | null | undefined | unknown): number | null {\n if (value == null || value === '') return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction booleanInput(value: boolean | string | null | undefined): boolean {\n if (value === '' || value === true) return true;\n if (value === 'false' || value === false || value == null) return false;\n return Boolean(value);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAgBA,MAAM,gBAAgB,GAAG,GAAG;AAC5B,MAAM,oBAAoB,GAAG,GAAG;AAChC,MAAM,mBAAmB,GAAG,IAAI;AAChC,MAAM,qBAAqB,GAAG,CAAC;MAOlB,iBAAiB,CAAA;AACnB,IAAA,sBAAsB,GAAG,KAAK,CAAC,gBAAgB,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,8BAAA,EAAA,CAAA,EACtD,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,WAAW,EAAA,CACtB;AAEO,IAAA,sBAAsB,GAAG,KAAK,CAAC,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,8BAAA,EAAA,CAAA,EAC3C,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,YAAY,EAAA,CACvB;AAEO,IAAA,4BAA4B,GAAG,KAAK,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,8BAAA,EAAA,CAAA,EAChD,KAAK,EAAE,8BAA8B;QACrC,SAAS,EAAE,YAAY,EAAA,CACvB;AAEO,IAAA,yBAAyB,GAAG,KAAK,CAAC,oBAAoB,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,8BAAA,EAAA,CAAA,EAC7D,KAAK,EAAE,2BAA2B;QAClC,SAAS,EAAE,WAAW,EAAA,CACtB;AAEO,IAAA,wBAAwB,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,8BAAA,EAAA,CAAA,EAC3D,KAAK,EAAE,0BAA0B;QACjC,SAAS,EAAE,mBAAmB,EAAA,CAC9B;AAEO,IAAA,0BAA0B,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,CAAA,EAC7D,KAAK,EAAE,4BAA4B;QACnC,SAAS,EAAE,mBAAmB,EAAA,CAC9B;IAEO,uBAAuB,GAAG,KAAK,CAA6B,MAAM,+FACzE,KAAK,EAAE,yBAAyB,EAAA,CAChC;IAEO,uBAAuB,GAAG,KAAK,CAA8B,IAAI,+FACxE,KAAK,EAAE,yBAAyB,EAAA,CAChC;IAEO,kBAAkB,GAAG,KAAK,CAAqB,IAAI,0FAC1D,KAAK,EAAE,oBAAoB,EAAA,CAC3B;AAEO,IAAA,YAAY,GAAG,KAAK,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,CAAA,EAChC,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,YAAY,EAAA,CACvB;AAEO,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAC7B,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,YAAY,EAAA,CACvB;;AAGO,IAAA,oCAAoC,GAAG,KAAK,CAAC,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,sCAAA,EAAA,8BAAA,EAAA,CAAA,EACxD,KAAK,EAAE,sCAAsC;QAC7C,SAAS,EAAE,YAAY,EAAA,CACvB;;IAGO,oCAAoC,GAAG,KAAK,CAAiB,MAAM,4GAC1E,KAAK,EAAE,sCAAsC,EAAA,CAC7C;IAEO,QAAQ,GAAG,MAAM,EAA0B;IAC3C,UAAU,GAAG,MAAM,EAA0B;IAC7C,YAAY,GAAG,MAAM,EAA0B;IAC/C,kBAAkB,GAAG,MAAM,EAA0B;IACrD,gBAAgB,GAAG,MAAM,EAA0B;AAE3C,IAAA,OAAO,GAAG,MAAM,EAAC,UAAuB,EAAC;AACzC,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IAEhC,KAAK,GAAG,MAAM,CAAC,KAAK;8EAAC;AAC9B,IAAA,qBAAqB;AAUrB,IAAA,QAAQ;AACR,IAAA,cAAc;AACd,IAAA,gBAAgB;AAChB,IAAA,WAAW;AACX,IAAA,cAAc;IACd,IAAI,GAAuB,IAAI;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,iBAAiB;IACxC,OAAO,GAAG,IAAI;IACd,SAAS,GAAG,IAAI;IAChB,gBAAgB,GAAG,KAAK;IACxB,YAAY,GAAG,CAAC;AAEhB,IAAA,eAAe;AAKvB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC9C,YAAA,MAAM,aAAa,GAAG;AACpB,gBAAA,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE;AACvC,gBAAA,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE;AAC3C,gBAAA,YAAY,EAAE,IAAI,CAAC,0BAA0B,EAAE;AAC/C,gBAAA,SAAS,EAAE,IAAI,CAAC,uBAAuB,EAAE;AACzC,gBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;AACjC,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,gBAAA,SAAS,EAAE,IAAI,CAAC,uBAAuB,EAAE;AACzC,gBAAA,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE;aAChC;AAED,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACxD;YACF;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;gBAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE;AAC1C,oBAAA,IAAI,CAAC,qBAAqB,GAAG,aAAa;oBAC1C,IAAI,CAAC,KAAK,EAAE;gBACd;gBAEA,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,oBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;oBACrB;gBACF;AAEA,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE;oBACvC,IAAI,CAAC,aAAa,EAAE;gBACtB;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC5B,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAEpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACvC;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;YACtC,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE;gBACvC,IAAI,CAAC,aAAa,EAAE;YACtB;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACxD;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA;;;AAGG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;IACjC;AAEQ,IAAA,iBAAiB,CAAC,IAAoD,EAAA;AAC5E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB;AAC3C,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AAE3B,QAAA,QACE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;AACnC,YAAA,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;AACvC,YAAA,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;AAC3C,YAAA,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;AACrC,YAAA,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;AAC3C,YAAA,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;AACnC,YAAA,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;AACrC,YAAA,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;IAE/B;IAEQ,KAAK,GAAA;QACX,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAE9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;AAEnD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AAEvC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QAEhC,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CACtC,CAAC,OAAO,KAAI;AACV,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACzB,oBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW;AAAE,wBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AAC1D,oBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc;AAAE,wBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;oBAC/D;gBACF;AAEA,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AACnE,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACpB;AAEA,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;AACxE,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBACtB;YACF;AACF,QAAA,CAAC,EACD;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE;AAClC,YAAA,SAAS,EAAE,CAAC;AACb,SAAA,CACF;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;AAE1C,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAK;YAC5C,IAAI,IAAI,CAAC,gBAAgB;gBAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAClC;YACA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE;gBACzE,IAAI,CAAC,aAAa,EAAE;YACtB;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,mBAAmB,EAAE;QAC5D,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;QAC3C;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;AAEjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAK;YAChD,IAAI,IAAI,CAAC,gBAAgB;gBAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAClC;YACA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE;gBACzE,IAAI,CAAC,aAAa,EAAE;YACtB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE;AAClC,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;IACJ;AAEQ,IAAA,OAAO,CAAC,SAAwB,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;YACjC;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS;QAChE,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,EAAE;YAC5E;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AACzC,QAAA,MAAM,KAAK,GAA2B;YACpC,SAAS;AACT,YAAA,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YACrC,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;AAED,QAAA,IAAI,CAAC,aAAa,GAAG,GAAG;AAExB,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,IAAI,CAAC,oCAAoC,EAAE,EAAE;gBAC/C,IAAI,CAAC,sBAAsB,EAAE;YAC/B;QACF;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACxB;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,YAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,SAAwB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACjD,QAAA,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,SAAS;IAC1D;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE;;AAEhD,QAAA,IAAI,SAAS,YAAY,WAAW,EAAE;AACpC,YAAA,OAAO,SAAS;QAClB;QAEA,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE;AACrD,YAAA,MAAM,KAAK,GAAe,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AACjF,YAAA,OAAO,KAAK,CAAC,aAAa,CAAc,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;QAClF;AAEA,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa;IACnC;IAEQ,eAAe,GAAA;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACrC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE;AAEhD,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;YACtB,OAAO,CAAA,EAAG,EAAE,CAAA,cAAA,CAAgB;QAC9B;AAEA,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,OAAO,CAAA,QAAA,EAAW,IAAI,CAAA,MAAA,CAAQ;QAChC;AAEA,QAAA,OAAO,CAAA,EAAG,EAAE,CAAA,OAAA,EAAU,IAAI,QAAQ;IACpC;AAEQ,IAAA,cAAc,CAAC,QAA0B,EAAA;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAC3C,QAAA,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,GAAG,QAAQ;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AAChC,QAAA,OAAO,IAAI;IACb;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,CAAC,UAAU,CAAC,MAAK;AACrB,YAAA,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,sBAAsB,EAAE;gBAAE;YAC5D,IAAI,CAAC,uBAAuB,EAAE;QAChC,CAAC,EAAE,qBAAqB,CAAC;IAC3B;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;YAC9E;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACpB,cAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB;AACjC,cAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;AAE1C,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG;AAC5B,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAE7C,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE;AACrD,YAAA,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE;AACjE,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB;QACF;QAEA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;AACxD,YAAA,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;AACnE,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB;QACF;IACF;AAEQ,IAAA,WAAW,CAAC,SAAwB,EAAA;AAC1C,QAAA,MAAM,QAAQ,GACZ,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC,0BAA0B,EAAE;AAC1F,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC/D;IAEQ,mBAAmB,GAAA;QACzB,IAAI,OAAO,QAAQ,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;QAChD,OAAO,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,KAAK,IAAI,CAAC;cAC/C,QAAQ,CAAC;cACV,IAAI;IACV;IAEQ,gBAAgB,GAAA;QAKtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,mBAAmB,EAAE;QACvD,IAAI,OAAO,EAAE;YACX,OAAO;gBACL,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC;QACH;QAEA,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,MAAM,CAAC,OAAO;AACzB,YAAA,YAAY,EAAE,IAAI,CAAC,GAAG,CACpB,QAAQ,CAAC,eAAe,CAAC,YAAY,EACrC,QAAQ,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,CACjC;SACF;IACH;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACvC,IAAI,CAAC,eAAe,GAAG;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC;QAED,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;QAClB,IAAI,CAAC,oBAAoB,EAAE;AAE3B,QAAA,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QAEnC,MAAM,KAAK,GAAG,MAAK;YACjB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAClD,gBAAA,IAAI,CAAC,YAAY,GAAG,CAAC;gBACrB;YACF;YAEA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YACpD,IAAI,WAAW,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,mBAAmB,EAAE;AACvE,gBAAA,IAAI,CAAC,YAAY,GAAG,CAAC;gBACrB;YACF;YAEA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACzD,QAAA,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC;IACzD;AAEQ,IAAA,oBAAoB,CAAC,KAAc,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;AACrC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAE1B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY;AAE1D,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,CAAC,eAAe,GAAG,SAAS;gBAChC,IAAI,CAAC,oBAAoB,EAAE;YAC7B;AACA,YAAA,OAAO,KAAK;QACd;AAEA;;;AAGG;AACH,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS;AACpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;AAEjE,QAAA,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,GAAG,KAAK;AAE1C,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,gBAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvB,oBAAA,GAAG,EAAE,OAAO;AACZ,oBAAA,QAAQ,EAAE,IAAI,CAAC,oCAAoC,EAAE;AACtD,iBAAA,CAAC;YACJ;iBAAO;gBACL,MAAM,CAAC,QAAQ,CAAC;AACd,oBAAA,GAAG,EAAE,OAAO;AACZ,oBAAA,QAAQ,EAAE,IAAI,CAAC,oCAAoC,EAAE;AACtD,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,CAAC,eAAe,GAAG,SAAS;YAChC,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,KAAK;IACd;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9C,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;QACvB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE;AACjC,QAAA,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;IACnC;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAC1B,QAAA,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;IACjC;uGA3iBW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oCAAA,EAAA,EAAA,iBAAA,EAAA,sCAAA,EAAA,UAAA,EAAA,sCAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oCAAA,EAAA,EAAA,iBAAA,EAAA,sCAAA,EAAA,UAAA,EAAA,sCAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;AA+iBD,SAAS,WAAW,CAAC,KAAyC,EAAA;AAC5D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC;AAC7C;AAEA,SAAS,mBAAmB,CAAC,KAAmD,EAAA;AAC9E,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,IAAI;AAC9C,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;AAChD;AAEA,SAAS,YAAY,CAAC,KAA0C,EAAA;AAC9D,IAAA,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAC/C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI;AAAE,QAAA,OAAO,KAAK;AACvE,IAAA,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB;;ACvlBA;;AAEG;;;;"}
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, viewChild, inject, DOCUMENT, HostListener, ViewEncapsulation, Component, createComponent, EventEmitter, Inject, Injectable, makeEnvironmentProviders, provideEnvironmentInitializer, Injector } from '@angular/core';
3
- import * as i1 from '@angular/common';
4
- import { CommonModule, DOCUMENT as DOCUMENT$1 } from '@angular/common';
2
+ import { InjectionToken, signal, viewChild, inject, DOCUMENT, HostListener, ViewEncapsulation, Component, EventEmitter, Injectable, makeEnvironmentProviders, provideEnvironmentInitializer, Injector } from '@angular/core';
5
3
  import { Subject } from 'rxjs';
4
+ import * as i1 from '@angular/common';
5
+ import { CommonModule } from '@angular/common';
6
6
  import { DomSanitizer } from '@angular/platform-browser';
7
- import { makeConfetti } from 'ngx-kit/core';
7
+ import { makeConfetti, OverlayService } from 'ngx-kit/core';
8
8
 
9
9
  const NGX_MESSAGE_CONFIGS = new InjectionToken('ngx-message-configs');
10
10
  const NGX_MESSAGE_API = new InjectionToken('NgxMessageService');
@@ -88,24 +88,12 @@ class NgxMessageComponent {
88
88
  makeConfetti(this.doc, confetti);
89
89
  }
90
90
  }
91
- /**
92
- * وقتی چند تا پیام هم‌زمان باز باشن، هرکدوم listener خودشو روی document
93
- * داشت — پس یه فشردن Escape/Enter، رویداد رو به *همه‌شون* هم‌زمان می‌فرستاد،
94
- * نه فقط آخرین پیامی که باز شده (رفتار طبیعیِ یه استکِ مودال باید این باشه
95
- * که فقط بالاترین لایه به کیبورد واکنش نشون بده). این چک همون چیزیه که
96
- * OverlayService با getLastDialog() برای اورلی‌ها انجام می‌ده.
97
- */
98
91
  isTopmost() {
99
92
  const ids = [...this.messageService.alerts.keys()];
100
93
  if (!ids.length)
101
94
  return true;
102
95
  return this.index === Math.max(...ids);
103
96
  }
104
- onScapeKey(event) {
105
- if (this.options.allowEscapeKey && this.isTopmost()) {
106
- this.onCancel();
107
- }
108
- }
109
97
  onEnterKey(event) {
110
98
  if (!this.isTopmost())
111
99
  return;
@@ -159,22 +147,13 @@ class NgxMessageComponent {
159
147
  close() {
160
148
  this.onCancel();
161
149
  }
162
- onOutSideClick() {
163
- if (this.options.allowOutsideClick) {
164
- this.onCancel();
165
- }
166
- }
167
- innerOnClick(ev) {
168
- ev.preventDefault();
169
- ev.stopPropagation();
170
- }
171
150
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxMessageComponent, isStandalone: true, selector: "ngx-message", host: { listeners: { "document:keydown.escape": "onScapeKey($event)", "document:keydown.enter": "onEnterKey($event)" } }, providers: [
151
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxMessageComponent, isStandalone: true, selector: "ngx-message", host: { listeners: { "document:keydown.enter": "onEnterKey($event)" } }, providers: [
173
152
  {
174
153
  provide: NGX_MESSAGE_CONFIGS,
175
154
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
176
155
  },
177
- ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
156
+ ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-msg-modal show\"\n [ngClass]=\"options.containerClass\"\n [attr.data-type]=\"options.icon\"\n animate.leave=\"close-ngx-msg-modal\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n</div>\n", styles: [".ngx-msg-modal{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-backdrop{-webkit-backdrop-filter:blur(4px) saturate(140%);backdrop-filter:blur(4px) saturate(140%)}.ngx-msg-panel{overflow:visible!important;box-shadow:none!important;border-radius:unset!important;border:none!important}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;overflow:hidden}.ngx-msg-modal.show{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.close-ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-modal .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-modal .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-modal.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-modal .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-modal.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-modal .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-modal .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-modal.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-modal .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-modal.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-modal .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-modal .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-modal.show h2{animation:textIn .5s .3s ease forwards}.ngx-msg-modal.show p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-modal.show .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-modal .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-modal .btn:active{transform:scale(.95)}.ngx-msg-modal .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-modal .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-modal .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-modal .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-modal .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-modal [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-modal *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-modal .btn:focus-visible,.ngx-msg-modal .trigger:focus-visible,.ngx-msg-modal .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-modal[data-type=success]{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-modal[data-type=error]{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-modal[data-type=warning]{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-modal[data-type=info]{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-modal[data-type=confirm]{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-modal[data-type=loading]{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
178
157
  }
179
158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageComponent, decorators: [{
180
159
  type: Component,
@@ -183,11 +162,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
183
162
  provide: NGX_MESSAGE_CONFIGS,
184
163
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
185
164
  },
186
- ], template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
187
- }], propDecorators: { confetti: [{ type: i0.ViewChild, args: ['confetti', { isSignal: true }] }], onScapeKey: [{
188
- type: HostListener,
189
- args: ['document:keydown.escape', ['$event']]
190
- }], onEnterKey: [{
165
+ ], template: "<div\n class=\"ngx-msg-modal show\"\n [ngClass]=\"options.containerClass\"\n [attr.data-type]=\"options.icon\"\n animate.leave=\"close-ngx-msg-modal\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n</div>\n", styles: [".ngx-msg-modal{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-backdrop{-webkit-backdrop-filter:blur(4px) saturate(140%);backdrop-filter:blur(4px) saturate(140%)}.ngx-msg-panel{overflow:visible!important;box-shadow:none!important;border-radius:unset!important;border:none!important}.ngx-msg-modal{position:relative;min-width:400px;max-width:80dvw;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;overflow:hidden}.ngx-msg-modal.show{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.close-ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-modal .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-modal .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-modal.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-modal .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-modal.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-modal .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-modal .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-modal.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-modal .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-modal.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-modal .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-modal .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px);overflow:auto;max-height:70dvh}.ngx-msg-modal.show h2{animation:textIn .5s .3s ease forwards}.ngx-msg-modal.show p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-modal.show .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-modal .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-modal .btn:active{transform:scale(.95)}.ngx-msg-modal .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-modal .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-modal .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-modal .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-modal .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-modal [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-modal *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-modal .btn:focus-visible,.ngx-msg-modal .trigger:focus-visible,.ngx-msg-modal .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-modal[data-type=success]{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-modal[data-type=error]{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-modal[data-type=warning]{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-modal[data-type=info]{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-modal[data-type=confirm]{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-modal[data-type=loading]{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
166
+ }], propDecorators: { confetti: [{ type: i0.ViewChild, args: ['confetti', { isSignal: true }] }], onEnterKey: [{
191
167
  type: HostListener,
192
168
  args: ['document:keydown.enter', ['$event']]
193
169
  }] } });
@@ -206,84 +182,63 @@ function applyDefaultConfig(config, defaultConfig) {
206
182
  }
207
183
 
208
184
  class NgxMessageService {
209
- appRef;
210
185
  injector;
211
- envInjector;
212
- _doc;
213
- // قبلاً یه آرایه‌ی معمولی بود (`ComponentRef[]`) و removeDialogComponentFromBody
214
- // فقط componentRef رو destroy می‌کرد ولی هیچ‌وقت از آرایه حذفش نمی‌کرد — یعنی
215
- // این سرویس (که providedIn:'root' و singleton سراسریه) به ازای هر پیامی که
216
- // تا حالا تو کل عمر اپ نشون داده شده، یک رفرنس destroy-شده رو برای همیشه نگه
217
- // می‌داشت: یک نشتی حافظه‌ی پیوسته. با Map<id, ComponentRef> جایگزین شد که
218
- // با delete واقعاً entry رو آزاد می‌کنه؛ کلید هم شناسه‌ی پایدارِ پیام (insertedId)
219
- // هست، نه موقعیتِ آرایه (که با splice ممکن بود جابه‌جا و نامعتبر بشه).
220
186
  alerts = new Map();
187
+ overlay = inject(OverlayService);
221
188
  insertedId = 0;
222
- constructor(appRef, injector, envInjector, _doc) {
223
- this.appRef = appRef;
189
+ constructor(injector) {
224
190
  this.injector = injector;
225
- this.envInjector = envInjector;
226
- this._doc = _doc;
227
191
  }
228
192
  show(c) {
229
193
  let d = applyDefaultConfig(this.injector.get(NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS), NGX_MESSAGE_DEFAULT_OPTIONS);
230
194
  const config = applyDefaultConfig(c, d);
231
- const componentRef = createComponent(NgxMessageComponent, {
232
- environmentInjector: this.envInjector,
233
- });
234
- this.appRef.attachView(componentRef.hostView);
235
195
  const id = this.insertedId++;
236
196
  const payload = {
237
- close: () => componentRef.instance.close(),
197
+ close,
238
198
  id,
239
199
  afterClose: new EventEmitter(),
240
200
  };
241
- this.appendDialogComponentToBody(componentRef, config);
242
- componentRef.instance.options = config;
243
- componentRef.instance.index = id;
244
- componentRef.instance.onClose.subscribe((result) => {
245
- this.removeDialogComponentFromBody(result.index);
246
- payload.afterClose.emit(result.result);
201
+ const ref = this.overlay.open({
202
+ component: NgxMessageComponent,
203
+ usePopover: config.useOverlay,
204
+ closeOnEscape: config.allowEscapeKey,
205
+ closeOnOutsideClick: config.allowOutsideClick,
206
+ alignment: 'center',
207
+ placement: 'center',
208
+ ariaDescribedby: config.ariaDescribedby,
209
+ ariaLabel: config.ariaLabel,
210
+ ariaLabelledby: config.ariaLabelledby,
211
+ ariaModal: true,
212
+ role: 'alertdialog',
213
+ backdropClass: 'ngx-msg-backdrop',
214
+ panelClass: 'ngx-msg-panel',
215
+ configure: (instance, ref) => {
216
+ instance.options = config;
217
+ instance.index = id;
218
+ instance.onClose.subscribe((result) => {
219
+ this.remove(result.index);
220
+ payload.afterClose.emit(result.result);
221
+ });
222
+ },
223
+ onClosed: () => this.remove(id),
247
224
  });
248
- this.alerts.set(id, componentRef);
225
+ this.alerts.set(id, ref);
249
226
  return payload;
250
227
  }
251
- removeDialogComponentFromBody(id) {
228
+ remove(id) {
252
229
  const ref = this.alerts.get(id);
253
230
  if (!ref)
254
231
  return;
255
- const domElem = ref.hostView.rootNodes[0];
256
- // قبل از destroy باید hidePopover صدا بزنیم
257
- if (domElem.popover === 'manual') {
258
- try {
259
- domElem.hidePopover();
260
- }
261
- catch { }
262
- }
263
- this.appRef.detachView(ref.hostView);
264
- ref.destroy();
232
+ ref.close();
265
233
  this.alerts.delete(id);
266
234
  }
267
- appendDialogComponentToBody(componentRef, config) {
268
- const domElem = componentRef.hostView.rootNodes[0];
269
- if (config.containerClass) {
270
- for (let c of config.containerClass.split(' ')) {
271
- if (c.trim())
272
- domElem.classList.add(c);
273
- }
274
- }
275
- this._doc.body.appendChild(domElem);
276
- if (config.useOverlay) {
277
- domElem.popover = 'manual';
278
- domElem.showPopover();
279
- }
280
- }
281
235
  closeAll() {
282
- for (const id of [...this.alerts.keys()]) {
283
- this.removeDialogComponentFromBody(id);
284
- }
236
+ this.alerts.forEach((item) => {
237
+ item.close();
238
+ });
239
+ this.alerts.clear();
285
240
  }
286
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }, { token: i0.EnvironmentInjector }, { token: DOCUMENT$1 }], target: i0.ɵɵFactoryTarget.Injectable });
241
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
287
242
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageService, providedIn: 'root' });
288
243
  }
289
244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageService, decorators: [{
@@ -291,10 +246,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
291
246
  args: [{
292
247
  providedIn: 'root',
293
248
  }]
294
- }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.Injector }, { type: i0.EnvironmentInjector }, { type: Document, decorators: [{
295
- type: Inject,
296
- args: [DOCUMENT$1]
297
- }] }] });
249
+ }], ctorParameters: () => [{ type: i0.Injector }] });
298
250
 
299
251
  /**
300
252
  * Static facade so call sites can use: MSG.warn('msg', opts)