ngx-kit 8.0.1 → 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.
- package/fesm2022/ngx-kit-core.mjs +1 -1
- package/fesm2022/ngx-kit-core.mjs.map +1 -1
- package/fesm2022/ngx-kit-drag-resize.mjs +291 -178
- package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
- package/fesm2022/ngx-kit-infinite-scroll.mjs +4 -1
- package/fesm2022/ngx-kit-infinite-scroll.mjs.map +1 -1
- package/fesm2022/ngx-kit-message.mjs +43 -91
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ngx-kit-drag-resize.d.ts +53 -33
- package/types/ngx-kit-message.d.ts +9 -25
|
@@ -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
|
|
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":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, signal, viewChild, inject, DOCUMENT, HostListener, ViewEncapsulation, Component,
|
|
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.
|
|
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 }] }],
|
|
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(
|
|
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
|
|
197
|
+
close,
|
|
238
198
|
id,
|
|
239
199
|
afterClose: new EventEmitter(),
|
|
240
200
|
};
|
|
241
|
-
this.
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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,
|
|
225
|
+
this.alerts.set(id, ref);
|
|
249
226
|
return payload;
|
|
250
227
|
}
|
|
251
|
-
|
|
228
|
+
remove(id) {
|
|
252
229
|
const ref = this.alerts.get(id);
|
|
253
230
|
if (!ref)
|
|
254
231
|
return;
|
|
255
|
-
|
|
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
|
-
|
|
283
|
-
|
|
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.
|
|
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.
|
|
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)
|