@angular/material
Version:
Angular Material
1 lines • 57.7 kB
Source Map (JSON)
{"version":3,"file":"snack-bar.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-ref.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-config.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-content.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/simple-snack-bar.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/simple-snack-bar.html","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-container.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-container.html","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/snack-bar/snack-bar-module.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> | undefined;\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 = 'polite';\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 {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 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 /** 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 matButton 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 {_IdGenerator, AriaLivePoliteness} from '@angular/cdk/a11y';\nimport {Platform} from '@angular/cdk/platform';\nimport {\n BasePortalOutlet,\n CdkPortalOutlet,\n ComponentPortal,\n DomPortal,\n TemplatePortal,\n} from '@angular/cdk/portal';\n\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n inject,\n Injector,\n NgZone,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n DOCUMENT,\n} from '@angular/core';\nimport {Observable, of, Subject} from 'rxjs';\nimport {_animationsDisabled} from '../core';\nimport {MatSnackBarConfig} from './snack-bar-config';\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.Eager,\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 readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private _changeDetectorRef = inject(ChangeDetectorRef);\n private _platform = inject(Platform);\n protected _animationsDisabled = _animationsDisabled();\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 _injector = inject(Injector);\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> | undefined;\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() {\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\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 afterNextRender(\n () => {\n this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(ENTER_ANIMATION)));\n },\n {injector: this._injector},\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 afterNextRender(\n () => {\n this._ngZone.run(() => queueMicrotask(() => this.onAnimationEnd(EXIT_ANIMATION)));\n },\n {injector: this._injector},\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 }\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 {\n ComponentType,\n createGlobalPositionStrategy,\n createOverlayRef,\n OverlayConfig,\n OverlayRef,\n} from '@angular/cdk/overlay';\nimport {\n ComponentRef,\n EmbeddedViewRef,\n Service,\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';\nimport {_animationsDisabled} from '../core';\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: () => new MatSnackBarConfig(),\n },\n);\n\n/**\n * Service to dispatch Material Design snack bar messages.\n */\n@Service()\nexport class MatSnackBar implements OnDestroy {\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 private _animationsDisabled = _animationsDisabled();\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 /**\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 const positionStrategy = createGlobalPositionStrategy(this._injector);\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 overlayConfig.disableAnimations = this._animationsDisabled;\n return createOverlayRef(this._injector, 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 {BidiModule} from '@angular/cdk/bidi';\nimport {MatButtonModule} from '../button';\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: [OverlayModule, PortalModule, MatButtonModule, SimpleSnackBar, ...DIRECTIVES],\n exports: [BidiModule, ...DIRECTIVES],\n providers: [MatSnackBar],\n})\nexport class MatSnackBarModule {}\n"],"names":[],"mappings":"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