primeng
Version:
PrimeNG is a premium UI library for Angular featuring a rich set of 90+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBlock,
1 lines • 74.8 kB
Source Map (JSON)
{"version":3,"file":"primeng-toast.mjs","sources":["../../src/toast/style/toaststyle.ts","../../src/toast/toast-item.ts","../../src/toast/toast.ts","../../src/toast/primeng-toast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { style } from '@primeuix/styles/toast';\nimport { BaseStyle } from 'primeng/base';\n\n// Position\nconst inlineStyles = {\n root: ({ instance }) => {\n const position = instance.position();\n\n return {\n position: 'fixed',\n top: position === 'top-right' || position === 'top-left' || position === 'top-center' ? '20px' : position === 'center' ? '50%' : null,\n right: (position === 'top-right' || position === 'bottom-right') && '20px',\n bottom: (position === 'bottom-left' || position === 'bottom-right' || position === 'bottom-center') && '20px',\n left: position === 'top-left' || position === 'bottom-left' ? '20px' : position === 'center' || position === 'top-center' || position === 'bottom-center' ? '50%' : null\n };\n }\n};\n\nconst classes = {\n root: ({ instance }) => ['p-toast p-component', `p-toast-${instance.position()}`],\n\n message: ({ instance }) => ({\n 'p-toast-message': true,\n 'p-toast-message-normal': instance.message().severity === 'normal' || instance.message().severity === undefined,\n 'p-toast-message-info': instance.message().severity === 'info',\n 'p-toast-message-warn': instance.message().severity === 'warn',\n 'p-toast-message-error': instance.message().severity === 'error',\n 'p-toast-message-success': instance.message().severity === 'success',\n 'p-toast-message-secondary': instance.message().severity === 'secondary',\n 'p-toast-message-contrast': instance.message().severity === 'contrast'\n }),\n messageContent: 'p-toast-message-content',\n messageIcon: ({ instance }) => ({\n 'p-toast-message-icon': true,\n [`pi ${instance.message().icon}`]: !!instance.message().icon\n }),\n messageText: 'p-toast-message-text',\n summary: 'p-toast-summary',\n detail: 'p-toast-detail',\n closeButton: 'p-toast-close-button',\n closeIcon: ({ instance }) => ({\n 'p-toast-close-icon': true,\n [`pi ${instance.message().closeIcon}`]: !!instance.message().closeIcon\n })\n};\n\n@Injectable()\nexport class ToastStyle extends BaseStyle {\n name = 'toast';\n\n style = style;\n\n classes = classes;\n\n inlineStyles = inlineStyles;\n}\n\n/**\n *\n * Toast is used to display messages in an overlay.\n *\n * [Live Demo](https://www.primeng.org/toast/)\n *\n * @module toaststyle\n *\n */\nexport enum ToastClasses {\n /**\n * Class name of the root element\n */\n root = 'p-toast',\n /**\n * Class name of the message element\n */\n message = 'p-toast-message',\n /**\n * Class name of the message content element\n */\n messageContent = 'p-toast-message-content',\n /**\n * Class name of the message icon element\n */\n messageIcon = 'p-toast-message-icon',\n /**\n * Class name of the message text element\n */\n messageText = 'p-toast-message-text',\n /**\n * Class name of the summary element\n */\n summary = 'p-toast-summary',\n /**\n * Class name of the detail element\n */\n detail = 'p-toast-detail',\n /**\n * Class name of the close button element\n */\n closeButton = 'p-toast-close-button',\n /**\n * Class name of the close icon element\n */\n closeIcon = 'p-toast-close-icon'\n}\n\nexport interface ToastStyle extends BaseStyle {}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, numberAttribute, output, signal, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { MotionEvent, MotionOptions } from '@primeuix/motion';\nimport { SharedModule, ToastMessageOptions } from 'primeng/api';\nimport { BaseComponent } from 'primeng/basecomponent';\nimport { Bind } from 'primeng/bind';\nimport { Check as CheckIcon } from '@primeicons/angular/check';\nimport { InfoCircle as InfoCircleIcon } from '@primeicons/angular/info-circle';\nimport { TimesCircle as TimesCircleIcon } from '@primeicons/angular/times-circle';\nimport { ExclamationTriangle as ExclamationTriangleIcon } from '@primeicons/angular/exclamation-triangle';\nimport { Times as TimesIcon } from '@primeicons/angular/times';\nimport { MotionModule } from 'primeng/motion';\nimport { ToastHeadlessTemplateContext, ToastItemCloseEvent, ToastMessageTemplateContext, ToastPassThrough } from 'primeng/types/toast';\nimport { ToastStyle } from './style/toaststyle';\n\nconst SWIPE_THRESHOLD = 50;\nconst VELOCITY_THRESHOLD = 0.11;\nconst SWIPE_OUT_DURATION = 500;\n\n@Component({\n selector: 'p-toast-item',\n standalone: true,\n imports: [NgTemplateOutlet, CheckIcon, InfoCircleIcon, TimesCircleIcon, ExclamationTriangleIcon, TimesIcon, SharedModule, Bind, MotionModule],\n template: `\n <div\n #container\n [pMotion]=\"visible()\"\n [pMotionAppear]=\"true\"\n [pMotionOptions]=\"motionOptions()\"\n (pMotionOnBeforeEnter)=\"onBeforeEnter($event)\"\n (pMotionOnAfterEnter)=\"onAfterEnter()\"\n (pMotionOnAfterLeave)=\"onAfterLeave($event)\"\n [attr.id]=\"message()?.id\"\n [pBind]=\"ptm('message')\"\n [class]=\"cn(cx('message'), message()?.styleClass)\"\n [style]=\"stackStyles()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp()\"\n (dragend)=\"onDragEnd()\"\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [attr.data-p]=\"dataP()\"\n data-stack=\"\"\n [attr.data-mounted]=\"dataMounted()\"\n [attr.data-removed]=\"dataRemoved()\"\n [attr.data-front]=\"dataFront()\"\n [attr.data-expanded]=\"dataExpanded()\"\n [attr.data-visible]=\"dataVisible()\"\n [attr.data-swiping]=\"dataSwiping()\"\n [attr.data-swiped]=\"dataSwiped()\"\n [attr.data-swipe-out]=\"dataSwipeOut()\"\n [attr.data-swipe-direction]=\"dataSwipeDirection()\"\n [attr.data-dismissible]=\"dataDismissible()\"\n >\n @if (headlessTemplate()) {\n <ng-container *ngTemplateOutlet=\"headlessTemplate(); context: headlessContext()\"></ng-container>\n } @else {\n <div [pBind]=\"ptm('messageContent')\" [class]=\"cn(cx('messageContent'), message()?.contentStyleClass)\">\n @if (!template()) {\n @if (message()?.icon) {\n <span [pBind]=\"ptm('messageIcon')\" [class]=\"cn(cx('messageIcon'), message()?.icon)\"></span>\n } @else if (severityIcon()) {\n @switch (severityIcon()) {\n @case ('check') {\n <svg data-p-icon=\"check\" [pBind]=\"ptm('messageIcon')\" [class]=\"cx('messageIcon')\" [attr.aria-hidden]=\"true\" />\n }\n @case ('times-circle') {\n <svg data-p-icon=\"times-circle\" [pBind]=\"ptm('messageIcon')\" [class]=\"cx('messageIcon')\" [attr.aria-hidden]=\"true\" />\n }\n @case ('exclamation-triangle') {\n <svg data-p-icon=\"exclamation-triangle\" [pBind]=\"ptm('messageIcon')\" [class]=\"cx('messageIcon')\" [attr.aria-hidden]=\"true\" />\n }\n @case ('info-circle') {\n <svg data-p-icon=\"info-circle\" [pBind]=\"ptm('messageIcon')\" [class]=\"cx('messageIcon')\" [attr.aria-hidden]=\"true\" />\n }\n }\n }\n <div [pBind]=\"ptm('messageText')\" [class]=\"cx('messageText')\" [attr.data-p]=\"dataP()\">\n <div [pBind]=\"ptm('summary')\" [class]=\"cx('summary')\" [attr.data-p]=\"dataP()\">\n {{ message()?.summary }}\n </div>\n <div [pBind]=\"ptm('detail')\" [class]=\"cx('detail')\" [attr.data-p]=\"dataP()\">{{ message()?.detail }}</div>\n </div>\n }\n @if (template()) {\n <ng-container *ngTemplateOutlet=\"template(); context: messageContext()\"></ng-container>\n }\n @if (showCloseButton()) {\n <div>\n <button\n [pBind]=\"ptm('closeButton')\"\n type=\"button\"\n [attr.class]=\"cx('closeButton')\"\n (click)=\"onCloseIconClick($event)\"\n (keydown.enter)=\"onCloseIconClick($event)\"\n [attr.aria-label]=\"closeAriaLabel\"\n autofocus\n [attr.data-p]=\"dataP()\"\n >\n @if (message()?.closeIcon) {\n <span [pBind]=\"ptm('closeIcon')\" [class]=\"cn(cx('closeIcon'), message()?.closeIcon)\"></span>\n } @else {\n <svg [pBind]=\"ptm('closeIcon')\" data-p-icon=\"times\" [class]=\"cx('closeIcon')\" [attr.aria-hidden]=\"true\" />\n }\n </button>\n </div>\n }\n </div>\n }\n </div>\n `,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [ToastStyle]\n})\nexport class ToastItem extends BaseComponent<ToastPassThrough> {\n /**\n * Message instance.\n * @group Props\n */\n message = input<ToastMessageOptions | null>();\n /**\n * Index of the message.\n * @group Props\n */\n index = input<number, unknown>(undefined, { transform: numberAttribute });\n /**\n * Life duration in milliseconds.\n * @group Props\n */\n life = input<number, unknown>(undefined, { transform: numberAttribute });\n /**\n * Custom message template.\n * @group Props\n */\n template = input<TemplateRef<ToastMessageTemplateContext>>();\n /**\n * Custom headless template.\n * @group Props\n */\n headlessTemplate = input<TemplateRef<ToastHeadlessTemplateContext>>();\n /**\n * The motion options.\n * @group Props\n */\n motionOptions = input<MotionOptions>();\n /**\n * Clear all trigger.\n * @group Props\n */\n clearAll = input<object | null>(null);\n /**\n * Whether the stack is expanded.\n * @group Props\n */\n stackExpanded = input(false);\n /**\n * Whether the toast container is currently hovered or focused.\n * @group Props\n */\n stackIsHovered = input(false);\n /**\n * Index of this toast in the stack.\n * @group Props\n */\n stackIndex = input(0, { transform: numberAttribute });\n /**\n * Total number of toasts in the stack.\n * @group Props\n */\n stackTotal = input(0, { transform: numberAttribute });\n /**\n * Cumulative offset for expanded state in pixels.\n * @group Props\n */\n stackOffset = input(0, { transform: numberAttribute });\n /**\n * Whether this toast is within the visible limit.\n * @group Props\n */\n stackIsVisible = input(false);\n /**\n * Whether the user is interacting with the toast container.\n * @group Props\n */\n stackIsInteracting = input(false);\n /**\n * Position of the toast container.\n * @group Props\n */\n position = input<string>('top-right');\n /**\n * Emits when animation starts.\n * @group Emits\n */\n onAnimationStart = output<HTMLElement>();\n /**\n * Emits when animation ends.\n * @group Emits\n */\n onAnimationEnd = output<HTMLElement>();\n /**\n * Emits when message is closed.\n * @group Emits\n */\n onClose = output<ToastItemCloseEvent>();\n /**\n * Emits when toast height is measured (for stack mode).\n * @group Emits\n */\n onHeightChange = output<{ index: number; height: number; removed?: boolean }>();\n\n _componentStyle = inject(ToastStyle);\n\n timeout: ReturnType<typeof setTimeout> | null = null;\n\n visible = signal<boolean | undefined>(undefined);\n\n showCloseButton = computed(() => this.message()?.closable !== false);\n\n private static readonly severityIcons: Record<string, string> = {\n success: 'check',\n info: 'info-circle',\n error: 'times-circle',\n warn: 'exclamation-triangle',\n secondary: 'info-circle',\n contrast: 'info-circle'\n };\n\n severityIcon = computed(() => ToastItem.severityIcons[this.message()?.severity as string] ?? null);\n\n private isDestroyed = false;\n\n mounted = signal(false);\n\n measuredHeight = signal(0);\n\n removed = signal(false);\n\n offsetBeforeRemove = signal(0);\n\n swiping = signal(false);\n\n isSwiped = signal(false);\n\n swipeOut = signal(false);\n\n swipeDirection = signal<'x' | 'y' | null>(null);\n\n swipeOutDirection = signal<'left' | 'right' | 'up' | 'down' | null>(null);\n\n swipeAmountX = signal(0);\n\n swipeAmountY = signal(0);\n\n pointerStartPosition: { x: number; y: number } | null = null;\n\n swipeStartTime = 0;\n\n dataMounted = computed(() => (this.mounted() ? '' : null));\n\n dataFront = computed(() => (this.stackIndex() === 0 ? '' : null));\n\n dataExpanded = computed(() => (this.stackExpanded() ? '' : null));\n\n dataVisible = computed(() => (this.stackIsVisible() ? '' : null));\n\n dataRemoved = computed(() => (this.removed() ? '' : null));\n\n dataSwiping = computed(() => (this.swiping() ? '' : null));\n\n dataSwiped = computed(() => (this.isSwiped() ? '' : null));\n\n dataSwipeOut = computed(() => (this.swipeOut() ? '' : null));\n\n dataSwipeDirection = computed(() => (this.swipeOutDirection() ? this.swipeOutDirection() : null));\n\n dataDismissible = computed(() => String(this.message()?.closable !== false));\n\n stackStyles = computed(() => {\n const idx = this.stackIndex();\n const total = this.stackTotal();\n return {\n '--px-toast-index': this.removed() ? this.stackIndex() : idx,\n '--px-toast-z-index': total - idx,\n '--px-initial-height': this.measuredHeight() + 'px',\n '--px-toast-offset': (this.removed() ? this.offsetBeforeRemove() : this.stackOffset()) + 'px',\n '--px-swipe-amount-x': this.swipeAmountX() + 'px',\n '--px-swipe-amount-y': this.swipeAmountY() + 'px',\n 'z-index': total - idx\n };\n });\n\n constructor() {\n super();\n\n effect(() => {\n if (this.clearAll()) {\n this.visible.set(false);\n }\n });\n\n effect(() => {\n // Pause auto-dismiss only while hovered/focused, interacting or swiping — not in expanded mode\n // (expanded just lays the stack out open; toasts still dismiss on their own). Mirrors React's useToast.\n const hovered = this.stackIsHovered();\n const interacting = this.stackIsInteracting();\n const swiping = this.swiping();\n\n if (hovered || interacting || swiping) {\n this.pauseStackTimer();\n } else {\n this.startStackTimer();\n }\n });\n }\n\n onBeforeEnter(event: MotionEvent) {\n this.onAnimationStart.emit(event.element as HTMLElement);\n }\n\n onAfterEnter() {\n this.measureStackHeight();\n }\n\n onAfterLeave(event: MotionEvent) {\n if (!this.visible() && !this.isDestroyed) {\n this.onClose.emit({\n index: this.index() as number,\n message: this.message() as ToastMessageOptions\n });\n\n if (!this.isDestroyed) {\n this.onAnimationEnd.emit(event.element as HTMLElement);\n }\n }\n }\n\n onAfterViewInit() {\n this.visible.set(true);\n this.measureStackHeight();\n }\n\n private measureStackHeight() {\n if (this.mounted()) return;\n const el = this.el.nativeElement.querySelector('[data-stack]') as HTMLElement;\n if (!el) return;\n const orig = el.style.height;\n el.style.height = 'auto';\n const height = el.getBoundingClientRect().height;\n el.style.height = orig;\n this.measuredHeight.set(height);\n this.onHeightChange.emit({ index: this.index() as number, height });\n this.mounted.set(true);\n }\n\n private remainingTime = 0;\n\n private timerStartTime = 0;\n\n startStackTimer() {\n const msg = this.message();\n if (msg?.sticky) return;\n this.clearTimeout();\n if (this.remainingTime <= 0) {\n this.remainingTime = msg?.life || this.life() || 3000;\n }\n this.timerStartTime = Date.now();\n this.timeout = setTimeout(() => {\n this.handleFocusOnRemove();\n this.closeStack();\n }, this.remainingTime);\n }\n\n pauseStackTimer() {\n if (this.timerStartTime > 0 && this.timeout) {\n const elapsed = Date.now() - this.timerStartTime;\n this.remainingTime = Math.max(0, this.remainingTime - elapsed);\n }\n this.clearTimeout();\n }\n\n clearTimeout() {\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n onCloseIconClick = (event?: Event) => {\n this.clearTimeout();\n\n this.handleFocusOnRemove();\n this.closeStack();\n\n event?.preventDefault();\n };\n\n private closeStack() {\n this.markRemoved();\n this.visible.set(false);\n }\n\n private isDismissible(): boolean {\n return this.message()?.closable !== false;\n }\n\n private markRemoved() {\n // A pending close/transition callback can reach this after teardown; bail so we don't\n // emit on a destroyed OutputRef.\n if (this.isDestroyed) return;\n this.offsetBeforeRemove.set(this.stackOffset());\n this.removed.set(true);\n this.onHeightChange.emit({ index: this.index() as number, height: 0, removed: true });\n }\n\n onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n if (!this.isDismissible()) return;\n\n this.swipeStartTime = Date.now();\n this.offsetBeforeRemove.set(this.stackOffset());\n\n try {\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n } catch (_) {\n // ignore — some elements don't support pointer capture\n }\n\n this.swiping.set(true);\n this.pointerStartPosition = { x: event.clientX, y: event.clientY };\n };\n\n onPointerMove = (event: PointerEvent) => {\n if (!this.pointerStartPosition || !this.isDismissible()) return;\n if ((window.getSelection()?.toString().length ?? 0) > 0) return;\n\n const yDelta = event.clientY - this.pointerStartPosition.y;\n const xDelta = event.clientX - this.pointerStartPosition.x;\n const isRealSwipe = Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1;\n\n const positionParts = (this.position() ?? 'top-right').split('-');\n const side = positionParts[0];\n const align = positionParts[1];\n\n if (!this.swipeDirection() && isRealSwipe) {\n this.swipeDirection.set(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n\n let nextX = 0;\n let nextY = 0;\n\n if (this.swipeDirection() === 'x') {\n const naturalDirection = (align === 'left' && xDelta < 0) || (align === 'right' && xDelta > 0);\n nextX = naturalDirection ? xDelta : this.applyDampening(xDelta);\n } else if (this.swipeDirection() === 'y') {\n const naturalDirection = (side === 'top' && yDelta < 0) || (side === 'bottom' && yDelta > 0);\n nextY = naturalDirection ? yDelta : this.applyDampening(yDelta);\n }\n\n if (Math.abs(nextX) > 0 || Math.abs(nextY) > 0) {\n this.isSwiped.set(true);\n }\n\n this.swipeAmountX.set(nextX);\n this.swipeAmountY.set(nextY);\n };\n\n onPointerUp = () => {\n if (this.swipeOut() || !this.isDismissible()) return;\n\n this.swiping.set(false);\n this.pointerStartPosition = null;\n\n const swipeAmount = this.swipeDirection() === 'x' ? this.swipeAmountX() : this.swipeAmountY();\n const elapsed = Date.now() - (this.swipeStartTime || Date.now());\n const velocity = elapsed > 0 ? Math.abs(swipeAmount) / elapsed : 0;\n\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > VELOCITY_THRESHOLD) {\n this.offsetBeforeRemove.set(this.stackOffset());\n\n if (this.swipeDirection() === 'x') {\n this.swipeOutDirection.set(this.swipeAmountX() > 0 ? 'right' : 'left');\n } else {\n this.swipeOutDirection.set(this.swipeAmountY() > 0 ? 'down' : 'up');\n }\n\n this.swipeOut.set(true);\n this.markRemoved();\n this.scheduleSwipeOutClose();\n\n return;\n }\n\n this.swipeAmountX.set(0);\n this.swipeAmountY.set(0);\n this.isSwiped.set(false);\n this.swipeDirection.set(null);\n };\n\n onDragEnd = () => {\n this.swiping.set(false);\n this.swipeDirection.set(null);\n this.pointerStartPosition = null;\n };\n\n private applyDampening(delta: number): number {\n const factor = Math.abs(delta) / 20;\n const dampenedDelta = delta * (1 / (1.5 + factor));\n return Math.abs(dampenedDelta) < Math.abs(delta) ? dampenedDelta : delta;\n }\n\n private scheduleSwipeOutClose() {\n this.clearTimeout();\n this.timeout = setTimeout(() => {\n this.visible.set(false);\n }, SWIPE_OUT_DURATION);\n }\n\n private handleFocusOnRemove() {\n const el = this.el.nativeElement;\n const activeEl = this.document.activeElement as HTMLElement;\n if (!el?.contains(activeEl)) return;\n const next = el.nextElementSibling?.querySelector('[data-pc-section=\"closebutton\"]') as HTMLElement;\n const prev = el.previousElementSibling?.querySelector('[data-pc-section=\"closebutton\"]') as HTMLElement;\n requestAnimationFrame(() => {\n if (next) next.focus({ preventScroll: true });\n else if (prev) prev.focus({ preventScroll: true });\n });\n }\n\n get closeAriaLabel() {\n return this.config.translation.aria ? this.config.translation.aria.close : undefined;\n }\n\n onDestroy() {\n this.isDestroyed = true;\n this.clearTimeout();\n this.visible.set(false);\n }\n\n headlessContext = computed<ToastHeadlessTemplateContext>(() => ({\n $implicit: this.message(),\n closeFn: this.onCloseIconClick\n }));\n\n messageContext = computed<ToastMessageTemplateContext>(() => ({\n $implicit: this.message(),\n closeFn: this.onCloseIconClick\n }));\n\n dataP = computed(() => {\n const msg = this.message();\n return this.cn({\n [msg?.severity as string]: msg?.severity\n });\n });\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChild, inject, InjectionToken, input, NgModule, numberAttribute, output, signal, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { MotionOptions } from '@primeuix/motion';\nimport { isEmpty, setAttribute, uuid } from '@primeuix/utils';\nimport { MessageService, SharedModule, ToastMessageOptions } from 'primeng/api';\nimport { BaseComponent, PARENT_INSTANCE } from 'primeng/basecomponent';\nimport { Bind } from 'primeng/bind';\nimport { ToastBreakpoints, ToastCloseEvent, ToastHeadlessTemplateContext, ToastItemCloseEvent, ToastMessageTemplateContext, ToastModeType, ToastPassThrough, ToastPositionType } from 'primeng/types/toast';\nimport { ZIndexUtils } from 'primeng/utils';\nimport { Subscription } from 'rxjs';\nimport { ToastStyle } from './style/toaststyle';\nimport { ToastItem } from './toast-item';\n\nconst TOAST_INSTANCE = new InjectionToken<Toast>('TOAST_INSTANCE');\n\n/**\n * Toast is used to display messages in an overlay.\n * @group Components\n */\n@Component({\n selector: 'p-toast',\n standalone: true,\n imports: [ToastItem, SharedModule],\n template: `\n @for (msg of messages; track msg; let i = $index) {\n <p-toast-item\n [message]=\"msg\"\n [index]=\"i\"\n [life]=\"life()\"\n [clearAll]=\"clearAllTrigger()\"\n (onClose)=\"onMessageClose($event)\"\n (onAnimationEnd)=\"onAnimationEnd()\"\n (onAnimationStart)=\"onAnimationStart()\"\n [template]=\"messageTemplate()\"\n [headlessTemplate]=\"headlessTemplate()\"\n [pt]=\"pt\"\n [unstyled]=\"unstyled()\"\n [motionOptions]=\"computedMotionOptions()\"\n [stackExpanded]=\"isExpanded()\"\n [stackIsHovered]=\"hovered()\"\n [stackIsInteracting]=\"isInteracting()\"\n [stackIndex]=\"getStackIndex(i)\"\n [stackTotal]=\"stackTotal()\"\n [stackOffset]=\"getStackOffset(i)\"\n [stackIsVisible]=\"isStackVisible(i)\"\n [position]=\"position()\"\n (onHeightChange)=\"onItemHeightChange($event)\"\n ></p-toast-item>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [ToastStyle, { provide: TOAST_INSTANCE, useExisting: Toast }, { provide: PARENT_INSTANCE, useExisting: Toast }],\n host: {\n '[class]': \"cx('root')\",\n '[style]': \"sx('root')\",\n '[attr.data-p]': 'dataP()',\n '[attr.data-position]': 'position()',\n '[attr.data-expanded]': 'hostDataExpanded()',\n '[style.--px-gap.px]': 'stackGap()',\n '[style.--px-front-toast-height.px]': 'frontToastHeight()',\n '[style.--px-raise-factor]': 'raiseFactor()',\n '(mouseenter)': 'onContainerMouseEnter()',\n '(mouseleave)': 'onContainerMouseLeave($event)',\n '(pointerdown)': 'onContainerPointerDown($event)',\n '(pointerup)': 'onContainerPointerUp()'\n },\n hostDirectives: [Bind]\n})\nexport class Toast extends BaseComponent<ToastPassThrough> {\n componentName = 'Toast';\n\n $pcToast: Toast | undefined = inject(TOAST_INSTANCE, { optional: true, skipSelf: true }) ?? undefined;\n\n bindDirectiveInstance = inject(Bind, { self: true });\n\n onAfterViewChecked() {\n this.bindDirectiveInstance.setAttrs(this.ptms(['host', 'root']));\n }\n /**\n * Key of the message in case message is targeted to a specific toast component.\n * @group Props\n */\n key = input<string>();\n /**\n * Whether to automatically manage layering.\n * @group Props\n */\n autoZIndex = input(true, { transform: booleanAttribute });\n /**\n * Base zIndex value to use in layering.\n * @group Props\n */\n baseZIndex = input(0, { transform: numberAttribute });\n /**\n * The default time to display messages for in milliseconds.\n * @group Props\n */\n life = input(3000, { transform: numberAttribute });\n /**\n * Position of the toast in viewport.\n * @group Props\n */\n position = input<ToastPositionType>('top-right');\n /**\n * Layout mode of the toast. `stacked` collapses toasts into a stack that expands on hover/focus; `expanded` always renders every toast expanded.\n * @defaultValue 'stacked'\n * @group Props\n */\n mode = input<ToastModeType>('stacked');\n /**\n * Gap between stacked toast items in pixels.\n * @group Props\n */\n stackGap = input(8, { transform: numberAttribute });\n /**\n * Maximum number of visible toasts in the stack.\n * @group Props\n */\n stackVisibleLimit = input(3, { transform: numberAttribute });\n /**\n * It does not add the new message if there is already a toast displayed with the same content\n * @group Props\n */\n preventOpenDuplicates = input(false, { transform: booleanAttribute });\n /**\n * Displays only once a message with the same content.\n * @group Props\n */\n preventDuplicates = input(false, { transform: booleanAttribute });\n /**\n * The motion options.\n * @group Props\n */\n motionOptions = input<MotionOptions>();\n\n computedMotionOptions = computed<MotionOptions>(() => {\n return {\n ...this.ptm('motion'),\n ...this.motionOptions()\n };\n });\n /**\n * Object literal to define styles per screen size.\n * @group Props\n */\n breakpoints = input<ToastBreakpoints>();\n /**\n * Callback to invoke when a message is closed.\n * @param {ToastCloseEvent} event - custom close event.\n * @group Emits\n */\n onClose = output<ToastCloseEvent>();\n /**\n * Custom message template.\n * @param {ToastMessageTemplateContext} context - message context.\n * @see {@link ToastMessageTemplateContext}\n * @group Templates\n */\n messageTemplate = contentChild<TemplateRef<ToastMessageTemplateContext>>('message', { descendants: false });\n /**\n * Custom headless template.\n * @param {ToastHeadlessTemplateContext} context - headless context.\n * @see {@link ToastHeadlessTemplateContext}\n * @group Templates\n */\n headlessTemplate = contentChild<TemplateRef<ToastHeadlessTemplateContext>>('headless', { descendants: false });\n\n messageSubscription: Subscription | undefined;\n\n clearSubscription: Subscription | undefined;\n\n messages: ToastMessageOptions[] | null | undefined;\n\n messageArchive: ToastMessageOptions[] | undefined;\n\n messageService = inject(MessageService);\n\n _componentStyle = inject(ToastStyle);\n\n styleElement: HTMLStyleElement | null = null;\n\n id: string = uuid('pn_id_');\n\n clearAllTrigger = signal<object | null>(null);\n\n hovered = signal(false);\n\n isInteracting = signal(false);\n\n heights = signal<{ index: number; height: number }[]>([]);\n\n // Single sorted source — all stack computeds derive from this\n sortedHeights = computed(() => [...this.heights()].sort((a, b) => b.index - a.index));\n\n frontToastHeight = computed(() => this.sortedHeights()[0]?.height ?? 0);\n\n stackOffsets = computed(() => {\n const sorted = this.sortedHeights();\n const offsets: number[] = [0];\n for (let i = 1; i < sorted.length; i++) {\n offsets[i] = offsets[i - 1] + sorted[i - 1].height;\n }\n return offsets;\n });\n\n visualStackIndices = computed(() => {\n const map = new Map<number, number>();\n this.sortedHeights().forEach((entry, idx) => map.set(entry.index, idx));\n return map;\n });\n\n visibleIndices = computed(\n () =>\n new Set(\n this.sortedHeights()\n .slice(0, this.stackVisibleLimit())\n .map((x) => x.index)\n )\n );\n\n raiseFactor = computed(() => {\n const pos = this.position();\n return pos.startsWith('bottom') ? -1 : 1;\n });\n\n isExpanded = computed(() => this.mode() === 'expanded' || this.hovered());\n\n hostDataExpanded = computed(() => (this.isExpanded() ? '' : null));\n\n stackTotal = computed(() => this.messages?.length ?? 0);\n\n getStackIndex(domIndex: number): number {\n return this.visualStackIndices().get(domIndex) ?? (this.messages?.length ?? 0) - 1 - domIndex;\n }\n\n getStackOffset(domIndex: number): number {\n const visualIdx = this.visualStackIndices().get(domIndex) ?? 0;\n return this.stackOffsets()[visualIdx] ?? 0;\n }\n\n isStackVisible(domIndex: number): boolean {\n return this.visibleIndices().has(domIndex);\n }\n\n dataP = computed(() => {\n const pos = this.position();\n return this.cn({\n [pos]: pos\n });\n });\n\n onInit() {\n this.messageSubscription = this.messageService.messageObserver.subscribe((messages) => {\n if (messages) {\n if (Array.isArray(messages)) {\n const filteredMessages = messages.filter((m) => this.canAdd(m));\n this.add(filteredMessages);\n } else if (this.canAdd(messages)) {\n this.add([messages]);\n }\n }\n });\n\n this.clearSubscription = this.messageService.clearObserver.subscribe((key) => {\n if (key) {\n if (this.key() === key) {\n this.clearAll();\n }\n } else {\n this.clearAll();\n }\n\n this.cd.markForCheck();\n });\n }\n\n clearAll() {\n this.clearAllTrigger.set({});\n this.heights.set([]);\n this.hovered.set(false);\n this.isInteracting.set(false);\n this.messageArchive = undefined;\n }\n\n onAfterViewInit() {\n if (this.breakpoints()) {\n this.createStyle();\n }\n }\n\n add(messages: ToastMessageOptions[]): void {\n this.messages = this.messages ? [...this.messages, ...messages] : [...messages];\n\n if (this.preventDuplicates()) {\n this.messageArchive = this.messageArchive ? [...this.messageArchive, ...messages] : [...messages];\n }\n\n this.cd.markForCheck();\n }\n\n canAdd(message: ToastMessageOptions): boolean {\n let allow = this.key() === message.key;\n\n if (allow && this.preventOpenDuplicates()) {\n allow = !this.containsMessage(this.messages ?? [], message);\n }\n\n if (allow && this.preventDuplicates()) {\n allow = !this.containsMessage(this.messageArchive ?? [], message);\n }\n\n return allow;\n }\n\n containsMessage(collection: ToastMessageOptions[], message: ToastMessageOptions): boolean {\n if (!collection) {\n return false;\n }\n\n return (\n collection.find((m) => {\n return m.summary === message.summary && m.detail == message.detail && m.severity === message.severity;\n }) != null\n );\n }\n\n onMessageClose(event: ToastItemCloseEvent) {\n this.messages?.splice(event.index, 1);\n\n this.heights.update((h) => h.filter((x) => x.index !== event.index).map((x) => (x.index > event.index ? { ...x, index: x.index - 1 } : x)));\n if ((this.messages?.length ?? 0) <= 1) {\n this.hovered.set(false);\n }\n\n this.onClose.emit({\n message: event.message\n });\n this.onAnimationEnd();\n this.cd.detectChanges();\n }\n\n onAnimationStart() {\n this.renderer.setAttribute(this.el?.nativeElement, this.id, '');\n if (this.autoZIndex() && this.el?.nativeElement.style.zIndex === '') {\n ZIndexUtils.set('modal', this.el?.nativeElement, this.baseZIndex() || this.config.zIndex.modal);\n }\n }\n\n onAnimationEnd() {\n if (this.autoZIndex() && isEmpty(this.messages)) {\n ZIndexUtils.clear(this.el?.nativeElement);\n }\n }\n\n onContainerMouseEnter() {\n this.hovered.set(true);\n }\n\n onContainerMouseLeave(event: MouseEvent) {\n if (this.isInteracting()) return;\n\n const container = this.el?.nativeElement;\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && container?.contains(relatedTarget)) {\n return;\n }\n\n this.hovered.set(false);\n }\n\n onContainerPointerDown(event: PointerEvent) {\n const target = event.target as HTMLElement;\n if (target && target.closest('[data-dismissible=\"false\"]')) return;\n\n this.isInteracting.set(true);\n }\n\n onContainerPointerUp() {\n this.isInteracting.set(false);\n }\n\n onItemHeightChange(event: { index: number; height: number; removed?: boolean }) {\n if (event.removed) {\n this.heights.update((h) => h.filter((x) => x.index !== event.index));\n return;\n }\n this.heights.update((h) => {\n const existing = h.findIndex((x) => x.index === event.index);\n if (existing >= 0) {\n const copy = [...h];\n copy[existing] = event;\n return copy;\n }\n return [...h, event].sort((a, b) => a.index - b.index);\n });\n }\n\n createStyle() {\n const bp = this.breakpoints();\n if (!this.styleElement) {\n const styleEl: HTMLStyleElement = this.renderer.createElement('style');\n setAttribute(styleEl, 'nonce', this.config?.csp()?.nonce);\n this.renderer.appendChild(this.document.head, styleEl);\n let innerHTML = '';\n for (let breakpoint in bp) {\n let breakpointStyle = '';\n for (let styleProp in bp![breakpoint]) {\n breakpointStyle += styleProp + ':' + bp![breakpoint][styleProp] + ' !important;';\n }\n innerHTML += `\n @media screen and (max-width: ${breakpoint}) {\n .p-toast[${this.id}] {\n ${breakpointStyle}\n }\n }\n `;\n }\n\n this.renderer.setProperty(styleEl, 'innerHTML', innerHTML);\n setAttribute(styleEl, 'nonce', this.config?.csp()?.nonce);\n this.styleElement = styleEl;\n }\n }\n\n destroyStyle() {\n if (this.styleElement) {\n this.renderer.removeChild(this.document.head, this.styleElement);\n this.styleElement = null;\n }\n }\n\n onDestroy() {\n if (this.messageSubscription) {\n this.messageSubscription.unsubscribe();\n }\n\n if (this.el && this.autoZIndex()) {\n ZIndexUtils.clear(this.el.nativeElement);\n }\n\n if (this.clearSubscription) {\n this.clearSubscription.unsubscribe();\n }\n\n this.destroyStyle();\n }\n}\n\n@NgModule({\n imports: [Toast, SharedModule],\n exports: [Toast, SharedModule]\n})\nexport class ToastModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["CheckIcon","InfoCircleIcon","TimesCircleIcon","ExclamationTriangleIcon","TimesIcon","i1"],"mappings":"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