{"version":3,"sources":["node_modules/@angular/cdk/fesm2022/collections.mjs","node_modules/@angular/cdk/fesm2022/portal.mjs","node_modules/@angular/animations/fesm2022/animations.mjs","node_modules/@angular/cdk/fesm2022/scrolling.mjs","node_modules/@angular/cdk/fesm2022/overlay.mjs"],"sourcesContent":["import { ConnectableObservable, isObservable, of, Subject } from 'rxjs';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Injectable } from '@angular/core';\nclass DataSource {}\n/** Checks whether an object is a data source. */\nfunction isDataSource(value) {\n // Check if the value is a DataSource by observing if it has a connect function. Cannot\n // be checked as an `instanceof DataSource` since people could create their own sources\n // that match the interface, but don't extend DataSource. We also can't use `isObservable`\n // here, because of some internal apps.\n return value && typeof value.connect === 'function' && !(value instanceof ConnectableObservable);\n}\n\n/** DataSource wrapper for a native array. */\nclass ArrayDataSource extends DataSource {\n constructor(_data) {\n super();\n this._data = _data;\n }\n connect() {\n return isObservable(this._data) ? this._data : of(this._data);\n }\n disconnect() {}\n}\n\n/** Indicates how a view was changed by a {@link _ViewRepeater}. */\nvar _ViewRepeaterOperation = /*#__PURE__*/function (_ViewRepeaterOperation) {\n /** The content of an existing view was replaced with another item. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REPLACED\"] = 0] = \"REPLACED\";\n /** A new view was created with `createEmbeddedView`. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"INSERTED\"] = 1] = \"INSERTED\";\n /** The position of a view changed, but the content remains the same. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"MOVED\"] = 2] = \"MOVED\";\n /** A view was detached from the view container. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REMOVED\"] = 3] = \"REMOVED\";\n return _ViewRepeaterOperation;\n}(_ViewRepeaterOperation || {});\n/**\n * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.\n * @docs-private\n */\nconst _VIEW_REPEATER_STRATEGY = /*#__PURE__*/new InjectionToken('_ViewRepeater');\n\n/**\n * A repeater that destroys views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will always construct a new embedded view for each item.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _DisposeViewRepeaterStrategy {\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);\n operation = _ViewRepeaterOperation.INSERTED;\n } else if (currentIndex == null) {\n viewContainerRef.remove(adjustedPreviousIndex);\n operation = _ViewRepeaterOperation.REMOVED;\n } else {\n view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record\n });\n }\n });\n }\n detach() {}\n}\n\n/**\n * A repeater that caches views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will reuse one of the cached views instead of creating a new\n * embedded view. Recycling cached views reduces the quantity of expensive DOM\n * inserts.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _RecycleViewRepeaterStrategy {\n constructor() {\n /**\n * The size of the cache used to store unused views.\n * Setting the cache size to `0` will disable caching. Defaults to 20 views.\n */\n this.viewCacheSize = 20;\n /**\n * View cache that stores embedded view instances that have been previously stamped out,\n * but don't are not currently rendered. The view repeater will reuse these views rather than\n * creating brand new ones.\n *\n * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.\n */\n this._viewCache = [];\n }\n /** Apply changes to the DOM. */\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n // Rearrange the views to put them in the right location.\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n // Item added.\n const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = view ? _ViewRepeaterOperation.INSERTED : _ViewRepeaterOperation.REPLACED;\n } else if (currentIndex == null) {\n // Item removed.\n this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);\n operation = _ViewRepeaterOperation.REMOVED;\n } else {\n // Item moved.\n view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record\n });\n }\n });\n }\n detach() {\n for (const view of this._viewCache) {\n view.destroy();\n }\n this._viewCache = [];\n }\n /**\n * Inserts a view for a new item, either from the cache or by creating a new\n * one. Returns `undefined` if the item was inserted into a cached view.\n */\n _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {\n const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);\n if (cachedView) {\n cachedView.context.$implicit = value;\n return undefined;\n }\n const viewArgs = viewArgsFactory();\n return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);\n }\n /** Detaches the view at the given index and inserts into the view cache. */\n _detachAndCacheView(index, viewContainerRef) {\n const detachedView = viewContainerRef.detach(index);\n this._maybeCacheView(detachedView, viewContainerRef);\n }\n /** Moves view at the previous index to the current index. */\n _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {\n const view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n view.context.$implicit = value;\n return view;\n }\n /**\n * Cache the given detached view. If the cache is full, the view will be\n * destroyed.\n */\n _maybeCacheView(view, viewContainerRef) {\n if (this._viewCache.length < this.viewCacheSize) {\n this._viewCache.push(view);\n } else {\n const index = viewContainerRef.indexOf(view);\n // The host component could remove views from the container outside of\n // the view repeater. It's unlikely this will occur, but just in case,\n // destroy the view on its own, otherwise destroy it through the\n // container to ensure that all the references are removed.\n if (index === -1) {\n view.destroy();\n } else {\n viewContainerRef.remove(index);\n }\n }\n }\n /** Inserts a recycled view from the cache at the given index. */\n _insertViewFromCache(index, viewContainerRef) {\n const cachedView = this._viewCache.pop();\n if (cachedView) {\n viewContainerRef.insert(cachedView, index);\n }\n return cachedView || null;\n }\n}\n\n/**\n * Class to be used to power selecting one or more options from a list.\n */\nclass SelectionModel {\n /** Selected values. */\n get selected() {\n if (!this._selected) {\n this._selected = Array.from(this._selection.values());\n }\n return this._selected;\n }\n constructor(_multiple = false, initiallySelectedValues, _emitChanges = true, compareWith) {\n this._multiple = _multiple;\n this._emitChanges = _emitChanges;\n this.compareWith = compareWith;\n /** Currently-selected values. */\n this._selection = new Set();\n /** Keeps track of the deselected options that haven't been emitted by the change event. */\n this._deselectedToEmit = [];\n /** Keeps track of the selected options that haven't been emitted by the change event. */\n this._selectedToEmit = [];\n /** Event emitted when the value has changed. */\n this.changed = new Subject();\n if (initiallySelectedValues && initiallySelectedValues.length) {\n if (_multiple) {\n initiallySelectedValues.forEach(value => this._markSelected(value));\n } else {\n this._markSelected(initiallySelectedValues[0]);\n }\n // Clear the array in order to avoid firing the change event for preselected values.\n this._selectedToEmit.length = 0;\n }\n }\n /**\n * Selects a value or an array of values.\n * @param values The values to select\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n select(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._markSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Deselects a value or an array of values.\n * @param values The values to deselect\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n deselect(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Sets the selected values\n * @param values The new selected values\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n setSelection(...values) {\n this._verifyValueAssignment(values);\n const oldValues = this.selected;\n const newSelectedSet = new Set(values);\n values.forEach(value => this._markSelected(value));\n oldValues.filter(value => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet))).forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Toggles a value between selected and deselected.\n * @param value The value to toggle\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n toggle(value) {\n return this.isSelected(value) ? this.deselect(value) : this.select(value);\n }\n /**\n * Clears all of the selected values.\n * @param flushEvent Whether to flush the changes in an event.\n * If false, the changes to the selection will be flushed along with the next event.\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n clear(flushEvent = true) {\n this._unmarkAll();\n const changed = this._hasQueuedChanges();\n if (flushEvent) {\n this._emitChangeEvent();\n }\n return changed;\n }\n /**\n * Determines whether a value is selected.\n */\n isSelected(value) {\n return this._selection.has(this._getConcreteValue(value));\n }\n /**\n * Determines whether the model does not have a value.\n */\n isEmpty() {\n return this._selection.size === 0;\n }\n /**\n * Determines whether the model has a value.\n */\n hasValue() {\n return !this.isEmpty();\n }\n /**\n * Sorts the selected values based on a predicate function.\n */\n sort(predicate) {\n if (this._multiple && this.selected) {\n this._selected.sort(predicate);\n }\n }\n /**\n * Gets whether multiple values can be selected.\n */\n isMultipleSelection() {\n return this._multiple;\n }\n /** Emits a change event and clears the records of selected and deselected values. */\n _emitChangeEvent() {\n // Clear the selected values so they can be re-cached.\n this._selected = null;\n if (this._selectedToEmit.length || this._deselectedToEmit.length) {\n this.changed.next({\n source: this,\n added: this._selectedToEmit,\n removed: this._deselectedToEmit\n });\n this._deselectedToEmit = [];\n this._selectedToEmit = [];\n }\n }\n /** Selects a value. */\n _markSelected(value) {\n value = this._getConcreteValue(value);\n if (!this.isSelected(value)) {\n if (!this._multiple) {\n this._unmarkAll();\n }\n if (!this.isSelected(value)) {\n this._selection.add(value);\n }\n if (this._emitChanges) {\n this._selectedToEmit.push(value);\n }\n }\n }\n /** Deselects a value. */\n _unmarkSelected(value) {\n value = this._getConcreteValue(value);\n if (this.isSelected(value)) {\n this._selection.delete(value);\n if (this._emitChanges) {\n this._deselectedToEmit.push(value);\n }\n }\n }\n /** Clears out the selected values. */\n _unmarkAll() {\n if (!this.isEmpty()) {\n this._selection.forEach(value => this._unmarkSelected(value));\n }\n }\n /**\n * Verifies the value assignment and throws an error if the specified value array is\n * including multiple values while the selection model is not supporting multiple values.\n */\n _verifyValueAssignment(values) {\n if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMultipleValuesInSingleSelectionError();\n }\n }\n /** Whether there are queued up change to be emitted. */\n _hasQueuedChanges() {\n return !!(this._deselectedToEmit.length || this._selectedToEmit.length);\n }\n /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */\n _getConcreteValue(inputValue, selection) {\n if (!this.compareWith) {\n return inputValue;\n } else {\n selection = selection ?? this._selection;\n for (let selectedValue of selection) {\n if (this.compareWith(inputValue, selectedValue)) {\n return selectedValue;\n }\n }\n return inputValue;\n }\n }\n}\n/**\n * Returns an error that reports that multiple values are passed into a selection model\n * with a single value.\n * @docs-private\n */\nfunction getMultipleValuesInSingleSelectionError() {\n return Error('Cannot pass multiple values into SelectionModel with single-value mode.');\n}\n\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nlet UniqueSelectionDispatcher = /*#__PURE__*/(() => {\n class UniqueSelectionDispatcher {\n constructor() {\n this._listeners = [];\n }\n /**\n * Notify other items that selection for the given name has been set.\n * @param id ID of the item.\n * @param name Name of the item.\n */\n notify(id, name) {\n for (let listener of this._listeners) {\n listener(id, name);\n }\n }\n /**\n * Listen for future changes to item selection.\n * @return Function used to deregister listener\n */\n listen(listener) {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(registered => {\n return listener !== registered;\n });\n };\n }\n ngOnDestroy() {\n this._listeners = [];\n }\n static {\n this.ɵfac = function UniqueSelectionDispatcher_Factory(t) {\n return new (t || UniqueSelectionDispatcher)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: UniqueSelectionDispatcher,\n factory: UniqueSelectionDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return UniqueSelectionDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, _ViewRepeaterOperation, getMultipleValuesInSingleSelectionError, isDataSource };\n","import * as i0 from '@angular/core';\nimport { ElementRef, Injector, Directive, EventEmitter, Inject, Input, Output, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * Throws an exception when attempting to attach a null portal to a host.\n * @docs-private\n */\nfunction throwNullPortalError() {\n throw Error('Must provide a portal to attach');\n}\n/**\n * Throws an exception when attempting to attach a portal to a host that is already attached.\n * @docs-private\n */\nfunction throwPortalAlreadyAttachedError() {\n throw Error('Host already has a portal attached');\n}\n/**\n * Throws an exception when attempting to attach a portal to an already-disposed host.\n * @docs-private\n */\nfunction throwPortalOutletAlreadyDisposedError() {\n throw Error('This PortalOutlet has already been disposed');\n}\n/**\n * Throws an exception when attempting to attach an unknown portal type.\n * @docs-private\n */\nfunction throwUnknownPortalTypeError() {\n throw Error('Attempting to attach an unknown Portal type. BasePortalOutlet accepts either ' + 'a ComponentPortal or a TemplatePortal.');\n}\n/**\n * Throws an exception when attempting to attach a portal to a null host.\n * @docs-private\n */\nfunction throwNullPortalOutletError() {\n throw Error('Attempting to attach a portal to a null PortalOutlet');\n}\n/**\n * Throws an exception when attempting to detach a portal that is not attached.\n * @docs-private\n */\nfunction throwNoPortalAttachedError() {\n throw Error('Attempting to detach a portal that is not attached to a host');\n}\n\n/**\n * A `Portal` is something that you want to render somewhere else.\n * It can be attach to / detached from a `PortalOutlet`.\n */\nclass Portal {\n /** Attach this portal to a host. */\n attach(host) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (host == null) {\n throwNullPortalOutletError();\n }\n if (host.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n }\n this._attachedHost = host;\n return host.attach(this);\n }\n /** Detach this portal from its host */\n detach() {\n let host = this._attachedHost;\n if (host != null) {\n this._attachedHost = null;\n host.detach();\n } else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwNoPortalAttachedError();\n }\n }\n /** Whether this portal is attached to a host. */\n get isAttached() {\n return this._attachedHost != null;\n }\n /**\n * Sets the PortalOutlet reference without performing `attach()`. This is used directly by\n * the PortalOutlet when it is performing an `attach()` or `detach()`.\n */\n setAttachedHost(host) {\n this._attachedHost = host;\n }\n}\n/**\n * A `ComponentPortal` is a portal that instantiates some Component upon attachment.\n */\nclass ComponentPortal extends Portal {\n constructor(component, viewContainerRef, injector, componentFactoryResolver, projectableNodes) {\n super();\n this.component = component;\n this.viewContainerRef = viewContainerRef;\n this.injector = injector;\n this.componentFactoryResolver = componentFactoryResolver;\n this.projectableNodes = projectableNodes;\n }\n}\n/**\n * A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).\n */\nclass TemplatePortal extends Portal {\n constructor( /** The embedded template that will be used to instantiate an embedded View in the host. */\n templateRef, /** Reference to the ViewContainer into which the template will be stamped out. */\n viewContainerRef, /** Contextual data to be passed in to the embedded view. */\n context, /** The injector to use for the embedded view. */\n injector) {\n super();\n this.templateRef = templateRef;\n this.viewContainerRef = viewContainerRef;\n this.context = context;\n this.injector = injector;\n }\n get origin() {\n return this.templateRef.elementRef;\n }\n /**\n * Attach the portal to the provided `PortalOutlet`.\n * When a context is provided it will override the `context` property of the `TemplatePortal`\n * instance.\n */\n attach(host, context = this.context) {\n this.context = context;\n return super.attach(host);\n }\n detach() {\n this.context = undefined;\n return super.detach();\n }\n}\n/**\n * A `DomPortal` is a portal whose DOM element will be taken from its current position\n * in the DOM and moved into a portal outlet, when it is attached. On detach, the content\n * will be restored to its original position.\n */\nclass DomPortal extends Portal {\n constructor(element) {\n super();\n this.element = element instanceof ElementRef ? element.nativeElement : element;\n }\n}\n/**\n * Partial implementation of PortalOutlet that handles attaching\n * ComponentPortal and TemplatePortal.\n */\nclass BasePortalOutlet {\n constructor() {\n /** Whether this host has already been permanently disposed. */\n this._isDisposed = false;\n // @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.\n this.attachDomPortal = null;\n }\n /** Whether this host has an attached portal. */\n hasAttached() {\n return !!this._attachedPortal;\n }\n /** Attaches a portal. */\n attach(portal) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!portal) {\n throwNullPortalError();\n }\n if (this.hasAttached()) {\n throwPortalAlreadyAttachedError();\n }\n if (this._isDisposed) {\n throwPortalOutletAlreadyDisposedError();\n }\n }\n if (portal instanceof ComponentPortal) {\n this._attachedPortal = portal;\n return this.attachComponentPortal(portal);\n } else if (portal instanceof TemplatePortal) {\n this._attachedPortal = portal;\n return this.attachTemplatePortal(portal);\n // @breaking-change 10.0.0 remove null check for `this.attachDomPortal`.\n } else if (this.attachDomPortal && portal instanceof DomPortal) {\n this._attachedPortal = portal;\n return this.attachDomPortal(portal);\n }\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throwUnknownPortalTypeError();\n }\n }\n /** Detaches a previously attached portal. */\n detach() {\n if (this._attachedPortal) {\n this._attachedPortal.setAttachedHost(null);\n this._attachedPortal = null;\n }\n this._invokeDisposeFn();\n }\n /** Permanently dispose of this portal host. */\n dispose() {\n if (this.hasAttached()) {\n this.detach();\n }\n this._invokeDisposeFn();\n this._isDisposed = true;\n }\n /** @docs-private */\n setDisposeFn(fn) {\n this._disposeFn = fn;\n }\n _invokeDisposeFn() {\n if (this._disposeFn) {\n this._disposeFn();\n this._disposeFn = null;\n }\n }\n}\n/**\n * @deprecated Use `BasePortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass BasePortalHost extends BasePortalOutlet {}\n\n/**\n * A PortalOutlet for attaching portals to an arbitrary DOM element outside of the Angular\n * application context.\n */\nclass DomPortalOutlet extends BasePortalOutlet {\n /**\n * @param outletElement Element into which the content is projected.\n * @param _componentFactoryResolver Used to resolve the component factory.\n * Only required when attaching component portals.\n * @param _appRef Reference to the application. Only used in component portals when there\n * is no `ViewContainerRef` available.\n * @param _defaultInjector Injector to use as a fallback when the portal being attached doesn't\n * have one. Only used for component portals.\n * @param _document Reference to the document. Used when attaching a DOM portal. Will eventually\n * become a required parameter.\n */\n constructor( /** Element into which the content is projected. */\n outletElement, _componentFactoryResolver, _appRef, _defaultInjector,\n /**\n * @deprecated `_document` Parameter to be made required.\n * @breaking-change 10.0.0\n */\n _document) {\n super();\n this.outletElement = outletElement;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._appRef = _appRef;\n this._defaultInjector = _defaultInjector;\n /**\n * Attaches a DOM portal by transferring its content into the outlet.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = portal => {\n // @breaking-change 10.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n element.parentNode.insertBefore(anchorNode, element);\n this.outletElement.appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n // We can't use `replaceWith` here because IE doesn't support it.\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /**\n * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.\n * @param portal Portal to be attached\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !resolver) {\n throw Error('Cannot attach component portal to outlet without a ComponentFactoryResolver.');\n }\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n let componentRef;\n // If the portal specifies a ViewContainerRef, we will use that as the attachment point\n // for the component (in terms of Angular's component tree, not rendering).\n // When the ViewContainerRef is missing, we use the factory to create the component directly\n // and then manually attach the view to the application.\n if (portal.viewContainerRef) {\n componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.injector, portal.projectableNodes || undefined);\n this.setDisposeFn(() => componentRef.destroy());\n } else {\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._appRef) {\n throw Error('Cannot attach component portal to outlet without an ApplicationRef.');\n }\n componentRef = componentFactory.create(portal.injector || this._defaultInjector || Injector.NULL);\n this._appRef.attachView(componentRef.hostView);\n this.setDisposeFn(() => {\n // Verify that the ApplicationRef has registered views before trying to detach a host view.\n // This check also protects the `detachView` from being called on a destroyed ApplicationRef.\n if (this._appRef.viewCount > 0) {\n this._appRef.detachView(componentRef.hostView);\n }\n componentRef.destroy();\n });\n }\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.appendChild(this._getComponentRootNode(componentRef));\n this._attachedPortal = portal;\n return componentRef;\n }\n /**\n * Attaches a template portal to the DOM as an embedded view.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n let viewContainer = portal.viewContainerRef;\n let viewRef = viewContainer.createEmbeddedView(portal.templateRef, portal.context, {\n injector: portal.injector\n });\n // The method `createEmbeddedView` will add the view as a child of the viewContainer.\n // But for the DomPortalOutlet the view can be added everywhere in the DOM\n // (e.g Overlay Container) To move the view to the specified host element. We just\n // re-append the existing root nodes.\n viewRef.rootNodes.forEach(rootNode => this.outletElement.appendChild(rootNode));\n // Note that we want to detect changes after the nodes have been moved so that\n // any directives inside the portal that are looking at the DOM inside a lifecycle\n // hook won't be invoked too early.\n viewRef.detectChanges();\n this.setDisposeFn(() => {\n let index = viewContainer.indexOf(viewRef);\n if (index !== -1) {\n viewContainer.remove(index);\n }\n });\n this._attachedPortal = portal;\n // TODO(jelbourn): Return locals from view.\n return viewRef;\n }\n /**\n * Clears out a portal from the DOM.\n */\n dispose() {\n super.dispose();\n this.outletElement.remove();\n }\n /** Gets the root HTMLElement for an instantiated component. */\n _getComponentRootNode(componentRef) {\n return componentRef.hostView.rootNodes[0];\n }\n}\n/**\n * @deprecated Use `DomPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nclass DomPortalHost extends DomPortalOutlet {}\n\n/**\n * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal,\n * the directive instance itself can be attached to a host, enabling declarative use of portals.\n */\nlet CdkPortal = /*#__PURE__*/(() => {\n class CdkPortal extends TemplatePortal {\n constructor(templateRef, viewContainerRef) {\n super(templateRef, viewContainerRef);\n }\n static {\n this.ɵfac = function CdkPortal_Factory(t) {\n return new (t || CdkPortal)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkPortal,\n selectors: [[\"\", \"cdkPortal\", \"\"]],\n exportAs: [\"cdkPortal\"],\n standalone: true,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkPortal;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortal` instead.\n * @breaking-change 9.0.0\n */\nlet TemplatePortalDirective = /*#__PURE__*/(() => {\n class TemplatePortalDirective extends CdkPortal {\n static {\n this.ɵfac = /* @__PURE__ */(() => {\n let ɵTemplatePortalDirective_BaseFactory;\n return function TemplatePortalDirective_Factory(t) {\n return (ɵTemplatePortalDirective_BaseFactory || (ɵTemplatePortalDirective_BaseFactory = i0.ɵɵgetInheritedFactory(TemplatePortalDirective)))(t || TemplatePortalDirective);\n };\n })();\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: TemplatePortalDirective,\n selectors: [[\"\", \"cdk-portal\", \"\"], [\"\", \"portal\", \"\"]],\n exportAs: [\"cdkPortal\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkPortal,\n useExisting: TemplatePortalDirective\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return TemplatePortalDirective;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive version of a PortalOutlet. Because the directive *is* a PortalOutlet, portals can be\n * directly attached to it, enabling declarative use.\n *\n * Usage:\n * ``\n */\nlet CdkPortalOutlet = /*#__PURE__*/(() => {\n class CdkPortalOutlet extends BasePortalOutlet {\n constructor(_componentFactoryResolver, _viewContainerRef,\n /**\n * @deprecated `_document` parameter to be made required.\n * @breaking-change 9.0.0\n */\n _document) {\n super();\n this._componentFactoryResolver = _componentFactoryResolver;\n this._viewContainerRef = _viewContainerRef;\n /** Whether the portal component is initialized. */\n this._isInitialized = false;\n /** Emits when a portal is attached to the outlet. */\n this.attached = new EventEmitter();\n /**\n * Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.\n * @param portal Portal to be attached.\n * @deprecated To be turned into a method.\n * @breaking-change 10.0.0\n */\n this.attachDomPortal = portal => {\n // @breaking-change 9.0.0 Remove check and error once the\n // `_document` constructor parameter is required.\n if (!this._document && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Cannot attach DOM portal without _document constructor parameter');\n }\n const element = portal.element;\n if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('DOM portal content must be attached to a parent node.');\n }\n // Anchor used to save the element's previous position so\n // that we can restore it when the portal is detached.\n const anchorNode = this._document.createComment('dom-portal');\n portal.setAttachedHost(this);\n element.parentNode.insertBefore(anchorNode, element);\n this._getRootNode().appendChild(element);\n this._attachedPortal = portal;\n super.setDisposeFn(() => {\n if (anchorNode.parentNode) {\n anchorNode.parentNode.replaceChild(element, anchorNode);\n }\n });\n };\n this._document = _document;\n }\n /** Portal associated with the Portal outlet. */\n get portal() {\n return this._attachedPortal;\n }\n set portal(portal) {\n // Ignore the cases where the `portal` is set to a falsy value before the lifecycle hooks have\n // run. This handles the cases where the user might do something like `
`\n // and attach a portal programmatically in the parent component. When Angular does the first CD\n // round, it will fire the setter with empty string, causing the user's content to be cleared.\n if (this.hasAttached() && !portal && !this._isInitialized) {\n return;\n }\n if (this.hasAttached()) {\n super.detach();\n }\n if (portal) {\n super.attach(portal);\n }\n this._attachedPortal = portal || null;\n }\n /** Component or view reference that is attached to the portal. */\n get attachedRef() {\n return this._attachedRef;\n }\n ngOnInit() {\n this._isInitialized = true;\n }\n ngOnDestroy() {\n super.dispose();\n this._attachedRef = this._attachedPortal = null;\n }\n /**\n * Attach the given ComponentPortal to this PortalOutlet using the ComponentFactoryResolver.\n *\n * @param portal Portal to be attached to the portal outlet.\n * @returns Reference to the created component.\n */\n attachComponentPortal(portal) {\n portal.setAttachedHost(this);\n // If the portal specifies an origin, use that as the logical location of the component\n // in the application tree. Otherwise use the location of this PortalOutlet.\n const viewContainerRef = portal.viewContainerRef != null ? portal.viewContainerRef : this._viewContainerRef;\n const resolver = portal.componentFactoryResolver || this._componentFactoryResolver;\n const componentFactory = resolver.resolveComponentFactory(portal.component);\n const ref = viewContainerRef.createComponent(componentFactory, viewContainerRef.length, portal.injector || viewContainerRef.injector, portal.projectableNodes || undefined);\n // If we're using a view container that's different from the injected one (e.g. when the portal\n // specifies its own) we need to move the component into the outlet, otherwise it'll be rendered\n // inside of the alternate view container.\n if (viewContainerRef !== this._viewContainerRef) {\n this._getRootNode().appendChild(ref.hostView.rootNodes[0]);\n }\n super.setDisposeFn(() => ref.destroy());\n this._attachedPortal = portal;\n this._attachedRef = ref;\n this.attached.emit(ref);\n return ref;\n }\n /**\n * Attach the given TemplatePortal to this PortalHost as an embedded View.\n * @param portal Portal to be attached.\n * @returns Reference to the created embedded view.\n */\n attachTemplatePortal(portal) {\n portal.setAttachedHost(this);\n const viewRef = this._viewContainerRef.createEmbeddedView(portal.templateRef, portal.context, {\n injector: portal.injector\n });\n super.setDisposeFn(() => this._viewContainerRef.clear());\n this._attachedPortal = portal;\n this._attachedRef = viewRef;\n this.attached.emit(viewRef);\n return viewRef;\n }\n /** Gets the root node of the portal outlet. */\n _getRootNode() {\n const nativeElement = this._viewContainerRef.element.nativeElement;\n // The directive could be set on a template which will result in a comment\n // node being the root. Use the comment's parent node if that is the case.\n return nativeElement.nodeType === nativeElement.ELEMENT_NODE ? nativeElement : nativeElement.parentNode;\n }\n static {\n this.ɵfac = function CdkPortalOutlet_Factory(t) {\n return new (t || CdkPortalOutlet)(i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(DOCUMENT));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkPortalOutlet,\n selectors: [[\"\", \"cdkPortalOutlet\", \"\"]],\n inputs: {\n portal: [i0.ɵɵInputFlags.None, \"cdkPortalOutlet\", \"portal\"]\n },\n outputs: {\n attached: \"attached\"\n },\n exportAs: [\"cdkPortalOutlet\"],\n standalone: true,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkPortalOutlet;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @deprecated Use `CdkPortalOutlet` instead.\n * @breaking-change 9.0.0\n */\nlet PortalHostDirective = /*#__PURE__*/(() => {\n class PortalHostDirective extends CdkPortalOutlet {\n static {\n this.ɵfac = /* @__PURE__ */(() => {\n let ɵPortalHostDirective_BaseFactory;\n return function PortalHostDirective_Factory(t) {\n return (ɵPortalHostDirective_BaseFactory || (ɵPortalHostDirective_BaseFactory = i0.ɵɵgetInheritedFactory(PortalHostDirective)))(t || PortalHostDirective);\n };\n })();\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: PortalHostDirective,\n selectors: [[\"\", \"cdkPortalHost\", \"\"], [\"\", \"portalHost\", \"\"]],\n inputs: {\n portal: [i0.ɵɵInputFlags.None, \"cdkPortalHost\", \"portal\"]\n },\n exportAs: [\"cdkPortalHost\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkPortalOutlet,\n useExisting: PortalHostDirective\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return PortalHostDirective;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet PortalModule = /*#__PURE__*/(() => {\n class PortalModule {\n static {\n this.ɵfac = function PortalModule_Factory(t) {\n return new (t || PortalModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: PortalModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return PortalModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Custom injector to be used when providing custom\n * injection tokens to components inside a portal.\n * @docs-private\n * @deprecated Use `Injector.create` instead.\n * @breaking-change 11.0.0\n */\nclass PortalInjector {\n constructor(_parentInjector, _customTokens) {\n this._parentInjector = _parentInjector;\n this._customTokens = _customTokens;\n }\n get(token, notFoundValue) {\n const value = this._customTokens.get(token);\n if (typeof value !== 'undefined') {\n return value;\n }\n return this._parentInjector.get(token, notFoundValue);\n }\n}\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BasePortalHost, BasePortalOutlet, CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortal, DomPortalHost, DomPortalOutlet, Portal, PortalHostDirective, PortalInjector, PortalModule, TemplatePortal, TemplatePortalDirective };\n","/**\n * @license Angular v17.2.1\n * (c) 2010-2022 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { inject, Injectable, ANIMATION_MODULE_TYPE, ViewEncapsulation, ɵRuntimeError, Inject } from '@angular/core';\n\n/**\n * @description Constants for the categories of parameters that can be defined for animations.\n *\n * A corresponding function defines a set of parameters for each category, and\n * collects them into a corresponding `AnimationMetadata` object.\n *\n * @publicApi\n */\nvar AnimationMetadataType = /*#__PURE__*/function (AnimationMetadataType) {\n /**\n * Associates a named animation state with a set of CSS styles.\n * See [`state()`](api/animations/state)\n */\n AnimationMetadataType[AnimationMetadataType[\"State\"] = 0] = \"State\";\n /**\n * Data for a transition from one animation state to another.\n * See `transition()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Transition\"] = 1] = \"Transition\";\n /**\n * Contains a set of animation steps.\n * See `sequence()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Sequence\"] = 2] = \"Sequence\";\n /**\n * Contains a set of animation steps.\n * See `{@link animations/group group()}`\n */\n AnimationMetadataType[AnimationMetadataType[\"Group\"] = 3] = \"Group\";\n /**\n * Contains an animation step.\n * See `animate()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Animate\"] = 4] = \"Animate\";\n /**\n * Contains a set of animation steps.\n * See `keyframes()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Keyframes\"] = 5] = \"Keyframes\";\n /**\n * Contains a set of CSS property-value pairs into a named style.\n * See `style()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Style\"] = 6] = \"Style\";\n /**\n * Associates an animation with an entry trigger that can be attached to an element.\n * See `trigger()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Trigger\"] = 7] = \"Trigger\";\n /**\n * Contains a re-usable animation.\n * See `animation()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Reference\"] = 8] = \"Reference\";\n /**\n * Contains data to use in executing child animations returned by a query.\n * See `animateChild()`\n */\n AnimationMetadataType[AnimationMetadataType[\"AnimateChild\"] = 9] = \"AnimateChild\";\n /**\n * Contains animation parameters for a re-usable animation.\n * See `useAnimation()`\n */\n AnimationMetadataType[AnimationMetadataType[\"AnimateRef\"] = 10] = \"AnimateRef\";\n /**\n * Contains child-animation query data.\n * See `query()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Query\"] = 11] = \"Query\";\n /**\n * Contains data for staggering an animation sequence.\n * See `stagger()`\n */\n AnimationMetadataType[AnimationMetadataType[\"Stagger\"] = 12] = \"Stagger\";\n return AnimationMetadataType;\n}(AnimationMetadataType || {});\n/**\n * Specifies automatic styling.\n *\n * @publicApi\n */\nconst AUTO_STYLE = '*';\n/**\n * Creates a named animation trigger, containing a list of [`state()`](api/animations/state)\n * and `transition()` entries to be evaluated when the expression\n * bound to the trigger changes.\n *\n * @param name An identifying string.\n * @param definitions An animation definition object, containing an array of\n * [`state()`](api/animations/state) and `transition()` declarations.\n *\n * @return An object that encapsulates the trigger data.\n *\n * @usageNotes\n * Define an animation trigger in the `animations` section of `@Component` metadata.\n * In the template, reference the trigger by name and bind it to a trigger expression that\n * evaluates to a defined animation state, using the following format:\n *\n * `[@triggerName]=\"expression\"`\n *\n * Animation trigger bindings convert all values to strings, and then match the\n * previous and current values against any linked transitions.\n * Booleans can be specified as `1` or `true` and `0` or `false`.\n *\n * ### Usage Example\n *\n * The following example creates an animation trigger reference based on the provided\n * name value.\n * The provided animation value is expected to be an array consisting of state and\n * transition declarations.\n *\n * ```typescript\n * @Component({\n * selector: \"my-component\",\n * templateUrl: \"my-component-tpl.html\",\n * animations: [\n * trigger(\"myAnimationTrigger\", [\n * state(...),\n * state(...),\n * transition(...),\n * transition(...)\n * ])\n * ]\n * })\n * class MyComponent {\n * myStatusExp = \"something\";\n * }\n * ```\n *\n * The template associated with this component makes use of the defined trigger\n * by binding to an element within its template code.\n *\n * ```html\n * \n *
...
\n * ```\n *\n * ### Using an inline function\n * The `transition` animation method also supports reading an inline function which can decide\n * if its associated animation should be run.\n *\n * ```typescript\n * // this method is run each time the `myAnimationTrigger` trigger value changes.\n * function myInlineMatcherFn(fromState: string, toState: string, element: any, params: {[key:\n string]: any}): boolean {\n * // notice that `element` and `params` are also available here\n * return toState == 'yes-please-animate';\n * }\n *\n * @Component({\n * selector: 'my-component',\n * templateUrl: 'my-component-tpl.html',\n * animations: [\n * trigger('myAnimationTrigger', [\n * transition(myInlineMatcherFn, [\n * // the animation sequence code\n * ]),\n * ])\n * ]\n * })\n * class MyComponent {\n * myStatusExp = \"yes-please-animate\";\n * }\n * ```\n *\n * ### Disabling Animations\n * When true, the special animation control binding `@.disabled` binding prevents\n * all animations from rendering.\n * Place the `@.disabled` binding on an element to disable\n * animations on the element itself, as well as any inner animation triggers\n * within the element.\n *\n * The following example shows how to use this feature:\n *\n * ```typescript\n * @Component({\n * selector: 'my-component',\n * template: `\n *
\n *
\n *
\n * `,\n * animations: [\n * trigger(\"childAnimation\", [\n * // ...\n * ])\n * ]\n * })\n * class MyComponent {\n * isDisabled = true;\n * exp = '...';\n * }\n * ```\n *\n * When `@.disabled` is true, it prevents the `@childAnimation` trigger from animating,\n * along with any inner animations.\n *\n * ### Disable animations application-wide\n * When an area of the template is set to have animations disabled,\n * **all** inner components have their animations disabled as well.\n * This means that you can disable all animations for an app\n * by placing a host binding set on `@.disabled` on the topmost Angular component.\n *\n * ```typescript\n * import {Component, HostBinding} from '@angular/core';\n *\n * @Component({\n * selector: 'app-component',\n * templateUrl: 'app.component.html',\n * })\n * class AppComponent {\n * @HostBinding('@.disabled')\n * public animationsDisabled = true;\n * }\n * ```\n *\n * ### Overriding disablement of inner animations\n * Despite inner animations being disabled, a parent animation can `query()`\n * for inner elements located in disabled areas of the template and still animate\n * them if needed. This is also the case for when a sub animation is\n * queried by a parent and then later animated using `animateChild()`.\n *\n * ### Detecting when an animation is disabled\n * If a region of the DOM (or the entire application) has its animations disabled, the animation\n * trigger callbacks still fire, but for zero seconds. When the callback fires, it provides\n * an instance of an `AnimationEvent`. If animations are disabled,\n * the `.disabled` flag on the event is true.\n *\n * @publicApi\n */\nfunction trigger(name, definitions) {\n return {\n type: AnimationMetadataType.Trigger,\n name,\n definitions,\n options: {}\n };\n}\n/**\n * Defines an animation step that combines styling information with timing information.\n *\n * @param timings Sets `AnimateTimings` for the parent animation.\n * A string in the format \"duration [delay] [easing]\".\n * - Duration and delay are expressed as a number and optional time unit,\n * such as \"1s\" or \"10ms\" for one second and 10 milliseconds, respectively.\n * The default unit is milliseconds.\n * - The easing value controls how the animation accelerates and decelerates\n * during its runtime. Value is one of `ease`, `ease-in`, `ease-out`,\n * `ease-in-out`, or a `cubic-bezier()` function call.\n * If not supplied, no easing is applied.\n *\n * For example, the string \"1s 100ms ease-out\" specifies a duration of\n * 1000 milliseconds, and delay of 100 ms, and the \"ease-out\" easing style,\n * which decelerates near the end of the duration.\n * @param styles Sets AnimationStyles for the parent animation.\n * A function call to either `style()` or `keyframes()`\n * that returns a collection of CSS style entries to be applied to the parent animation.\n * When null, uses the styles from the destination state.\n * This is useful when describing an animation step that will complete an animation;\n * see \"Animating to the final state\" in `transitions()`.\n * @returns An object that encapsulates the animation step.\n *\n * @usageNotes\n * Call within an animation `sequence()`, `{@link animations/group group()}`, or\n * `transition()` call to specify an animation step\n * that applies given style data to the parent animation for a given amount of time.\n *\n * ### Syntax Examples\n * **Timing examples**\n *\n * The following examples show various `timings` specifications.\n * - `animate(500)` : Duration is 500 milliseconds.\n * - `animate(\"1s\")` : Duration is 1000 milliseconds.\n * - `animate(\"100ms 0.5s\")` : Duration is 100 milliseconds, delay is 500 milliseconds.\n * - `animate(\"5s ease-in\")` : Duration is 5000 milliseconds, easing in.\n * - `animate(\"5s 10ms cubic-bezier(.17,.67,.88,.1)\")` : Duration is 5000 milliseconds, delay is 10\n * milliseconds, easing according to a bezier curve.\n *\n * **Style examples**\n *\n * The following example calls `style()` to set a single CSS style.\n * ```typescript\n * animate(500, style({ background: \"red\" }))\n * ```\n * The following example calls `keyframes()` to set a CSS style\n * to different values for successive keyframes.\n * ```typescript\n * animate(500, keyframes(\n * [\n * style({ background: \"blue\" }),\n * style({ background: \"red\" })\n * ])\n * ```\n *\n * @publicApi\n */\nfunction animate(timings, styles = null) {\n return {\n type: AnimationMetadataType.Animate,\n styles,\n timings\n };\n}\n/**\n * @description Defines a list of animation steps to be run in parallel.\n *\n * @param steps An array of animation step objects.\n * - When steps are defined by `style()` or `animate()`\n * function calls, each call within the group is executed instantly.\n * - To specify offset styles to be applied at a later time, define steps with\n * `keyframes()`, or use `animate()` calls with a delay value.\n * For example:\n *\n * ```typescript\n * group([\n * animate(\"1s\", style({ background: \"black\" })),\n * animate(\"2s\", style({ color: \"white\" }))\n * ])\n * ```\n *\n * @param options An options object containing a delay and\n * developer-defined parameters that provide styling defaults and\n * can be overridden on invocation.\n *\n * @return An object that encapsulates the group data.\n *\n * @usageNotes\n * Grouped animations are useful when a series of styles must be\n * animated at different starting times and closed off at different ending times.\n *\n * When called within a `sequence()` or a\n * `transition()` call, does not continue to the next\n * instruction until all of the inner animation steps have completed.\n *\n * @publicApi\n */\nfunction group(steps, options = null) {\n return {\n type: AnimationMetadataType.Group,\n steps,\n options\n };\n}\n/**\n * Defines a list of animation steps to be run sequentially, one by one.\n *\n * @param steps An array of animation step objects.\n * - Steps defined by `style()` calls apply the styling data immediately.\n * - Steps defined by `animate()` calls apply the styling data over time\n * as specified by the timing data.\n *\n * ```typescript\n * sequence([\n * style({ opacity: 0 }),\n * animate(\"1s\", style({ opacity: 1 }))\n * ])\n * ```\n *\n * @param options An options object containing a delay and\n * developer-defined parameters that provide styling defaults and\n * can be overridden on invocation.\n *\n * @return An object that encapsulates the sequence data.\n *\n * @usageNotes\n * When you pass an array of steps to a\n * `transition()` call, the steps run sequentially by default.\n * Compare this to the `{@link animations/group group()}` call, which runs animation steps in\n *parallel.\n *\n * When a sequence is used within a `{@link animations/group group()}` or a `transition()` call,\n * execution continues to the next instruction only after each of the inner animation\n * steps have completed.\n *\n * @publicApi\n **/\nfunction sequence(steps, options = null) {\n return {\n type: AnimationMetadataType.Sequence,\n steps,\n options\n };\n}\n/**\n * Declares a key/value object containing CSS properties/styles that\n * can then be used for an animation [`state`](api/animations/state), within an animation\n *`sequence`, or as styling data for calls to `animate()` and `keyframes()`.\n *\n * @param tokens A set of CSS styles or HTML styles associated with an animation state.\n * The value can be any of the following:\n * - A key-value style pair associating a CSS property with a value.\n * - An array of key-value style pairs.\n * - An asterisk (*), to use auto-styling, where styles are derived from the element\n * being animated and applied to the animation when it starts.\n *\n * Auto-styling can be used to define a state that depends on layout or other\n * environmental factors.\n *\n * @return An object that encapsulates the style data.\n *\n * @usageNotes\n * The following examples create animation styles that collect a set of\n * CSS property values:\n *\n * ```typescript\n * // string values for CSS properties\n * style({ background: \"red\", color: \"blue\" })\n *\n * // numerical pixel values\n * style({ width: 100, height: 0 })\n * ```\n *\n * The following example uses auto-styling to allow an element to animate from\n * a height of 0 up to its full height:\n *\n * ```\n * style({ height: 0 }),\n * animate(\"1s\", style({ height: \"*\" }))\n * ```\n *\n * @publicApi\n **/\nfunction style(tokens) {\n return {\n type: AnimationMetadataType.Style,\n styles: tokens,\n offset: null\n };\n}\n/**\n * Declares an animation state within a trigger attached to an element.\n *\n * @param name One or more names for the defined state in a comma-separated string.\n * The following reserved state names can be supplied to define a style for specific use\n * cases:\n *\n * - `void` You can associate styles with this name to be used when\n * the element is detached from the application. For example, when an `ngIf` evaluates\n * to false, the state of the associated element is void.\n * - `*` (asterisk) Indicates the default state. You can associate styles with this name\n * to be used as the fallback when the state that is being animated is not declared\n * within the trigger.\n *\n * @param styles A set of CSS styles associated with this state, created using the\n * `style()` function.\n * This set of styles persists on the element once the state has been reached.\n * @param options Parameters that can be passed to the state when it is invoked.\n * 0 or more key-value pairs.\n * @return An object that encapsulates the new state data.\n *\n * @usageNotes\n * Use the `trigger()` function to register states to an animation trigger.\n * Use the `transition()` function to animate between states.\n * When a state is active within a component, its associated styles persist on the element,\n * even when the animation ends.\n *\n * @publicApi\n **/\nfunction state(name, styles, options) {\n return {\n type: AnimationMetadataType.State,\n name,\n styles,\n options\n };\n}\n/**\n * Defines a set of animation styles, associating each style with an optional `offset` value.\n *\n * @param steps A set of animation styles with optional offset data.\n * The optional `offset` value for a style specifies a percentage of the total animation\n * time at which that style is applied.\n * @returns An object that encapsulates the keyframes data.\n *\n * @usageNotes\n * Use with the `animate()` call. Instead of applying animations\n * from the current state\n * to the destination state, keyframes describe how each style entry is applied and at what point\n * within the animation arc.\n * Compare [CSS Keyframe Animations](https://www.w3schools.com/css/css3_animations.asp).\n *\n * ### Usage\n *\n * In the following example, the offset values describe\n * when each `backgroundColor` value is applied. The color is red at the start, and changes to\n * blue when 20% of the total time has elapsed.\n *\n * ```typescript\n * // the provided offset values\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\", offset: 0 }),\n * style({ backgroundColor: \"blue\", offset: 0.2 }),\n * style({ backgroundColor: \"orange\", offset: 0.3 }),\n * style({ backgroundColor: \"black\", offset: 1 })\n * ]))\n * ```\n *\n * If there are no `offset` values specified in the style entries, the offsets\n * are calculated automatically.\n *\n * ```typescript\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\" }) // offset = 0\n * style({ backgroundColor: \"blue\" }) // offset = 0.33\n * style({ backgroundColor: \"orange\" }) // offset = 0.66\n * style({ backgroundColor: \"black\" }) // offset = 1\n * ]))\n *```\n\n * @publicApi\n */\nfunction keyframes(steps) {\n return {\n type: AnimationMetadataType.Keyframes,\n steps\n };\n}\n/**\n * Declares an animation transition which is played when a certain specified condition is met.\n *\n * @param stateChangeExpr A string with a specific format or a function that specifies when the\n * animation transition should occur (see [State Change Expression](#state-change-expression)).\n *\n * @param steps One or more animation objects that represent the animation's instructions.\n *\n * @param options An options object that can be used to specify a delay for the animation or provide\n * custom parameters for it.\n *\n * @returns An object that encapsulates the transition data.\n *\n * @usageNotes\n *\n * ### State Change Expression\n *\n * The State Change Expression instructs Angular when to run the transition's animations, it can\n *either be\n * - a string with a specific syntax\n * - or a function that compares the previous and current state (value of the expression bound to\n * the element's trigger) and returns `true` if the transition should occur or `false` otherwise\n *\n * The string format can be:\n * - `fromState => toState`, which indicates that the transition's animations should occur then the\n * expression bound to the trigger's element goes from `fromState` to `toState`\n *\n * _Example:_\n * ```typescript\n * transition('open => closed', animate('.5s ease-out', style({ height: 0 }) ))\n * ```\n *\n * - `fromState <=> toState`, which indicates that the transition's animations should occur then\n * the expression bound to the trigger's element goes from `fromState` to `toState` or vice versa\n *\n * _Example:_\n * ```typescript\n * transition('enabled <=> disabled', animate('1s cubic-bezier(0.8,0.3,0,1)'))\n * ```\n *\n * - `:enter`/`:leave`, which indicates that the transition's animations should occur when the\n * element enters or exists the DOM\n *\n * _Example:_\n * ```typescript\n * transition(':enter', [\n * style({ opacity: 0 }),\n * animate('500ms', style({ opacity: 1 }))\n * ])\n * ```\n *\n * - `:increment`/`:decrement`, which indicates that the transition's animations should occur when\n * the numerical expression bound to the trigger's element has increased in value or decreased\n *\n * _Example:_\n * ```typescript\n * transition(':increment', query('@counter', animateChild()))\n * ```\n *\n * - a sequence of any of the above divided by commas, which indicates that transition's animations\n * should occur whenever one of the state change expressions matches\n *\n * _Example:_\n * ```typescript\n * transition(':increment, * => enabled, :enter', animate('1s ease', keyframes([\n * style({ transform: 'scale(1)', offset: 0}),\n * style({ transform: 'scale(1.1)', offset: 0.7}),\n * style({ transform: 'scale(1)', offset: 1})\n * ]))),\n * ```\n *\n * Also note that in such context:\n * - `void` can be used to indicate the absence of the element\n * - asterisks can be used as wildcards that match any state\n * - (as a consequence of the above, `void => *` is equivalent to `:enter` and `* => void` is\n * equivalent to `:leave`)\n * - `true` and `false` also match expression values of `1` and `0` respectively (but do not match\n * _truthy_ and _falsy_ values)\n *\n *
\n *\n * Be careful about entering end leaving elements as their transitions present a common\n * pitfall for developers.\n *\n * Note that when an element with a trigger enters the DOM its `:enter` transition always\n * gets executed, but its `:leave` transition will not be executed if the element is removed\n * alongside its parent (as it will be removed \"without warning\" before its transition has\n * a chance to be executed, the only way that such transition can occur is if the element\n * is exiting the DOM on its own).\n *\n *\n *
\n *\n * ### Animating to a Final State\n *\n * If the final step in a transition is a call to `animate()` that uses a timing value\n * with no `style` data, that step is automatically considered the final animation arc,\n * for the element to reach the final state, in such case Angular automatically adds or removes\n * CSS styles to ensure that the element is in the correct final state.\n *\n *\n * ### Usage Examples\n *\n * - Transition animations applied based on\n * the trigger's expression value\n *\n * ```HTML\n *
\n * ...\n *
\n * ```\n *\n * ```typescript\n * trigger(\"myAnimationTrigger\", [\n * ..., // states\n * transition(\"on => off, open => closed\", animate(500)),\n * transition(\"* <=> error\", query('.indicator', animateChild()))\n * ])\n * ```\n *\n * - Transition animations applied based on custom logic dependent\n * on the trigger's expression value and provided parameters\n *\n * ```HTML\n *
\n * ...\n *
\n * ```\n *\n * ```typescript\n * trigger(\"myAnimationTrigger\", [\n * ..., // states\n * transition(\n * (fromState, toState, _element, params) =>\n * ['firststep', 'laststep'].includes(fromState.toLowerCase())\n * && toState === params?.['target'],\n * animate('1s')\n * )\n * ])\n * ```\n *\n * @publicApi\n **/\nfunction transition(stateChangeExpr, steps, options = null) {\n return {\n type: AnimationMetadataType.Transition,\n expr: stateChangeExpr,\n animation: steps,\n options\n };\n}\n/**\n * Produces a reusable animation that can be invoked in another animation or sequence,\n * by calling the `useAnimation()` function.\n *\n * @param steps One or more animation objects, as returned by the `animate()`\n * or `sequence()` function, that form a transformation from one state to another.\n * A sequence is used by default when you pass an array.\n * @param options An options object that can contain a delay value for the start of the\n * animation, and additional developer-defined parameters.\n * Provided values for additional parameters are used as defaults,\n * and override values can be passed to the caller on invocation.\n * @returns An object that encapsulates the animation data.\n *\n * @usageNotes\n * The following example defines a reusable animation, providing some default parameter\n * values.\n *\n * ```typescript\n * var fadeAnimation = animation([\n * style({ opacity: '{{ start }}' }),\n * animate('{{ time }}',\n * style({ opacity: '{{ end }}'}))\n * ],\n * { params: { time: '1000ms', start: 0, end: 1 }});\n * ```\n *\n * The following invokes the defined animation with a call to `useAnimation()`,\n * passing in override parameter values.\n *\n * ```js\n * useAnimation(fadeAnimation, {\n * params: {\n * time: '2s',\n * start: 1,\n * end: 0\n * }\n * })\n * ```\n *\n * If any of the passed-in parameter values are missing from this call,\n * the default values are used. If one or more parameter values are missing before a step is\n * animated, `useAnimation()` throws an error.\n *\n * @publicApi\n */\nfunction animation(steps, options = null) {\n return {\n type: AnimationMetadataType.Reference,\n animation: steps,\n options\n };\n}\n/**\n * Executes a queried inner animation element within an animation sequence.\n *\n * @param options An options object that can contain a delay value for the start of the\n * animation, and additional override values for developer-defined parameters.\n * @return An object that encapsulates the child animation data.\n *\n * @usageNotes\n * Each time an animation is triggered in Angular, the parent animation\n * has priority and any child animations are blocked. In order\n * for a child animation to run, the parent animation must query each of the elements\n * containing child animations, and run them using this function.\n *\n * Note that this feature is designed to be used with `query()` and it will only work\n * with animations that are assigned using the Angular animation library. CSS keyframes\n * and transitions are not handled by this API.\n *\n * @publicApi\n */\nfunction animateChild(options = null) {\n return {\n type: AnimationMetadataType.AnimateChild,\n options\n };\n}\n/**\n * Starts a reusable animation that is created using the `animation()` function.\n *\n * @param animation The reusable animation to start.\n * @param options An options object that can contain a delay value for the start of\n * the animation, and additional override values for developer-defined parameters.\n * @return An object that contains the animation parameters.\n *\n * @publicApi\n */\nfunction useAnimation(animation, options = null) {\n return {\n type: AnimationMetadataType.AnimateRef,\n animation,\n options\n };\n}\n/**\n * Finds one or more inner elements within the current element that is\n * being animated within a sequence. Use with `animate()`.\n *\n * @param selector The element to query, or a set of elements that contain Angular-specific\n * characteristics, specified with one or more of the following tokens.\n * - `query(\":enter\")` or `query(\":leave\")` : Query for newly inserted/removed elements (not\n * all elements can be queried via these tokens, see\n * [Entering and Leaving Elements](#entering-and-leaving-elements))\n * - `query(\":animating\")` : Query all currently animating elements.\n * - `query(\"@triggerName\")` : Query elements that contain an animation trigger.\n * - `query(\"@*\")` : Query all elements that contain an animation triggers.\n * - `query(\":self\")` : Include the current element into the animation sequence.\n *\n * @param animation One or more animation steps to apply to the queried element or elements.\n * An array is treated as an animation sequence.\n * @param options An options object. Use the 'limit' field to limit the total number of\n * items to collect.\n * @return An object that encapsulates the query data.\n *\n * @usageNotes\n *\n * ### Multiple Tokens\n *\n * Tokens can be merged into a combined query selector string. For example:\n *\n * ```typescript\n * query(':self, .record:enter, .record:leave, @subTrigger', [...])\n * ```\n *\n * The `query()` function collects multiple elements and works internally by using\n * `element.querySelectorAll`. Use the `limit` field of an options object to limit\n * the total number of items to be collected. For example:\n *\n * ```js\n * query('div', [\n * animate(...),\n * animate(...)\n * ], { limit: 1 })\n * ```\n *\n * By default, throws an error when zero items are found. Set the\n * `optional` flag to ignore this error. For example:\n *\n * ```js\n * query('.some-element-that-may-not-be-there', [\n * animate(...),\n * animate(...)\n * ], { optional: true })\n * ```\n *\n * ### Entering and Leaving Elements\n *\n * Not all elements can be queried via the `:enter` and `:leave` tokens, the only ones\n * that can are those that Angular assumes can enter/leave based on their own logic\n * (if their insertion/removal is simply a consequence of that of their parent they\n * should be queried via a different token in their parent's `:enter`/`:leave` transitions).\n *\n * The only elements Angular assumes can enter/leave based on their own logic (thus the only\n * ones that can be queried via the `:enter` and `:leave` tokens) are:\n * - Those inserted dynamically (via `ViewContainerRef`)\n * - Those that have a structural directive (which, under the hood, are a subset of the above ones)\n *\n *
\n *\n * Note that elements will be successfully queried via `:enter`/`:leave` even if their\n * insertion/removal is not done manually via `ViewContainerRef`or caused by their structural\n * directive (e.g. they enter/exit alongside their parent).\n *\n *
\n *\n *
\n *\n * There is an exception to what previously mentioned, besides elements entering/leaving based on\n * their own logic, elements with an animation trigger can always be queried via `:leave` when\n * their parent is also leaving.\n *\n *
\n *\n * ### Usage Example\n *\n * The following example queries for inner elements and animates them\n * individually using `animate()`.\n *\n * ```typescript\n * @Component({\n * selector: 'inner',\n * template: `\n *
\n *

Title

\n *
\n * Blah blah blah\n *
\n *
\n * `,\n * animations: [\n * trigger('queryAnimation', [\n * transition('* => goAnimate', [\n * // hide the inner elements\n * query('h1', style({ opacity: 0 })),\n * query('.content', style({ opacity: 0 })),\n *\n * // animate the inner elements in, one by one\n * query('h1', animate(1000, style({ opacity: 1 }))),\n * query('.content', animate(1000, style({ opacity: 1 }))),\n * ])\n * ])\n * ]\n * })\n * class Cmp {\n * exp = '';\n *\n * goAnimate() {\n * this.exp = 'goAnimate';\n * }\n * }\n * ```\n *\n * @publicApi\n */\nfunction query(selector, animation, options = null) {\n return {\n type: AnimationMetadataType.Query,\n selector,\n animation,\n options\n };\n}\n/**\n * Use within an animation `query()` call to issue a timing gap after\n * each queried item is animated.\n *\n * @param timings A delay value.\n * @param animation One ore more animation steps.\n * @returns An object that encapsulates the stagger data.\n *\n * @usageNotes\n * In the following example, a container element wraps a list of items stamped out\n * by an `ngFor`. The container element contains an animation trigger that will later be set\n * to query for each of the inner items.\n *\n * Each time items are added, the opacity fade-in animation runs,\n * and each removed item is faded out.\n * When either of these animations occur, the stagger effect is\n * applied after each item's animation is started.\n *\n * ```html\n * \n * \n *
\n *
\n *
\n * {{ item }}\n *
\n *
\n * ```\n *\n * Here is the component code:\n *\n * ```typescript\n * import {trigger, transition, style, animate, query, stagger} from '@angular/animations';\n * @Component({\n * templateUrl: 'list.component.html',\n * animations: [\n * trigger('listAnimation', [\n * ...\n * ])\n * ]\n * })\n * class ListComponent {\n * items = [];\n *\n * showItems() {\n * this.items = [0,1,2,3,4];\n * }\n *\n * hideItems() {\n * this.items = [];\n * }\n *\n * toggle() {\n * this.items.length ? this.hideItems() : this.showItems();\n * }\n * }\n * ```\n *\n * Here is the animation trigger code:\n *\n * ```typescript\n * trigger('listAnimation', [\n * transition('* => *', [ // each time the binding value changes\n * query(':leave', [\n * stagger(100, [\n * animate('0.5s', style({ opacity: 0 }))\n * ])\n * ]),\n * query(':enter', [\n * style({ opacity: 0 }),\n * stagger(100, [\n * animate('0.5s', style({ opacity: 1 }))\n * ])\n * ])\n * ])\n * ])\n * ```\n *\n * @publicApi\n */\nfunction stagger(timings, animation) {\n return {\n type: AnimationMetadataType.Stagger,\n timings,\n animation\n };\n}\n\n/**\n * An injectable service that produces an animation sequence programmatically within an\n * Angular component or directive.\n * Provided by the `BrowserAnimationsModule` or `NoopAnimationsModule`.\n *\n * @usageNotes\n *\n * To use this service, add it to your component or directive as a dependency.\n * The service is instantiated along with your component.\n *\n * Apps do not typically need to create their own animation players, but if you\n * do need to, follow these steps:\n *\n * 1. Use the [AnimationBuilder.build](api/animations/AnimationBuilder#build)() method\n * to create a programmatic animation. The method returns an `AnimationFactory` instance.\n *\n * 2. Use the factory object to create an `AnimationPlayer` and attach it to a DOM element.\n *\n * 3. Use the player object to control the animation programmatically.\n *\n * For example:\n *\n * ```ts\n * // import the service from BrowserAnimationsModule\n * import {AnimationBuilder} from '@angular/animations';\n * // require the service as a dependency\n * class MyCmp {\n * constructor(private _builder: AnimationBuilder) {}\n *\n * makeAnimation(element: any) {\n * // first define a reusable animation\n * const myAnimation = this._builder.build([\n * style({ width: 0 }),\n * animate(1000, style({ width: '100px' }))\n * ]);\n *\n * // use the returned factory object to create a player\n * const player = myAnimation.create(element);\n *\n * player.play();\n * }\n * }\n * ```\n *\n * @publicApi\n */\nlet AnimationBuilder = /*#__PURE__*/(() => {\n class AnimationBuilder {\n static {\n this.ɵfac = function AnimationBuilder_Factory(t) {\n return new (t || AnimationBuilder)();\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: AnimationBuilder,\n factory: () => (() => inject(BrowserAnimationBuilder))(),\n providedIn: 'root'\n });\n }\n }\n return AnimationBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * A factory object returned from the\n * [AnimationBuilder.build](api/animations/AnimationBuilder#build)()\n * method.\n *\n * @publicApi\n */\nclass AnimationFactory {}\nlet BrowserAnimationBuilder = /*#__PURE__*/(() => {\n class BrowserAnimationBuilder extends AnimationBuilder {\n constructor(rootRenderer, doc) {\n super();\n this.animationModuleType = inject(ANIMATION_MODULE_TYPE, {\n optional: true\n });\n this._nextAnimationId = 0;\n const typeData = {\n id: '0',\n encapsulation: ViewEncapsulation.None,\n styles: [],\n data: {\n animation: []\n }\n };\n this._renderer = rootRenderer.createRenderer(doc.body, typeData);\n if (this.animationModuleType === null && !isAnimationRenderer(this._renderer)) {\n // We only support AnimationRenderer & DynamicDelegationRenderer for this AnimationBuilder\n throw new ɵRuntimeError(3600 /* RuntimeErrorCode.BROWSER_ANIMATION_BUILDER_INJECTED_WITHOUT_ANIMATIONS */, (typeof ngDevMode === 'undefined' || ngDevMode) && 'Angular detected that the `AnimationBuilder` was injected, but animation support was not enabled. ' + 'Please make sure that you enable animations in your application by calling `provideAnimations()` or `provideAnimationsAsync()` function.');\n }\n }\n build(animation) {\n const id = this._nextAnimationId;\n this._nextAnimationId++;\n const entry = Array.isArray(animation) ? sequence(animation) : animation;\n issueAnimationCommand(this._renderer, null, id, 'register', [entry]);\n return new BrowserAnimationFactory(id, this._renderer);\n }\n static {\n this.ɵfac = function BrowserAnimationBuilder_Factory(t) {\n return new (t || BrowserAnimationBuilder)(i0.ɵɵinject(i0.RendererFactory2), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: BrowserAnimationBuilder,\n factory: BrowserAnimationBuilder.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return BrowserAnimationBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nclass BrowserAnimationFactory extends AnimationFactory {\n constructor(_id, _renderer) {\n super();\n this._id = _id;\n this._renderer = _renderer;\n }\n create(element, options) {\n return new RendererAnimationPlayer(this._id, element, options || {}, this._renderer);\n }\n}\nclass RendererAnimationPlayer {\n constructor(id, element, options, _renderer) {\n this.id = id;\n this.element = element;\n this._renderer = _renderer;\n this.parentPlayer = null;\n this._started = false;\n this.totalTime = 0;\n this._command('create', options);\n }\n _listen(eventName, callback) {\n return this._renderer.listen(this.element, `@@${this.id}:${eventName}`, callback);\n }\n _command(command, ...args) {\n issueAnimationCommand(this._renderer, this.element, this.id, command, args);\n }\n onDone(fn) {\n this._listen('done', fn);\n }\n onStart(fn) {\n this._listen('start', fn);\n }\n onDestroy(fn) {\n this._listen('destroy', fn);\n }\n init() {\n this._command('init');\n }\n hasStarted() {\n return this._started;\n }\n play() {\n this._command('play');\n this._started = true;\n }\n pause() {\n this._command('pause');\n }\n restart() {\n this._command('restart');\n }\n finish() {\n this._command('finish');\n }\n destroy() {\n this._command('destroy');\n }\n reset() {\n this._command('reset');\n this._started = false;\n }\n setPosition(p) {\n this._command('setPosition', p);\n }\n getPosition() {\n return unwrapAnimationRenderer(this._renderer)?.engine?.players[this.id]?.getPosition() ?? 0;\n }\n}\nfunction issueAnimationCommand(renderer, element, id, command, args) {\n renderer.setProperty(element, `@@${id}:${command}`, args);\n}\n/**\n * The following 2 methods cannot reference their correct types (AnimationRenderer &\n * DynamicDelegationRenderer) since this would introduce a import cycle.\n */\nfunction unwrapAnimationRenderer(renderer) {\n const type = renderer.ɵtype;\n if (type === 0 /* AnimationRendererType.Regular */) {\n return renderer;\n } else if (type === 1 /* AnimationRendererType.Delegated */) {\n return renderer.animationRenderer;\n }\n return null;\n}\nfunction isAnimationRenderer(renderer) {\n const type = renderer.ɵtype;\n return type === 0 /* AnimationRendererType.Regular */ || type === 1 /* AnimationRendererType.Delegated */;\n}\n\n/**\n * An empty programmatic controller for reusable animations.\n * Used internally when animations are disabled, to avoid\n * checking for the null case when an animation player is expected.\n *\n * @see {@link animate}\n * @see {@link AnimationPlayer}\n * @see {@link ɵAnimationGroupPlayer AnimationGroupPlayer}\n *\n * @publicApi\n */\nclass NoopAnimationPlayer {\n constructor(duration = 0, delay = 0) {\n this._onDoneFns = [];\n this._onStartFns = [];\n this._onDestroyFns = [];\n this._originalOnDoneFns = [];\n this._originalOnStartFns = [];\n this._started = false;\n this._destroyed = false;\n this._finished = false;\n this._position = 0;\n this.parentPlayer = null;\n this.totalTime = duration + delay;\n }\n _onFinish() {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(fn => fn());\n this._onDoneFns = [];\n }\n }\n onStart(fn) {\n this._originalOnStartFns.push(fn);\n this._onStartFns.push(fn);\n }\n onDone(fn) {\n this._originalOnDoneFns.push(fn);\n this._onDoneFns.push(fn);\n }\n onDestroy(fn) {\n this._onDestroyFns.push(fn);\n }\n hasStarted() {\n return this._started;\n }\n init() {}\n play() {\n if (!this.hasStarted()) {\n this._onStart();\n this.triggerMicrotask();\n }\n this._started = true;\n }\n /** @internal */\n triggerMicrotask() {\n queueMicrotask(() => this._onFinish());\n }\n _onStart() {\n this._onStartFns.forEach(fn => fn());\n this._onStartFns = [];\n }\n pause() {}\n restart() {}\n finish() {\n this._onFinish();\n }\n destroy() {\n if (!this._destroyed) {\n this._destroyed = true;\n if (!this.hasStarted()) {\n this._onStart();\n }\n this.finish();\n this._onDestroyFns.forEach(fn => fn());\n this._onDestroyFns = [];\n }\n }\n reset() {\n this._started = false;\n this._finished = false;\n this._onStartFns = this._originalOnStartFns;\n this._onDoneFns = this._originalOnDoneFns;\n }\n setPosition(position) {\n this._position = this.totalTime ? position * this.totalTime : 1;\n }\n getPosition() {\n return this.totalTime ? this._position / this.totalTime : 1;\n }\n /** @internal */\n triggerCallback(phaseName) {\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach(fn => fn());\n methods.length = 0;\n }\n}\n\n/**\n * A programmatic controller for a group of reusable animations.\n * Used internally to control animations.\n *\n * @see {@link AnimationPlayer}\n * @see {@link animations/group group}\n *\n */\nclass AnimationGroupPlayer {\n constructor(_players) {\n this._onDoneFns = [];\n this._onStartFns = [];\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this._onDestroyFns = [];\n this.parentPlayer = null;\n this.totalTime = 0;\n this.players = _players;\n let doneCount = 0;\n let destroyCount = 0;\n let startCount = 0;\n const total = this.players.length;\n if (total == 0) {\n queueMicrotask(() => this._onFinish());\n } else {\n this.players.forEach(player => {\n player.onDone(() => {\n if (++doneCount == total) {\n this._onFinish();\n }\n });\n player.onDestroy(() => {\n if (++destroyCount == total) {\n this._onDestroy();\n }\n });\n player.onStart(() => {\n if (++startCount == total) {\n this._onStart();\n }\n });\n });\n }\n this.totalTime = this.players.reduce((time, player) => Math.max(time, player.totalTime), 0);\n }\n _onFinish() {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(fn => fn());\n this._onDoneFns = [];\n }\n }\n init() {\n this.players.forEach(player => player.init());\n }\n onStart(fn) {\n this._onStartFns.push(fn);\n }\n _onStart() {\n if (!this.hasStarted()) {\n this._started = true;\n this._onStartFns.forEach(fn => fn());\n this._onStartFns = [];\n }\n }\n onDone(fn) {\n this._onDoneFns.push(fn);\n }\n onDestroy(fn) {\n this._onDestroyFns.push(fn);\n }\n hasStarted() {\n return this._started;\n }\n play() {\n if (!this.parentPlayer) {\n this.init();\n }\n this._onStart();\n this.players.forEach(player => player.play());\n }\n pause() {\n this.players.forEach(player => player.pause());\n }\n restart() {\n this.players.forEach(player => player.restart());\n }\n finish() {\n this._onFinish();\n this.players.forEach(player => player.finish());\n }\n destroy() {\n this._onDestroy();\n }\n _onDestroy() {\n if (!this._destroyed) {\n this._destroyed = true;\n this._onFinish();\n this.players.forEach(player => player.destroy());\n this._onDestroyFns.forEach(fn => fn());\n this._onDestroyFns = [];\n }\n }\n reset() {\n this.players.forEach(player => player.reset());\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n }\n setPosition(p) {\n const timeAtPosition = p * this.totalTime;\n this.players.forEach(player => {\n const position = player.totalTime ? Math.min(1, timeAtPosition / player.totalTime) : 1;\n player.setPosition(position);\n });\n }\n getPosition() {\n const longestPlayer = this.players.reduce((longestSoFar, player) => {\n const newPlayerIsLongest = longestSoFar === null || player.totalTime > longestSoFar.totalTime;\n return newPlayerIsLongest ? player : longestSoFar;\n }, null);\n return longestPlayer != null ? longestPlayer.getPosition() : 0;\n }\n beforeDestroy() {\n this.players.forEach(player => {\n if (player.beforeDestroy) {\n player.beforeDestroy();\n }\n });\n }\n /** @internal */\n triggerCallback(phaseName) {\n const methods = phaseName == 'start' ? this._onStartFns : this._onDoneFns;\n methods.forEach(fn => fn());\n methods.length = 0;\n }\n}\nconst ɵPRE_STYLE = '!';\n\n/**\n * @module\n * @description\n * Entry point for all animation APIs of the animation package.\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of this package.\n */\n\n// This file is not used to build this module. It is only used during editing\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AUTO_STYLE, AnimationBuilder, AnimationFactory, AnimationMetadataType, NoopAnimationPlayer, animate, animateChild, animation, group, keyframes, query, sequence, stagger, state, style, transition, trigger, useAnimation, AnimationGroupPlayer as ɵAnimationGroupPlayer, BrowserAnimationBuilder as ɵBrowserAnimationBuilder, ɵPRE_STYLE };\n","import { coerceNumberProperty, coerceElement } from '@angular/cdk/coercion';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, forwardRef, Directive, Input, Injectable, Optional, Inject, inject, booleanAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy, Output, ViewChild, SkipSelf, ElementRef, NgModule } from '@angular/core';\nimport { Subject, of, Observable, fromEvent, animationFrameScheduler, asapScheduler, Subscription, isObservable } from 'rxjs';\nimport { distinctUntilChanged, auditTime, filter, takeUntil, startWith, pairwise, switchMap, shareReplay } from 'rxjs/operators';\nimport * as i1 from '@angular/cdk/platform';\nimport { getRtlScrollAxisType, RtlScrollAxisType, supportsScrollBehavior, Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport * as i2 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport * as i2$1 from '@angular/cdk/collections';\nimport { isDataSource, ArrayDataSource, _VIEW_REPEATER_STRATEGY, _RecycleViewRepeaterStrategy } from '@angular/cdk/collections';\n\n/** The injection token used to specify the virtual scrolling strategy. */\nconst _c0 = [\"contentWrapper\"];\nconst _c1 = [\"*\"];\nconst VIRTUAL_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLL_STRATEGY');\n\n/** Virtual scrolling strategy for lists with items of known fixed size. */\nclass FixedSizeVirtualScrollStrategy {\n /**\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n constructor(itemSize, minBufferPx, maxBufferPx) {\n this._scrolledIndexChange = new Subject();\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n this.scrolledIndexChange = this._scrolledIndexChange.pipe(distinctUntilChanged());\n /** The attached viewport. */\n this._viewport = null;\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n }\n /**\n * Attaches this scroll strategy to a viewport.\n * @param viewport The viewport to attach this strategy to.\n */\n attach(viewport) {\n this._viewport = viewport;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** Detaches this scroll strategy from the currently attached viewport. */\n detach() {\n this._scrolledIndexChange.complete();\n this._viewport = null;\n }\n /**\n * Update the item size and buffer size.\n * @param itemSize The size of the items in the virtually scrolling list.\n * @param minBufferPx The minimum amount of buffer (in pixels) before needing to render more\n * @param maxBufferPx The amount of buffer (in pixels) to render when rendering more.\n */\n updateItemAndBufferSize(itemSize, minBufferPx, maxBufferPx) {\n if (maxBufferPx < minBufferPx && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CDK virtual scroll: maxBufferPx must be greater than or equal to minBufferPx');\n }\n this._itemSize = itemSize;\n this._minBufferPx = minBufferPx;\n this._maxBufferPx = maxBufferPx;\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentScrolled() {\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onDataLengthChanged() {\n this._updateTotalContentSize();\n this._updateRenderedRange();\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onContentRendered() {\n /* no-op */\n }\n /** @docs-private Implemented as part of VirtualScrollStrategy. */\n onRenderedOffsetChanged() {\n /* no-op */\n }\n /**\n * Scroll to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling.\n */\n scrollToIndex(index, behavior) {\n if (this._viewport) {\n this._viewport.scrollToOffset(index * this._itemSize, behavior);\n }\n }\n /** Update the viewport's total content size. */\n _updateTotalContentSize() {\n if (!this._viewport) {\n return;\n }\n this._viewport.setTotalContentSize(this._viewport.getDataLength() * this._itemSize);\n }\n /** Update the viewport's rendered range. */\n _updateRenderedRange() {\n if (!this._viewport) {\n return;\n }\n const renderedRange = this._viewport.getRenderedRange();\n const newRange = {\n start: renderedRange.start,\n end: renderedRange.end\n };\n const viewportSize = this._viewport.getViewportSize();\n const dataLength = this._viewport.getDataLength();\n let scrollOffset = this._viewport.measureScrollOffset();\n // Prevent NaN as result when dividing by zero.\n let firstVisibleIndex = this._itemSize > 0 ? scrollOffset / this._itemSize : 0;\n // If user scrolls to the bottom of the list and data changes to a smaller list\n if (newRange.end > dataLength) {\n // We have to recalculate the first visible index based on new data length and viewport size.\n const maxVisibleItems = Math.ceil(viewportSize / this._itemSize);\n const newVisibleIndex = Math.max(0, Math.min(firstVisibleIndex, dataLength - maxVisibleItems));\n // If first visible index changed we must update scroll offset to handle start/end buffers\n // Current range must also be adjusted to cover the new position (bottom of new list).\n if (firstVisibleIndex != newVisibleIndex) {\n firstVisibleIndex = newVisibleIndex;\n scrollOffset = newVisibleIndex * this._itemSize;\n newRange.start = Math.floor(firstVisibleIndex);\n }\n newRange.end = Math.max(0, Math.min(dataLength, newRange.start + maxVisibleItems));\n }\n const startBuffer = scrollOffset - newRange.start * this._itemSize;\n if (startBuffer < this._minBufferPx && newRange.start != 0) {\n const expandStart = Math.ceil((this._maxBufferPx - startBuffer) / this._itemSize);\n newRange.start = Math.max(0, newRange.start - expandStart);\n newRange.end = Math.min(dataLength, Math.ceil(firstVisibleIndex + (viewportSize + this._minBufferPx) / this._itemSize));\n } else {\n const endBuffer = newRange.end * this._itemSize - (scrollOffset + viewportSize);\n if (endBuffer < this._minBufferPx && newRange.end != dataLength) {\n const expandEnd = Math.ceil((this._maxBufferPx - endBuffer) / this._itemSize);\n if (expandEnd > 0) {\n newRange.end = Math.min(dataLength, newRange.end + expandEnd);\n newRange.start = Math.max(0, Math.floor(firstVisibleIndex - this._minBufferPx / this._itemSize));\n }\n }\n }\n this._viewport.setRenderedRange(newRange);\n this._viewport.setRenderedContentOffset(this._itemSize * newRange.start);\n this._scrolledIndexChange.next(Math.floor(firstVisibleIndex));\n }\n}\n/**\n * Provider factory for `FixedSizeVirtualScrollStrategy` that simply extracts the already created\n * `FixedSizeVirtualScrollStrategy` from the given directive.\n * @param fixedSizeDir The instance of `CdkFixedSizeVirtualScroll` to extract the\n * `FixedSizeVirtualScrollStrategy` from.\n */\nfunction _fixedSizeVirtualScrollStrategyFactory(fixedSizeDir) {\n return fixedSizeDir._scrollStrategy;\n}\n/** A virtual scroll strategy that supports fixed-size items. */\nlet CdkFixedSizeVirtualScroll = /*#__PURE__*/(() => {\n class CdkFixedSizeVirtualScroll {\n constructor() {\n this._itemSize = 20;\n this._minBufferPx = 100;\n this._maxBufferPx = 200;\n /** The scroll strategy used by this directive. */\n this._scrollStrategy = new FixedSizeVirtualScrollStrategy(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n /** The size of the items in the list (in pixels). */\n get itemSize() {\n return this._itemSize;\n }\n set itemSize(value) {\n this._itemSize = coerceNumberProperty(value);\n }\n /**\n * The minimum amount of buffer rendered beyond the viewport (in pixels).\n * If the amount of buffer dips below this number, more items will be rendered. Defaults to 100px.\n */\n get minBufferPx() {\n return this._minBufferPx;\n }\n set minBufferPx(value) {\n this._minBufferPx = coerceNumberProperty(value);\n }\n /**\n * The number of pixels worth of buffer to render for when rendering new items. Defaults to 200px.\n */\n get maxBufferPx() {\n return this._maxBufferPx;\n }\n set maxBufferPx(value) {\n this._maxBufferPx = coerceNumberProperty(value);\n }\n ngOnChanges() {\n this._scrollStrategy.updateItemAndBufferSize(this.itemSize, this.minBufferPx, this.maxBufferPx);\n }\n static {\n this.ɵfac = function CdkFixedSizeVirtualScroll_Factory(t) {\n return new (t || CdkFixedSizeVirtualScroll)();\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkFixedSizeVirtualScroll,\n selectors: [[\"cdk-virtual-scroll-viewport\", \"itemSize\", \"\"]],\n inputs: {\n itemSize: \"itemSize\",\n minBufferPx: \"minBufferPx\",\n maxBufferPx: \"maxBufferPx\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: _fixedSizeVirtualScrollStrategyFactory,\n deps: [forwardRef(() => CdkFixedSizeVirtualScroll)]\n }]), i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return CdkFixedSizeVirtualScroll;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the scrolling events by default. */\nconst DEFAULT_SCROLL_TIME = 20;\n/**\n * Service contained all registered Scrollable references and emits an event when any one of the\n * Scrollable references emit a scrolled event.\n */\nlet ScrollDispatcher = /*#__PURE__*/(() => {\n class ScrollDispatcher {\n constructor(_ngZone, _platform, document) {\n this._ngZone = _ngZone;\n this._platform = _platform;\n /** Subject for notifying that a registered scrollable reference element has been scrolled. */\n this._scrolled = new Subject();\n /** Keeps track of the global `scroll` and `resize` subscriptions. */\n this._globalSubscription = null;\n /** Keeps track of the amount of subscriptions to `scrolled`. Used for cleaning up afterwards. */\n this._scrolledCount = 0;\n /**\n * Map of all the scrollable references that are registered with the service and their\n * scroll event subscriptions.\n */\n this.scrollContainers = new Map();\n this._document = document;\n }\n /**\n * Registers a scrollable instance with the service and listens for its scrolled events. When the\n * scrollable is scrolled, the service emits the event to its scrolled observable.\n * @param scrollable Scrollable instance to be registered.\n */\n register(scrollable) {\n if (!this.scrollContainers.has(scrollable)) {\n this.scrollContainers.set(scrollable, scrollable.elementScrolled().subscribe(() => this._scrolled.next(scrollable)));\n }\n }\n /**\n * De-registers a Scrollable reference and unsubscribes from its scroll event observable.\n * @param scrollable Scrollable instance to be deregistered.\n */\n deregister(scrollable) {\n const scrollableReference = this.scrollContainers.get(scrollable);\n if (scrollableReference) {\n scrollableReference.unsubscribe();\n this.scrollContainers.delete(scrollable);\n }\n }\n /**\n * Returns an observable that emits an event whenever any of the registered Scrollable\n * references (or window, document, or body) fire a scrolled event. Can provide a time in ms\n * to override the default \"throttle\" time.\n *\n * **Note:** in order to avoid hitting change detection for every scroll event,\n * all of the events emitted from this stream will be run outside the Angular zone.\n * If you need to update any data bindings as a result of a scroll event, you have\n * to run the callback using `NgZone.run`.\n */\n scrolled(auditTimeInMs = DEFAULT_SCROLL_TIME) {\n if (!this._platform.isBrowser) {\n return of();\n }\n return new Observable(observer => {\n if (!this._globalSubscription) {\n this._addGlobalListener();\n }\n // In the case of a 0ms delay, use an observable without auditTime\n // since it does add a perceptible delay in processing overhead.\n const subscription = auditTimeInMs > 0 ? this._scrolled.pipe(auditTime(auditTimeInMs)).subscribe(observer) : this._scrolled.subscribe(observer);\n this._scrolledCount++;\n return () => {\n subscription.unsubscribe();\n this._scrolledCount--;\n if (!this._scrolledCount) {\n this._removeGlobalListener();\n }\n };\n });\n }\n ngOnDestroy() {\n this._removeGlobalListener();\n this.scrollContainers.forEach((_, container) => this.deregister(container));\n this._scrolled.complete();\n }\n /**\n * Returns an observable that emits whenever any of the\n * scrollable ancestors of an element are scrolled.\n * @param elementOrElementRef Element whose ancestors to listen for.\n * @param auditTimeInMs Time to throttle the scroll events.\n */\n ancestorScrolled(elementOrElementRef, auditTimeInMs) {\n const ancestors = this.getAncestorScrollContainers(elementOrElementRef);\n return this.scrolled(auditTimeInMs).pipe(filter(target => {\n return !target || ancestors.indexOf(target) > -1;\n }));\n }\n /** Returns all registered Scrollables that contain the provided element. */\n getAncestorScrollContainers(elementOrElementRef) {\n const scrollingContainers = [];\n this.scrollContainers.forEach((_subscription, scrollable) => {\n if (this._scrollableContainsElement(scrollable, elementOrElementRef)) {\n scrollingContainers.push(scrollable);\n }\n });\n return scrollingContainers;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Returns true if the element is contained within the provided Scrollable. */\n _scrollableContainsElement(scrollable, elementOrElementRef) {\n let element = coerceElement(elementOrElementRef);\n let scrollableElement = scrollable.getElementRef().nativeElement;\n // Traverse through the element parents until we reach null, checking if any of the elements\n // are the scrollable's element.\n do {\n if (element == scrollableElement) {\n return true;\n }\n } while (element = element.parentElement);\n return false;\n }\n /** Sets up the global scroll listeners. */\n _addGlobalListener() {\n this._globalSubscription = this._ngZone.runOutsideAngular(() => {\n const window = this._getWindow();\n return fromEvent(window.document, 'scroll').subscribe(() => this._scrolled.next());\n });\n }\n /** Cleans up the global scroll listener. */\n _removeGlobalListener() {\n if (this._globalSubscription) {\n this._globalSubscription.unsubscribe();\n this._globalSubscription = null;\n }\n }\n static {\n this.ɵfac = function ScrollDispatcher_Factory(t) {\n return new (t || ScrollDispatcher)(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.Platform), i0.ɵɵinject(DOCUMENT, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ScrollDispatcher,\n factory: ScrollDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ScrollDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Sends an event when the directive's element is scrolled. Registers itself with the\n * ScrollDispatcher service to include itself as part of its collection of scrolling events that it\n * can be listened to through the service.\n */\nlet CdkScrollable = /*#__PURE__*/(() => {\n class CdkScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n this.elementRef = elementRef;\n this.scrollDispatcher = scrollDispatcher;\n this.ngZone = ngZone;\n this.dir = dir;\n this._destroyed = new Subject();\n this._elementScrolled = new Observable(observer => this.ngZone.runOutsideAngular(() => fromEvent(this.elementRef.nativeElement, 'scroll').pipe(takeUntil(this._destroyed)).subscribe(observer)));\n }\n ngOnInit() {\n this.scrollDispatcher.register(this);\n }\n ngOnDestroy() {\n this.scrollDispatcher.deregister(this);\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Returns observable that emits when a scroll event is fired on the host element. */\n elementScrolled() {\n return this._elementScrolled;\n }\n /** Gets the ElementRef for the viewport. */\n getElementRef() {\n return this.elementRef;\n }\n /**\n * Scrolls to the specified offsets. This is a normalized version of the browser's native scrollTo\n * method, since browsers are not consistent about what scrollLeft means in RTL. For this method\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param options specified the offsets to scroll to.\n */\n scrollTo(options) {\n const el = this.elementRef.nativeElement;\n const isRtl = this.dir && this.dir.value == 'rtl';\n // Rewrite start & end offsets as right or left offsets.\n if (options.left == null) {\n options.left = isRtl ? options.end : options.start;\n }\n if (options.right == null) {\n options.right = isRtl ? options.start : options.end;\n }\n // Rewrite the bottom offset as a top offset.\n if (options.bottom != null) {\n options.top = el.scrollHeight - el.clientHeight - options.bottom;\n }\n // Rewrite the right offset as a left offset.\n if (isRtl && getRtlScrollAxisType() != RtlScrollAxisType.NORMAL) {\n if (options.left != null) {\n options.right = el.scrollWidth - el.clientWidth - options.left;\n }\n if (getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n options.left = options.right;\n } else if (getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n options.left = options.right ? -options.right : options.right;\n }\n } else {\n if (options.right != null) {\n options.left = el.scrollWidth - el.clientWidth - options.right;\n }\n }\n this._applyScrollToOptions(options);\n }\n _applyScrollToOptions(options) {\n const el = this.elementRef.nativeElement;\n if (supportsScrollBehavior()) {\n el.scrollTo(options);\n } else {\n if (options.top != null) {\n el.scrollTop = options.top;\n }\n if (options.left != null) {\n el.scrollLeft = options.left;\n }\n }\n }\n /**\n * Measures the scroll offset relative to the specified edge of the viewport. This method can be\n * used instead of directly checking scrollLeft or scrollTop, since browsers are not consistent\n * about what scrollLeft means in RTL. The values returned by this method are normalized such that\n * left and right always refer to the left and right side of the scrolling container irrespective\n * of the layout direction. start and end refer to left and right in an LTR context and vice-versa\n * in an RTL context.\n * @param from The edge to measure from.\n */\n measureScrollOffset(from) {\n const LEFT = 'left';\n const RIGHT = 'right';\n const el = this.elementRef.nativeElement;\n if (from == 'top') {\n return el.scrollTop;\n }\n if (from == 'bottom') {\n return el.scrollHeight - el.clientHeight - el.scrollTop;\n }\n // Rewrite start & end as left or right offsets.\n const isRtl = this.dir && this.dir.value == 'rtl';\n if (from == 'start') {\n from = isRtl ? RIGHT : LEFT;\n } else if (from == 'end') {\n from = isRtl ? LEFT : RIGHT;\n }\n if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.INVERTED) {\n // For INVERTED, scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return el.scrollLeft;\n }\n } else if (isRtl && getRtlScrollAxisType() == RtlScrollAxisType.NEGATED) {\n // For NEGATED, scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and\n // 0 when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft + el.scrollWidth - el.clientWidth;\n } else {\n return -el.scrollLeft;\n }\n } else {\n // For NORMAL, as well as non-RTL contexts, scrollLeft is 0 when scrolled all the way left and\n // (scrollWidth - clientWidth) when scrolled all the way right.\n if (from == LEFT) {\n return el.scrollLeft;\n } else {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n }\n }\n }\n static {\n this.ɵfac = function CdkScrollable_Factory(t) {\n return new (t || CdkScrollable)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkScrollable,\n selectors: [[\"\", \"cdk-scrollable\", \"\"], [\"\", \"cdkScrollable\", \"\"]],\n standalone: true\n });\n }\n }\n return CdkScrollable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Time in ms to throttle the resize events by default. */\nconst DEFAULT_RESIZE_TIME = 20;\n/**\n * Simple utility for getting the bounds of the browser viewport.\n * @docs-private\n */\nlet ViewportRuler = /*#__PURE__*/(() => {\n class ViewportRuler {\n constructor(_platform, ngZone, document) {\n this._platform = _platform;\n /** Stream of viewport change events. */\n this._change = new Subject();\n /** Event listener that will be used to handle the viewport change events. */\n this._changeListener = event => {\n this._change.next(event);\n };\n this._document = document;\n ngZone.runOutsideAngular(() => {\n if (_platform.isBrowser) {\n const window = this._getWindow();\n // Note that bind the events ourselves, rather than going through something like RxJS's\n // `fromEvent` so that we can ensure that they're bound outside of the NgZone.\n window.addEventListener('resize', this._changeListener);\n window.addEventListener('orientationchange', this._changeListener);\n }\n // Clear the cached position so that the viewport is re-measured next time it is required.\n // We don't need to keep track of the subscription, because it is completed on destroy.\n this.change().subscribe(() => this._viewportSize = null);\n });\n }\n ngOnDestroy() {\n if (this._platform.isBrowser) {\n const window = this._getWindow();\n window.removeEventListener('resize', this._changeListener);\n window.removeEventListener('orientationchange', this._changeListener);\n }\n this._change.complete();\n }\n /** Returns the viewport's width and height. */\n getViewportSize() {\n if (!this._viewportSize) {\n this._updateViewportSize();\n }\n const output = {\n width: this._viewportSize.width,\n height: this._viewportSize.height\n };\n // If we're not on a browser, don't cache the size since it'll be mocked out anyway.\n if (!this._platform.isBrowser) {\n this._viewportSize = null;\n }\n return output;\n }\n /** Gets a DOMRect for the viewport's bounds. */\n getViewportRect() {\n // Use the document element's bounding rect rather than the window scroll properties\n // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll\n // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different\n // conceptual viewports. Under most circumstances these viewports are equivalent, but they\n // can disagree when the page is pinch-zoomed (on devices that support touch).\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4\n // We use the documentElement instead of the body because, by default (without a css reset)\n // browsers typically give the document body an 8px margin, which is not included in\n // getBoundingClientRect().\n const scrollPosition = this.getViewportScrollPosition();\n const {\n width,\n height\n } = this.getViewportSize();\n return {\n top: scrollPosition.top,\n left: scrollPosition.left,\n bottom: scrollPosition.top + height,\n right: scrollPosition.left + width,\n height,\n width\n };\n }\n /** Gets the (top, left) scroll position of the viewport. */\n getViewportScrollPosition() {\n // While we can get a reference to the fake document\n // during SSR, it doesn't have getBoundingClientRect.\n if (!this._platform.isBrowser) {\n return {\n top: 0,\n left: 0\n };\n }\n // The top-left-corner of the viewport is determined by the scroll position of the document\n // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about\n // whether `document.body` or `document.documentElement` is the scrolled element, so reading\n // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of\n // `document.documentElement` works consistently, where the `top` and `left` values will\n // equal negative the scroll position.\n const document = this._document;\n const window = this._getWindow();\n const documentElement = document.documentElement;\n const documentRect = documentElement.getBoundingClientRect();\n const top = -documentRect.top || document.body.scrollTop || window.scrollY || documentElement.scrollTop || 0;\n const left = -documentRect.left || document.body.scrollLeft || window.scrollX || documentElement.scrollLeft || 0;\n return {\n top,\n left\n };\n }\n /**\n * Returns a stream that emits whenever the size of the viewport changes.\n * This stream emits outside of the Angular zone.\n * @param throttleTime Time in milliseconds to throttle the stream.\n */\n change(throttleTime = DEFAULT_RESIZE_TIME) {\n return throttleTime > 0 ? this._change.pipe(auditTime(throttleTime)) : this._change;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n return this._document.defaultView || window;\n }\n /** Updates the cached viewport size. */\n _updateViewportSize() {\n const window = this._getWindow();\n this._viewportSize = this._platform.isBrowser ? {\n width: window.innerWidth,\n height: window.innerHeight\n } : {\n width: 0,\n height: 0\n };\n }\n static {\n this.ɵfac = function ViewportRuler_Factory(t) {\n return new (t || ViewportRuler)(i0.ɵɵinject(i1.Platform), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ViewportRuler,\n factory: ViewportRuler.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ViewportRuler;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nconst VIRTUAL_SCROLLABLE = /*#__PURE__*/new InjectionToken('VIRTUAL_SCROLLABLE');\n/**\n * Extending the {@link CdkScrollable} to be used as scrolling container for virtual scrolling.\n */\nlet CdkVirtualScrollable = /*#__PURE__*/(() => {\n class CdkVirtualScrollable extends CdkScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n }\n /**\n * Measure the viewport size for the provided orientation.\n *\n * @param orientation The orientation to measure the size from.\n */\n measureViewportSize(orientation) {\n const viewportEl = this.elementRef.nativeElement;\n return orientation === 'horizontal' ? viewportEl.clientWidth : viewportEl.clientHeight;\n }\n static {\n this.ɵfac = function CdkVirtualScrollable_Factory(t) {\n return new (t || CdkVirtualScrollable)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollable,\n features: [i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollable;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Checks if the given ranges are equal. */\nfunction rangesEqual(r1, r2) {\n return r1.start == r2.start && r1.end == r2.end;\n}\n/**\n * Scheduler to be used for scroll events. Needs to fall back to\n * something that doesn't rely on requestAnimationFrame on environments\n * that don't support it (e.g. server-side rendering).\n */\nconst SCROLL_SCHEDULER = typeof requestAnimationFrame !== 'undefined' ? animationFrameScheduler : asapScheduler;\n/** A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`. */\nlet CdkVirtualScrollViewport = /*#__PURE__*/(() => {\n class CdkVirtualScrollViewport extends CdkVirtualScrollable {\n /** The direction the viewport scrolls. */\n get orientation() {\n return this._orientation;\n }\n set orientation(orientation) {\n if (this._orientation !== orientation) {\n this._orientation = orientation;\n this._calculateSpacerSize();\n }\n }\n constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler, scrollable) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n this.elementRef = elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._scrollStrategy = _scrollStrategy;\n this.scrollable = scrollable;\n this._platform = inject(Platform);\n /** Emits when the viewport is detached from a CdkVirtualForOf. */\n this._detachedSubject = new Subject();\n /** Emits when the rendered range changes. */\n this._renderedRangeSubject = new Subject();\n this._orientation = 'vertical';\n /**\n * Whether rendered items should persist in the DOM after scrolling out of view. By default, items\n * will be removed.\n */\n this.appendOnly = false;\n // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll\n // strategy lazily (i.e. only if the user is actually listening to the events). We do this because\n // depending on how the strategy calculates the scrolled index, it may come at a cost to\n // performance.\n /** Emits when the index of the first element visible in the viewport changes. */\n this.scrolledIndexChange = new Observable(observer => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));\n /** A stream that emits whenever the rendered range changes. */\n this.renderedRangeStream = this._renderedRangeSubject;\n /**\n * The total size of all content (in pixels), including content that is not currently rendered.\n */\n this._totalContentSize = 0;\n /** A string representing the `style.width` property value to be used for the spacer element. */\n this._totalContentWidth = '';\n /** A string representing the `style.height` property value to be used for the spacer element. */\n this._totalContentHeight = '';\n /** The currently rendered range of indices. */\n this._renderedRange = {\n start: 0,\n end: 0\n };\n /** The length of the data bound to this viewport (in number of items). */\n this._dataLength = 0;\n /** The size of the viewport (in pixels). */\n this._viewportSize = 0;\n /** The last rendered content offset that was set. */\n this._renderedContentOffset = 0;\n /**\n * Whether the last rendered content offset was to the end of the content (and therefore needs to\n * be rewritten as an offset to the start of the content).\n */\n this._renderedContentOffsetNeedsRewrite = false;\n /** Whether there is a pending change detection cycle. */\n this._isChangeDetectionPending = false;\n /** A list of functions to run after the next change detection cycle. */\n this._runAfterChangeDetection = [];\n /** Subscription to changes in the viewport size. */\n this._viewportChanges = Subscription.EMPTY;\n if (!_scrollStrategy && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Error: cdk-virtual-scroll-viewport requires the \"itemSize\" property to be set.');\n }\n this._viewportChanges = viewportRuler.change().subscribe(() => {\n this.checkViewportSize();\n });\n if (!this.scrollable) {\n // No scrollable is provided, so the virtual-scroll-viewport needs to become a scrollable\n this.elementRef.nativeElement.classList.add('cdk-virtual-scrollable');\n this.scrollable = this;\n }\n }\n ngOnInit() {\n // Scrolling depends on the element dimensions which we can't get during SSR.\n if (!this._platform.isBrowser) {\n return;\n }\n if (this.scrollable === this) {\n super.ngOnInit();\n }\n // It's still too early to measure the viewport at this point. Deferring with a promise allows\n // the Viewport to be rendered with the correct size before we measure. We run this outside the\n // zone to avoid causing more change detection cycles. We handle the change detection loop\n // ourselves instead.\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._measureViewportSize();\n this._scrollStrategy.attach(this);\n this.scrollable.elementScrolled().pipe(\n // Start off with a fake scroll event so we properly detect our initial position.\n startWith(null),\n // Collect multiple events into one until the next animation frame. This way if\n // there are multiple scroll events in the same frame we only need to recheck\n // our layout once.\n auditTime(0, SCROLL_SCHEDULER),\n // Usually `elementScrolled` is completed when the scrollable is destroyed, but\n // that may not be the case if a `CdkVirtualScrollableElement` is used so we have\n // to unsubscribe here just in case.\n takeUntil(this._destroyed)).subscribe(() => this._scrollStrategy.onContentScrolled());\n this._markChangeDetectionNeeded();\n }));\n }\n ngOnDestroy() {\n this.detach();\n this._scrollStrategy.detach();\n // Complete all subjects\n this._renderedRangeSubject.complete();\n this._detachedSubject.complete();\n this._viewportChanges.unsubscribe();\n super.ngOnDestroy();\n }\n /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */\n attach(forOf) {\n if (this._forOf && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('CdkVirtualScrollViewport is already attached.');\n }\n // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length\n // changes. Run outside the zone to avoid triggering change detection, since we're managing the\n // change detection loop ourselves.\n this.ngZone.runOutsideAngular(() => {\n this._forOf = forOf;\n this._forOf.dataStream.pipe(takeUntil(this._detachedSubject)).subscribe(data => {\n const newLength = data.length;\n if (newLength !== this._dataLength) {\n this._dataLength = newLength;\n this._scrollStrategy.onDataLengthChanged();\n }\n this._doChangeDetection();\n });\n });\n }\n /** Detaches the current `CdkVirtualForOf`. */\n detach() {\n this._forOf = null;\n this._detachedSubject.next();\n }\n /** Gets the length of the data bound to this viewport (in number of items). */\n getDataLength() {\n return this._dataLength;\n }\n /** Gets the size of the viewport (in pixels). */\n getViewportSize() {\n return this._viewportSize;\n }\n // TODO(mmalerba): This is technically out of sync with what's really rendered until a render\n // cycle happens. I'm being careful to only call it after the render cycle is complete and before\n // setting it to something else, but its error prone and should probably be split into\n // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.\n /** Get the current rendered range of items. */\n getRenderedRange() {\n return this._renderedRange;\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n }\n /**\n * Sets the total size of all content (in pixels), including content that is not currently\n * rendered.\n */\n setTotalContentSize(size) {\n if (this._totalContentSize !== size) {\n this._totalContentSize = size;\n this._calculateSpacerSize();\n this._markChangeDetectionNeeded();\n }\n }\n /** Sets the currently rendered range of indices. */\n setRenderedRange(range) {\n if (!rangesEqual(this._renderedRange, range)) {\n if (this.appendOnly) {\n range = {\n start: 0,\n end: Math.max(this._renderedRange.end, range.end)\n };\n }\n this._renderedRangeSubject.next(this._renderedRange = range);\n this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());\n }\n }\n /**\n * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).\n */\n getOffsetToRenderedContentStart() {\n return this._renderedContentOffsetNeedsRewrite ? null : this._renderedContentOffset;\n }\n /**\n * Sets the offset from the start of the viewport to either the start or end of the rendered data\n * (in pixels).\n */\n setRenderedContentOffset(offset, to = 'to-start') {\n // In appendOnly, we always start from the top\n offset = this.appendOnly && to === 'to-start' ? 0 : offset;\n // For a horizontal viewport in a right-to-left language we need to translate along the x-axis\n // in the negative direction.\n const isRtl = this.dir && this.dir.value == 'rtl';\n const isHorizontal = this.orientation == 'horizontal';\n const axis = isHorizontal ? 'X' : 'Y';\n const axisDirection = isHorizontal && isRtl ? -1 : 1;\n let transform = `translate${axis}(${Number(axisDirection * offset)}px)`;\n this._renderedContentOffset = offset;\n if (to === 'to-end') {\n transform += ` translate${axis}(-100%)`;\n // The viewport should rewrite this as a `to-start` offset on the next render cycle. Otherwise\n // elements will appear to expand in the wrong direction (e.g. `mat-expansion-panel` would\n // expand upward).\n this._renderedContentOffsetNeedsRewrite = true;\n }\n if (this._renderedContentTransform != transform) {\n // We know this value is safe because we parse `offset` with `Number()` before passing it\n // into the string.\n this._renderedContentTransform = transform;\n this._markChangeDetectionNeeded(() => {\n if (this._renderedContentOffsetNeedsRewrite) {\n this._renderedContentOffset -= this.measureRenderedContentSize();\n this._renderedContentOffsetNeedsRewrite = false;\n this.setRenderedContentOffset(this._renderedContentOffset);\n } else {\n this._scrollStrategy.onRenderedOffsetChanged();\n }\n });\n }\n }\n /**\n * Scrolls to the given offset from the start of the viewport. Please note that this is not always\n * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left\n * direction, this would be the equivalent of setting a fictional `scrollRight` property.\n * @param offset The offset to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToOffset(offset, behavior = 'auto') {\n const options = {\n behavior\n };\n if (this.orientation === 'horizontal') {\n options.start = offset;\n } else {\n options.top = offset;\n }\n this.scrollable.scrollTo(options);\n }\n /**\n * Scrolls to the offset for the given index.\n * @param index The index of the element to scroll to.\n * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.\n */\n scrollToIndex(index, behavior = 'auto') {\n this._scrollStrategy.scrollToIndex(index, behavior);\n }\n /**\n * Gets the current scroll offset from the start of the scrollable (in pixels).\n * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'\n * in horizontal mode.\n */\n measureScrollOffset(from) {\n // This is to break the call cycle\n let measureScrollOffset;\n if (this.scrollable == this) {\n measureScrollOffset = _from => super.measureScrollOffset(_from);\n } else {\n measureScrollOffset = _from => this.scrollable.measureScrollOffset(_from);\n }\n return Math.max(0, measureScrollOffset(from ?? (this.orientation === 'horizontal' ? 'start' : 'top')) - this.measureViewportOffset());\n }\n /**\n * Measures the offset of the viewport from the scrolling container\n * @param from The edge to measure from.\n */\n measureViewportOffset(from) {\n let fromRect;\n const LEFT = 'left';\n const RIGHT = 'right';\n const isRtl = this.dir?.value == 'rtl';\n if (from == 'start') {\n fromRect = isRtl ? RIGHT : LEFT;\n } else if (from == 'end') {\n fromRect = isRtl ? LEFT : RIGHT;\n } else if (from) {\n fromRect = from;\n } else {\n fromRect = this.orientation === 'horizontal' ? 'left' : 'top';\n }\n const scrollerClientRect = this.scrollable.measureBoundingClientRectWithScrollOffset(fromRect);\n const viewportClientRect = this.elementRef.nativeElement.getBoundingClientRect()[fromRect];\n return viewportClientRect - scrollerClientRect;\n }\n /** Measure the combined size of all of the rendered items. */\n measureRenderedContentSize() {\n const contentEl = this._contentWrapper.nativeElement;\n return this.orientation === 'horizontal' ? contentEl.offsetWidth : contentEl.offsetHeight;\n }\n /**\n * Measure the total combined size of the given range. Throws if the range includes items that are\n * not rendered.\n */\n measureRangeSize(range) {\n if (!this._forOf) {\n return 0;\n }\n return this._forOf.measureRangeSize(range, this.orientation);\n }\n /** Update the viewport dimensions and re-render. */\n checkViewportSize() {\n // TODO: Cleanup later when add logic for handling content resize\n this._measureViewportSize();\n this._scrollStrategy.onDataLengthChanged();\n }\n /** Measure the viewport size. */\n _measureViewportSize() {\n this._viewportSize = this.scrollable.measureViewportSize(this.orientation);\n }\n /** Queue up change detection to run. */\n _markChangeDetectionNeeded(runAfter) {\n if (runAfter) {\n this._runAfterChangeDetection.push(runAfter);\n }\n // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of\n // properties sequentially we only have to run `_doChangeDetection` once at the end.\n if (!this._isChangeDetectionPending) {\n this._isChangeDetectionPending = true;\n this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {\n this._doChangeDetection();\n }));\n }\n }\n /** Run change detection. */\n _doChangeDetection() {\n this._isChangeDetectionPending = false;\n // Apply the content transform. The transform can't be set via an Angular binding because\n // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of\n // string literals, a variable that can only be 'X' or 'Y', and user input that is run through\n // the `Number` function first to coerce it to a numeric value.\n this._contentWrapper.nativeElement.style.transform = this._renderedContentTransform;\n // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection\n // from the root, since the repeated items are content projected in. Calling `detectChanges`\n // instead does not properly check the projected content.\n this.ngZone.run(() => this._changeDetectorRef.markForCheck());\n const runAfterChangeDetection = this._runAfterChangeDetection;\n this._runAfterChangeDetection = [];\n for (const fn of runAfterChangeDetection) {\n fn();\n }\n }\n /** Calculates the `style.width` and `style.height` for the spacer element. */\n _calculateSpacerSize() {\n this._totalContentHeight = this.orientation === 'horizontal' ? '' : `${this._totalContentSize}px`;\n this._totalContentWidth = this.orientation === 'horizontal' ? `${this._totalContentSize}px` : '';\n }\n static {\n this.ɵfac = function CdkVirtualScrollViewport_Factory(t) {\n return new (t || CdkVirtualScrollViewport)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(VIRTUAL_SCROLL_STRATEGY, 8), i0.ɵɵdirectiveInject(i2.Directionality, 8), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(ViewportRuler), i0.ɵɵdirectiveInject(VIRTUAL_SCROLLABLE, 8));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: CdkVirtualScrollViewport,\n selectors: [[\"cdk-virtual-scroll-viewport\"]],\n viewQuery: function CdkVirtualScrollViewport_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c0, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._contentWrapper = _t.first);\n }\n },\n hostAttrs: [1, \"cdk-virtual-scroll-viewport\"],\n hostVars: 4,\n hostBindings: function CdkVirtualScrollViewport_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵclassProp(\"cdk-virtual-scroll-orientation-horizontal\", ctx.orientation === \"horizontal\")(\"cdk-virtual-scroll-orientation-vertical\", ctx.orientation !== \"horizontal\");\n }\n },\n inputs: {\n orientation: \"orientation\",\n appendOnly: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"appendOnly\", \"appendOnly\", booleanAttribute]\n },\n outputs: {\n scrolledIndexChange: \"scrolledIndexChange\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: CdkScrollable,\n useFactory: (virtualScrollable, viewport) => virtualScrollable || viewport,\n deps: [[new Optional(), new Inject(VIRTUAL_SCROLLABLE)], CdkVirtualScrollViewport]\n }]), i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature],\n ngContentSelectors: _c1,\n decls: 4,\n vars: 4,\n consts: [[1, \"cdk-virtual-scroll-content-wrapper\"], [\"contentWrapper\", \"\"], [1, \"cdk-virtual-scroll-spacer\"]],\n template: function CdkVirtualScrollViewport_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵprojectionDef();\n i0.ɵɵelementStart(0, \"div\", 0, 1);\n i0.ɵɵprojection(2);\n i0.ɵɵelementEnd();\n i0.ɵɵelement(3, \"div\", 2);\n }\n if (rf & 2) {\n i0.ɵɵadvance(3);\n i0.ɵɵstyleProp(\"width\", ctx._totalContentWidth)(\"height\", ctx._totalContentHeight);\n }\n },\n styles: [\"cdk-virtual-scroll-viewport{display:block;position:relative;transform:translateZ(0)}.cdk-virtual-scrollable{overflow:auto;will-change:scroll-position;contain:strict;-webkit-overflow-scrolling:touch}.cdk-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .cdk-virtual-scroll-content-wrapper{right:0;left:auto}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper{min-height:100%}.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-horizontal .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{min-width:100%}.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.cdk-virtual-scroll-spacer{height:1px;transform-origin:0 0;flex:0 0 auto}[dir=rtl] .cdk-virtual-scroll-spacer{transform-origin:100% 0}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return CdkVirtualScrollViewport;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Helper to extract the offset of a DOM Node in a certain direction. */\nfunction getOffset(orientation, direction, node) {\n const el = node;\n if (!el.getBoundingClientRect) {\n return 0;\n }\n const rect = el.getBoundingClientRect();\n if (orientation === 'horizontal') {\n return direction === 'start' ? rect.left : rect.right;\n }\n return direction === 'start' ? rect.top : rect.bottom;\n}\n/**\n * A directive similar to `ngForOf` to be used for rendering data inside a virtual scrolling\n * container.\n */\nlet CdkVirtualForOf = /*#__PURE__*/(() => {\n class CdkVirtualForOf {\n /** The DataSource to display. */\n get cdkVirtualForOf() {\n return this._cdkVirtualForOf;\n }\n set cdkVirtualForOf(value) {\n this._cdkVirtualForOf = value;\n if (isDataSource(value)) {\n this._dataSourceChanges.next(value);\n } else {\n // If value is an an NgIterable, convert it to an array.\n this._dataSourceChanges.next(new ArrayDataSource(isObservable(value) ? value : Array.from(value || [])));\n }\n }\n /**\n * The `TrackByFunction` to use for tracking changes. The `TrackByFunction` takes the index and\n * the item and produces a value to be used as the item's identity when tracking changes.\n */\n get cdkVirtualForTrackBy() {\n return this._cdkVirtualForTrackBy;\n }\n set cdkVirtualForTrackBy(fn) {\n this._needsUpdate = true;\n this._cdkVirtualForTrackBy = fn ? (index, item) => fn(index + (this._renderedRange ? this._renderedRange.start : 0), item) : undefined;\n }\n /** The template used to stamp out new elements. */\n set cdkVirtualForTemplate(value) {\n if (value) {\n this._needsUpdate = true;\n this._template = value;\n }\n }\n /**\n * The size of the cache used to store templates that are not being used for re-use later.\n * Setting the cache size to `0` will disable caching. Defaults to 20 templates.\n */\n get cdkVirtualForTemplateCacheSize() {\n return this._viewRepeater.viewCacheSize;\n }\n set cdkVirtualForTemplateCacheSize(size) {\n this._viewRepeater.viewCacheSize = coerceNumberProperty(size);\n }\n constructor( /** The view container to add items to. */\n _viewContainerRef, /** The template to use when stamping out new items. */\n _template, /** The set of available differs. */\n _differs, /** The strategy used to render items in the virtual scroll viewport. */\n _viewRepeater, /** The virtual scrolling viewport that these items are being rendered in. */\n _viewport, ngZone) {\n this._viewContainerRef = _viewContainerRef;\n this._template = _template;\n this._differs = _differs;\n this._viewRepeater = _viewRepeater;\n this._viewport = _viewport;\n /** Emits when the rendered view of the data changes. */\n this.viewChange = new Subject();\n /** Subject that emits when a new DataSource instance is given. */\n this._dataSourceChanges = new Subject();\n /** Emits whenever the data in the current DataSource changes. */\n this.dataStream = this._dataSourceChanges.pipe(\n // Start off with null `DataSource`.\n startWith(null),\n // Bundle up the previous and current data sources so we can work with both.\n pairwise(),\n // Use `_changeDataSource` to disconnect from the previous data source and connect to the\n // new one, passing back a stream of data changes which we run through `switchMap` to give\n // us a data stream that emits the latest data from whatever the current `DataSource` is.\n switchMap(([prev, cur]) => this._changeDataSource(prev, cur)),\n // Replay the last emitted data when someone subscribes.\n shareReplay(1));\n /** The differ used to calculate changes to the data. */\n this._differ = null;\n /** Whether the rendered data should be updated during the next ngDoCheck cycle. */\n this._needsUpdate = false;\n this._destroyed = new Subject();\n this.dataStream.subscribe(data => {\n this._data = data;\n this._onRenderedDataChange();\n });\n this._viewport.renderedRangeStream.pipe(takeUntil(this._destroyed)).subscribe(range => {\n this._renderedRange = range;\n if (this.viewChange.observers.length) {\n ngZone.run(() => this.viewChange.next(this._renderedRange));\n }\n this._onRenderedDataChange();\n });\n this._viewport.attach(this);\n }\n /**\n * Measures the combined size (width for horizontal orientation, height for vertical) of all items\n * in the specified range. Throws an error if the range includes items that are not currently\n * rendered.\n */\n measureRangeSize(range, orientation) {\n if (range.start >= range.end) {\n return 0;\n }\n if ((range.start < this._renderedRange.start || range.end > this._renderedRange.end) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error(`Error: attempted to measure an item that isn't rendered.`);\n }\n // The index into the list of rendered views for the first item in the range.\n const renderedStartIndex = range.start - this._renderedRange.start;\n // The length of the range we're measuring.\n const rangeLen = range.end - range.start;\n // Loop over all the views, find the first and land node and compute the size by subtracting\n // the top of the first node from the bottom of the last one.\n let firstNode;\n let lastNode;\n // Find the first node by starting from the beginning and going forwards.\n for (let i = 0; i < rangeLen; i++) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n firstNode = lastNode = view.rootNodes[0];\n break;\n }\n }\n // Find the last node by starting from the end and going backwards.\n for (let i = rangeLen - 1; i > -1; i--) {\n const view = this._viewContainerRef.get(i + renderedStartIndex);\n if (view && view.rootNodes.length) {\n lastNode = view.rootNodes[view.rootNodes.length - 1];\n break;\n }\n }\n return firstNode && lastNode ? getOffset(orientation, 'end', lastNode) - getOffset(orientation, 'start', firstNode) : 0;\n }\n ngDoCheck() {\n if (this._differ && this._needsUpdate) {\n // TODO(mmalerba): We should differentiate needs update due to scrolling and a new portion of\n // this list being rendered (can use simpler algorithm) vs needs update due to data actually\n // changing (need to do this diff).\n const changes = this._differ.diff(this._renderedItems);\n if (!changes) {\n this._updateContext();\n } else {\n this._applyChanges(changes);\n }\n this._needsUpdate = false;\n }\n }\n ngOnDestroy() {\n this._viewport.detach();\n this._dataSourceChanges.next(undefined);\n this._dataSourceChanges.complete();\n this.viewChange.complete();\n this._destroyed.next();\n this._destroyed.complete();\n this._viewRepeater.detach();\n }\n /** React to scroll state changes in the viewport. */\n _onRenderedDataChange() {\n if (!this._renderedRange) {\n return;\n }\n this._renderedItems = this._data.slice(this._renderedRange.start, this._renderedRange.end);\n if (!this._differ) {\n // Use a wrapper function for the `trackBy` so any new values are\n // picked up automatically without having to recreate the differ.\n this._differ = this._differs.find(this._renderedItems).create((index, item) => {\n return this.cdkVirtualForTrackBy ? this.cdkVirtualForTrackBy(index, item) : item;\n });\n }\n this._needsUpdate = true;\n }\n /** Swap out one `DataSource` for another. */\n _changeDataSource(oldDs, newDs) {\n if (oldDs) {\n oldDs.disconnect(this);\n }\n this._needsUpdate = true;\n return newDs ? newDs.connect(this) : of();\n }\n /** Update the `CdkVirtualForOfContext` for all views. */\n _updateContext() {\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n view.detectChanges();\n }\n }\n /** Apply changes to the DOM. */\n _applyChanges(changes) {\n this._viewRepeater.applyChanges(changes, this._viewContainerRef, (record, _adjustedPreviousIndex, currentIndex) => this._getEmbeddedViewArgs(record, currentIndex), record => record.item);\n // Update $implicit for any items that had an identity change.\n changes.forEachIdentityChange(record => {\n const view = this._viewContainerRef.get(record.currentIndex);\n view.context.$implicit = record.item;\n });\n // Update the context variables on all items.\n const count = this._data.length;\n let i = this._viewContainerRef.length;\n while (i--) {\n const view = this._viewContainerRef.get(i);\n view.context.index = this._renderedRange.start + i;\n view.context.count = count;\n this._updateComputedContextProperties(view.context);\n }\n }\n /** Update the computed properties on the `CdkVirtualForOfContext`. */\n _updateComputedContextProperties(context) {\n context.first = context.index === 0;\n context.last = context.index === context.count - 1;\n context.even = context.index % 2 === 0;\n context.odd = !context.even;\n }\n _getEmbeddedViewArgs(record, index) {\n // Note that it's important that we insert the item directly at the proper index,\n // rather than inserting it and the moving it in place, because if there's a directive\n // on the same node that injects the `ViewContainerRef`, Angular will insert another\n // comment node which can throw off the move when it's being repeated for all items.\n return {\n templateRef: this._template,\n context: {\n $implicit: record.item,\n // It's guaranteed that the iterable is not \"undefined\" or \"null\" because we only\n // generate views for elements if the \"cdkVirtualForOf\" iterable has elements.\n cdkVirtualForOf: this._cdkVirtualForOf,\n index: -1,\n count: -1,\n first: false,\n last: false,\n odd: false,\n even: false\n },\n index\n };\n }\n static {\n this.ɵfac = function CdkVirtualForOf_Factory(t) {\n return new (t || CdkVirtualForOf)(i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.IterableDiffers), i0.ɵɵdirectiveInject(_VIEW_REPEATER_STRATEGY), i0.ɵɵdirectiveInject(CdkVirtualScrollViewport, 4), i0.ɵɵdirectiveInject(i0.NgZone));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualForOf,\n selectors: [[\"\", \"cdkVirtualFor\", \"\", \"cdkVirtualForOf\", \"\"]],\n inputs: {\n cdkVirtualForOf: \"cdkVirtualForOf\",\n cdkVirtualForTrackBy: \"cdkVirtualForTrackBy\",\n cdkVirtualForTemplate: \"cdkVirtualForTemplate\",\n cdkVirtualForTemplateCacheSize: \"cdkVirtualForTemplateCacheSize\"\n },\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: _VIEW_REPEATER_STRATEGY,\n useClass: _RecycleViewRepeaterStrategy\n }])]\n });\n }\n }\n return CdkVirtualForOf;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides a virtual scrollable for the element it is attached to.\n */\nlet CdkVirtualScrollableElement = /*#__PURE__*/(() => {\n class CdkVirtualScrollableElement extends CdkVirtualScrollable {\n constructor(elementRef, scrollDispatcher, ngZone, dir) {\n super(elementRef, scrollDispatcher, ngZone, dir);\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from] - this.measureScrollOffset(from);\n }\n static {\n this.ɵfac = function CdkVirtualScrollableElement_Factory(t) {\n return new (t || CdkVirtualScrollableElement)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollableElement,\n selectors: [[\"\", \"cdkVirtualScrollingElement\", \"\"]],\n hostAttrs: [1, \"cdk-virtual-scrollable\"],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLLABLE,\n useExisting: CdkVirtualScrollableElement\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollableElement;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Provides as virtual scrollable for the global / window scrollbar.\n */\nlet CdkVirtualScrollableWindow = /*#__PURE__*/(() => {\n class CdkVirtualScrollableWindow extends CdkVirtualScrollable {\n constructor(scrollDispatcher, ngZone, dir) {\n super(new ElementRef(document.documentElement), scrollDispatcher, ngZone, dir);\n this._elementScrolled = new Observable(observer => this.ngZone.runOutsideAngular(() => fromEvent(document, 'scroll').pipe(takeUntil(this._destroyed)).subscribe(observer)));\n }\n measureBoundingClientRectWithScrollOffset(from) {\n return this.getElementRef().nativeElement.getBoundingClientRect()[from];\n }\n static {\n this.ɵfac = function CdkVirtualScrollableWindow_Factory(t) {\n return new (t || CdkVirtualScrollableWindow)(i0.ɵɵdirectiveInject(ScrollDispatcher), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i2.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkVirtualScrollableWindow,\n selectors: [[\"cdk-virtual-scroll-viewport\", \"scrollWindow\", \"\"]],\n standalone: true,\n features: [i0.ɵɵProvidersFeature([{\n provide: VIRTUAL_SCROLLABLE,\n useExisting: CdkVirtualScrollableWindow\n }]), i0.ɵɵInheritDefinitionFeature]\n });\n }\n }\n return CdkVirtualScrollableWindow;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet CdkScrollableModule = /*#__PURE__*/(() => {\n class CdkScrollableModule {\n static {\n this.ɵfac = function CdkScrollableModule_Factory(t) {\n return new (t || CdkScrollableModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: CdkScrollableModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return CdkScrollableModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * @docs-primary-export\n */\nlet ScrollingModule = /*#__PURE__*/(() => {\n class ScrollingModule {\n static {\n this.ɵfac = function ScrollingModule_Factory(t) {\n return new (t || ScrollingModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: ScrollingModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [BidiModule, CdkScrollableModule, BidiModule, CdkScrollableModule]\n });\n }\n }\n return ScrollingModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CdkFixedSizeVirtualScroll, CdkScrollable, CdkScrollableModule, CdkVirtualForOf, CdkVirtualScrollViewport, CdkVirtualScrollable, CdkVirtualScrollableElement, CdkVirtualScrollableWindow, DEFAULT_RESIZE_TIME, DEFAULT_SCROLL_TIME, FixedSizeVirtualScrollStrategy, ScrollDispatcher, ScrollingModule, VIRTUAL_SCROLLABLE, VIRTUAL_SCROLL_STRATEGY, ViewportRuler, _fixedSizeVirtualScrollStrategyFactory };\n","import * as i1 from '@angular/cdk/scrolling';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nexport { CdkScrollable, ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\nimport * as i6 from '@angular/common';\nimport { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Inject, Optional, ElementRef, ApplicationRef, ANIMATION_MODULE_TYPE, InjectionToken, inject, Directive, NgZone, EventEmitter, booleanAttribute, Input, Output, NgModule } from '@angular/core';\nimport { coerceCssPixelValue, coerceArray } from '@angular/cdk/coercion';\nimport * as i1$1 from '@angular/cdk/platform';\nimport { supportsScrollBehavior, _getEventTarget, _isTestEnvironment } from '@angular/cdk/platform';\nimport { filter, take, takeUntil, takeWhile } from 'rxjs/operators';\nimport * as i5 from '@angular/cdk/bidi';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport { DomPortalOutlet, TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport { Subject, Subscription, merge } from 'rxjs';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nconst scrollBehaviorSupported = /*#__PURE__*/supportsScrollBehavior();\n/**\n * Strategy that will prevent the user from scrolling while the overlay is visible.\n */\nclass BlockScrollStrategy {\n constructor(_viewportRuler, document) {\n this._viewportRuler = _viewportRuler;\n this._previousHTMLStyles = {\n top: '',\n left: ''\n };\n this._isEnabled = false;\n this._document = document;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach() {}\n /** Blocks page-level scroll while the attached overlay is open. */\n enable() {\n if (this._canBeEnabled()) {\n const root = this._document.documentElement;\n this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition();\n // Cache the previous inline styles in case the user had set them.\n this._previousHTMLStyles.left = root.style.left || '';\n this._previousHTMLStyles.top = root.style.top || '';\n // Note: we're using the `html` node, instead of the `body`, because the `body` may\n // have the user agent margin, whereas the `html` is guaranteed not to have one.\n root.style.left = coerceCssPixelValue(-this._previousScrollPosition.left);\n root.style.top = coerceCssPixelValue(-this._previousScrollPosition.top);\n root.classList.add('cdk-global-scrollblock');\n this._isEnabled = true;\n }\n }\n /** Unblocks page-level scroll while the attached overlay is open. */\n disable() {\n if (this._isEnabled) {\n const html = this._document.documentElement;\n const body = this._document.body;\n const htmlStyle = html.style;\n const bodyStyle = body.style;\n const previousHtmlScrollBehavior = htmlStyle.scrollBehavior || '';\n const previousBodyScrollBehavior = bodyStyle.scrollBehavior || '';\n this._isEnabled = false;\n htmlStyle.left = this._previousHTMLStyles.left;\n htmlStyle.top = this._previousHTMLStyles.top;\n html.classList.remove('cdk-global-scrollblock');\n // Disable user-defined smooth scrolling temporarily while we restore the scroll position.\n // See https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior\n // Note that we don't mutate the property if the browser doesn't support `scroll-behavior`,\n // because it can throw off feature detections in `supportsScrollBehavior` which\n // checks for `'scrollBehavior' in documentElement.style`.\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = bodyStyle.scrollBehavior = 'auto';\n }\n window.scroll(this._previousScrollPosition.left, this._previousScrollPosition.top);\n if (scrollBehaviorSupported) {\n htmlStyle.scrollBehavior = previousHtmlScrollBehavior;\n bodyStyle.scrollBehavior = previousBodyScrollBehavior;\n }\n }\n }\n _canBeEnabled() {\n // Since the scroll strategies can't be singletons, we have to use a global CSS class\n // (`cdk-global-scrollblock`) to make sure that we don't try to disable global\n // scrolling multiple times.\n const html = this._document.documentElement;\n if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) {\n return false;\n }\n const body = this._document.body;\n const viewport = this._viewportRuler.getViewportSize();\n return body.scrollHeight > viewport.height || body.scrollWidth > viewport.width;\n }\n}\n\n/**\n * Returns an error to be thrown when attempting to attach an already-attached scroll strategy.\n */\nfunction getMatScrollStrategyAlreadyAttachedError() {\n return Error(`Scroll strategy has already been attached.`);\n}\n\n/**\n * Strategy that will close the overlay as soon as the user starts scrolling.\n */\nclass CloseScrollStrategy {\n constructor(_scrollDispatcher, _ngZone, _viewportRuler, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._ngZone = _ngZone;\n this._viewportRuler = _viewportRuler;\n this._config = _config;\n this._scrollSubscription = null;\n /** Detaches the overlay ref and disables the scroll strategy. */\n this._detach = () => {\n this.disable();\n if (this._overlayRef.hasAttached()) {\n this._ngZone.run(() => this._overlayRef.detach());\n }\n };\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables the closing of the attached overlay on scroll. */\n enable() {\n if (this._scrollSubscription) {\n return;\n }\n const stream = this._scrollDispatcher.scrolled(0).pipe(filter(scrollable => {\n return !scrollable || !this._overlayRef.overlayElement.contains(scrollable.getElementRef().nativeElement);\n }));\n if (this._config && this._config.threshold && this._config.threshold > 1) {\n this._initialScrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n this._scrollSubscription = stream.subscribe(() => {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition().top;\n if (Math.abs(scrollPosition - this._initialScrollPosition) > this._config.threshold) {\n this._detach();\n } else {\n this._overlayRef.updatePosition();\n }\n });\n } else {\n this._scrollSubscription = stream.subscribe(this._detach);\n }\n }\n /** Disables the closing the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/** Scroll strategy that doesn't do anything. */\nclass NoopScrollStrategy {\n /** Does nothing, as this scroll strategy is a no-op. */\n enable() {}\n /** Does nothing, as this scroll strategy is a no-op. */\n disable() {}\n /** Does nothing, as this scroll strategy is a no-op. */\n attach() {}\n}\n\n/**\n * Gets whether an element is scrolled outside of view by any of its parent scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is scrolled out of view\n * @docs-private\n */\nfunction isElementScrolledOutsideView(element, scrollContainers) {\n return scrollContainers.some(containerBounds => {\n const outsideAbove = element.bottom < containerBounds.top;\n const outsideBelow = element.top > containerBounds.bottom;\n const outsideLeft = element.right < containerBounds.left;\n const outsideRight = element.left > containerBounds.right;\n return outsideAbove || outsideBelow || outsideLeft || outsideRight;\n });\n}\n/**\n * Gets whether an element is clipped by any of its scrolling containers.\n * @param element Dimensions of the element (from getBoundingClientRect)\n * @param scrollContainers Dimensions of element's scrolling containers (from getBoundingClientRect)\n * @returns Whether the element is clipped\n * @docs-private\n */\nfunction isElementClippedByScrolling(element, scrollContainers) {\n return scrollContainers.some(scrollContainerRect => {\n const clippedAbove = element.top < scrollContainerRect.top;\n const clippedBelow = element.bottom > scrollContainerRect.bottom;\n const clippedLeft = element.left < scrollContainerRect.left;\n const clippedRight = element.right > scrollContainerRect.right;\n return clippedAbove || clippedBelow || clippedLeft || clippedRight;\n });\n}\n\n/**\n * Strategy that will update the element position as the user is scrolling.\n */\nclass RepositionScrollStrategy {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, _config) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n this._config = _config;\n this._scrollSubscription = null;\n }\n /** Attaches this scroll strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatScrollStrategyAlreadyAttachedError();\n }\n this._overlayRef = overlayRef;\n }\n /** Enables repositioning of the attached overlay on scroll. */\n enable() {\n if (!this._scrollSubscription) {\n const throttle = this._config ? this._config.scrollThrottle : 0;\n this._scrollSubscription = this._scrollDispatcher.scrolled(throttle).subscribe(() => {\n this._overlayRef.updatePosition();\n // TODO(crisbeto): make `close` on by default once all components can handle it.\n if (this._config && this._config.autoClose) {\n const overlayRect = this._overlayRef.overlayElement.getBoundingClientRect();\n const {\n width,\n height\n } = this._viewportRuler.getViewportSize();\n // TODO(crisbeto): include all ancestor scroll containers here once\n // we have a way of exposing the trigger element to the scroll strategy.\n const parentRects = [{\n width,\n height,\n bottom: height,\n right: width,\n top: 0,\n left: 0\n }];\n if (isElementScrolledOutsideView(overlayRect, parentRects)) {\n this.disable();\n this._ngZone.run(() => this._overlayRef.detach());\n }\n }\n });\n }\n }\n /** Disables repositioning of the attached overlay on scroll. */\n disable() {\n if (this._scrollSubscription) {\n this._scrollSubscription.unsubscribe();\n this._scrollSubscription = null;\n }\n }\n detach() {\n this.disable();\n this._overlayRef = null;\n }\n}\n\n/**\n * Options for how an overlay will handle scrolling.\n *\n * Users can provide a custom value for `ScrollStrategyOptions` to replace the default\n * behaviors. This class primarily acts as a factory for ScrollStrategy instances.\n */\nlet ScrollStrategyOptions = /*#__PURE__*/(() => {\n class ScrollStrategyOptions {\n constructor(_scrollDispatcher, _viewportRuler, _ngZone, document) {\n this._scrollDispatcher = _scrollDispatcher;\n this._viewportRuler = _viewportRuler;\n this._ngZone = _ngZone;\n /** Do nothing on scroll. */\n this.noop = () => new NoopScrollStrategy();\n /**\n * Close the overlay as soon as the user scrolls.\n * @param config Configuration to be used inside the scroll strategy.\n */\n this.close = config => new CloseScrollStrategy(this._scrollDispatcher, this._ngZone, this._viewportRuler, config);\n /** Block scrolling. */\n this.block = () => new BlockScrollStrategy(this._viewportRuler, this._document);\n /**\n * Update the overlay's position on scroll.\n * @param config Configuration to be used inside the scroll strategy.\n * Allows debouncing the reposition calls.\n */\n this.reposition = config => new RepositionScrollStrategy(this._scrollDispatcher, this._viewportRuler, this._ngZone, config);\n this._document = document;\n }\n static {\n this.ɵfac = function ScrollStrategyOptions_Factory(t) {\n return new (t || ScrollStrategyOptions)(i0.ɵɵinject(i1.ScrollDispatcher), i0.ɵɵinject(i1.ViewportRuler), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: ScrollStrategyOptions,\n factory: ScrollStrategyOptions.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return ScrollStrategyOptions;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Initial configuration used when creating an overlay. */\nclass OverlayConfig {\n constructor(config) {\n /** Strategy to be used when handling scroll events while the overlay is open. */\n this.scrollStrategy = new NoopScrollStrategy();\n /** Custom class to add to the overlay pane. */\n this.panelClass = '';\n /** Whether the overlay has a backdrop. */\n this.hasBackdrop = false;\n /** Custom class to add to the backdrop */\n this.backdropClass = 'cdk-overlay-dark-backdrop';\n /**\n * Whether the overlay should be disposed of 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 this.disposeOnNavigation = false;\n if (config) {\n // Use `Iterable` instead of `Array` because TypeScript, as of 3.6.3,\n // loses the array generic type in the `for of`. But we *also* have to use `Array` because\n // typescript won't iterate over an `Iterable` unless you compile with `--downlevelIteration`\n const configKeys = Object.keys(config);\n for (const key of configKeys) {\n if (config[key] !== undefined) {\n // TypeScript, as of version 3.5, sees the left-hand-side of this expression\n // as \"I don't know *which* key this is, so the only valid value is the intersection\n // of all the possible values.\" In this case, that happens to be `undefined`. TypeScript\n // is not smart enough to see that the right-hand-side is actually an access of the same\n // exact type with the same exact key, meaning that the value type must be identical.\n // So we use `any` to work around this.\n this[key] = config[key];\n }\n }\n }\n }\n}\n\n/** The points of the origin element and the overlay element to connect. */\nclass ConnectionPositionPair {\n constructor(origin, overlay, /** Offset along the X axis. */\n offsetX, /** Offset along the Y axis. */\n offsetY, /** Class(es) to be applied to the panel while this position is active. */\n panelClass) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n this.panelClass = panelClass;\n this.originX = origin.originX;\n this.originY = origin.originY;\n this.overlayX = overlay.overlayX;\n this.overlayY = overlay.overlayY;\n }\n}\n/**\n * Set of properties regarding the position of the origin and overlay relative to the viewport\n * with respect to the containing Scrollable elements.\n *\n * The overlay and origin are clipped if any part of their bounding client rectangle exceeds the\n * bounds of any one of the strategy's Scrollable's bounding client rectangle.\n *\n * The overlay and origin are outside view if there is no overlap between their bounding client\n * rectangle and any one of the strategy's Scrollable's bounding client rectangle.\n *\n * ----------- -----------\n * | outside | | clipped |\n * | view | --------------------------\n * | | | | | |\n * ---------- | ----------- |\n * -------------------------- | |\n * | | | Scrollable |\n * | | | |\n * | | --------------------------\n * | Scrollable |\n * | |\n * --------------------------\n *\n * @docs-private\n */\nclass ScrollingVisibility {}\n/** The change event emitted by the strategy when a fallback position is used. */\nclass ConnectedOverlayPositionChange {\n constructor( /** The position used as a result of this change. */\n connectionPair, /** @docs-private */\n scrollableViewProperties) {\n this.connectionPair = connectionPair;\n this.scrollableViewProperties = scrollableViewProperties;\n }\n}\n/**\n * Validates whether a vertical position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateVerticalPosition(property, value) {\n if (value !== 'top' && value !== 'bottom' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"top\", \"bottom\" or \"center\".`);\n }\n}\n/**\n * Validates whether a horizontal position property matches the expected values.\n * @param property Name of the property being validated.\n * @param value Value of the property being validated.\n * @docs-private\n */\nfunction validateHorizontalPosition(property, value) {\n if (value !== 'start' && value !== 'end' && value !== 'center') {\n throw Error(`ConnectedPosition: Invalid ${property} \"${value}\". ` + `Expected \"start\", \"end\" or \"center\".`);\n }\n}\n\n/**\n * Service for dispatching events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet BaseOverlayDispatcher = /*#__PURE__*/(() => {\n class BaseOverlayDispatcher {\n constructor(document) {\n /** Currently attached overlays in the order they were attached. */\n this._attachedOverlays = [];\n this._document = document;\n }\n ngOnDestroy() {\n this.detach();\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n // Ensure that we don't get the same overlay multiple times.\n this.remove(overlayRef);\n this._attachedOverlays.push(overlayRef);\n }\n /** Remove an overlay from the list of attached overlay refs. */\n remove(overlayRef) {\n const index = this._attachedOverlays.indexOf(overlayRef);\n if (index > -1) {\n this._attachedOverlays.splice(index, 1);\n }\n // Remove the global listener once there are no more overlays.\n if (this._attachedOverlays.length === 0) {\n this.detach();\n }\n }\n static {\n this.ɵfac = function BaseOverlayDispatcher_Factory(t) {\n return new (t || BaseOverlayDispatcher)(i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: BaseOverlayDispatcher,\n factory: BaseOverlayDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return BaseOverlayDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching keyboard events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayKeyboardDispatcher = /*#__PURE__*/(() => {\n class OverlayKeyboardDispatcher extends BaseOverlayDispatcher {\n constructor(document, /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._ngZone = _ngZone;\n /** Keyboard event listener that will be attached to the body. */\n this._keydownListener = event => {\n const overlays = this._attachedOverlays;\n for (let i = overlays.length - 1; i > -1; i--) {\n // Dispatch the keydown event to the top overlay which has subscribers to its keydown events.\n // We want to target the most recent overlay, rather than trying to match where the event came\n // from, because some components might open an overlay, but keep focus on a trigger element\n // (e.g. for select and autocomplete). We skip overlays without keydown event subscriptions,\n // because we don't want overlays that don't handle keyboard events to block the ones below\n // them that do.\n if (overlays[i]._keydownEvents.observers.length > 0) {\n const keydownEvents = overlays[i]._keydownEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => keydownEvents.next(event));\n } else {\n keydownEvents.next(event);\n }\n break;\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Lazily start dispatcher once first overlay is added\n if (!this._isAttached) {\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._document.body.addEventListener('keydown', this._keydownListener));\n } else {\n this._document.body.addEventListener('keydown', this._keydownListener);\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n this._document.body.removeEventListener('keydown', this._keydownListener);\n this._isAttached = false;\n }\n }\n static {\n this.ɵfac = function OverlayKeyboardDispatcher_Factory(t) {\n return new (t || OverlayKeyboardDispatcher)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i0.NgZone, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayKeyboardDispatcher,\n factory: OverlayKeyboardDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayKeyboardDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Service for dispatching mouse click events that land on the body to appropriate overlay ref,\n * if any. It maintains a list of attached overlays to determine best suited overlay based\n * on event target and order of overlay opens.\n */\nlet OverlayOutsideClickDispatcher = /*#__PURE__*/(() => {\n class OverlayOutsideClickDispatcher extends BaseOverlayDispatcher {\n constructor(document, _platform, /** @breaking-change 14.0.0 _ngZone will be required. */\n _ngZone) {\n super(document);\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._cursorStyleIsSet = false;\n /** Store pointerdown event target to track origin of click. */\n this._pointerDownListener = event => {\n this._pointerDownEventTarget = _getEventTarget(event);\n };\n /** Click event listener that will be attached to the body propagate phase. */\n this._clickListener = event => {\n const target = _getEventTarget(event);\n // In case of a click event, we want to check the origin of the click\n // (e.g. in case where a user starts a click inside the overlay and\n // releases the click outside of it).\n // This is done by using the event target of the preceding pointerdown event.\n // Every click event caused by a pointer device has a preceding pointerdown\n // event, unless the click was programmatically triggered (e.g. in a unit test).\n const origin = event.type === 'click' && this._pointerDownEventTarget ? this._pointerDownEventTarget : target;\n // Reset the stored pointerdown event target, to avoid having it interfere\n // in subsequent events.\n this._pointerDownEventTarget = null;\n // We copy the array because the original may be modified asynchronously if the\n // outsidePointerEvents listener decides to detach overlays resulting in index errors inside\n // the for loop.\n const overlays = this._attachedOverlays.slice();\n // Dispatch the mouse event to the top overlay which has subscribers to its mouse events.\n // We want to target all overlays for which the click could be considered as outside click.\n // As soon as we reach an overlay for which the click is not outside click we break off\n // the loop.\n for (let i = overlays.length - 1; i > -1; i--) {\n const overlayRef = overlays[i];\n if (overlayRef._outsidePointerEvents.observers.length < 1 || !overlayRef.hasAttached()) {\n continue;\n }\n // If it's a click inside the overlay, just break - we should do nothing\n // If it's an outside click (both origin and target of the click) dispatch the mouse event,\n // and proceed with the next overlay\n if (overlayRef.overlayElement.contains(target) || overlayRef.overlayElement.contains(origin)) {\n break;\n }\n const outsidePointerEvents = overlayRef._outsidePointerEvents;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.run(() => outsidePointerEvents.next(event));\n } else {\n outsidePointerEvents.next(event);\n }\n }\n };\n }\n /** Add a new overlay to the list of attached overlay refs. */\n add(overlayRef) {\n super.add(overlayRef);\n // Safari on iOS does not generate click events for non-interactive\n // elements. However, we want to receive a click for any element outside\n // the overlay. We can force a \"clickable\" state by setting\n // `cursor: pointer` on the document body. See:\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile\n // https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html\n if (!this._isAttached) {\n const body = this._document.body;\n /** @breaking-change 14.0.0 _ngZone will be required. */\n if (this._ngZone) {\n this._ngZone.runOutsideAngular(() => this._addEventListeners(body));\n } else {\n this._addEventListeners(body);\n }\n // click event is not fired on iOS. To make element \"clickable\" we are\n // setting the cursor to pointer\n if (this._platform.IOS && !this._cursorStyleIsSet) {\n this._cursorOriginalValue = body.style.cursor;\n body.style.cursor = 'pointer';\n this._cursorStyleIsSet = true;\n }\n this._isAttached = true;\n }\n }\n /** Detaches the global keyboard event listener. */\n detach() {\n if (this._isAttached) {\n const body = this._document.body;\n body.removeEventListener('pointerdown', this._pointerDownListener, true);\n body.removeEventListener('click', this._clickListener, true);\n body.removeEventListener('auxclick', this._clickListener, true);\n body.removeEventListener('contextmenu', this._clickListener, true);\n if (this._platform.IOS && this._cursorStyleIsSet) {\n body.style.cursor = this._cursorOriginalValue;\n this._cursorStyleIsSet = false;\n }\n this._isAttached = false;\n }\n }\n _addEventListeners(body) {\n body.addEventListener('pointerdown', this._pointerDownListener, true);\n body.addEventListener('click', this._clickListener, true);\n body.addEventListener('auxclick', this._clickListener, true);\n body.addEventListener('contextmenu', this._clickListener, true);\n }\n static {\n this.ɵfac = function OverlayOutsideClickDispatcher_Factory(t) {\n return new (t || OverlayOutsideClickDispatcher)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform), i0.ɵɵinject(i0.NgZone, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayOutsideClickDispatcher,\n factory: OverlayOutsideClickDispatcher.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayOutsideClickDispatcher;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Container inside which all overlays will render. */\nlet OverlayContainer = /*#__PURE__*/(() => {\n class OverlayContainer {\n constructor(document, _platform) {\n this._platform = _platform;\n this._document = document;\n }\n ngOnDestroy() {\n this._containerElement?.remove();\n }\n /**\n * This method returns the overlay container element. It will lazily\n * create the element the first time it is called to facilitate using\n * the container in non-browser environments.\n * @returns the container element\n */\n getContainerElement() {\n if (!this._containerElement) {\n this._createContainer();\n }\n return this._containerElement;\n }\n /**\n * Create the overlay container element, which is simply a div\n * with the 'cdk-overlay-container' class on the document body.\n */\n _createContainer() {\n const containerClass = 'cdk-overlay-container';\n // TODO(crisbeto): remove the testing check once we have an overlay testing\n // module or Angular starts tearing down the testing `NgModule`. See:\n // https://github.com/angular/angular/issues/18831\n if (this._platform.isBrowser || _isTestEnvironment()) {\n const oppositePlatformContainers = this._document.querySelectorAll(`.${containerClass}[platform=\"server\"], ` + `.${containerClass}[platform=\"test\"]`);\n // Remove any old containers from the opposite platform.\n // This can happen when transitioning from the server to the client.\n for (let i = 0; i < oppositePlatformContainers.length; i++) {\n oppositePlatformContainers[i].remove();\n }\n }\n const container = this._document.createElement('div');\n container.classList.add(containerClass);\n // A long time ago we kept adding new overlay containers whenever a new app was instantiated,\n // but at some point we added logic which clears the duplicate ones in order to avoid leaks.\n // The new logic was a little too aggressive since it was breaking some legitimate use cases.\n // To mitigate the problem we made it so that only containers from a different platform are\n // cleared, but the side-effect was that people started depending on the overly-aggressive\n // logic to clean up their tests for them. Until we can introduce an overlay-specific testing\n // module which does the cleanup, we try to detect that we're in a test environment and we\n // always clear the container. See #17006.\n // TODO(crisbeto): remove the test environment check once we have an overlay testing module.\n if (_isTestEnvironment()) {\n container.setAttribute('platform', 'test');\n } else if (!this._platform.isBrowser) {\n container.setAttribute('platform', 'server');\n }\n this._document.body.appendChild(container);\n this._containerElement = container;\n }\n static {\n this.ɵfac = function OverlayContainer_Factory(t) {\n return new (t || OverlayContainer)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayContainer,\n factory: OverlayContainer.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayContainer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Reference to an overlay that has been created with the Overlay service.\n * Used to manipulate or dispose of said overlay.\n */\nclass OverlayRef {\n constructor(_portalOutlet, _host, _pane, _config, _ngZone, _keyboardDispatcher, _document, _location, _outsideClickDispatcher, _animationsDisabled = false) {\n this._portalOutlet = _portalOutlet;\n this._host = _host;\n this._pane = _pane;\n this._config = _config;\n this._ngZone = _ngZone;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._document = _document;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n this._animationsDisabled = _animationsDisabled;\n this._backdropElement = null;\n this._backdropClick = new Subject();\n this._attachments = new Subject();\n this._detachments = new Subject();\n this._locationChanges = Subscription.EMPTY;\n this._backdropClickHandler = event => this._backdropClick.next(event);\n this._backdropTransitionendHandler = event => {\n this._disposeBackdrop(event.target);\n };\n /** Stream of keydown events dispatched to this overlay. */\n this._keydownEvents = new Subject();\n /** Stream of mouse outside events dispatched to this overlay. */\n this._outsidePointerEvents = new Subject();\n if (_config.scrollStrategy) {\n this._scrollStrategy = _config.scrollStrategy;\n this._scrollStrategy.attach(this);\n }\n this._positionStrategy = _config.positionStrategy;\n }\n /** The overlay's HTML element */\n get overlayElement() {\n return this._pane;\n }\n /** The overlay's backdrop HTML element. */\n get backdropElement() {\n return this._backdropElement;\n }\n /**\n * Wrapper around the panel element. Can be used for advanced\n * positioning where a wrapper with specific styling is\n * required around the overlay pane.\n */\n get hostElement() {\n return this._host;\n }\n /**\n * Attaches content, given via a Portal, to the overlay.\n * If the overlay is configured to have a backdrop, it will be created.\n *\n * @param portal Portal instance to which to attach the overlay.\n * @returns The portal attachment result.\n */\n attach(portal) {\n // Insert the host into the DOM before attaching the portal, otherwise\n // the animations module will skip animations on repeat attachments.\n if (!this._host.parentElement && this._previousHostParent) {\n this._previousHostParent.appendChild(this._host);\n }\n const attachResult = this._portalOutlet.attach(portal);\n if (this._positionStrategy) {\n this._positionStrategy.attach(this);\n }\n this._updateStackingOrder();\n this._updateElementSize();\n this._updateElementDirection();\n if (this._scrollStrategy) {\n this._scrollStrategy.enable();\n }\n // Update the position once the zone is stable so that the overlay will be fully rendered\n // before attempting to position it, as the position may depend on the size of the rendered\n // content.\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n // The overlay could've been detached before the zone has stabilized.\n if (this.hasAttached()) {\n this.updatePosition();\n }\n });\n // Enable pointer events for the overlay pane element.\n this._togglePointerEvents(true);\n if (this._config.hasBackdrop) {\n this._attachBackdrop();\n }\n if (this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, true);\n }\n // Only emit the `attachments` event once all other setup is done.\n this._attachments.next();\n // Track this overlay by the keyboard dispatcher\n this._keyboardDispatcher.add(this);\n if (this._config.disposeOnNavigation) {\n this._locationChanges = this._location.subscribe(() => this.dispose());\n }\n this._outsideClickDispatcher.add(this);\n // TODO(crisbeto): the null check is here, because the portal outlet returns `any`.\n // We should be guaranteed for the result to be `ComponentRef | EmbeddedViewRef`, but\n // `instanceof EmbeddedViewRef` doesn't appear to work at the moment.\n if (typeof attachResult?.onDestroy === 'function') {\n // In most cases we control the portal and we know when it is being detached so that\n // we can finish the disposal process. The exception is if the user passes in a custom\n // `ViewContainerRef` that isn't destroyed through the overlay API. Note that we use\n // `detach` here instead of `dispose`, because we don't know if the user intends to\n // reattach the overlay at a later point. It also has the advantage of waiting for animations.\n attachResult.onDestroy(() => {\n if (this.hasAttached()) {\n // We have to delay the `detach` call, because detaching immediately prevents\n // other destroy hooks from running. This is likely a framework bug similar to\n // https://github.com/angular/angular/issues/46119\n this._ngZone.runOutsideAngular(() => Promise.resolve().then(() => this.detach()));\n }\n });\n }\n return attachResult;\n }\n /**\n * Detaches an overlay from a portal.\n * @returns The portal detachment result.\n */\n detach() {\n if (!this.hasAttached()) {\n return;\n }\n this.detachBackdrop();\n // When the overlay is detached, the pane element should disable pointer events.\n // This is necessary because otherwise the pane element will cover the page and disable\n // pointer events therefore. Depends on the position strategy and the applied pane boundaries.\n this._togglePointerEvents(false);\n if (this._positionStrategy && this._positionStrategy.detach) {\n this._positionStrategy.detach();\n }\n if (this._scrollStrategy) {\n this._scrollStrategy.disable();\n }\n const detachmentResult = this._portalOutlet.detach();\n // Only emit after everything is detached.\n this._detachments.next();\n // Remove this overlay from keyboard dispatcher tracking.\n this._keyboardDispatcher.remove(this);\n // Keeping the host element in the DOM can cause scroll jank, because it still gets\n // rendered, even though it's transparent and unclickable which is why we remove it.\n this._detachContentWhenStable();\n this._locationChanges.unsubscribe();\n this._outsideClickDispatcher.remove(this);\n return detachmentResult;\n }\n /** Cleans up the overlay from the DOM. */\n dispose() {\n const isAttached = this.hasAttached();\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._disposeScrollStrategy();\n this._disposeBackdrop(this._backdropElement);\n this._locationChanges.unsubscribe();\n this._keyboardDispatcher.remove(this);\n this._portalOutlet.dispose();\n this._attachments.complete();\n this._backdropClick.complete();\n this._keydownEvents.complete();\n this._outsidePointerEvents.complete();\n this._outsideClickDispatcher.remove(this);\n this._host?.remove();\n this._previousHostParent = this._pane = this._host = null;\n if (isAttached) {\n this._detachments.next();\n }\n this._detachments.complete();\n }\n /** Whether the overlay has attached content. */\n hasAttached() {\n return this._portalOutlet.hasAttached();\n }\n /** Gets an observable that emits when the backdrop has been clicked. */\n backdropClick() {\n return this._backdropClick;\n }\n /** Gets an observable that emits when the overlay has been attached. */\n attachments() {\n return this._attachments;\n }\n /** Gets an observable that emits when the overlay has been detached. */\n detachments() {\n return this._detachments;\n }\n /** Gets an observable of keydown events targeted to this overlay. */\n keydownEvents() {\n return this._keydownEvents;\n }\n /** Gets an observable of pointer events targeted outside this overlay. */\n outsidePointerEvents() {\n return this._outsidePointerEvents;\n }\n /** Gets the current overlay configuration, which is immutable. */\n getConfig() {\n return this._config;\n }\n /** Updates the position of the overlay based on the position strategy. */\n updatePosition() {\n if (this._positionStrategy) {\n this._positionStrategy.apply();\n }\n }\n /** Switches to a new position strategy and updates the overlay position. */\n updatePositionStrategy(strategy) {\n if (strategy === this._positionStrategy) {\n return;\n }\n if (this._positionStrategy) {\n this._positionStrategy.dispose();\n }\n this._positionStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n this.updatePosition();\n }\n }\n /** Update the size properties of the overlay. */\n updateSize(sizeConfig) {\n this._config = {\n ...this._config,\n ...sizeConfig\n };\n this._updateElementSize();\n }\n /** Sets the LTR/RTL direction for the overlay. */\n setDirection(dir) {\n this._config = {\n ...this._config,\n direction: dir\n };\n this._updateElementDirection();\n }\n /** Add a CSS class or an array of classes to the overlay pane. */\n addPanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, true);\n }\n }\n /** Remove a CSS class or an array of classes from the overlay pane. */\n removePanelClass(classes) {\n if (this._pane) {\n this._toggleClasses(this._pane, classes, false);\n }\n }\n /**\n * Returns the layout direction of the overlay panel.\n */\n getDirection() {\n const direction = this._config.direction;\n if (!direction) {\n return 'ltr';\n }\n return typeof direction === 'string' ? direction : direction.value;\n }\n /** Switches to a new scroll strategy. */\n updateScrollStrategy(strategy) {\n if (strategy === this._scrollStrategy) {\n return;\n }\n this._disposeScrollStrategy();\n this._scrollStrategy = strategy;\n if (this.hasAttached()) {\n strategy.attach(this);\n strategy.enable();\n }\n }\n /** Updates the text direction of the overlay panel. */\n _updateElementDirection() {\n this._host.setAttribute('dir', this.getDirection());\n }\n /** Updates the size of the overlay element based on the overlay config. */\n _updateElementSize() {\n if (!this._pane) {\n return;\n }\n const style = this._pane.style;\n style.width = coerceCssPixelValue(this._config.width);\n style.height = coerceCssPixelValue(this._config.height);\n style.minWidth = coerceCssPixelValue(this._config.minWidth);\n style.minHeight = coerceCssPixelValue(this._config.minHeight);\n style.maxWidth = coerceCssPixelValue(this._config.maxWidth);\n style.maxHeight = coerceCssPixelValue(this._config.maxHeight);\n }\n /** Toggles the pointer events for the overlay pane element. */\n _togglePointerEvents(enablePointer) {\n this._pane.style.pointerEvents = enablePointer ? '' : 'none';\n }\n /** Attaches a backdrop for this overlay. */\n _attachBackdrop() {\n const showingClass = 'cdk-overlay-backdrop-showing';\n this._backdropElement = this._document.createElement('div');\n this._backdropElement.classList.add('cdk-overlay-backdrop');\n if (this._animationsDisabled) {\n this._backdropElement.classList.add('cdk-overlay-backdrop-noop-animation');\n }\n if (this._config.backdropClass) {\n this._toggleClasses(this._backdropElement, this._config.backdropClass, true);\n }\n // Insert the backdrop before the pane in the DOM order,\n // in order to handle stacked overlays properly.\n this._host.parentElement.insertBefore(this._backdropElement, this._host);\n // Forward backdrop clicks such that the consumer of the overlay can perform whatever\n // action desired when such a click occurs (usually closing the overlay).\n this._backdropElement.addEventListener('click', this._backdropClickHandler);\n // Add class to fade-in the backdrop after one frame.\n if (!this._animationsDisabled && typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => {\n if (this._backdropElement) {\n this._backdropElement.classList.add(showingClass);\n }\n });\n });\n } else {\n this._backdropElement.classList.add(showingClass);\n }\n }\n /**\n * Updates the stacking order of the element, moving it to the top if necessary.\n * This is required in cases where one overlay was detached, while another one,\n * that should be behind it, was destroyed. The next time both of them are opened,\n * the stacking will be wrong, because the detached element's pane will still be\n * in its original DOM position.\n */\n _updateStackingOrder() {\n if (this._host.nextSibling) {\n this._host.parentNode.appendChild(this._host);\n }\n }\n /** Detaches the backdrop (if any) associated with the overlay. */\n detachBackdrop() {\n const backdropToDetach = this._backdropElement;\n if (!backdropToDetach) {\n return;\n }\n if (this._animationsDisabled) {\n this._disposeBackdrop(backdropToDetach);\n return;\n }\n backdropToDetach.classList.remove('cdk-overlay-backdrop-showing');\n this._ngZone.runOutsideAngular(() => {\n backdropToDetach.addEventListener('transitionend', this._backdropTransitionendHandler);\n });\n // If the backdrop doesn't have a transition, the `transitionend` event won't fire.\n // In this case we make it unclickable and we try to remove it after a delay.\n backdropToDetach.style.pointerEvents = 'none';\n // Run this outside the Angular zone because there's nothing that Angular cares about.\n // If it were to run inside the Angular zone, every test that used Overlay would have to be\n // either async or fakeAsync.\n this._backdropTimeout = this._ngZone.runOutsideAngular(() => setTimeout(() => {\n this._disposeBackdrop(backdropToDetach);\n }, 500));\n }\n /** Toggles a single CSS class or an array of classes on an element. */\n _toggleClasses(element, cssClasses, isAdd) {\n const classes = coerceArray(cssClasses || []).filter(c => !!c);\n if (classes.length) {\n isAdd ? element.classList.add(...classes) : element.classList.remove(...classes);\n }\n }\n /** Detaches the overlay content next time the zone stabilizes. */\n _detachContentWhenStable() {\n // Normally we wouldn't have to explicitly run this outside the `NgZone`, however\n // if the consumer is using `zone-patch-rxjs`, the `Subscription.unsubscribe` call will\n // be patched to run inside the zone, which will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => {\n // We can't remove the host here immediately, because the overlay pane's content\n // might still be animating. This stream helps us avoid interrupting the animation\n // by waiting for the pane to become empty.\n const subscription = this._ngZone.onStable.pipe(takeUntil(merge(this._attachments, this._detachments))).subscribe(() => {\n // Needs a couple of checks for the pane and host, because\n // they may have been removed by the time the zone stabilizes.\n if (!this._pane || !this._host || this._pane.children.length === 0) {\n if (this._pane && this._config.panelClass) {\n this._toggleClasses(this._pane, this._config.panelClass, false);\n }\n if (this._host && this._host.parentElement) {\n this._previousHostParent = this._host.parentElement;\n this._host.remove();\n }\n subscription.unsubscribe();\n }\n });\n });\n }\n /** Disposes of a scroll strategy. */\n _disposeScrollStrategy() {\n const scrollStrategy = this._scrollStrategy;\n if (scrollStrategy) {\n scrollStrategy.disable();\n if (scrollStrategy.detach) {\n scrollStrategy.detach();\n }\n }\n }\n /** Removes a backdrop element from the DOM. */\n _disposeBackdrop(backdrop) {\n if (backdrop) {\n backdrop.removeEventListener('click', this._backdropClickHandler);\n backdrop.removeEventListener('transitionend', this._backdropTransitionendHandler);\n backdrop.remove();\n // It is possible that a new portal has been attached to this overlay since we started\n // removing the backdrop. If that is the case, only clear the backdrop reference if it\n // is still the same instance that we started to remove.\n if (this._backdropElement === backdrop) {\n this._backdropElement = null;\n }\n }\n if (this._backdropTimeout) {\n clearTimeout(this._backdropTimeout);\n this._backdropTimeout = undefined;\n }\n }\n}\n\n// TODO: refactor clipping detection into a separate thing (part of scrolling module)\n// TODO: doesn't handle both flexible width and height when it has to scroll along both axis.\n/** Class to be added to the overlay bounding box. */\nconst boundingBoxClass = 'cdk-overlay-connected-position-bounding-box';\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * implicit position relative some origin element. The relative position is defined in terms of\n * a point on the origin element that is connected to a point on the overlay element. For example,\n * a basic dropdown is connecting the bottom-left corner of the origin to the top-left corner\n * of the overlay.\n */\nclass FlexibleConnectedPositionStrategy {\n /** Ordered list of preferred positions, from most to least desirable. */\n get positions() {\n return this._preferredPositions;\n }\n constructor(connectedTo, _viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n /** Last size used for the bounding box. Used to avoid resizing the overlay after open. */\n this._lastBoundingBoxSize = {\n width: 0,\n height: 0\n };\n /** Whether the overlay was pushed in a previous positioning. */\n this._isPushed = false;\n /** Whether the overlay can be pushed on-screen on the initial open. */\n this._canPush = true;\n /** Whether the overlay can grow via flexible width/height after the initial open. */\n this._growAfterOpen = false;\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n this._hasFlexibleDimensions = true;\n /** Whether the overlay position is locked. */\n this._positionLocked = false;\n /** Amount of space that must be maintained between the overlay and the edge of the viewport. */\n this._viewportMargin = 0;\n /** The Scrollable containers used to check scrollable view properties on position change. */\n this._scrollables = [];\n /** Ordered list of preferred positions, from most to least desirable. */\n this._preferredPositions = [];\n /** Subject that emits whenever the position changes. */\n this._positionChanges = new Subject();\n /** Subscription to viewport size changes. */\n this._resizeSubscription = Subscription.EMPTY;\n /** Default offset for the overlay along the x axis. */\n this._offsetX = 0;\n /** Default offset for the overlay along the y axis. */\n this._offsetY = 0;\n /** Keeps track of the CSS classes that the position strategy has applied on the overlay panel. */\n this._appliedPanelClasses = [];\n /** Observable sequence of position changes. */\n this.positionChanges = this._positionChanges;\n this.setOrigin(connectedTo);\n }\n /** Attaches this position strategy to an overlay. */\n attach(overlayRef) {\n if (this._overlayRef && overlayRef !== this._overlayRef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('This position strategy is already attached to an overlay');\n }\n this._validatePositions();\n overlayRef.hostElement.classList.add(boundingBoxClass);\n this._overlayRef = overlayRef;\n this._boundingBox = overlayRef.hostElement;\n this._pane = overlayRef.overlayElement;\n this._isDisposed = false;\n this._isInitialRender = true;\n this._lastPosition = null;\n this._resizeSubscription.unsubscribe();\n this._resizeSubscription = this._viewportRuler.change().subscribe(() => {\n // When the window is resized, we want to trigger the next reposition as if it\n // was an initial render, in order for the strategy to pick a new optimal position,\n // otherwise position locking will cause it to stay at the old one.\n this._isInitialRender = true;\n this.apply();\n });\n }\n /**\n * Updates the position of the overlay element, using whichever preferred position relative\n * to the origin best fits on-screen.\n *\n * The selection of a position goes as follows:\n * - If any positions fit completely within the viewport as-is,\n * choose the first position that does so.\n * - If flexible dimensions are enabled and at least one satisfies the given minimum width/height,\n * choose the position with the greatest available size modified by the positions' weight.\n * - If pushing is enabled, take the position that went off-screen the least and push it\n * on-screen.\n * - If none of the previous criteria were met, use the position that goes off-screen the least.\n * @docs-private\n */\n apply() {\n // We shouldn't do anything if the strategy was disposed or we're on the server.\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n // If the position has been applied already (e.g. when the overlay was opened) and the\n // consumer opted into locking in the position, re-use the old position, in order to\n // prevent the overlay from jumping around.\n if (!this._isInitialRender && this._positionLocked && this._lastPosition) {\n this.reapplyLastPosition();\n return;\n }\n this._clearPanelClasses();\n this._resetOverlayElementStyles();\n this._resetBoundingBoxStyles();\n // We need the bounding rects for the origin, the overlay and the container to determine how to position\n // the overlay relative to the origin.\n // We use the viewport rect to determine whether a position would go off-screen.\n this._viewportRect = this._getNarrowedViewportRect();\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originRect = this._originRect;\n const overlayRect = this._overlayRect;\n const viewportRect = this._viewportRect;\n const containerRect = this._containerRect;\n // Positions where the overlay will fit with flexible dimensions.\n const flexibleFits = [];\n // Fallback if none of the preferred positions fit within the viewport.\n let fallback;\n // Go through each of the preferred positions looking for a good fit.\n // If a good fit is found, it will be applied immediately.\n for (let pos of this._preferredPositions) {\n // Get the exact (x, y) coordinate for the point-of-origin on the origin element.\n let originPoint = this._getOriginPoint(originRect, containerRect, pos);\n // From that point-of-origin, get the exact (x, y) coordinate for the top-left corner of the\n // overlay in this position. We use the top-left corner for calculations and later translate\n // this into an appropriate (top, left, bottom, right) style.\n let overlayPoint = this._getOverlayPoint(originPoint, overlayRect, pos);\n // Calculate how well the overlay would fit into the viewport with this point.\n let overlayFit = this._getOverlayFit(overlayPoint, overlayRect, viewportRect, pos);\n // If the overlay, without any further work, fits into the viewport, use this position.\n if (overlayFit.isCompletelyWithinViewport) {\n this._isPushed = false;\n this._applyPosition(pos, originPoint);\n return;\n }\n // If the overlay has flexible dimensions, we can use this position\n // so long as there's enough space for the minimum dimensions.\n if (this._canFitWithFlexibleDimensions(overlayFit, overlayPoint, viewportRect)) {\n // Save positions where the overlay will fit with flexible dimensions. We will use these\n // if none of the positions fit *without* flexible dimensions.\n flexibleFits.push({\n position: pos,\n origin: originPoint,\n overlayRect,\n boundingBoxRect: this._calculateBoundingBoxRect(originPoint, pos)\n });\n continue;\n }\n // If the current preferred position does not fit on the screen, remember the position\n // if it has more visible area on-screen than we've seen and move onto the next preferred\n // position.\n if (!fallback || fallback.overlayFit.visibleArea < overlayFit.visibleArea) {\n fallback = {\n overlayFit,\n overlayPoint,\n originPoint,\n position: pos,\n overlayRect\n };\n }\n }\n // If there are any positions where the overlay would fit with flexible dimensions, choose the\n // one that has the greatest area available modified by the position's weight\n if (flexibleFits.length) {\n let bestFit = null;\n let bestScore = -1;\n for (const fit of flexibleFits) {\n const score = fit.boundingBoxRect.width * fit.boundingBoxRect.height * (fit.position.weight || 1);\n if (score > bestScore) {\n bestScore = score;\n bestFit = fit;\n }\n }\n this._isPushed = false;\n this._applyPosition(bestFit.position, bestFit.origin);\n return;\n }\n // When none of the preferred positions fit within the viewport, take the position\n // that went off-screen the least and attempt to push it on-screen.\n if (this._canPush) {\n // TODO(jelbourn): after pushing, the opening \"direction\" of the overlay might not make sense.\n this._isPushed = true;\n this._applyPosition(fallback.position, fallback.originPoint);\n return;\n }\n // All options for getting the overlay within the viewport have been exhausted, so go with the\n // position that went off-screen the least.\n this._applyPosition(fallback.position, fallback.originPoint);\n }\n detach() {\n this._clearPanelClasses();\n this._lastPosition = null;\n this._previousPushAmount = null;\n this._resizeSubscription.unsubscribe();\n }\n /** Cleanup after the element gets destroyed. */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n // We can't use `_resetBoundingBoxStyles` here, because it resets\n // some properties to zero, rather than removing them.\n if (this._boundingBox) {\n extendStyles(this._boundingBox.style, {\n top: '',\n left: '',\n right: '',\n bottom: '',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: ''\n });\n }\n if (this._pane) {\n this._resetOverlayElementStyles();\n }\n if (this._overlayRef) {\n this._overlayRef.hostElement.classList.remove(boundingBoxClass);\n }\n this.detach();\n this._positionChanges.complete();\n this._overlayRef = this._boundingBox = null;\n this._isDisposed = true;\n }\n /**\n * This re-aligns the overlay element with the trigger in its last calculated position,\n * even if a position higher in the \"preferred positions\" list would now fit. This\n * allows one to re-align the panel without changing the orientation of the panel.\n */\n reapplyLastPosition() {\n if (this._isDisposed || !this._platform.isBrowser) {\n return;\n }\n const lastPosition = this._lastPosition;\n if (lastPosition) {\n this._originRect = this._getOriginRect();\n this._overlayRect = this._pane.getBoundingClientRect();\n this._viewportRect = this._getNarrowedViewportRect();\n this._containerRect = this._overlayContainer.getContainerElement().getBoundingClientRect();\n const originPoint = this._getOriginPoint(this._originRect, this._containerRect, lastPosition);\n this._applyPosition(lastPosition, originPoint);\n } else {\n this.apply();\n }\n }\n /**\n * Sets the list of Scrollable containers that host the origin element so that\n * on reposition we can evaluate if it or the overlay has been clipped or outside view. Every\n * Scrollable must be an ancestor element of the strategy's origin element.\n */\n withScrollableContainers(scrollables) {\n this._scrollables = scrollables;\n return this;\n }\n /**\n * Adds new preferred positions.\n * @param positions List of positions options for this overlay.\n */\n withPositions(positions) {\n this._preferredPositions = positions;\n // If the last calculated position object isn't part of the positions anymore, clear\n // it in order to avoid it being picked up if the consumer tries to re-apply.\n if (positions.indexOf(this._lastPosition) === -1) {\n this._lastPosition = null;\n }\n this._validatePositions();\n return this;\n }\n /**\n * Sets a minimum distance the overlay may be positioned to the edge of the viewport.\n * @param margin Required margin between the overlay and the viewport edge in pixels.\n */\n withViewportMargin(margin) {\n this._viewportMargin = margin;\n return this;\n }\n /** Sets whether the overlay's width and height can be constrained to fit within the viewport. */\n withFlexibleDimensions(flexibleDimensions = true) {\n this._hasFlexibleDimensions = flexibleDimensions;\n return this;\n }\n /** Sets whether the overlay can grow after the initial open via flexible width/height. */\n withGrowAfterOpen(growAfterOpen = true) {\n this._growAfterOpen = growAfterOpen;\n return this;\n }\n /** Sets whether the overlay can be pushed on-screen if none of the provided positions fit. */\n withPush(canPush = true) {\n this._canPush = canPush;\n return this;\n }\n /**\n * Sets whether the overlay's position should be locked in after it is positioned\n * initially. When an overlay is locked in, it won't attempt to reposition itself\n * when the position is re-applied (e.g. when the user scrolls away).\n * @param isLocked Whether the overlay should locked in.\n */\n withLockedPosition(isLocked = true) {\n this._positionLocked = isLocked;\n return this;\n }\n /**\n * Sets the origin, relative to which to position the overlay.\n * Using an element origin is useful for building components that need to be positioned\n * relatively to a trigger (e.g. dropdown menus or tooltips), whereas using a point can be\n * used for cases like contextual menus which open relative to the user's pointer.\n * @param origin Reference to the new origin.\n */\n setOrigin(origin) {\n this._origin = origin;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the x-axis.\n * @param offset New offset in the X axis.\n */\n withDefaultOffsetX(offset) {\n this._offsetX = offset;\n return this;\n }\n /**\n * Sets the default offset for the overlay's connection point on the y-axis.\n * @param offset New offset in the Y axis.\n */\n withDefaultOffsetY(offset) {\n this._offsetY = offset;\n return this;\n }\n /**\n * Configures that the position strategy should set a `transform-origin` on some elements\n * inside the overlay, depending on the current position that is being applied. This is\n * useful for the cases where the origin of an animation can change depending on the\n * alignment of the overlay.\n * @param selector CSS selector that will be used to find the target\n * elements onto which to set the transform origin.\n */\n withTransformOriginOn(selector) {\n this._transformOriginSelector = selector;\n return this;\n }\n /**\n * Gets the (x, y) coordinate of a connection point on the origin based on a relative position.\n */\n _getOriginPoint(originRect, containerRect, pos) {\n let x;\n if (pos.originX == 'center') {\n // Note: when centering we should always use the `left`\n // offset, otherwise the position will be wrong in RTL.\n x = originRect.left + originRect.width / 2;\n } else {\n const startX = this._isRtl() ? originRect.right : originRect.left;\n const endX = this._isRtl() ? originRect.left : originRect.right;\n x = pos.originX == 'start' ? startX : endX;\n }\n // When zooming in Safari the container rectangle contains negative values for the position\n // and we need to re-add them to the calculated coordinates.\n if (containerRect.left < 0) {\n x -= containerRect.left;\n }\n let y;\n if (pos.originY == 'center') {\n y = originRect.top + originRect.height / 2;\n } else {\n y = pos.originY == 'top' ? originRect.top : originRect.bottom;\n }\n // Normally the containerRect's top value would be zero, however when the overlay is attached to an input\n // (e.g. in an autocomplete), mobile browsers will shift everything in order to put the input in the middle\n // of the screen and to make space for the virtual keyboard. We need to account for this offset,\n // otherwise our positioning will be thrown off.\n // Additionally, when zooming in Safari this fixes the vertical position.\n if (containerRect.top < 0) {\n y -= containerRect.top;\n }\n return {\n x,\n y\n };\n }\n /**\n * Gets the (x, y) coordinate of the top-left corner of the overlay given a given position and\n * origin point to which the overlay should be connected.\n */\n _getOverlayPoint(originPoint, overlayRect, pos) {\n // Calculate the (overlayStartX, overlayStartY), the start of the\n // potential overlay position relative to the origin point.\n let overlayStartX;\n if (pos.overlayX == 'center') {\n overlayStartX = -overlayRect.width / 2;\n } else if (pos.overlayX === 'start') {\n overlayStartX = this._isRtl() ? -overlayRect.width : 0;\n } else {\n overlayStartX = this._isRtl() ? 0 : -overlayRect.width;\n }\n let overlayStartY;\n if (pos.overlayY == 'center') {\n overlayStartY = -overlayRect.height / 2;\n } else {\n overlayStartY = pos.overlayY == 'top' ? 0 : -overlayRect.height;\n }\n // The (x, y) coordinates of the overlay.\n return {\n x: originPoint.x + overlayStartX,\n y: originPoint.y + overlayStartY\n };\n }\n /** Gets how well an overlay at the given point will fit within the viewport. */\n _getOverlayFit(point, rawOverlayRect, viewport, position) {\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n let {\n x,\n y\n } = point;\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n // Account for the offsets since they could push the overlay out of the viewport.\n if (offsetX) {\n x += offsetX;\n }\n if (offsetY) {\n y += offsetY;\n }\n // How much the overlay would overflow at this position, on each side.\n let leftOverflow = 0 - x;\n let rightOverflow = x + overlay.width - viewport.width;\n let topOverflow = 0 - y;\n let bottomOverflow = y + overlay.height - viewport.height;\n // Visible parts of the element on each axis.\n let visibleWidth = this._subtractOverflows(overlay.width, leftOverflow, rightOverflow);\n let visibleHeight = this._subtractOverflows(overlay.height, topOverflow, bottomOverflow);\n let visibleArea = visibleWidth * visibleHeight;\n return {\n visibleArea,\n isCompletelyWithinViewport: overlay.width * overlay.height === visibleArea,\n fitsInViewportVertically: visibleHeight === overlay.height,\n fitsInViewportHorizontally: visibleWidth == overlay.width\n };\n }\n /**\n * Whether the overlay can fit within the viewport when it may resize either its width or height.\n * @param fit How well the overlay fits in the viewport at some position.\n * @param point The (x, y) coordinates of the overlay at some position.\n * @param viewport The geometry of the viewport.\n */\n _canFitWithFlexibleDimensions(fit, point, viewport) {\n if (this._hasFlexibleDimensions) {\n const availableHeight = viewport.bottom - point.y;\n const availableWidth = viewport.right - point.x;\n const minHeight = getPixelValue(this._overlayRef.getConfig().minHeight);\n const minWidth = getPixelValue(this._overlayRef.getConfig().minWidth);\n const verticalFit = fit.fitsInViewportVertically || minHeight != null && minHeight <= availableHeight;\n const horizontalFit = fit.fitsInViewportHorizontally || minWidth != null && minWidth <= availableWidth;\n return verticalFit && horizontalFit;\n }\n return false;\n }\n /**\n * Gets the point at which the overlay can be \"pushed\" on-screen. If the overlay is larger than\n * the viewport, the top-left corner will be pushed on-screen (with overflow occurring on the\n * right and bottom).\n *\n * @param start Starting point from which the overlay is pushed.\n * @param rawOverlayRect Dimensions of the overlay.\n * @param scrollPosition Current viewport scroll position.\n * @returns The point at which to position the overlay after pushing. This is effectively a new\n * originPoint.\n */\n _pushOverlayOnScreen(start, rawOverlayRect, scrollPosition) {\n // If the position is locked and we've pushed the overlay already, reuse the previous push\n // amount, rather than pushing it again. If we were to continue pushing, the element would\n // remain in the viewport, which goes against the expectations when position locking is enabled.\n if (this._previousPushAmount && this._positionLocked) {\n return {\n x: start.x + this._previousPushAmount.x,\n y: start.y + this._previousPushAmount.y\n };\n }\n // Round the overlay rect when comparing against the\n // viewport, because the viewport is always rounded.\n const overlay = getRoundedBoundingClientRect(rawOverlayRect);\n const viewport = this._viewportRect;\n // Determine how much the overlay goes outside the viewport on each\n // side, which we'll use to decide which direction to push it.\n const overflowRight = Math.max(start.x + overlay.width - viewport.width, 0);\n const overflowBottom = Math.max(start.y + overlay.height - viewport.height, 0);\n const overflowTop = Math.max(viewport.top - scrollPosition.top - start.y, 0);\n const overflowLeft = Math.max(viewport.left - scrollPosition.left - start.x, 0);\n // Amount by which to push the overlay in each axis such that it remains on-screen.\n let pushX = 0;\n let pushY = 0;\n // If the overlay fits completely within the bounds of the viewport, push it from whichever\n // direction is goes off-screen. Otherwise, push the top-left corner such that its in the\n // viewport and allow for the trailing end of the overlay to go out of bounds.\n if (overlay.width <= viewport.width) {\n pushX = overflowLeft || -overflowRight;\n } else {\n pushX = start.x < this._viewportMargin ? viewport.left - scrollPosition.left - start.x : 0;\n }\n if (overlay.height <= viewport.height) {\n pushY = overflowTop || -overflowBottom;\n } else {\n pushY = start.y < this._viewportMargin ? viewport.top - scrollPosition.top - start.y : 0;\n }\n this._previousPushAmount = {\n x: pushX,\n y: pushY\n };\n return {\n x: start.x + pushX,\n y: start.y + pushY\n };\n }\n /**\n * Applies a computed position to the overlay and emits a position change.\n * @param position The position preference\n * @param originPoint The point on the origin element where the overlay is connected.\n */\n _applyPosition(position, originPoint) {\n this._setTransformOrigin(position);\n this._setOverlayElementStyles(originPoint, position);\n this._setBoundingBoxStyles(originPoint, position);\n if (position.panelClass) {\n this._addPanelClasses(position.panelClass);\n }\n // Notify that the position has been changed along with its change properties.\n // We only emit if we've got any subscriptions, because the scroll visibility\n // calculations can be somewhat expensive.\n if (this._positionChanges.observers.length) {\n const scrollVisibility = this._getScrollVisibility();\n // We're recalculating on scroll, but we only want to emit if anything\n // changed since downstream code might be hitting the `NgZone`.\n if (position !== this._lastPosition || !this._lastScrollVisibility || !compareScrollVisibility(this._lastScrollVisibility, scrollVisibility)) {\n const changeEvent = new ConnectedOverlayPositionChange(position, scrollVisibility);\n this._positionChanges.next(changeEvent);\n }\n this._lastScrollVisibility = scrollVisibility;\n }\n // Save the last connected position in case the position needs to be re-calculated.\n this._lastPosition = position;\n this._isInitialRender = false;\n }\n /** Sets the transform origin based on the configured selector and the passed-in position. */\n _setTransformOrigin(position) {\n if (!this._transformOriginSelector) {\n return;\n }\n const elements = this._boundingBox.querySelectorAll(this._transformOriginSelector);\n let xOrigin;\n let yOrigin = position.overlayY;\n if (position.overlayX === 'center') {\n xOrigin = 'center';\n } else if (this._isRtl()) {\n xOrigin = position.overlayX === 'start' ? 'right' : 'left';\n } else {\n xOrigin = position.overlayX === 'start' ? 'left' : 'right';\n }\n for (let i = 0; i < elements.length; i++) {\n elements[i].style.transformOrigin = `${xOrigin} ${yOrigin}`;\n }\n }\n /**\n * Gets the position and size of the overlay's sizing container.\n *\n * This method does no measuring and applies no styles so that we can cheaply compute the\n * bounds for all positions and choose the best fit based on these results.\n */\n _calculateBoundingBoxRect(origin, position) {\n const viewport = this._viewportRect;\n const isRtl = this._isRtl();\n let height, top, bottom;\n if (position.overlayY === 'top') {\n // Overlay is opening \"downward\" and thus is bound by the bottom viewport edge.\n top = origin.y;\n height = viewport.height - top + this._viewportMargin;\n } else if (position.overlayY === 'bottom') {\n // Overlay is opening \"upward\" and thus is bound by the top viewport edge. We need to add\n // the viewport margin back in, because the viewport rect is narrowed down to remove the\n // margin, whereas the `origin` position is calculated based on its `DOMRect`.\n bottom = viewport.height - origin.y + this._viewportMargin * 2;\n height = viewport.height - bottom + this._viewportMargin;\n } else {\n // If neither top nor bottom, it means that the overlay is vertically centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.bottom - origin.y` and\n // `origin.y - viewport.top`.\n const smallestDistanceToViewportEdge = Math.min(viewport.bottom - origin.y + viewport.top, origin.y);\n const previousHeight = this._lastBoundingBoxSize.height;\n height = smallestDistanceToViewportEdge * 2;\n top = origin.y - smallestDistanceToViewportEdge;\n if (height > previousHeight && !this._isInitialRender && !this._growAfterOpen) {\n top = origin.y - previousHeight / 2;\n }\n }\n // The overlay is opening 'right-ward' (the content flows to the right).\n const isBoundedByRightViewportEdge = position.overlayX === 'start' && !isRtl || position.overlayX === 'end' && isRtl;\n // The overlay is opening 'left-ward' (the content flows to the left).\n const isBoundedByLeftViewportEdge = position.overlayX === 'end' && !isRtl || position.overlayX === 'start' && isRtl;\n let width, left, right;\n if (isBoundedByLeftViewportEdge) {\n right = viewport.width - origin.x + this._viewportMargin * 2;\n width = origin.x - this._viewportMargin;\n } else if (isBoundedByRightViewportEdge) {\n left = origin.x;\n width = viewport.right - origin.x;\n } else {\n // If neither start nor end, it means that the overlay is horizontally centered on the\n // origin point. Note that we want the position relative to the viewport, rather than\n // the page, which is why we don't use something like `viewport.right - origin.x` and\n // `origin.x - viewport.left`.\n const smallestDistanceToViewportEdge = Math.min(viewport.right - origin.x + viewport.left, origin.x);\n const previousWidth = this._lastBoundingBoxSize.width;\n width = smallestDistanceToViewportEdge * 2;\n left = origin.x - smallestDistanceToViewportEdge;\n if (width > previousWidth && !this._isInitialRender && !this._growAfterOpen) {\n left = origin.x - previousWidth / 2;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width,\n height\n };\n }\n /**\n * Sets the position and size of the overlay's sizing wrapper. The wrapper is positioned on the\n * origin's connection point and stretches to the bounds of the viewport.\n *\n * @param origin The point on the origin element where the overlay is connected.\n * @param position The position preference\n */\n _setBoundingBoxStyles(origin, position) {\n const boundingBoxRect = this._calculateBoundingBoxRect(origin, position);\n // It's weird if the overlay *grows* while scrolling, so we take the last size into account\n // when applying a new size.\n if (!this._isInitialRender && !this._growAfterOpen) {\n boundingBoxRect.height = Math.min(boundingBoxRect.height, this._lastBoundingBoxSize.height);\n boundingBoxRect.width = Math.min(boundingBoxRect.width, this._lastBoundingBoxSize.width);\n }\n const styles = {};\n if (this._hasExactPosition()) {\n styles.top = styles.left = '0';\n styles.bottom = styles.right = styles.maxHeight = styles.maxWidth = '';\n styles.width = styles.height = '100%';\n } else {\n const maxHeight = this._overlayRef.getConfig().maxHeight;\n const maxWidth = this._overlayRef.getConfig().maxWidth;\n styles.height = coerceCssPixelValue(boundingBoxRect.height);\n styles.top = coerceCssPixelValue(boundingBoxRect.top);\n styles.bottom = coerceCssPixelValue(boundingBoxRect.bottom);\n styles.width = coerceCssPixelValue(boundingBoxRect.width);\n styles.left = coerceCssPixelValue(boundingBoxRect.left);\n styles.right = coerceCssPixelValue(boundingBoxRect.right);\n // Push the pane content towards the proper direction.\n if (position.overlayX === 'center') {\n styles.alignItems = 'center';\n } else {\n styles.alignItems = position.overlayX === 'end' ? 'flex-end' : 'flex-start';\n }\n if (position.overlayY === 'center') {\n styles.justifyContent = 'center';\n } else {\n styles.justifyContent = position.overlayY === 'bottom' ? 'flex-end' : 'flex-start';\n }\n if (maxHeight) {\n styles.maxHeight = coerceCssPixelValue(maxHeight);\n }\n if (maxWidth) {\n styles.maxWidth = coerceCssPixelValue(maxWidth);\n }\n }\n this._lastBoundingBoxSize = boundingBoxRect;\n extendStyles(this._boundingBox.style, styles);\n }\n /** Resets the styles for the bounding box so that a new positioning can be computed. */\n _resetBoundingBoxStyles() {\n extendStyles(this._boundingBox.style, {\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n height: '',\n width: '',\n alignItems: '',\n justifyContent: ''\n });\n }\n /** Resets the styles for the overlay pane so that a new positioning can be computed. */\n _resetOverlayElementStyles() {\n extendStyles(this._pane.style, {\n top: '',\n left: '',\n bottom: '',\n right: '',\n position: '',\n transform: ''\n });\n }\n /** Sets positioning styles to the overlay element. */\n _setOverlayElementStyles(originPoint, position) {\n const styles = {};\n const hasExactPosition = this._hasExactPosition();\n const hasFlexibleDimensions = this._hasFlexibleDimensions;\n const config = this._overlayRef.getConfig();\n if (hasExactPosition) {\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n extendStyles(styles, this._getExactOverlayY(position, originPoint, scrollPosition));\n extendStyles(styles, this._getExactOverlayX(position, originPoint, scrollPosition));\n } else {\n styles.position = 'static';\n }\n // Use a transform to apply the offsets. We do this because the `center` positions rely on\n // being in the normal flex flow and setting a `top` / `left` at all will completely throw\n // off the position. We also can't use margins, because they won't have an effect in some\n // cases where the element doesn't have anything to \"push off of\". Finally, this works\n // better both with flexible and non-flexible positioning.\n let transformString = '';\n let offsetX = this._getOffset(position, 'x');\n let offsetY = this._getOffset(position, 'y');\n if (offsetX) {\n transformString += `translateX(${offsetX}px) `;\n }\n if (offsetY) {\n transformString += `translateY(${offsetY}px)`;\n }\n styles.transform = transformString.trim();\n // If a maxWidth or maxHeight is specified on the overlay, we remove them. We do this because\n // we need these values to both be set to \"100%\" for the automatic flexible sizing to work.\n // The maxHeight and maxWidth are set on the boundingBox in order to enforce the constraint.\n // Note that this doesn't apply when we have an exact position, in which case we do want to\n // apply them because they'll be cleared from the bounding box.\n if (config.maxHeight) {\n if (hasExactPosition) {\n styles.maxHeight = coerceCssPixelValue(config.maxHeight);\n } else if (hasFlexibleDimensions) {\n styles.maxHeight = '';\n }\n }\n if (config.maxWidth) {\n if (hasExactPosition) {\n styles.maxWidth = coerceCssPixelValue(config.maxWidth);\n } else if (hasFlexibleDimensions) {\n styles.maxWidth = '';\n }\n }\n extendStyles(this._pane.style, styles);\n }\n /** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayY(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the\n // preferred position has changed since the last `apply`.\n let styles = {\n top: '',\n bottom: ''\n };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `top` or `bottom` based on whether the overlay wants to appear\n // above or below the origin and the direction in which the element will expand.\n if (position.overlayY === 'bottom') {\n // When using `bottom`, we adjust the y position such that it is the distance\n // from the bottom of the viewport rather than the top.\n const documentHeight = this._document.documentElement.clientHeight;\n styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`;\n } else {\n styles.top = coerceCssPixelValue(overlayPoint.y);\n }\n return styles;\n }\n /** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */\n _getExactOverlayX(position, originPoint, scrollPosition) {\n // Reset any existing styles. This is necessary in case the preferred position has\n // changed since the last `apply`.\n let styles = {\n left: '',\n right: ''\n };\n let overlayPoint = this._getOverlayPoint(originPoint, this._overlayRect, position);\n if (this._isPushed) {\n overlayPoint = this._pushOverlayOnScreen(overlayPoint, this._overlayRect, scrollPosition);\n }\n // We want to set either `left` or `right` based on whether the overlay wants to appear \"before\"\n // or \"after\" the origin, which determines the direction in which the element will expand.\n // For the horizontal axis, the meaning of \"before\" and \"after\" change based on whether the\n // page is in RTL or LTR.\n let horizontalStyleProperty;\n if (this._isRtl()) {\n horizontalStyleProperty = position.overlayX === 'end' ? 'left' : 'right';\n } else {\n horizontalStyleProperty = position.overlayX === 'end' ? 'right' : 'left';\n }\n // When we're setting `right`, we adjust the x position such that it is the distance\n // from the right edge of the viewport rather than the left edge.\n if (horizontalStyleProperty === 'right') {\n const documentWidth = this._document.documentElement.clientWidth;\n styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`;\n } else {\n styles.left = coerceCssPixelValue(overlayPoint.x);\n }\n return styles;\n }\n /**\n * Gets the view properties of the trigger and overlay, including whether they are clipped\n * or completely outside the view of any of the strategy's scrollables.\n */\n _getScrollVisibility() {\n // Note: needs fresh rects since the position could've changed.\n const originBounds = this._getOriginRect();\n const overlayBounds = this._pane.getBoundingClientRect();\n // TODO(jelbourn): instead of needing all of the client rects for these scrolling containers\n // every time, we should be able to use the scrollTop of the containers if the size of those\n // containers hasn't changed.\n const scrollContainerBounds = this._scrollables.map(scrollable => {\n return scrollable.getElementRef().nativeElement.getBoundingClientRect();\n });\n return {\n isOriginClipped: isElementClippedByScrolling(originBounds, scrollContainerBounds),\n isOriginOutsideView: isElementScrolledOutsideView(originBounds, scrollContainerBounds),\n isOverlayClipped: isElementClippedByScrolling(overlayBounds, scrollContainerBounds),\n isOverlayOutsideView: isElementScrolledOutsideView(overlayBounds, scrollContainerBounds)\n };\n }\n /** Subtracts the amount that an element is overflowing on an axis from its length. */\n _subtractOverflows(length, ...overflows) {\n return overflows.reduce((currentValue, currentOverflow) => {\n return currentValue - Math.max(currentOverflow, 0);\n }, length);\n }\n /** Narrows the given viewport rect by the current _viewportMargin. */\n _getNarrowedViewportRect() {\n // We recalculate the viewport rect here ourselves, rather than using the ViewportRuler,\n // because we want to use the `clientWidth` and `clientHeight` as the base. The difference\n // being that the client properties don't include the scrollbar, as opposed to `innerWidth`\n // and `innerHeight` that do. This is necessary, because the overlay container uses\n // 100% `width` and `height` which don't include the scrollbar either.\n const width = this._document.documentElement.clientWidth;\n const height = this._document.documentElement.clientHeight;\n const scrollPosition = this._viewportRuler.getViewportScrollPosition();\n return {\n top: scrollPosition.top + this._viewportMargin,\n left: scrollPosition.left + this._viewportMargin,\n right: scrollPosition.left + width - this._viewportMargin,\n bottom: scrollPosition.top + height - this._viewportMargin,\n width: width - 2 * this._viewportMargin,\n height: height - 2 * this._viewportMargin\n };\n }\n /** Whether the we're dealing with an RTL context */\n _isRtl() {\n return this._overlayRef.getDirection() === 'rtl';\n }\n /** Determines whether the overlay uses exact or flexible positioning. */\n _hasExactPosition() {\n return !this._hasFlexibleDimensions || this._isPushed;\n }\n /** Retrieves the offset of a position along the x or y axis. */\n _getOffset(position, axis) {\n if (axis === 'x') {\n // We don't do something like `position['offset' + axis]` in\n // order to avoid breaking minifiers that rename properties.\n return position.offsetX == null ? this._offsetX : position.offsetX;\n }\n return position.offsetY == null ? this._offsetY : position.offsetY;\n }\n /** Validates that the current position match the expected values. */\n _validatePositions() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._preferredPositions.length) {\n throw Error('FlexibleConnectedPositionStrategy: At least one position is required.');\n }\n // TODO(crisbeto): remove these once Angular's template type\n // checking is advanced enough to catch these cases.\n this._preferredPositions.forEach(pair => {\n validateHorizontalPosition('originX', pair.originX);\n validateVerticalPosition('originY', pair.originY);\n validateHorizontalPosition('overlayX', pair.overlayX);\n validateVerticalPosition('overlayY', pair.overlayY);\n });\n }\n }\n /** Adds a single CSS class or an array of classes on the overlay panel. */\n _addPanelClasses(cssClasses) {\n if (this._pane) {\n coerceArray(cssClasses).forEach(cssClass => {\n if (cssClass !== '' && this._appliedPanelClasses.indexOf(cssClass) === -1) {\n this._appliedPanelClasses.push(cssClass);\n this._pane.classList.add(cssClass);\n }\n });\n }\n }\n /** Clears the classes that the position strategy has applied from the overlay panel. */\n _clearPanelClasses() {\n if (this._pane) {\n this._appliedPanelClasses.forEach(cssClass => {\n this._pane.classList.remove(cssClass);\n });\n this._appliedPanelClasses = [];\n }\n }\n /** Returns the DOMRect of the current origin. */\n _getOriginRect() {\n const origin = this._origin;\n if (origin instanceof ElementRef) {\n return origin.nativeElement.getBoundingClientRect();\n }\n // Check for Element so SVG elements are also supported.\n if (origin instanceof Element) {\n return origin.getBoundingClientRect();\n }\n const width = origin.width || 0;\n const height = origin.height || 0;\n // If the origin is a point, return a client rect as if it was a 0x0 element at the point.\n return {\n top: origin.y,\n bottom: origin.y + height,\n left: origin.x,\n right: origin.x + width,\n height,\n width\n };\n }\n}\n/** Shallow-extends a stylesheet object with another stylesheet object. */\nfunction extendStyles(destination, source) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n destination[key] = source[key];\n }\n }\n return destination;\n}\n/**\n * Extracts the pixel value as a number from a value, if it's a number\n * or a CSS pixel string (e.g. `1337px`). Otherwise returns null.\n */\nfunction getPixelValue(input) {\n if (typeof input !== 'number' && input != null) {\n const [value, units] = input.split(cssUnitPattern);\n return !units || units === 'px' ? parseFloat(value) : null;\n }\n return input || null;\n}\n/**\n * Gets a version of an element's bounding `DOMRect` where all the values are rounded down to\n * the nearest pixel. This allows us to account for the cases where there may be sub-pixel\n * deviations in the `DOMRect` returned by the browser (e.g. when zoomed in with a percentage\n * size, see #21350).\n */\nfunction getRoundedBoundingClientRect(clientRect) {\n return {\n top: Math.floor(clientRect.top),\n right: Math.floor(clientRect.right),\n bottom: Math.floor(clientRect.bottom),\n left: Math.floor(clientRect.left),\n width: Math.floor(clientRect.width),\n height: Math.floor(clientRect.height)\n };\n}\n/** Returns whether two `ScrollingVisibility` objects are identical. */\nfunction compareScrollVisibility(a, b) {\n if (a === b) {\n return true;\n }\n return a.isOriginClipped === b.isOriginClipped && a.isOriginOutsideView === b.isOriginOutsideView && a.isOverlayClipped === b.isOverlayClipped && a.isOverlayOutsideView === b.isOverlayOutsideView;\n}\nconst STANDARD_DROPDOWN_BELOW_POSITIONS = [{\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n}, {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom'\n}];\nconst STANDARD_DROPDOWN_ADJACENT_POSITIONS = [{\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'bottom'\n}];\n\n/** Class to be added to the overlay pane wrapper. */\nconst wrapperClass = 'cdk-global-overlay-wrapper';\n/**\n * A strategy for positioning overlays. Using this strategy, an overlay is given an\n * explicit position relative to the browser's viewport. We use flexbox, instead of\n * transforms, in order to avoid issues with subpixel rendering which can cause the\n * element to become blurry.\n */\nclass GlobalPositionStrategy {\n constructor() {\n this._cssPosition = 'static';\n this._topOffset = '';\n this._bottomOffset = '';\n this._alignItems = '';\n this._xPosition = '';\n this._xOffset = '';\n this._width = '';\n this._height = '';\n this._isDisposed = false;\n }\n attach(overlayRef) {\n const config = overlayRef.getConfig();\n this._overlayRef = overlayRef;\n if (this._width && !config.width) {\n overlayRef.updateSize({\n width: this._width\n });\n }\n if (this._height && !config.height) {\n overlayRef.updateSize({\n height: this._height\n });\n }\n overlayRef.hostElement.classList.add(wrapperClass);\n this._isDisposed = false;\n }\n /**\n * Sets the top position of the overlay. Clears any previously set vertical position.\n * @param value New top offset.\n */\n top(value = '') {\n this._bottomOffset = '';\n this._topOffset = value;\n this._alignItems = 'flex-start';\n return this;\n }\n /**\n * Sets the left position of the overlay. Clears any previously set horizontal position.\n * @param value New left offset.\n */\n left(value = '') {\n this._xOffset = value;\n this._xPosition = 'left';\n return this;\n }\n /**\n * Sets the bottom position of the overlay. Clears any previously set vertical position.\n * @param value New bottom offset.\n */\n bottom(value = '') {\n this._topOffset = '';\n this._bottomOffset = value;\n this._alignItems = 'flex-end';\n return this;\n }\n /**\n * Sets the right position of the overlay. Clears any previously set horizontal position.\n * @param value New right offset.\n */\n right(value = '') {\n this._xOffset = value;\n this._xPosition = 'right';\n return this;\n }\n /**\n * Sets the overlay to the start of the viewport, depending on the overlay direction.\n * This will be to the left in LTR layouts and to the right in RTL.\n * @param offset Offset from the edge of the screen.\n */\n start(value = '') {\n this._xOffset = value;\n this._xPosition = 'start';\n return this;\n }\n /**\n * Sets the overlay to the end of the viewport, depending on the overlay direction.\n * This will be to the right in LTR layouts and to the left in RTL.\n * @param offset Offset from the edge of the screen.\n */\n end(value = '') {\n this._xOffset = value;\n this._xPosition = 'end';\n return this;\n }\n /**\n * Sets the overlay width and clears any previously set width.\n * @param value New width for the overlay\n * @deprecated Pass the `width` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n width(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({\n width: value\n });\n } else {\n this._width = value;\n }\n return this;\n }\n /**\n * Sets the overlay height and clears any previously set height.\n * @param value New height for the overlay\n * @deprecated Pass the `height` through the `OverlayConfig`.\n * @breaking-change 8.0.0\n */\n height(value = '') {\n if (this._overlayRef) {\n this._overlayRef.updateSize({\n height: value\n });\n } else {\n this._height = value;\n }\n return this;\n }\n /**\n * Centers the overlay horizontally with an optional offset.\n * Clears any previously set horizontal position.\n *\n * @param offset Overlay offset from the horizontal center.\n */\n centerHorizontally(offset = '') {\n this.left(offset);\n this._xPosition = 'center';\n return this;\n }\n /**\n * Centers the overlay vertically with an optional offset.\n * Clears any previously set vertical position.\n *\n * @param offset Overlay offset from the vertical center.\n */\n centerVertically(offset = '') {\n this.top(offset);\n this._alignItems = 'center';\n return this;\n }\n /**\n * Apply the position to the element.\n * @docs-private\n */\n apply() {\n // Since the overlay ref applies the strategy asynchronously, it could\n // have been disposed before it ends up being applied. If that is the\n // case, we shouldn't do anything.\n if (!this._overlayRef || !this._overlayRef.hasAttached()) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parentStyles = this._overlayRef.hostElement.style;\n const config = this._overlayRef.getConfig();\n const {\n width,\n height,\n maxWidth,\n maxHeight\n } = config;\n const shouldBeFlushHorizontally = (width === '100%' || width === '100vw') && (!maxWidth || maxWidth === '100%' || maxWidth === '100vw');\n const shouldBeFlushVertically = (height === '100%' || height === '100vh') && (!maxHeight || maxHeight === '100%' || maxHeight === '100vh');\n const xPosition = this._xPosition;\n const xOffset = this._xOffset;\n const isRtl = this._overlayRef.getConfig().direction === 'rtl';\n let marginLeft = '';\n let marginRight = '';\n let justifyContent = '';\n if (shouldBeFlushHorizontally) {\n justifyContent = 'flex-start';\n } else if (xPosition === 'center') {\n justifyContent = 'center';\n if (isRtl) {\n marginRight = xOffset;\n } else {\n marginLeft = xOffset;\n }\n } else if (isRtl) {\n if (xPosition === 'left' || xPosition === 'end') {\n justifyContent = 'flex-end';\n marginLeft = xOffset;\n } else if (xPosition === 'right' || xPosition === 'start') {\n justifyContent = 'flex-start';\n marginRight = xOffset;\n }\n } else if (xPosition === 'left' || xPosition === 'start') {\n justifyContent = 'flex-start';\n marginLeft = xOffset;\n } else if (xPosition === 'right' || xPosition === 'end') {\n justifyContent = 'flex-end';\n marginRight = xOffset;\n }\n styles.position = this._cssPosition;\n styles.marginLeft = shouldBeFlushHorizontally ? '0' : marginLeft;\n styles.marginTop = shouldBeFlushVertically ? '0' : this._topOffset;\n styles.marginBottom = this._bottomOffset;\n styles.marginRight = shouldBeFlushHorizontally ? '0' : marginRight;\n parentStyles.justifyContent = justifyContent;\n parentStyles.alignItems = shouldBeFlushVertically ? 'flex-start' : this._alignItems;\n }\n /**\n * Cleans up the DOM changes from the position strategy.\n * @docs-private\n */\n dispose() {\n if (this._isDisposed || !this._overlayRef) {\n return;\n }\n const styles = this._overlayRef.overlayElement.style;\n const parent = this._overlayRef.hostElement;\n const parentStyles = parent.style;\n parent.classList.remove(wrapperClass);\n parentStyles.justifyContent = parentStyles.alignItems = styles.marginTop = styles.marginBottom = styles.marginLeft = styles.marginRight = styles.position = '';\n this._overlayRef = null;\n this._isDisposed = true;\n }\n}\n\n/** Builder for overlay position strategy. */\nlet OverlayPositionBuilder = /*#__PURE__*/(() => {\n class OverlayPositionBuilder {\n constructor(_viewportRuler, _document, _platform, _overlayContainer) {\n this._viewportRuler = _viewportRuler;\n this._document = _document;\n this._platform = _platform;\n this._overlayContainer = _overlayContainer;\n }\n /**\n * Creates a global position strategy.\n */\n global() {\n return new GlobalPositionStrategy();\n }\n /**\n * Creates a flexible position strategy.\n * @param origin Origin relative to which to position the overlay.\n */\n flexibleConnectedTo(origin) {\n return new FlexibleConnectedPositionStrategy(origin, this._viewportRuler, this._document, this._platform, this._overlayContainer);\n }\n static {\n this.ɵfac = function OverlayPositionBuilder_Factory(t) {\n return new (t || OverlayPositionBuilder)(i0.ɵɵinject(i1.ViewportRuler), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform), i0.ɵɵinject(OverlayContainer));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: OverlayPositionBuilder,\n factory: OverlayPositionBuilder.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return OverlayPositionBuilder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Next overlay unique ID. */\nlet nextUniqueId = 0;\n// Note that Overlay is *not* scoped to the app root because of the ComponentFactoryResolver\n// which needs to be different depending on where OverlayModule is imported.\n/**\n * Service to create Overlays. Overlays are dynamically added pieces of floating UI, meant to be\n * used as a low-level building block for other components. Dialogs, tooltips, menus,\n * selects, etc. can all be built using overlays. The service should primarily be used by authors\n * of re-usable components rather than developers building end-user applications.\n *\n * An overlay *is* a PortalOutlet, so any kind of Portal can be loaded into one.\n */\nlet Overlay = /*#__PURE__*/(() => {\n class Overlay {\n constructor( /** Scrolling strategies that can be used when creating an overlay. */\n scrollStrategies, _overlayContainer, _componentFactoryResolver, _positionBuilder, _keyboardDispatcher, _injector, _ngZone, _document, _directionality, _location, _outsideClickDispatcher, _animationsModuleType) {\n this.scrollStrategies = scrollStrategies;\n this._overlayContainer = _overlayContainer;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._positionBuilder = _positionBuilder;\n this._keyboardDispatcher = _keyboardDispatcher;\n this._injector = _injector;\n this._ngZone = _ngZone;\n this._document = _document;\n this._directionality = _directionality;\n this._location = _location;\n this._outsideClickDispatcher = _outsideClickDispatcher;\n this._animationsModuleType = _animationsModuleType;\n }\n /**\n * Creates an overlay.\n * @param config Configuration applied to the overlay.\n * @returns Reference to the created overlay.\n */\n create(config) {\n const host = this._createHostElement();\n const pane = this._createPaneElement(host);\n const portalOutlet = this._createPortalOutlet(pane);\n const overlayConfig = new OverlayConfig(config);\n overlayConfig.direction = overlayConfig.direction || this._directionality.value;\n return new OverlayRef(portalOutlet, host, pane, overlayConfig, this._ngZone, this._keyboardDispatcher, this._document, this._location, this._outsideClickDispatcher, this._animationsModuleType === 'NoopAnimations');\n }\n /**\n * Gets a position builder that can be used, via fluent API,\n * to construct and configure a position strategy.\n * @returns An overlay position builder.\n */\n position() {\n return this._positionBuilder;\n }\n /**\n * Creates the DOM element for an overlay and appends it to the overlay container.\n * @returns Newly-created pane element\n */\n _createPaneElement(host) {\n const pane = this._document.createElement('div');\n pane.id = `cdk-overlay-${nextUniqueId++}`;\n pane.classList.add('cdk-overlay-pane');\n host.appendChild(pane);\n return pane;\n }\n /**\n * Creates the host element that wraps around an overlay\n * and can be used for advanced positioning.\n * @returns Newly-create host element.\n */\n _createHostElement() {\n const host = this._document.createElement('div');\n this._overlayContainer.getContainerElement().appendChild(host);\n return host;\n }\n /**\n * Create a DomPortalOutlet into which the overlay content can be loaded.\n * @param pane The DOM element to turn into a portal outlet.\n * @returns A portal outlet for the given DOM element.\n */\n _createPortalOutlet(pane) {\n // We have to resolve the ApplicationRef later in order to allow people\n // to use overlay-based providers during app initialization.\n if (!this._appRef) {\n this._appRef = this._injector.get(ApplicationRef);\n }\n return new DomPortalOutlet(pane, this._componentFactoryResolver, this._appRef, this._injector, this._document);\n }\n static {\n this.ɵfac = function Overlay_Factory(t) {\n return new (t || Overlay)(i0.ɵɵinject(ScrollStrategyOptions), i0.ɵɵinject(OverlayContainer), i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(OverlayPositionBuilder), i0.ɵɵinject(OverlayKeyboardDispatcher), i0.ɵɵinject(i0.Injector), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i5.Directionality), i0.ɵɵinject(i6.Location), i0.ɵɵinject(OverlayOutsideClickDispatcher), i0.ɵɵinject(ANIMATION_MODULE_TYPE, 8));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: Overlay,\n factory: Overlay.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return Overlay;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Default set of positions for the overlay. Follows the behavior of a dropdown. */\nconst defaultPositionList = [{\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n}, {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom'\n}, {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top'\n}];\n/** Injection token that determines the scroll handling while the connected overlay is open. */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY = /*#__PURE__*/new InjectionToken('cdk-connected-overlay-scroll-strategy', {\n providedIn: 'root',\n factory: () => {\n const overlay = inject(Overlay);\n return () => overlay.scrollStrategies.reposition();\n }\n});\n/**\n * Directive applied to an element to make it usable as an origin for an Overlay using a\n * ConnectedPositionStrategy.\n */\nlet CdkOverlayOrigin = /*#__PURE__*/(() => {\n class CdkOverlayOrigin {\n constructor( /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n static {\n this.ɵfac = function CdkOverlayOrigin_Factory(t) {\n return new (t || CdkOverlayOrigin)(i0.ɵɵdirectiveInject(i0.ElementRef));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkOverlayOrigin,\n selectors: [[\"\", \"cdk-overlay-origin\", \"\"], [\"\", \"overlay-origin\", \"\"], [\"\", \"cdkOverlayOrigin\", \"\"]],\n exportAs: [\"cdkOverlayOrigin\"],\n standalone: true\n });\n }\n }\n return CdkOverlayOrigin;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/**\n * Directive to facilitate declarative creation of an\n * Overlay using a FlexibleConnectedPositionStrategy.\n */\nlet CdkConnectedOverlay = /*#__PURE__*/(() => {\n class CdkConnectedOverlay {\n /** The offset in pixels for the overlay connection point on the x-axis */\n get offsetX() {\n return this._offsetX;\n }\n set offsetX(offsetX) {\n this._offsetX = offsetX;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** The offset in pixels for the overlay connection point on the y-axis */\n get offsetY() {\n return this._offsetY;\n }\n set offsetY(offsetY) {\n this._offsetY = offsetY;\n if (this._position) {\n this._updatePositionStrategy(this._position);\n }\n }\n /** Whether the overlay should be disposed of when the user goes backwards/forwards in history. */\n get disposeOnNavigation() {\n return this._disposeOnNavigation;\n }\n set disposeOnNavigation(value) {\n this._disposeOnNavigation = value;\n }\n // TODO(jelbourn): inputs for size, scroll behavior, animation, etc.\n constructor(_overlay, templateRef, viewContainerRef, scrollStrategyFactory, _dir) {\n this._overlay = _overlay;\n this._dir = _dir;\n this._backdropSubscription = Subscription.EMPTY;\n this._attachSubscription = Subscription.EMPTY;\n this._detachSubscription = Subscription.EMPTY;\n this._positionSubscription = Subscription.EMPTY;\n this._disposeOnNavigation = false;\n this._ngZone = inject(NgZone);\n /** Margin between the overlay and the viewport edges. */\n this.viewportMargin = 0;\n /** Whether the overlay is open. */\n this.open = false;\n /** Whether the overlay can be closed by user interaction. */\n this.disableClose = false;\n /** Whether or not the overlay should attach a backdrop. */\n this.hasBackdrop = false;\n /** Whether or not the overlay should be locked when scrolling. */\n this.lockPosition = false;\n /** Whether the overlay's width and height can be constrained to fit within the viewport. */\n this.flexibleDimensions = false;\n /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */\n this.growAfterOpen = false;\n /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */\n this.push = false;\n /** Event emitted when the backdrop is clicked. */\n this.backdropClick = new EventEmitter();\n /** Event emitted when the position has changed. */\n this.positionChange = new EventEmitter();\n /** Event emitted when the overlay has been attached. */\n this.attach = new EventEmitter();\n /** Event emitted when the overlay has been detached. */\n this.detach = new EventEmitter();\n /** Emits when there are keyboard events that are targeted at the overlay. */\n this.overlayKeydown = new EventEmitter();\n /** Emits when there are mouse outside click events that are targeted at the overlay. */\n this.overlayOutsideClick = new EventEmitter();\n this._templatePortal = new TemplatePortal(templateRef, viewContainerRef);\n this._scrollStrategyFactory = scrollStrategyFactory;\n this.scrollStrategy = this._scrollStrategyFactory();\n }\n /** The associated overlay reference. */\n get overlayRef() {\n return this._overlayRef;\n }\n /** The element's layout direction. */\n get dir() {\n return this._dir ? this._dir.value : 'ltr';\n }\n ngOnDestroy() {\n this._attachSubscription.unsubscribe();\n this._detachSubscription.unsubscribe();\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n if (this._overlayRef) {\n this._overlayRef.dispose();\n }\n }\n ngOnChanges(changes) {\n if (this._position) {\n this._updatePositionStrategy(this._position);\n this._overlayRef.updateSize({\n width: this.width,\n minWidth: this.minWidth,\n height: this.height,\n minHeight: this.minHeight\n });\n if (changes['origin'] && this.open) {\n this._position.apply();\n }\n }\n if (changes['open']) {\n this.open ? this._attachOverlay() : this._detachOverlay();\n }\n }\n /** Creates an overlay */\n _createOverlay() {\n if (!this.positions || !this.positions.length) {\n this.positions = defaultPositionList;\n }\n const overlayRef = this._overlayRef = this._overlay.create(this._buildConfig());\n this._attachSubscription = overlayRef.attachments().subscribe(() => this.attach.emit());\n this._detachSubscription = overlayRef.detachments().subscribe(() => this.detach.emit());\n overlayRef.keydownEvents().subscribe(event => {\n this.overlayKeydown.next(event);\n if (event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event)) {\n event.preventDefault();\n this._detachOverlay();\n }\n });\n this._overlayRef.outsidePointerEvents().subscribe(event => {\n this.overlayOutsideClick.next(event);\n });\n }\n /** Builds the overlay config based on the directive's inputs */\n _buildConfig() {\n const positionStrategy = this._position = this.positionStrategy || this._createPositionStrategy();\n const overlayConfig = new OverlayConfig({\n direction: this._dir,\n positionStrategy,\n scrollStrategy: this.scrollStrategy,\n hasBackdrop: this.hasBackdrop,\n disposeOnNavigation: this.disposeOnNavigation\n });\n if (this.width || this.width === 0) {\n overlayConfig.width = this.width;\n }\n if (this.height || this.height === 0) {\n overlayConfig.height = this.height;\n }\n if (this.minWidth || this.minWidth === 0) {\n overlayConfig.minWidth = this.minWidth;\n }\n if (this.minHeight || this.minHeight === 0) {\n overlayConfig.minHeight = this.minHeight;\n }\n if (this.backdropClass) {\n overlayConfig.backdropClass = this.backdropClass;\n }\n if (this.panelClass) {\n overlayConfig.panelClass = this.panelClass;\n }\n return overlayConfig;\n }\n /** Updates the state of a position strategy, based on the values of the directive inputs. */\n _updatePositionStrategy(positionStrategy) {\n const positions = this.positions.map(currentPosition => ({\n originX: currentPosition.originX,\n originY: currentPosition.originY,\n overlayX: currentPosition.overlayX,\n overlayY: currentPosition.overlayY,\n offsetX: currentPosition.offsetX || this.offsetX,\n offsetY: currentPosition.offsetY || this.offsetY,\n panelClass: currentPosition.panelClass || undefined\n }));\n return positionStrategy.setOrigin(this._getFlexibleConnectedPositionStrategyOrigin()).withPositions(positions).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector);\n }\n /** Returns the position strategy of the overlay to be set on the overlay config */\n _createPositionStrategy() {\n const strategy = this._overlay.position().flexibleConnectedTo(this._getFlexibleConnectedPositionStrategyOrigin());\n this._updatePositionStrategy(strategy);\n return strategy;\n }\n _getFlexibleConnectedPositionStrategyOrigin() {\n if (this.origin instanceof CdkOverlayOrigin) {\n return this.origin.elementRef;\n } else {\n return this.origin;\n }\n }\n /** Attaches the overlay and subscribes to backdrop clicks if backdrop exists */\n _attachOverlay() {\n if (!this._overlayRef) {\n this._createOverlay();\n } else {\n // Update the overlay size, in case the directive's inputs have changed\n this._overlayRef.getConfig().hasBackdrop = this.hasBackdrop;\n }\n if (!this._overlayRef.hasAttached()) {\n this._overlayRef.attach(this._templatePortal);\n }\n if (this.hasBackdrop) {\n this._backdropSubscription = this._overlayRef.backdropClick().subscribe(event => {\n this.backdropClick.emit(event);\n });\n } else {\n this._backdropSubscription.unsubscribe();\n }\n this._positionSubscription.unsubscribe();\n // Only subscribe to `positionChanges` if requested, because putting\n // together all the information for it can be expensive.\n if (this.positionChange.observers.length > 0) {\n this._positionSubscription = this._position.positionChanges.pipe(takeWhile(() => this.positionChange.observers.length > 0)).subscribe(position => {\n this._ngZone.run(() => this.positionChange.emit(position));\n if (this.positionChange.observers.length === 0) {\n this._positionSubscription.unsubscribe();\n }\n });\n }\n }\n /** Detaches the overlay and unsubscribes to backdrop clicks if backdrop exists */\n _detachOverlay() {\n if (this._overlayRef) {\n this._overlayRef.detach();\n }\n this._backdropSubscription.unsubscribe();\n this._positionSubscription.unsubscribe();\n }\n static {\n this.ɵfac = function CdkConnectedOverlay_Factory(t) {\n return new (t || CdkConnectedOverlay)(i0.ɵɵdirectiveInject(Overlay), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY), i0.ɵɵdirectiveInject(i5.Directionality, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkConnectedOverlay,\n selectors: [[\"\", \"cdk-connected-overlay\", \"\"], [\"\", \"connected-overlay\", \"\"], [\"\", \"cdkConnectedOverlay\", \"\"]],\n inputs: {\n origin: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayOrigin\", \"origin\"],\n positions: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayPositions\", \"positions\"],\n positionStrategy: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayPositionStrategy\", \"positionStrategy\"],\n offsetX: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayOffsetX\", \"offsetX\"],\n offsetY: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayOffsetY\", \"offsetY\"],\n width: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayWidth\", \"width\"],\n height: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayHeight\", \"height\"],\n minWidth: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayMinWidth\", \"minWidth\"],\n minHeight: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayMinHeight\", \"minHeight\"],\n backdropClass: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayBackdropClass\", \"backdropClass\"],\n panelClass: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayPanelClass\", \"panelClass\"],\n viewportMargin: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayViewportMargin\", \"viewportMargin\"],\n scrollStrategy: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayScrollStrategy\", \"scrollStrategy\"],\n open: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayOpen\", \"open\"],\n disableClose: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayDisableClose\", \"disableClose\"],\n transformOriginSelector: [i0.ɵɵInputFlags.None, \"cdkConnectedOverlayTransformOriginOn\", \"transformOriginSelector\"],\n hasBackdrop: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayHasBackdrop\", \"hasBackdrop\", booleanAttribute],\n lockPosition: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayLockPosition\", \"lockPosition\", booleanAttribute],\n flexibleDimensions: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayFlexibleDimensions\", \"flexibleDimensions\", booleanAttribute],\n growAfterOpen: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayGrowAfterOpen\", \"growAfterOpen\", booleanAttribute],\n push: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayPush\", \"push\", booleanAttribute],\n disposeOnNavigation: [i0.ɵɵInputFlags.HasDecoratorInputTransform, \"cdkConnectedOverlayDisposeOnNavigation\", \"disposeOnNavigation\", booleanAttribute]\n },\n outputs: {\n backdropClick: \"backdropClick\",\n positionChange: \"positionChange\",\n attach: \"attach\",\n detach: \"detach\",\n overlayKeydown: \"overlayKeydown\",\n overlayOutsideClick: \"overlayOutsideClick\"\n },\n exportAs: [\"cdkConnectedOverlay\"],\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature]\n });\n }\n }\n return CdkConnectedOverlay;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** @docs-private */\nfunction CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER = {\n provide: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY\n};\nlet OverlayModule = /*#__PURE__*/(() => {\n class OverlayModule {\n static {\n this.ɵfac = function OverlayModule_Factory(t) {\n return new (t || OverlayModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: OverlayModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [Overlay, CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER],\n imports: [BidiModule, PortalModule, ScrollingModule, ScrollingModule]\n });\n }\n }\n return OverlayModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Alternative to OverlayContainer that supports correct displaying of overlay elements in\n * Fullscreen mode\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen\n *\n * Should be provided in the root component.\n */\nlet FullscreenOverlayContainer = /*#__PURE__*/(() => {\n class FullscreenOverlayContainer extends OverlayContainer {\n constructor(_document, platform) {\n super(_document, platform);\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n if (this._fullScreenEventName && this._fullScreenListener) {\n this._document.removeEventListener(this._fullScreenEventName, this._fullScreenListener);\n }\n }\n _createContainer() {\n super._createContainer();\n this._adjustParentForFullscreenChange();\n this._addFullscreenChangeListener(() => this._adjustParentForFullscreenChange());\n }\n _adjustParentForFullscreenChange() {\n if (!this._containerElement) {\n return;\n }\n const fullscreenElement = this.getFullscreenElement();\n const parent = fullscreenElement || this._document.body;\n parent.appendChild(this._containerElement);\n }\n _addFullscreenChangeListener(fn) {\n const eventName = this._getEventName();\n if (eventName) {\n if (this._fullScreenListener) {\n this._document.removeEventListener(eventName, this._fullScreenListener);\n }\n this._document.addEventListener(eventName, fn);\n this._fullScreenListener = fn;\n }\n }\n _getEventName() {\n if (!this._fullScreenEventName) {\n const _document = this._document;\n if (_document.fullscreenEnabled) {\n this._fullScreenEventName = 'fullscreenchange';\n } else if (_document.webkitFullscreenEnabled) {\n this._fullScreenEventName = 'webkitfullscreenchange';\n } else if (_document.mozFullScreenEnabled) {\n this._fullScreenEventName = 'mozfullscreenchange';\n } else if (_document.msFullscreenEnabled) {\n this._fullScreenEventName = 'MSFullscreenChange';\n }\n }\n return this._fullScreenEventName;\n }\n /**\n * When the page is put into fullscreen mode, a specific element is specified.\n * Only that element and its children are visible when in fullscreen mode.\n */\n getFullscreenElement() {\n const _document = this._document;\n return _document.fullscreenElement || _document.webkitFullscreenElement || _document.mozFullScreenElement || _document.msFullscreenElement || null;\n }\n static {\n this.ɵfac = function FullscreenOverlayContainer_Factory(t) {\n return new (t || FullscreenOverlayContainer)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i1$1.Platform));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FullscreenOverlayContainer,\n factory: FullscreenOverlayContainer.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return FullscreenOverlayContainer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BlockScrollStrategy, CdkConnectedOverlay, CdkOverlayOrigin, CloseScrollStrategy, ConnectedOverlayPositionChange, ConnectionPositionPair, FlexibleConnectedPositionStrategy, FullscreenOverlayContainer, GlobalPositionStrategy, NoopScrollStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayOutsideClickDispatcher, OverlayPositionBuilder, OverlayRef, RepositionScrollStrategy, STANDARD_DROPDOWN_ADJACENT_POSITIONS, STANDARD_DROPDOWN_BELOW_POSITIONS, ScrollStrategyOptions, ScrollingVisibility, validateHorizontalPosition, validateVerticalPosition };\n"],"mappings":"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","names":["DataSource","isDataSource","value","ConnectableObservable","ArrayDataSource","_data","isObservable","of","_ViewRepeaterOperation","_VIEW_REPEATER_STRATEGY","InjectionToken","_DisposeViewRepeaterStrategy","changes","viewContainerRef","itemContextFactory","itemValueResolver","itemViewChanged","record","adjustedPreviousIndex","currentIndex","view","operation","insertContext","_RecycleViewRepeaterStrategy","viewArgsFactory","cachedView","viewArgs","index","detachedView","SelectionModel","_multiple","initiallySelectedValues","_emitChanges","compareWith","Subject","values","changed","oldValues","newSelectedSet","flushEvent","predicate","inputValue","selection","selectedValue","UniqueSelectionDispatcher","_UniqueSelectionDispatcher","id","name","listener","registered","t","ɵɵdefineInjectable","Portal","host","ComponentPortal","component","viewContainerRef","injector","componentFactoryResolver","projectableNodes","TemplatePortal","templateRef","context","DomPortal","element","ElementRef","BasePortalOutlet","portal","fn","DomPortalOutlet","BasePortalOutlet","outletElement","_componentFactoryResolver","_appRef","_defaultInjector","_document","portal","element","anchorNode","componentFactory","componentRef","Injector","viewContainer","viewRef","rootNode","index","CdkPortalOutlet","_CdkPortalOutlet","BasePortalOutlet","_componentFactoryResolver","_viewContainerRef","_document","EventEmitter","portal","element","anchorNode","viewContainerRef","componentFactory","ref","viewRef","nativeElement","t","ɵɵdirectiveInject","ComponentFactoryResolver$1","ViewContainerRef","DOCUMENT","ɵɵdefineDirective","InputFlags","ɵɵInheritDefinitionFeature","PortalModule","_PortalModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","AnimationMetadataType","AUTO_STYLE","trigger","name","definitions","animate","timings","styles","sequence","steps","options","AnimationMetadataType","style","tokens","state","name","styles","keyframes","transition","stateChangeExpr","animateChild","options","AnimationMetadataType","query","selector","animation","options","AnimationMetadataType","NoopAnimationPlayer","duration","delay","fn","position","phaseName","methods","AnimationGroupPlayer","_players","doneCount","destroyCount","startCount","total","player","time","p","timeAtPosition","longestPlayer","longestSoFar","ɵPRE_STYLE","_c0","_c1","VIRTUAL_SCROLL_STRATEGY","InjectionToken","FixedSizeVirtualScrollStrategy","itemSize","minBufferPx","maxBufferPx","Subject","distinctUntilChanged","viewport","index","behavior","renderedRange","newRange","viewportSize","dataLength","scrollOffset","firstVisibleIndex","maxVisibleItems","newVisibleIndex","startBuffer","expandStart","endBuffer","expandEnd","_fixedSizeVirtualScrollStrategyFactory","fixedSizeDir","CdkFixedSizeVirtualScroll","_CdkFixedSizeVirtualScroll","value","coerceNumberProperty","t","ɵɵdefineDirective","ɵɵProvidersFeature","forwardRef","ɵɵNgOnChangesFeature","DEFAULT_SCROLL_TIME","ScrollDispatcher","_ScrollDispatcher","_ngZone","_platform","document","scrollable","scrollableReference","auditTimeInMs","Observable","observer","subscription","auditTime","of","_","container","elementOrElementRef","ancestors","filter","target","scrollingContainers","_subscription","element","coerceElement","scrollableElement","window","fromEvent","ɵɵinject","NgZone","Platform","DOCUMENT","ɵɵdefineInjectable","CdkScrollable","_CdkScrollable","elementRef","scrollDispatcher","ngZone","dir","takeUntil","options","el","isRtl","getRtlScrollAxisType","RtlScrollAxisType","supportsScrollBehavior","from","LEFT","RIGHT","ɵɵdirectiveInject","ElementRef","Directionality","DEFAULT_RESIZE_TIME","ViewportRuler","_ViewportRuler","event","output","scrollPosition","width","height","documentElement","documentRect","top","left","throttleTime","VIRTUAL_SCROLLABLE","CdkVirtualScrollable","_CdkVirtualScrollable","orientation","viewportEl","ɵɵInheritDefinitionFeature","rangesEqual","r1","r2","SCROLL_SCHEDULER","animationFrameScheduler","asapScheduler","CdkVirtualScrollViewport","_CdkVirtualScrollViewport","_changeDetectorRef","_scrollStrategy","viewportRuler","inject","Subscription","startWith","forOf","data","newLength","size","range","offset","to","isHorizontal","axis","transform","measureScrollOffset","_from","fromRect","scrollerClientRect","contentEl","runAfter","runAfterChangeDetection","fn","ChangeDetectorRef","ɵɵdefineComponent","rf","ctx","ɵɵviewQuery","_t","ɵɵqueryRefresh","ɵɵloadQuery","ɵɵclassProp","InputFlags","booleanAttribute","virtualScrollable","Optional","Inject","ɵɵInputTransformsFeature","ɵɵStandaloneFeature","ɵɵprojectionDef","ɵɵelementStart","ɵɵprojection","ɵɵelementEnd","ɵɵelement","ɵɵadvance","ɵɵstyleProp","getOffset","direction","node","rect","CdkVirtualForOf","_CdkVirtualForOf","isDataSource","ArrayDataSource","isObservable","item","_viewContainerRef","_template","_differs","_viewRepeater","_viewport","pairwise","switchMap","prev","cur","shareReplay","renderedStartIndex","rangeLen","firstNode","lastNode","i","view","changes","oldDs","newDs","count","record","_adjustedPreviousIndex","currentIndex","context","ViewContainerRef","TemplateRef","IterableDiffers","_VIEW_REPEATER_STRATEGY","_RecycleViewRepeaterStrategy","CdkScrollableModule","_CdkScrollableModule","t","ɵɵdefineNgModule","ɵɵdefineInjector","ScrollingModule","_ScrollingModule","BidiModule","scrollBehaviorSupported","supportsScrollBehavior","BlockScrollStrategy","_viewportRuler","document","root","coerceCssPixelValue","html","body","htmlStyle","bodyStyle","previousHtmlScrollBehavior","previousBodyScrollBehavior","viewport","CloseScrollStrategy","_scrollDispatcher","_ngZone","_viewportRuler","_config","overlayRef","stream","filter","scrollable","scrollPosition","NoopScrollStrategy","isElementScrolledOutsideView","element","scrollContainers","containerBounds","outsideAbove","outsideBelow","outsideLeft","outsideRight","isElementClippedByScrolling","scrollContainerRect","clippedAbove","clippedBelow","clippedLeft","clippedRight","RepositionScrollStrategy","throttle","overlayRect","width","height","ScrollStrategyOptions","_ScrollStrategyOptions","document","config","BlockScrollStrategy","t","ɵɵinject","ScrollDispatcher","ViewportRuler","NgZone","DOCUMENT","ɵɵdefineInjectable","OverlayConfig","configKeys","key","ConnectedOverlayPositionChange","connectionPair","scrollableViewProperties","BaseOverlayDispatcher","_BaseOverlayDispatcher","document","overlayRef","index","t","ɵɵinject","DOCUMENT","ɵɵdefineInjectable","OverlayKeyboardDispatcher","_OverlayKeyboardDispatcher","_ngZone","event","overlays","i","keydownEvents","NgZone","OverlayOutsideClickDispatcher","_OverlayOutsideClickDispatcher","_platform","_getEventTarget","target","origin","outsidePointerEvents","body","Platform","OverlayContainer","_OverlayContainer","containerClass","_isTestEnvironment","oppositePlatformContainers","container","OverlayRef","_portalOutlet","_host","_pane","_config","_keyboardDispatcher","_document","_location","_outsideClickDispatcher","_animationsDisabled","Subject","Subscription","portal","attachResult","take","detachmentResult","isAttached","strategy","sizeConfig","__spreadValues","dir","__spreadProps","classes","direction","style","coerceCssPixelValue","enablePointer","showingClass","backdropToDetach","element","cssClasses","isAdd","coerceArray","c","subscription","takeUntil","merge","scrollStrategy","backdrop","boundingBoxClass","cssUnitPattern","FlexibleConnectedPositionStrategy","connectedTo","_viewportRuler","_overlayContainer","originRect","overlayRect","viewportRect","containerRect","flexibleFits","fallback","pos","originPoint","overlayPoint","overlayFit","bestFit","bestScore","fit","score","extendStyles","lastPosition","scrollables","positions","margin","flexibleDimensions","growAfterOpen","canPush","isLocked","offset","selector","x","startX","endX","y","overlayStartX","overlayStartY","point","rawOverlayRect","viewport","position","overlay","getRoundedBoundingClientRect","offsetX","offsetY","leftOverflow","rightOverflow","topOverflow","bottomOverflow","visibleWidth","visibleHeight","visibleArea","availableHeight","availableWidth","minHeight","getPixelValue","minWidth","verticalFit","horizontalFit","start","scrollPosition","overflowRight","overflowBottom","overflowTop","overflowLeft","pushX","pushY","scrollVisibility","compareScrollVisibility","changeEvent","ConnectedOverlayPositionChange","elements","xOrigin","yOrigin","isRtl","height","top","bottom","smallestDistanceToViewportEdge","previousHeight","isBoundedByRightViewportEdge","isBoundedByLeftViewportEdge","width","left","right","previousWidth","boundingBoxRect","styles","maxHeight","maxWidth","hasExactPosition","hasFlexibleDimensions","config","transformString","documentHeight","horizontalStyleProperty","documentWidth","originBounds","overlayBounds","scrollContainerBounds","scrollable","isElementClippedByScrolling","isElementScrolledOutsideView","length","overflows","currentValue","currentOverflow","axis","cssClass","ElementRef","destination","source","key","input","value","units","clientRect","a","b","wrapperClass","GlobalPositionStrategy","overlayRef","config","value","offset","styles","parentStyles","width","height","maxWidth","maxHeight","shouldBeFlushHorizontally","shouldBeFlushVertically","xPosition","xOffset","isRtl","marginLeft","marginRight","justifyContent","parent","OverlayPositionBuilder","_OverlayPositionBuilder","_viewportRuler","_document","_platform","_overlayContainer","origin","FlexibleConnectedPositionStrategy","t","ɵɵinject","ViewportRuler","DOCUMENT","Platform","OverlayContainer","ɵɵdefineInjectable","nextUniqueId","Overlay","_Overlay","scrollStrategies","_componentFactoryResolver","_positionBuilder","_keyboardDispatcher","_injector","_ngZone","_directionality","_location","_outsideClickDispatcher","_animationsModuleType","host","pane","portalOutlet","overlayConfig","OverlayConfig","OverlayRef","ApplicationRef","DomPortalOutlet","ScrollStrategyOptions","ComponentFactoryResolver$1","OverlayKeyboardDispatcher","Injector","NgZone","Directionality","Location","OverlayOutsideClickDispatcher","ANIMATION_MODULE_TYPE","defaultPositionList","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY","InjectionToken","overlay","inject","CdkOverlayOrigin","_CdkOverlayOrigin","elementRef","ɵɵdirectiveInject","ElementRef","ɵɵdefineDirective","CdkConnectedOverlay","_CdkConnectedOverlay","offsetX","offsetY","_overlay","templateRef","viewContainerRef","scrollStrategyFactory","_dir","Subscription","EventEmitter","TemplatePortal","changes","event","hasModifierKey","positionStrategy","positions","currentPosition","strategy","takeWhile","position","TemplateRef","ViewContainerRef","InputFlags","booleanAttribute","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER_FACTORY","CDK_CONNECTED_OVERLAY_SCROLL_STRATEGY_PROVIDER","OverlayModule","_OverlayModule","ɵɵdefineNgModule","ɵɵdefineInjector","BidiModule","PortalModule","ScrollingModule"],"x_google_ignoreList":[0,1,2,3,4]}