{"version":3,"file":"mtxDrawer.mjs","sources":["../../../projects/extensions/drawer/drawer-config.ts","../../../projects/extensions/drawer/drawer-animation.ts","../../../projects/extensions/drawer/drawer-container.ts","../../../projects/extensions/drawer/drawer-container.html","../../../projects/extensions/drawer/drawer-ref.ts","../../../projects/extensions/drawer/drawer.ts","../../../projects/extensions/drawer/drawer-module.ts","../../../projects/extensions/drawer/mtxDrawer.ts"],"sourcesContent":["import { Direction } from '@angular/cdk/bidi';\nimport { ScrollStrategy } from '@angular/cdk/overlay';\nimport { ViewContainerRef } from '@angular/core';\n\n/** Options for where to set focus to automatically on dialog open. */\nexport type AutoFocusTarget = 'dialog' | 'first-tabbable' | 'first-heading';\n\n/** Possible overrides for a drawer's position. */\nexport type DrawerPosition = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Configuration used when opening a drawer.\n */\nexport class MtxDrawerConfig<D = any> {\n  /** The view container to place the overlay for the drawer into. */\n  viewContainerRef?: ViewContainerRef;\n\n  /** ID for the drawer. If omitted, a unique one will be generated. */\n  id?: string;\n\n  /** Extra CSS classes to be added to the drawer container. */\n  panelClass?: string | string[];\n\n  /** Text layout direction for the drawer. */\n  direction?: Direction;\n\n  /** Data being injected into the child component. */\n  data?: D | null = null;\n\n  /** Whether the drawer has a backdrop. */\n  hasBackdrop?: boolean = true;\n\n  /** Custom class for the backdrop. */\n  backdropClass?: string;\n\n  /** Whether the user can use escape or clicking outside to close the drawer. */\n  disableClose?: boolean = false;\n\n  /** Aria label to assign to the drawer element. */\n  ariaLabel?: string | null = null;\n\n  /**\n   * Whether the drawer should close when the user goes backwards/forwards in history.\n   * Note that this usually doesn't include clicking on links (unless the user is using\n   * the `HashLocationStrategy`).\n   */\n  closeOnNavigation?: boolean = true;\n\n  /**\n   * Where the drawer should focus on open.\n   * @breaking-change 14.0.0 Remove boolean option from autoFocus. Use string or\n   * AutoFocusTarget instead.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  autoFocus?: AutoFocusTarget | string | boolean = 'first-tabbable';\n\n  /**\n   * Whether the drawer should restore focus to the\n   * previously-focused element, after it's closed.\n   */\n  restoreFocus?: boolean = true;\n\n  /** Scroll strategy to be used for the drawer. */\n  scrollStrategy?: ScrollStrategy;\n\n  /** Position of the drawer. */\n  position?: DrawerPosition = 'right';\n\n  /** Width of the drawer. */\n  width?: string;\n\n  /** Height of the drawer. */\n  height?: string;\n\n  /** Min-width of the drawer. If a number is provided, assumes pixel units. */\n  minWidth?: number | string;\n\n  /** Min-height of the drawer. If a number is provided, assumes pixel units. */\n  minHeight?: number | string;\n\n  /** Max-width of the drawer. If a number is provided, assumes pixel units. */\n  maxWidth?: number | string;\n\n  /** Max-height of the drawer. If a number is provided, assumes pixel units. */\n  maxHeight?: number | string;\n}\n","import {\n  animate,\n  state,\n  style,\n  transition,\n  trigger,\n  AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/** Animations used by the drawer. */\nexport const mtxDrawerAnimations: {\n  readonly drawerState: AnimationTriggerMetadata;\n} = {\n  /** Animation that shows and hides a drawer. */\n  drawerState: trigger('state', [\n    state(\n      'void, hidden',\n      style({\n        'box-shadow': 'none',\n        'visibility': 'hidden',\n      })\n    ),\n    state(\n      'visible',\n      style({\n        transform: 'none',\n        visibility: 'visible',\n      })\n    ),\n    transition(\n      'visible => void, visible => hidden',\n      animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)')\n    ),\n    transition('void => visible', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),\n  ]),\n};\n","import { AnimationEvent } from '@angular/animations';\nimport { FocusMonitor, FocusTrapFactory, InteractivityChecker } from '@angular/cdk/a11y';\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  NgZone,\n  OnDestroy,\n  Optional,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { mtxDrawerAnimations } from './drawer-animation';\nimport { MtxDrawerConfig } from './drawer-config';\n\n/**\n * Internal component that wraps user-provided drawer content.\n * @docs-private\n */\n@Component({\n  selector: 'mtx-drawer-container',\n  templateUrl: 'drawer-container.html',\n  styleUrl: 'drawer-container.scss',\n  // In Ivy embedded views will be change detected from their declaration place, rather than where\n  // they were stamped out. This means that we can't have the drawer container be OnPush,\n  // because it might cause the sheets that were opened from a template not to be out of date.\n  changeDetection: ChangeDetectionStrategy.Default,\n  encapsulation: ViewEncapsulation.None,\n  animations: [mtxDrawerAnimations.drawerState],\n  host: {\n    'class': 'mtx-drawer-container',\n    '[class]': '_drawerPosition',\n    'tabindex': '-1',\n    '[id]': '_config.id',\n    '[attr.role]': '_config.role',\n    '[attr.aria-modal]': '_config.isModal',\n    '[attr.aria-label]': '_config.ariaLabel',\n    '[@state]': '_animationState',\n    '(@state.start)': '_onAnimationStart($event)',\n    '(@state.done)': '_onAnimationDone($event)',\n  },\n  standalone: true,\n  imports: [CdkPortalOutlet],\n})\nexport class MtxDrawerContainer extends CdkDialogContainer<MtxDrawerConfig> implements OnDestroy {\n  /** The portal outlet inside of this container into which the content will be loaded. */\n  @ViewChild(CdkPortalOutlet, { static: true }) _portalOutlet!: CdkPortalOutlet;\n\n  /** The state of the drawer animations. */\n  _animationState: 'void' | 'visible' | 'hidden' = 'void';\n\n  /** Emits whenever the state of the animation changes. */\n  _animationStateChanged = new EventEmitter<AnimationEvent>();\n\n  /** Whether the component has been destroyed. */\n  private _destroyed = false;\n\n  get _drawerPosition() {\n    return `mtx-drawer-${this._config.position}`;\n  }\n\n  constructor(\n    elementRef: ElementRef,\n    focusTrapFactory: FocusTrapFactory,\n    @Optional() @Inject(DOCUMENT) document: any,\n    config: MtxDrawerConfig,\n    checker: InteractivityChecker,\n    ngZone: NgZone,\n    overlayRef: OverlayRef,\n    focusMonitor?: FocusMonitor\n  ) {\n    super(\n      elementRef,\n      focusTrapFactory,\n      document,\n      config,\n      checker,\n      ngZone,\n      overlayRef,\n      focusMonitor\n    );\n  }\n\n  protected override _contentAttached(): void {\n    // Delegate to the original dialog-container initialization (i.e. saving the\n    // previous element, setting up the focus trap and moving focus to the container).\n    super._contentAttached();\n\n    this.enter();\n  }\n\n  /** Begin animation of bottom sheet entrance into view. */\n  enter(): void {\n    if (!this._destroyed) {\n      this._animationState = 'visible';\n      this._changeDetectorRef.markForCheck();\n      this._changeDetectorRef.detectChanges();\n    }\n  }\n\n  /** Begin animation of the bottom sheet exiting from view. */\n  exit(): void {\n    if (!this._destroyed) {\n      this._animationState = 'hidden';\n      this._changeDetectorRef.markForCheck();\n    }\n  }\n\n  override ngOnDestroy() {\n    super.ngOnDestroy();\n\n    this._destroyed = true;\n  }\n\n  _onAnimationDone(event: AnimationEvent) {\n    if (event.toState === 'visible') {\n      this._trapFocus();\n    }\n\n    this._animationStateChanged.emit(event);\n  }\n\n  _onAnimationStart(event: AnimationEvent) {\n    this._animationStateChanged.emit(event);\n  }\n\n  protected override _captureInitialFocus(): void {}\n}\n","<ng-template cdkPortalOutlet></ng-template>\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport { merge, Observable, Subject } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { MtxDrawerConfig } from './drawer-config';\nimport { MtxDrawerContainer } from './drawer-container';\nimport { ComponentRef } from '@angular/core';\n\n/**\n * Reference to a drawer dispatched from the drawer service.\n */\nexport class MtxDrawerRef<T = any, R = any> {\n  /** Instance of the component making up the content of the drawer. */\n  get instance(): T {\n    return this._ref.componentInstance!;\n  }\n\n  /**\n   * `ComponentRef` of the component opened into the drawer. Will be\n   * null when the drawer is opened using a `TemplateRef`.\n   */\n  get componentRef(): ComponentRef<T> | null {\n    return this._ref.componentRef;\n  }\n\n  /**\n   * Instance of the component into which the drawer content is projected.\n   * @docs-private\n   */\n  containerInstance: MtxDrawerContainer;\n\n  /** Whether the user is allowed to close the drawer. */\n  disableClose: boolean | undefined;\n\n  /** Unique ID for the drawer. */\n  id: string;\n\n  /** Subject for notifying the user that the drawer has been dismissed. */\n  private readonly _afterDismissed = new Subject<R | undefined>();\n\n  /** Subject for notifying the user that the drawer has opened and appeared. */\n  private readonly _afterOpened = new Subject<void>();\n\n  /** Result to be passed down to the `afterDismissed` stream. */\n  private _result: R | undefined;\n\n  /** Handle to the timeout that's running as a fallback in case the exit animation doesn't fire. */\n  private _closeFallbackTimeout: any;\n\n  constructor(\n    private _ref: DialogRef<R, T>,\n    config: MtxDrawerConfig,\n    containerInstance: MtxDrawerContainer\n  ) {\n    this.containerInstance = containerInstance;\n    this.disableClose = config.disableClose;\n    this.id = _ref.id;\n\n    // Emit when opening animation completes\n    containerInstance._animationStateChanged\n      .pipe(\n        filter(event => event.phaseName === 'done' && event.toState === 'visible'),\n        take(1)\n      )\n      .subscribe(() => {\n        this._afterOpened.next();\n        this._afterOpened.complete();\n      });\n\n    // Dispose overlay when closing animation is complete\n    containerInstance._animationStateChanged\n      .pipe(\n        filter(event => event.phaseName === 'done' && event.toState === 'hidden'),\n        take(1)\n      )\n      .subscribe(() => {\n        clearTimeout(this._closeFallbackTimeout);\n        this._ref.close(this._result);\n      });\n\n    _ref.overlayRef.detachments().subscribe(() => {\n      this._ref.close(this._result);\n    });\n\n    merge(\n      this.backdropClick(),\n      this.keydownEvents().pipe(filter(event => event.keyCode === ESCAPE))\n    ).subscribe(event => {\n      if (\n        !this.disableClose &&\n        (event.type !== 'keydown' || !hasModifierKey(event as KeyboardEvent))\n      ) {\n        event.preventDefault();\n        this.dismiss();\n      }\n    });\n  }\n\n  /**\n   * Dismisses the drawer.\n   * @param result Data to be passed back to the drawer opener.\n   */\n  dismiss(result?: R): void {\n    if (this.containerInstance && !this._afterDismissed.closed) {\n      // Transition the backdrop in parallel to the drawer.\n      this.containerInstance._animationStateChanged\n        .pipe(\n          filter(event => event.phaseName === 'start'),\n          take(1)\n        )\n        .subscribe(event => {\n          // The logic that disposes of the overlay depends on the exit animation completing, however\n          // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback\n          // timeout which will clean everything up if the animation hasn't fired within the specified\n          // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the\n          // vast majority of cases the timeout will have been cleared before it has fired.\n          this._closeFallbackTimeout = setTimeout(() => {\n            this._ref.close(this._result);\n          }, event.totalTime + 100);\n\n          this._ref.overlayRef.detachBackdrop();\n        });\n\n      this._result = result;\n      this.containerInstance.exit();\n      this.containerInstance = null!;\n    }\n  }\n\n  /** Gets an observable that is notified when the drawer is finished closing. */\n  afterDismissed(): Observable<R | undefined> {\n    return this._ref.closed;\n  }\n\n  /** Gets an observable that is notified when the drawer has opened and appeared. */\n  afterOpened(): Observable<void> {\n    return this._afterOpened;\n  }\n\n  /**\n   * Gets an observable that emits when the overlay's backdrop has been clicked.\n   */\n  backdropClick(): Observable<MouseEvent> {\n    return this._ref.backdropClick;\n  }\n\n  /**\n   * Gets an observable that emits when keydown events are targeted on the overlay.\n   */\n  keydownEvents(): Observable<KeyboardEvent> {\n    return this._ref.keydownEvents;\n  }\n}\n","import { coerceCssPixelValue } from '@angular/cdk/coercion';\nimport { Dialog, DialogConfig } from '@angular/cdk/dialog';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentType } from '@angular/cdk/portal';\nimport {\n  Inject,\n  Injectable,\n  InjectionToken,\n  Injector,\n  OnDestroy,\n  Optional,\n  SkipSelf,\n  TemplateRef,\n} from '@angular/core';\nimport { defer, Observable, Subject } from 'rxjs';\nimport { startWith } from 'rxjs/operators';\nimport { MtxDrawerConfig } from './drawer-config';\nimport { MtxDrawerContainer } from './drawer-container';\nimport { MtxDrawerRef } from './drawer-ref';\n\n/** Injection token that can be used to access the data that was passed in to a drawer. */\nexport const MTX_DRAWER_DATA = new InjectionToken<any>('MtxDrawerData');\n\n/** Injection token that can be used to specify default drawer options. */\nexport const MTX_DRAWER_DEFAULT_OPTIONS = new InjectionToken<MtxDrawerConfig>(\n  'mtx-drawer-default-options'\n);\n\n// Counter for unique drawer ids.\nlet uniqueId = 0;\n\n/**\n * Service to trigger Material Design bottom sheets.\n */\n@Injectable({ providedIn: 'root' })\nexport class MtxDrawer implements OnDestroy {\n  private readonly _openDrawersAtThisLevel: MtxDrawerRef<any>[] = [];\n  private readonly _afterAllDismissedAtThisLevel = new Subject<void>();\n  private readonly _afterOpenedAtThisLevel = new Subject<MtxDrawerRef<any>>();\n  private _dialog: Dialog;\n\n  /** Keeps track of the currently-open dialogs. */\n  get openDrawers(): MtxDrawerRef<any>[] {\n    return this._parentDrawer ? this._parentDrawer.openDrawers : this._openDrawersAtThisLevel;\n  }\n\n  /** Stream that emits when a drawer has been opened. */\n  get afterOpened(): Subject<MtxDrawerRef<any>> {\n    return this._parentDrawer ? this._parentDrawer.afterOpened : this._afterOpenedAtThisLevel;\n  }\n\n  private _getAfterAllDismissed(): Subject<void> {\n    const parent = this._parentDrawer;\n    return parent ? parent._getAfterAllDismissed() : this._afterAllDismissedAtThisLevel;\n  }\n\n  /**\n   * Stream that emits when all open drawer have finished closing.\n   * Will emit on subscribe if there are no open drawers to begin with.\n   */\n  readonly afterAllDismissed: Observable<void> = defer(() =>\n    this.openDrawers.length\n      ? this._getAfterAllDismissed()\n      : this._getAfterAllDismissed().pipe(startWith(undefined))\n  ) as Observable<any>;\n\n  constructor(\n    private _overlay: Overlay,\n    injector: Injector,\n    @Optional() @SkipSelf() private _parentDrawer: MtxDrawer,\n    @Optional()\n    @Inject(MTX_DRAWER_DEFAULT_OPTIONS)\n    private _defaultOptions?: MtxDrawerConfig\n  ) {\n    this._dialog = injector.get(Dialog);\n  }\n\n  /**\n   * Opens a drawer containing the given component.\n   * @param component Type of the component to load into the drawer.\n   * @param config Extra configuration options.\n   * @returns Reference to the newly-opened drawer.\n   */\n  open<T, D = any, R = any>(\n    component: ComponentType<T>,\n    config?: MtxDrawerConfig<D>\n  ): MtxDrawerRef<T, R>;\n\n  /**\n   * Opens a drawer containing the given template.\n   * @param template TemplateRef to instantiate as the drawer content.\n   * @param config Extra configuration options.\n   * @returns Reference to the newly-opened drawer.\n   */\n  open<T, D = any, R = any>(\n    template: TemplateRef<T>,\n    config?: MtxDrawerConfig<D>\n  ): MtxDrawerRef<T, R>;\n\n  open<T, D = any, R = any>(\n    componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n    config?: MtxDrawerConfig<D>\n  ): MtxDrawerRef<T, R> {\n    let drawerRef!: MtxDrawerRef<T, R>;\n\n    const _config = { ...(this._defaultOptions || new MtxDrawerConfig()), ...config };\n    _config.id = _config.id || `mtx-drawer-${uniqueId++}`;\n\n    _config.width =\n      _config.position === 'left' || _config.position === 'right'\n        ? coerceCssPixelValue(_config.width)\n        : '100vw';\n\n    _config.height =\n      _config.position === 'top' || _config.position === 'bottom'\n        ? coerceCssPixelValue(_config.height)\n        : '100vh';\n\n    this._dialog.open<R, D, T>(componentOrTemplateRef, {\n      ..._config,\n      // Disable closing since we need to sync it up to the animation ourselves.\n      disableClose: true,\n      // Disable closing on detachments so that we can sync up the animation.\n      closeOnOverlayDetachments: false,\n      container: {\n        type: MtxDrawerContainer,\n        providers: () => [\n          // Provide our config as the CDK config as well since it has the same interface as the\n          // CDK one, but it contains the actual values passed in by the user for things like\n          // `disableClose` which we disable for the CDK dialog since we handle it ourselves.\n          { provide: MtxDrawerConfig, useValue: _config },\n          { provide: DialogConfig, useValue: _config },\n        ],\n      },\n      scrollStrategy: _config.scrollStrategy || this._overlay.scrollStrategies.block(),\n      positionStrategy: this._overlay.position().global()[_config.position!]('0'),\n      templateContext: () => ({ drawerRef }),\n      providers: (cdkRef, _cdkConfig, container) => {\n        drawerRef = new MtxDrawerRef(cdkRef, _config, container as MtxDrawerContainer);\n        return [\n          { provide: MtxDrawerRef, useValue: drawerRef },\n          { provide: MTX_DRAWER_DATA, useValue: _config.data },\n        ];\n      },\n    });\n\n    this.openDrawers.push(drawerRef);\n    this.afterOpened.next(drawerRef);\n\n    drawerRef.afterDismissed().subscribe(() => {\n      const index = this.openDrawers.indexOf(drawerRef);\n\n      if (index > -1) {\n        this.openDrawers.splice(index, 1);\n\n        if (!this.openDrawers.length) {\n          this._getAfterAllDismissed().next();\n        }\n      }\n    });\n\n    return drawerRef;\n  }\n\n  /**\n   * Dismisses all of the currently-open drawers.\n   */\n  dismissAll(): void {\n    this._dismissDrawers(this.openDrawers);\n  }\n\n  /**\n   * Finds an open drawer by its id.\n   * @param id ID to use when looking up the drawer.\n   */\n  getDrawerById(id: string): MtxDrawerRef<any> | undefined {\n    return this.openDrawers.find(drawer => drawer.id === id);\n  }\n\n  ngOnDestroy() {\n    // Only dismiss the drawers at this level on destroy\n    // since the parent service may still be active.\n    this._dismissDrawers(this._openDrawersAtThisLevel);\n    this._afterAllDismissedAtThisLevel.complete();\n    this._afterOpenedAtThisLevel.complete();\n  }\n\n  private _dismissDrawers(drawers: MtxDrawerRef<any>[]) {\n    let i = drawers.length;\n\n    while (i--) {\n      drawers[i].dismiss();\n    }\n  }\n}\n","import { DialogModule } from '@angular/cdk/dialog';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MtxDrawer } from './drawer';\nimport { MtxDrawerContainer } from './drawer-container';\n\n@NgModule({\n  imports: [DialogModule, PortalModule, MatCommonModule, MtxDrawerContainer],\n  exports: [MtxDrawerContainer, MatCommonModule],\n  providers: [MtxDrawer],\n})\nexport class MtxDrawerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.MtxDrawerConfig"],"mappings":"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"}