@angular/material
Version:
Angular Material
1 lines • 63.2 kB
Source Map (JSON)
{"version":3,"file":"snack-bar.mjs","sources":["../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-ref.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-config.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-content.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/simple-snack-bar.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/simple-snack-bar.html","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-container.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-container.html","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/module.ts","../../../../../k8-fastbuild-ST-46c76129e412/bin/src/material/snack-bar/snack-bar-animations.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {OverlayRef} from '@angular/cdk/overlay';\nimport {Observable, Subject} from 'rxjs';\nimport {MatSnackBarContainer} from './snack-bar-container';\n\n/** Event that is emitted when a snack bar is dismissed. */\nexport interface MatSnackBarDismiss {\n /** Whether the snack bar was dismissed using the action button. */\n dismissedByAction: boolean;\n}\n\n/** Maximum amount of milliseconds that can be passed into setTimeout. */\nconst MAX_TIMEOUT = Math.pow(2, 31) - 1;\n\n/**\n * Reference to a snack bar dispatched from the snack bar service.\n */\nexport class MatSnackBarRef<T> {\n /** The instance of the component making up the content of the snack bar. */\n instance: T;\n\n /**\n * The instance of the component making up the content of the snack bar.\n * @docs-private\n */\n containerInstance: MatSnackBarContainer;\n\n /** Subject for notifying the user that the snack bar has been dismissed. */\n private readonly _afterDismissed = new Subject<MatSnackBarDismiss>();\n\n /** Subject for notifying the user that the snack bar has opened and appeared. */\n private readonly _afterOpened = new Subject<void>();\n\n /** Subject for notifying the user that the snack bar action was called. */\n private readonly _onAction = new Subject<void>();\n\n /**\n * Timeout ID for the duration setTimeout call. Used to clear the timeout if the snackbar is\n * dismissed before the duration passes.\n */\n private _durationTimeoutId: ReturnType<typeof setTimeout>;\n\n /** Whether the snack bar was dismissed using the action button. */\n private _dismissedByAction = false;\n\n constructor(\n containerInstance: MatSnackBarContainer,\n private _overlayRef: OverlayRef,\n ) {\n this.containerInstance = containerInstance;\n containerInstance._onExit.subscribe(() => this._finishDismiss());\n }\n\n /** Dismisses the snack bar. */\n dismiss(): void {\n if (!this._afterDismissed.closed) {\n this.containerInstance.exit();\n }\n clearTimeout(this._durationTimeoutId);\n }\n\n /** Marks the snackbar action clicked. */\n dismissWithAction(): void {\n if (!this._onAction.closed) {\n this._dismissedByAction = true;\n this._onAction.next();\n this._onAction.complete();\n this.dismiss();\n }\n clearTimeout(this._durationTimeoutId);\n }\n\n /**\n * Marks the snackbar action clicked.\n * @deprecated Use `dismissWithAction` instead.\n * @breaking-change 8.0.0\n */\n closeWithAction(): void {\n this.dismissWithAction();\n }\n\n /** Dismisses the snack bar after some duration */\n _dismissAfter(duration: number): void {\n // Note that we need to cap the duration to the maximum value for setTimeout, because\n // it'll revert to 1 if somebody passes in something greater (e.g. `Infinity`). See #17234.\n this._durationTimeoutId = setTimeout(() => this.dismiss(), Math.min(duration, MAX_TIMEOUT));\n }\n\n /** Marks the snackbar as opened */\n _open(): void {\n if (!this._afterOpened.closed) {\n this._afterOpened.next();\n this._afterOpened.complete();\n }\n }\n\n /** Cleans up the DOM after closing. */\n private _finishDismiss(): void {\n this._overlayRef.dispose();\n\n if (!this._onAction.closed) {\n this._onAction.complete();\n }\n\n this._afterDismissed.next({dismissedByAction: this._dismissedByAction});\n this._afterDismissed.complete();\n this._dismissedByAction = false;\n }\n\n /** Gets an observable that is notified when the snack bar is finished closing. */\n afterDismissed(): Observable<MatSnackBarDismiss> {\n return this._afterDismissed;\n }\n\n /** Gets an observable that is notified when the snack bar has opened and appeared. */\n afterOpened(): Observable<void> {\n return this.containerInstance._onEnter;\n }\n\n /** Gets an observable that is notified when the snack bar action is called. */\n onAction(): Observable<void> {\n return this._onAction;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ViewContainerRef, InjectionToken} from '@angular/core';\nimport {AriaLivePoliteness} from '@angular/cdk/a11y';\nimport {Direction} from '@angular/cdk/bidi';\n\n/** Injection token that can be used to access the data that was passed in to a snack bar. */\nexport const MAT_SNACK_BAR_DATA = new InjectionToken<any>('MatSnackBarData');\n\n/** Possible values for horizontalPosition on MatSnackBarConfig. */\nexport type MatSnackBarHorizontalPosition = 'start' | 'center' | 'end' | 'left' | 'right';\n\n/** Possible values for verticalPosition on MatSnackBarConfig. */\nexport type MatSnackBarVerticalPosition = 'top' | 'bottom';\n\n/**\n * Configuration used when opening a snack-bar.\n */\nexport class MatSnackBarConfig<D = any> {\n /** The politeness level for the MatAriaLiveAnnouncer announcement. */\n politeness?: AriaLivePoliteness = 'assertive';\n\n /**\n * Message to be announced by the LiveAnnouncer. When opening a snackbar without a custom\n * component or template, the announcement message will default to the specified message.\n */\n announcementMessage?: string = '';\n\n /**\n * The view container that serves as the parent for the snackbar for the purposes of dependency\n * injection. Note: this does not affect where the snackbar is inserted in the DOM.\n */\n viewContainerRef?: ViewContainerRef;\n\n /** The length of time in milliseconds to wait before automatically dismissing the snack bar. */\n duration?: number = 0;\n\n /** Extra CSS classes to be added to the snack bar container. */\n panelClass?: string | string[];\n\n /** Text layout direction for the snack bar. */\n direction?: Direction;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n /** The horizontal position to place the snack bar. */\n horizontalPosition?: MatSnackBarHorizontalPosition = 'center';\n\n /** The vertical position to place the snack bar. */\n verticalPosition?: MatSnackBarVerticalPosition = 'bottom';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Directive} from '@angular/core';\n\n/** Directive that should be applied to the text element to be rendered in the snack bar. */\n@Directive({\n selector: `[matSnackBarLabel]`,\n host: {\n 'class': 'mat-mdc-snack-bar-label mdc-snackbar__label',\n },\n})\nexport class MatSnackBarLabel {}\n\n/** Directive that should be applied to the element containing the snack bar's action buttons. */\n@Directive({\n selector: `[matSnackBarActions]`,\n host: {\n 'class': 'mat-mdc-snack-bar-actions mdc-snackbar__actions',\n },\n})\nexport class MatSnackBarActions {}\n\n/** Directive that should be applied to each of the snack bar's action buttons. */\n@Directive({\n selector: `[matSnackBarAction]`,\n host: {\n 'class': 'mat-mdc-snack-bar-action mdc-snackbar__action',\n },\n})\nexport class MatSnackBarAction {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ChangeDetectionStrategy, Component, ViewEncapsulation, inject} from '@angular/core';\nimport {MatButton} from '../button';\nimport {MatSnackBarRef} from './snack-bar-ref';\nimport {MAT_SNACK_BAR_DATA} from './snack-bar-config';\nimport {MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel} from './snack-bar-content';\n\n/**\n * Interface for a simple snack bar component that has a message and a single action.\n */\nexport interface TextOnlySnackBar {\n data: {message: string; action: string};\n snackBarRef: MatSnackBarRef<TextOnlySnackBar>;\n action: () => void;\n hasAction: boolean;\n}\n\n@Component({\n selector: 'simple-snack-bar',\n templateUrl: 'simple-snack-bar.html',\n styleUrl: 'simple-snack-bar.css',\n exportAs: 'matSnackBar',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatButton, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction],\n host: {\n 'class': 'mat-mdc-simple-snack-bar',\n },\n})\nexport class SimpleSnackBar implements TextOnlySnackBar {\n snackBarRef = inject<MatSnackBarRef<SimpleSnackBar>>(MatSnackBarRef);\n data = inject(MAT_SNACK_BAR_DATA);\n\n constructor(...args: unknown[]);\n constructor() {}\n\n /** Performs the action on the snack bar. */\n action(): void {\n this.snackBarRef.dismissWithAction();\n }\n\n /** If the action button should be shown. */\n get hasAction(): boolean {\n return !!this.data.action;\n }\n}\n","<div matSnackBarLabel>\n {{data.message}}\n</div>\n\n@if (hasAction) {\n <div matSnackBarActions>\n <button mat-button matSnackBarAction (click)=\"action()\">\n {{data.action}}\n </button>\n </div>\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n afterRender,\n AfterRenderRef,\n ANIMATION_MODULE_TYPE,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n inject,\n NgZone,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {\n BasePortalOutlet,\n CdkPortalOutlet,\n ComponentPortal,\n DomPortal,\n TemplatePortal,\n} from '@angular/cdk/portal';\nimport {Observable, Subject, of} from 'rxjs';\nimport {_IdGenerator, AriaLivePoliteness} from '@angular/cdk/a11y';\nimport {Platform} from '@angular/cdk/platform';\nimport {MatSnackBarConfig} from './snack-bar-config';\nimport {take} from 'rxjs/operators';\n\nconst ENTER_ANIMATION = '_mat-snack-bar-enter';\nconst EXIT_ANIMATION = '_mat-snack-bar-exit';\n\n/**\n * Internal component that wraps user-provided snack bar content.\n * @docs-private\n */\n@Component({\n selector: 'mat-snack-bar-container',\n templateUrl: 'snack-bar-container.html',\n styleUrl: 'snack-bar-container.css',\n // In Ivy embedded views will be change detected from their declaration place, rather than\n // where they were stamped out. This means that we can't have the snack bar container be OnPush,\n // because it might cause snack bars that were opened from a template not to be out of date.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n imports: [CdkPortalOutlet],\n host: {\n 'class': 'mdc-snackbar mat-mdc-snack-bar-container',\n '[class.mat-snack-bar-container-enter]': '_animationState === \"visible\"',\n '[class.mat-snack-bar-container-exit]': '_animationState === \"hidden\"',\n '[class.mat-snack-bar-container-animations-enabled]': '!_animationsDisabled',\n '(animationend)': 'onAnimationEnd($event.animationName)',\n '(animationcancel)': 'onAnimationEnd($event.animationName)',\n },\n})\nexport class MatSnackBarContainer extends BasePortalOutlet implements OnDestroy {\n private _ngZone = inject(NgZone);\n private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private _changeDetectorRef = inject(ChangeDetectorRef);\n private _platform = inject(Platform);\n private _rendersRef: AfterRenderRef;\n protected _animationsDisabled =\n inject(ANIMATION_MODULE_TYPE, {optional: true}) === 'NoopAnimations';\n snackBarConfig = inject(MatSnackBarConfig);\n\n private _document = inject(DOCUMENT);\n private _trackedModals = new Set<Element>();\n private _enterFallback: ReturnType<typeof setTimeout> | undefined;\n private _exitFallback: ReturnType<typeof setTimeout> | undefined;\n private _renders = new Subject<void>();\n\n /** The number of milliseconds to wait before announcing the snack bar's content. */\n private readonly _announceDelay: number = 150;\n\n /** The timeout for announcing the snack bar's content. */\n private _announceTimeoutId: ReturnType<typeof setTimeout>;\n\n /** Whether the component has been destroyed. */\n private _destroyed = false;\n\n /** The portal outlet inside of this container into which the snack bar content will be loaded. */\n @ViewChild(CdkPortalOutlet, {static: true}) _portalOutlet: CdkPortalOutlet;\n\n /** Subject for notifying that the snack bar has announced to screen readers. */\n readonly _onAnnounce: Subject<void> = new Subject();\n\n /** Subject for notifying that the snack bar has exited from view. */\n readonly _onExit: Subject<void> = new Subject();\n\n /** Subject for notifying that the snack bar has finished entering the view. */\n readonly _onEnter: Subject<void> = new Subject();\n\n /** The state of the snack bar animations. */\n _animationState = 'void';\n\n /** aria-live value for the live region. */\n _live: AriaLivePoliteness;\n\n /**\n * Element that will have the `mdc-snackbar__label` class applied if the attached component\n * or template does not have it. This ensures that the appropriate structure, typography, and\n * color is applied to the attached view.\n */\n @ViewChild('label', {static: true}) _label: ElementRef;\n\n /**\n * Role of the live region. This is only for Firefox as there is a known issue where Firefox +\n * JAWS does not read out aria-live message.\n */\n _role?: 'status' | 'alert';\n\n /** Unique ID of the aria-live element. */\n readonly _liveElementId = inject(_IdGenerator).getId('mat-snack-bar-container-live-');\n\n constructor(...args: unknown[]);\n\n constructor() {\n super();\n const config = this.snackBarConfig;\n\n // Use aria-live rather than a live role like 'alert' or 'status'\n // because NVDA and JAWS have show inconsistent behavior with live roles.\n if (config.politeness === 'assertive' && !config.announcementMessage) {\n this._live = 'assertive';\n } else if (config.politeness === 'off') {\n this._live = 'off';\n } else {\n this._live = 'polite';\n }\n\n // Only set role for Firefox. Set role based on aria-live because setting role=\"alert\" implies\n // aria-live=\"assertive\" which may cause issues if aria-live is set to \"polite\" above.\n if (this._platform.FIREFOX) {\n if (this._live === 'polite') {\n this._role = 'status';\n }\n if (this._live === 'assertive') {\n this._role = 'alert';\n }\n }\n\n // Note: ideally we'd just do an `afterNextRender` in the places where we need to delay\n // something, however in some cases (TestBed teardown) the injector can be destroyed at an\n // unexpected time, causing the `afterRender` to fail.\n this._rendersRef = afterRender(() => this._renders.next(), {manualCleanup: true});\n }\n\n /** Attach a component portal as content to this snack bar container. */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n this._assertNotAttached();\n const result = this._portalOutlet.attachComponentPortal(portal);\n this._afterPortalAttached();\n return result;\n }\n\n /** Attach a template portal as content to this snack bar container. */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n this._assertNotAttached();\n const result = this._portalOutlet.attachTemplatePortal(portal);\n this._afterPortalAttached();\n return result;\n }\n\n /**\n * Attaches a DOM portal to the snack bar container.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n override attachDomPortal = (portal: DomPortal) => {\n this._assertNotAttached();\n const result = this._portalOutlet.attachDomPortal(portal);\n this._afterPortalAttached();\n return result;\n };\n\n /** Handle end of animations, updating the state of the snackbar. */\n onAnimationEnd(animationName: string) {\n if (animationName === EXIT_ANIMATION) {\n this._completeExit();\n } else if (animationName === ENTER_ANIMATION) {\n clearTimeout(this._enterFallback);\n this._ngZone.run(() => {\n this._onEnter.next();\n this._onEnter.complete();\n });\n }\n }\n\n /** Begin animation of snack bar entrance into view. */\n enter(): void {\n if (!this._destroyed) {\n this._animationState = 'visible';\n // _animationState lives in host bindings and `detectChanges` does not refresh host bindings\n // so we have to call `markForCheck` to ensure the host view is refreshed eventually.\n this._changeDetectorRef.markForCheck();\n this._changeDetectorRef.detectChanges();\n this._screenReaderAnnounce();\n\n if (this._animationsDisabled) {\n this._renders.pipe(take(1)).subscribe(() => {\n this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(ENTER_ANIMATION)));\n });\n } else {\n clearTimeout(this._enterFallback);\n this._enterFallback = setTimeout(() => {\n // The snack bar will stay invisible if it fails to animate. Add a fallback class so it\n // becomes visible. This can happen in some apps that do `* {animation: none !important}`.\n this._elementRef.nativeElement.classList.add('mat-snack-bar-fallback-visible');\n this.onAnimationEnd(ENTER_ANIMATION);\n }, 200);\n }\n }\n }\n\n /** Begin animation of the snack bar exiting from view. */\n exit(): Observable<void> {\n if (this._destroyed) {\n return of(undefined);\n }\n\n // It's common for snack bars to be opened by random outside calls like HTTP requests or\n // errors. Run inside the NgZone to ensure that it functions correctly.\n this._ngZone.run(() => {\n // Note: this one transitions to `hidden`, rather than `void`, in order to handle the case\n // where multiple snack bars are opened in quick succession (e.g. two consecutive calls to\n // `MatSnackBar.open`).\n this._animationState = 'hidden';\n this._changeDetectorRef.markForCheck();\n\n // Mark this element with an 'exit' attribute to indicate that the snackbar has\n // been dismissed and will soon be removed from the DOM. This is used by the snackbar\n // test harness.\n this._elementRef.nativeElement.setAttribute('mat-exit', '');\n\n // If the snack bar hasn't been announced by the time it exits it wouldn't have been open\n // long enough to visually read it either, so clear the timeout for announcing.\n clearTimeout(this._announceTimeoutId);\n\n if (this._animationsDisabled) {\n this._renders.pipe(take(1)).subscribe(() => {\n this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(EXIT_ANIMATION)));\n });\n } else {\n clearTimeout(this._exitFallback);\n this._exitFallback = setTimeout(() => this.onAnimationEnd(EXIT_ANIMATION), 200);\n }\n });\n\n return this._onExit;\n }\n\n /** Makes sure the exit callbacks have been invoked when the element is destroyed. */\n ngOnDestroy() {\n this._destroyed = true;\n this._clearFromModals();\n this._completeExit();\n this._renders.complete();\n this._rendersRef.destroy();\n }\n\n private _completeExit() {\n clearTimeout(this._exitFallback);\n queueMicrotask(() => {\n this._onExit.next();\n this._onExit.complete();\n });\n }\n\n /**\n * Called after the portal contents have been attached. Can be\n * used to modify the DOM once it's guaranteed to be in place.\n */\n private _afterPortalAttached() {\n const element: HTMLElement = this._elementRef.nativeElement;\n const panelClasses = this.snackBarConfig.panelClass;\n\n if (panelClasses) {\n if (Array.isArray(panelClasses)) {\n // Note that we can't use a spread here, because IE doesn't support multiple arguments.\n panelClasses.forEach(cssClass => element.classList.add(cssClass));\n } else {\n element.classList.add(panelClasses);\n }\n }\n\n this._exposeToModals();\n\n // Check to see if the attached component or template uses the MDC template structure,\n // specifically the MDC label. If not, the container should apply the MDC label class to this\n // component's label container, which will apply MDC's label styles to the attached view.\n const label = this._label.nativeElement;\n const labelClass = 'mdc-snackbar__label';\n label.classList.toggle(labelClass, !label.querySelector(`.${labelClass}`));\n }\n\n /**\n * Some browsers won't expose the accessibility node of the live element if there is an\n * `aria-modal` and the live element is outside of it. This method works around the issue by\n * pointing the `aria-owns` of all modals to the live element.\n */\n private _exposeToModals() {\n // TODO(http://github.com/angular/components/issues/26853): consider de-duplicating this with the\n // `LiveAnnouncer` and any other usages.\n //\n // Note that the selector here is limited to CDK overlays at the moment in order to reduce the\n // section of the DOM we need to look through. This should cover all the cases we support, but\n // the selector can be expanded if it turns out to be too narrow.\n const id = this._liveElementId;\n const modals = this._document.querySelectorAll(\n 'body > .cdk-overlay-container [aria-modal=\"true\"]',\n );\n\n for (let i = 0; i < modals.length; i++) {\n const modal = modals[i];\n const ariaOwns = modal.getAttribute('aria-owns');\n this._trackedModals.add(modal);\n\n if (!ariaOwns) {\n modal.setAttribute('aria-owns', id);\n } else if (ariaOwns.indexOf(id) === -1) {\n modal.setAttribute('aria-owns', ariaOwns + ' ' + id);\n }\n }\n }\n\n /** Clears the references to the live element from any modals it was added to. */\n private _clearFromModals() {\n this._trackedModals.forEach(modal => {\n const ariaOwns = modal.getAttribute('aria-owns');\n\n if (ariaOwns) {\n const newValue = ariaOwns.replace(this._liveElementId, '').trim();\n\n if (newValue.length > 0) {\n modal.setAttribute('aria-owns', newValue);\n } else {\n modal.removeAttribute('aria-owns');\n }\n }\n });\n this._trackedModals.clear();\n }\n\n /** Asserts that no content is already attached to the container. */\n private _assertNotAttached() {\n if (this._portalOutlet.hasAttached() && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Attempting to attach snack bar content after content is already attached');\n }\n }\n\n /**\n * Starts a timeout to move the snack bar content to the live region so screen readers will\n * announce it.\n */\n private _screenReaderAnnounce() {\n if (this._announceTimeoutId) {\n return;\n }\n\n this._ngZone.runOutsideAngular(() => {\n this._announceTimeoutId = setTimeout(() => {\n if (this._destroyed) {\n return;\n }\n\n const element = this._elementRef.nativeElement;\n const inertElement = element.querySelector('[aria-hidden]');\n const liveElement = element.querySelector('[aria-live]');\n\n if (inertElement && liveElement) {\n // If an element in the snack bar content is focused before being moved\n // track it and restore focus after moving to the live region.\n let focusedElement: HTMLElement | null = null;\n if (\n this._platform.isBrowser &&\n document.activeElement instanceof HTMLElement &&\n inertElement.contains(document.activeElement)\n ) {\n focusedElement = document.activeElement;\n }\n\n inertElement.removeAttribute('aria-hidden');\n liveElement.appendChild(inertElement);\n focusedElement?.focus();\n\n this._onAnnounce.next();\n this._onAnnounce.complete();\n }\n }, this._announceDelay);\n });\n }\n}\n","<div class=\"mdc-snackbar__surface mat-mdc-snackbar-surface\">\n <!--\n This outer label wrapper will have the class `mdc-snackbar__label` applied if\n the attached template/component does not contain it.\n -->\n <div class=\"mat-mdc-snack-bar-label\" #label>\n <!-- Initialy holds the snack bar content, will be empty after announcing to screen readers. -->\n <div aria-hidden=\"true\">\n <ng-template cdkPortalOutlet />\n </div>\n\n <!-- Will receive the snack bar content from the non-live div, move will happen a short delay after opening -->\n <div [attr.aria-live]=\"_live\" [attr.role]=\"_role\" [attr.id]=\"_liveElementId\"></div>\n </div>\n</div>\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {LiveAnnouncer} from '@angular/cdk/a11y';\nimport {BreakpointObserver, Breakpoints} from '@angular/cdk/layout';\nimport {ComponentType, Overlay, OverlayConfig, OverlayRef} from '@angular/cdk/overlay';\nimport {\n ComponentRef,\n EmbeddedViewRef,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n TemplateRef,\n inject,\n} from '@angular/core';\nimport {SimpleSnackBar, TextOnlySnackBar} from './simple-snack-bar';\nimport {MatSnackBarContainer} from './snack-bar-container';\nimport {MAT_SNACK_BAR_DATA, MatSnackBarConfig} from './snack-bar-config';\nimport {MatSnackBarRef} from './snack-bar-ref';\nimport {ComponentPortal, TemplatePortal} from '@angular/cdk/portal';\nimport {takeUntil} from 'rxjs/operators';\n\n/**\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nexport function MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY(): MatSnackBarConfig {\n return new MatSnackBarConfig();\n}\n\n/** Injection token that can be used to specify default snack bar. */\nexport const MAT_SNACK_BAR_DEFAULT_OPTIONS = new InjectionToken<MatSnackBarConfig>(\n 'mat-snack-bar-default-options',\n {\n providedIn: 'root',\n factory: MAT_SNACK_BAR_DEFAULT_OPTIONS_FACTORY,\n },\n);\n\n/**\n * Service to dispatch Material Design snack bar messages.\n */\n@Injectable({providedIn: 'root'})\nexport class MatSnackBar implements OnDestroy {\n private _overlay = inject(Overlay);\n private _live = inject(LiveAnnouncer);\n private _injector = inject(Injector);\n private _breakpointObserver = inject(BreakpointObserver);\n private _parentSnackBar = inject(MatSnackBar, {optional: true, skipSelf: true});\n private _defaultConfig = inject<MatSnackBarConfig>(MAT_SNACK_BAR_DEFAULT_OPTIONS);\n\n /**\n * Reference to the current snack bar in the view *at this level* (in the Angular injector tree).\n * If there is a parent snack-bar service, all operations should delegate to that parent\n * via `_openedSnackBarRef`.\n */\n private _snackBarRefAtThisLevel: MatSnackBarRef<any> | null = null;\n\n /** The component that should be rendered as the snack bar's simple component. */\n simpleSnackBarComponent = SimpleSnackBar;\n\n /** The container component that attaches the provided template or component. */\n snackBarContainerComponent = MatSnackBarContainer;\n\n /** The CSS class to apply for handset mode. */\n handsetCssClass = 'mat-mdc-snack-bar-handset';\n\n /** Reference to the currently opened snackbar at *any* level. */\n get _openedSnackBarRef(): MatSnackBarRef<any> | null {\n const parent = this._parentSnackBar;\n return parent ? parent._openedSnackBarRef : this._snackBarRefAtThisLevel;\n }\n\n set _openedSnackBarRef(value: MatSnackBarRef<any> | null) {\n if (this._parentSnackBar) {\n this._parentSnackBar._openedSnackBarRef = value;\n } else {\n this._snackBarRefAtThisLevel = value;\n }\n }\n\n constructor(...args: unknown[]);\n constructor() {}\n\n /**\n * Creates and dispatches a snack bar with a custom component for the content, removing any\n * currently opened snack bars.\n *\n * @param component Component to be instantiated.\n * @param config Extra configuration for the snack bar.\n */\n openFromComponent<T, D = any>(\n component: ComponentType<T>,\n config?: MatSnackBarConfig<D>,\n ): MatSnackBarRef<T> {\n return this._attach(component, config) as MatSnackBarRef<T>;\n }\n\n /**\n * Creates and dispatches a snack bar with a custom template for the content, removing any\n * currently opened snack bars.\n *\n * @param template Template to be instantiated.\n * @param config Extra configuration for the snack bar.\n */\n openFromTemplate(\n template: TemplateRef<any>,\n config?: MatSnackBarConfig,\n ): MatSnackBarRef<EmbeddedViewRef<any>> {\n return this._attach(template, config);\n }\n\n /**\n * Opens a snackbar with a message and an optional action.\n * @param message The message to show in the snackbar.\n * @param action The label for the snackbar action.\n * @param config Additional configuration options for the snackbar.\n */\n open(\n message: string,\n action: string = '',\n config?: MatSnackBarConfig,\n ): MatSnackBarRef<TextOnlySnackBar> {\n const _config = {...this._defaultConfig, ...config};\n\n // Since the user doesn't have access to the component, we can\n // override the data to pass in our own message and action.\n _config.data = {message, action};\n\n // Since the snack bar has `role=\"alert\"`, we don't\n // want to announce the same message twice.\n if (_config.announcementMessage === message) {\n _config.announcementMessage = undefined;\n }\n\n return this.openFromComponent(this.simpleSnackBarComponent, _config);\n }\n\n /**\n * Dismisses the currently-visible snack bar.\n */\n dismiss(): void {\n if (this._openedSnackBarRef) {\n this._openedSnackBarRef.dismiss();\n }\n }\n\n ngOnDestroy() {\n // Only dismiss the snack bar at the current level on destroy.\n if (this._snackBarRefAtThisLevel) {\n this._snackBarRefAtThisLevel.dismiss();\n }\n }\n\n /**\n * Attaches the snack bar container component to the overlay.\n */\n private _attachSnackBarContainer(\n overlayRef: OverlayRef,\n config: MatSnackBarConfig,\n ): MatSnackBarContainer {\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n const injector = Injector.create({\n parent: userInjector || this._injector,\n providers: [{provide: MatSnackBarConfig, useValue: config}],\n });\n\n const containerPortal = new ComponentPortal(\n this.snackBarContainerComponent,\n config.viewContainerRef,\n injector,\n );\n const containerRef: ComponentRef<MatSnackBarContainer> = overlayRef.attach(containerPortal);\n containerRef.instance.snackBarConfig = config;\n return containerRef.instance;\n }\n\n /**\n * Places a new component or a template as the content of the snack bar container.\n */\n private _attach<T>(\n content: ComponentType<T> | TemplateRef<T>,\n userConfig?: MatSnackBarConfig,\n ): MatSnackBarRef<T | EmbeddedViewRef<any>> {\n const config = {...new MatSnackBarConfig(), ...this._defaultConfig, ...userConfig};\n const overlayRef = this._createOverlay(config);\n const container = this._attachSnackBarContainer(overlayRef, config);\n const snackBarRef = new MatSnackBarRef<T | EmbeddedViewRef<any>>(container, overlayRef);\n\n if (content instanceof TemplateRef) {\n const portal = new TemplatePortal(content, null!, {\n $implicit: config.data,\n snackBarRef,\n } as any);\n\n snackBarRef.instance = container.attachTemplatePortal(portal);\n } else {\n const injector = this._createInjector(config, snackBarRef);\n const portal = new ComponentPortal(content, undefined, injector);\n const contentRef = container.attachComponentPortal<T>(portal);\n\n // We can't pass this via the injector, because the injector is created earlier.\n snackBarRef.instance = contentRef.instance;\n }\n\n // Subscribe to the breakpoint observer and attach the mat-snack-bar-handset class as\n // appropriate. This class is applied to the overlay element because the overlay must expand to\n // fill the width of the screen for full width snackbars.\n this._breakpointObserver\n .observe(Breakpoints.HandsetPortrait)\n .pipe(takeUntil(overlayRef.detachments()))\n .subscribe(state => {\n overlayRef.overlayElement.classList.toggle(this.handsetCssClass, state.matches);\n });\n\n if (config.announcementMessage) {\n // Wait until the snack bar contents have been announced then deliver this message.\n container._onAnnounce.subscribe(() => {\n this._live.announce(config.announcementMessage!, config.politeness);\n });\n }\n\n this._animateSnackBar(snackBarRef, config);\n this._openedSnackBarRef = snackBarRef;\n return this._openedSnackBarRef;\n }\n\n /** Animates the old snack bar out and the new one in. */\n private _animateSnackBar(snackBarRef: MatSnackBarRef<any>, config: MatSnackBarConfig) {\n // When the snackbar is dismissed, clear the reference to it.\n snackBarRef.afterDismissed().subscribe(() => {\n // Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.\n if (this._openedSnackBarRef == snackBarRef) {\n this._openedSnackBarRef = null;\n }\n\n if (config.announcementMessage) {\n this._live.clear();\n }\n });\n\n // If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.\n if (config.duration && config.duration > 0) {\n snackBarRef.afterOpened().subscribe(() => snackBarRef._dismissAfter(config.duration!));\n }\n\n if (this._openedSnackBarRef) {\n // If a snack bar is already in view, dismiss it and enter the\n // new snack bar after exit animation is complete.\n this._openedSnackBarRef.afterDismissed().subscribe(() => {\n snackBarRef.containerInstance.enter();\n });\n this._openedSnackBarRef.dismiss();\n } else {\n // If no snack bar is in view, enter the new snack bar.\n snackBarRef.containerInstance.enter();\n }\n }\n\n /**\n * Creates a new overlay and places it in the correct location.\n * @param config The user-specified snack bar config.\n */\n private _createOverlay(config: MatSnackBarConfig): OverlayRef {\n const overlayConfig = new OverlayConfig();\n overlayConfig.direction = config.direction;\n\n let positionStrategy = this._overlay.position().global();\n // Set horizontal position.\n const isRtl = config.direction === 'rtl';\n const isLeft =\n config.horizontalPosition === 'left' ||\n (config.horizontalPosition === 'start' && !isRtl) ||\n (config.horizontalPosition === 'end' && isRtl);\n const isRight = !isLeft && config.horizontalPosition !== 'center';\n if (isLeft) {\n positionStrategy.left('0');\n } else if (isRight) {\n positionStrategy.right('0');\n } else {\n positionStrategy.centerHorizontally();\n }\n // Set horizontal position.\n if (config.verticalPosition === 'top') {\n positionStrategy.top('0');\n } else {\n positionStrategy.bottom('0');\n }\n\n overlayConfig.positionStrategy = positionStrategy;\n return this._overlay.create(overlayConfig);\n }\n\n /**\n * Creates an injector to be used inside of a snack bar component.\n * @param config Config that was used to create the snack bar.\n * @param snackBarRef Reference to the snack bar.\n */\n private _createInjector<T>(config: MatSnackBarConfig, snackBarRef: MatSnackBarRef<T>): Injector {\n const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;\n\n return Injector.create({\n parent: userInjector || this._injector,\n providers: [\n {provide: MatSnackBarRef, useValue: snackBarRef},\n {provide: MAT_SNACK_BAR_DATA, useValue: config.data},\n ],\n });\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '../button';\nimport {MatCommonModule} from '../core';\n\nimport {SimpleSnackBar} from './simple-snack-bar';\nimport {MatSnackBarContainer} from './snack-bar-container';\nimport {MatSnackBarAction, MatSnackBarActions, MatSnackBarLabel} from './snack-bar-content';\nimport {MatSnackBar} from './snack-bar';\n\nconst DIRECTIVES = [MatSnackBarContainer, MatSnackBarLabel, MatSnackBarActions, MatSnackBarAction];\n\n@NgModule({\n imports: [\n OverlayModule,\n PortalModule,\n MatButtonModule,\n MatCommonModule,\n SimpleSnackBar,\n ...DIRECTIVES,\n ],\n exports: [MatCommonModule, ...DIRECTIVES],\n providers: [MatSnackBar],\n})\nexport class MatSnackBarModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Animations used by the Material snack bar.\n * @docs-private\n * @deprecated No longer used, will be removed.\n * @breaking-change 21.0.0\n */\nexport const matSnackBarAnimations: {\n readonly snackBarState: any;\n} = {\n // Represents\n // trigger('state', [\n // state(\n // 'void, hidden',\n // style({\n // transform: 'scale(0.8)',\n // opacity: 0,\n // }),\n // ),\n // state(\n // 'visible',\n // style({\n // transform: 'scale(1)',\n // opacity: 1,\n // }),\n // ),\n // transition('* => visible', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),\n // transition(\n // '* => void, * => hidden',\n // animate(\n // '75ms cubic-bezier(0.4, 0.0, 1, 1)',\n // style({\n // opacity: 0,\n // }),\n // ),\n // ),\n // ])\n\n /** Animation that shows and hides a snack bar. */\n snackBarState: {\n type: 7,\n name: 'state',\n 'definitions': [\n {\n type: 0,\n name: 'void, hidden',\n styles: {type: 6, styles: {transform: 'scale(0.8)', opacity: 0}, offset: null},\n },\n {\n type: 0,\n name: 'visible',\n styles: {type: 6, styles: {transform: 'scale(1)', opacity: 1}, offset: null},\n },\n {\n type: 1,\n expr: '* => visible',\n animation: {type: 4, styles: null, timings: '150ms cubic-bezier(0, 0, 0.2, 1)'},\n options: null,\n },\n {\n type: 1,\n expr: '* => void, * => hidden',\n animation: {\n type: 4,\n styles: {type: 6, styles: {opacity: 0}, offset: null},\n timings: '75ms cubic-bezier(0.4, 0.0, 1, 1)',\n },\n options: null,\n },\n ],\n options: {},\n },\n};\n"],"names":[],"mappings":"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