{"version":3,"file":"_focus-monitor-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/a11y/input-modality/input-modality-detector.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/a11y/focus-monitor/focus-monitor.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ALT, CONTROL, MAC_META, META, SHIFT} from '../../keycodes';\nimport {\n  Injectable,\n  InjectionToken,\n  OnDestroy,\n  NgZone,\n  inject,\n  RendererFactory2,\n  DOCUMENT,\n} from '@angular/core';\nimport {Platform, _getEventTarget} from '../../platform';\n\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {distinctUntilChanged, skip} from 'rxjs/operators';\nimport {\n  isFakeMousedownFromScreenReader,\n  isFakeTouchstartFromScreenReader,\n} from '../fake-event-detection';\n\n/**\n * The input modalities detected by this service. Null is used if the input modality is unknown.\n */\nexport type InputModality = 'keyboard' | 'mouse' | 'touch' | null;\n\n/** Options to configure the behavior of the InputModalityDetector. */\nexport interface InputModalityDetectorOptions {\n  /** Keys to ignore when detecting keyboard input modality. */\n  ignoreKeys?: number[];\n}\n\n/**\n * Injectable options for the InputModalityDetector. These are shallowly merged with the default\n * options.\n */\nexport const INPUT_MODALITY_DETECTOR_OPTIONS = new InjectionToken<InputModalityDetectorOptions>(\n  'cdk-input-modality-detector-options',\n);\n\n/**\n * Default options for the InputModalityDetector.\n *\n * Modifier keys are ignored by default (i.e. when pressed won't cause the service to detect\n * keyboard input modality) for two reasons:\n *\n * 1. Modifier keys are commonly used with mouse to perform actions such as 'right click' or 'open\n *    in new tab', and are thus less representative of actual keyboard interaction.\n * 2. VoiceOver triggers some keyboard events when linearly navigating with Control + Option (but\n *    confusingly not with Caps Lock). Thus, to have parity with other screen readers, we ignore\n *    these keys so as to not update the input modality.\n *\n * Note that we do not by default ignore the right Meta key on Safari because it has the same key\n * code as the ContextMenu key on other browsers. When we switch to using event.key, we can\n * distinguish between the two.\n */\nexport const INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS: InputModalityDetectorOptions = {\n  ignoreKeys: [ALT, CONTROL, MAC_META, META, SHIFT],\n};\n\n/**\n * The amount of time needed to pass after a touchstart event in order for a subsequent mousedown\n * event to be attributed as mouse and not touch.\n *\n * This is the value used by AngularJS Material. Through trial and error (on iPhone 6S) they found\n * that a value of around 650ms seems appropriate.\n */\nexport const TOUCH_BUFFER_MS = 650;\n\n/**\n * Event listener options that enable capturing and also mark the listener as passive if the browser\n * supports it.\n */\nconst modalityEventListenerOptions = {\n  passive: true,\n  capture: true,\n};\n\n/**\n * Service that detects the user's input modality.\n *\n * This service does not update the input modality when a user navigates with a screen reader\n * (e.g. linear navigation with VoiceOver, object navigation / browse mode with NVDA, virtual PC\n * cursor mode with JAWS). This is in part due to technical limitations (i.e. keyboard events do not\n * fire as expected in these modes) but is also arguably the correct behavior. Navigating with a\n * screen reader is akin to visually scanning a page, and should not be interpreted as actual user\n * input interaction.\n *\n * When a user is not navigating but *interacting* with a screen reader, this service attempts to\n * update the input modality to keyboard, but in general this service's behavior is largely\n * undefined.\n */\n@Injectable({providedIn: 'root'})\nexport class InputModalityDetector implements OnDestroy {\n  private readonly _platform = inject(Platform);\n  private readonly _listenerCleanups: (() => void)[] | undefined;\n\n  /** Emits whenever an input modality is detected. */\n  readonly modalityDetected: Observable<InputModality>;\n\n  /** Emits when the input modality changes. */\n  readonly modalityChanged: Observable<InputModality>;\n\n  /** The most recently detected input modality. */\n  get mostRecentModality(): InputModality {\n    return this._modality.value;\n  }\n\n  /**\n   * The most recently detected input modality event target. Is null if no input modality has been\n   * detected or if the associated event target is null for some unknown reason.\n   */\n  _mostRecentTarget: HTMLElement | null = null;\n\n  /** The underlying BehaviorSubject that emits whenever an input modality is detected. */\n  private readonly _modality = new BehaviorSubject<InputModality>(null);\n\n  /** Options for this InputModalityDetector. */\n  private readonly _options: InputModalityDetectorOptions;\n\n  /**\n   * The timestamp of the last touch input modality. Used to determine whether mousedown events\n   * should be attributed to mouse or touch.\n   */\n  private _lastTouchMs = 0;\n\n  /**\n   * Handles keydown events. Must be an arrow function in order to preserve the context when it gets\n   * bound.\n   */\n  private _onKeydown = (event: KeyboardEvent) => {\n    // If this is one of the keys we should ignore, then ignore it and don't update the input\n    // modality to keyboard.\n    if (this._options?.ignoreKeys?.some(keyCode => keyCode === event.keyCode)) {\n      return;\n    }\n\n    this._modality.next('keyboard');\n    this._mostRecentTarget = _getEventTarget(event);\n  };\n\n  /**\n   * Handles mousedown events. Must be an arrow function in order to preserve the context when it\n   * gets bound.\n   */\n  private _onMousedown = (event: MouseEvent) => {\n    // Touches trigger both touch and mouse events, so we need to distinguish between mouse events\n    // that were triggered via mouse vs touch. To do so, check if the mouse event occurs closely\n    // after the previous touch event.\n    if (Date.now() - this._lastTouchMs < TOUCH_BUFFER_MS) {\n      return;\n    }\n\n    // Fake mousedown events are fired by some screen readers when controls are activated by the\n    // screen reader. Attribute them to keyboard input modality.\n    this._modality.next(isFakeMousedownFromScreenReader(event) ? 'keyboard' : 'mouse');\n    this._mostRecentTarget = _getEventTarget(event);\n  };\n\n  /**\n   * Handles touchstart events. Must be an arrow function in order to preserve the context when it\n   * gets bound.\n   */\n  private _onTouchstart = (event: TouchEvent) => {\n    // Same scenario as mentioned in _onMousedown, but on touch screen devices, fake touchstart\n    // events are fired. Again, attribute to keyboard input modality.\n    if (isFakeTouchstartFromScreenReader(event)) {\n      this._modality.next('keyboard');\n      return;\n    }\n\n    // Store the timestamp of this touch event, as it's used to distinguish between mouse events\n    // triggered via mouse vs touch.\n    this._lastTouchMs = Date.now();\n\n    this._modality.next('touch');\n    this._mostRecentTarget = _getEventTarget(event);\n  };\n\n  constructor(...args: unknown[]);\n\n  constructor() {\n    const ngZone = inject(NgZone);\n    const document = inject<Document>(DOCUMENT);\n    const options = inject(INPUT_MODALITY_DETECTOR_OPTIONS, {optional: true});\n\n    this._options = {\n      ...INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS,\n      ...options,\n    };\n\n    // Skip the first emission as it's null.\n    this.modalityDetected = this._modality.pipe(skip(1));\n    this.modalityChanged = this.modalityDetected.pipe(distinctUntilChanged());\n\n    // If we're not in a browser, this service should do nothing, as there's no relevant input\n    // modality to detect.\n    if (this._platform.isBrowser) {\n      const renderer = inject(RendererFactory2).createRenderer(null, null);\n\n      this._listenerCleanups = ngZone.runOutsideAngular(() => {\n        return [\n          renderer.listen(document, 'keydown', this._onKeydown, modalityEventListenerOptions),\n          renderer.listen(document, 'mousedown', this._onMousedown, modalityEventListenerOptions),\n          renderer.listen(document, 'touchstart', this._onTouchstart, modalityEventListenerOptions),\n        ];\n      });\n    }\n  }\n\n  ngOnDestroy() {\n    this._modality.complete();\n    this._listenerCleanups?.forEach(cleanup => cleanup());\n  }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n  Platform,\n  normalizePassiveListenerOptions,\n  _getShadowRoot,\n  _getEventTarget,\n} from '../../platform';\nimport {\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Injectable,\n  InjectionToken,\n  NgZone,\n  OnDestroy,\n  Output,\n  AfterViewInit,\n  inject,\n  DOCUMENT,\n} from '@angular/core';\nimport {Observable, of as observableOf, Subject, Subscription} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {coerceElement} from '../../coercion';\n\nimport {InputModalityDetector, TOUCH_BUFFER_MS} from '../input-modality/input-modality-detector';\n\nexport type FocusOrigin = 'touch' | 'mouse' | 'keyboard' | 'program' | null;\n\n/**\n * Corresponds to the options that can be passed to the native `focus` event.\n * via https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus\n */\nexport interface FocusOptions {\n  /** Whether the browser should scroll to the element when it is focused. */\n  preventScroll?: boolean;\n}\n\n/** Detection mode used for attributing the origin of a focus event. */\nexport enum FocusMonitorDetectionMode {\n  /**\n   * Any mousedown, keydown, or touchstart event that happened in the previous\n   * tick or the current tick will be used to assign a focus event's origin (to\n   * either mouse, keyboard, or touch). This is the default option.\n   */\n  IMMEDIATE,\n  /**\n   * A focus event's origin is always attributed to the last corresponding\n   * mousedown, keydown, or touchstart event, no matter how long ago it occurred.\n   */\n  EVENTUAL,\n}\n\n/** Injectable service-level options for FocusMonitor. */\nexport interface FocusMonitorOptions {\n  detectionMode?: FocusMonitorDetectionMode;\n}\n\n/** InjectionToken for FocusMonitorOptions. */\nexport const FOCUS_MONITOR_DEFAULT_OPTIONS = new InjectionToken<FocusMonitorOptions>(\n  'cdk-focus-monitor-default-options',\n);\n\ntype MonitoredElementInfo = {\n  checkChildren: boolean;\n  readonly subject: Subject<FocusOrigin>;\n  rootNode: HTMLElement | ShadowRoot | Document;\n};\n\n/**\n * Event listener options that enable capturing and also\n * mark the listener as passive if the browser supports it.\n */\nconst captureEventListenerOptions = normalizePassiveListenerOptions({\n  passive: true,\n  capture: true,\n});\n\n/** Monitors mouse and keyboard events to determine the cause of focus events. */\n@Injectable({providedIn: 'root'})\nexport class FocusMonitor implements OnDestroy {\n  private _ngZone = inject(NgZone);\n  private _platform = inject(Platform);\n  private readonly _inputModalityDetector = inject(InputModalityDetector);\n\n  /** The focus origin that the next focus event is a result of. */\n  private _origin: FocusOrigin = null;\n\n  /** The FocusOrigin of the last focus event tracked by the FocusMonitor. */\n  private _lastFocusOrigin: FocusOrigin = null;\n\n  /** Whether the window has just been focused. */\n  private _windowFocused = false;\n\n  /** The timeout id of the window focus timeout. */\n  private _windowFocusTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  /** The timeout id of the origin clearing timeout. */\n  private _originTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  /**\n   * Whether the origin was determined via a touch interaction. Necessary as properly attributing\n   * focus events to touch interactions requires special logic.\n   */\n  private _originFromTouchInteraction = false;\n\n  /** Map of elements being monitored to their info. */\n  private _elementInfo = new Map<HTMLElement, MonitoredElementInfo>();\n\n  /** The number of elements currently being monitored. */\n  private _monitoredElementCount = 0;\n\n  /**\n   * Keeps track of the root nodes to which we've currently bound a focus/blur handler,\n   * as well as the number of monitored elements that they contain. We have to treat focus/blur\n   * handlers differently from the rest of the events, because the browser won't emit events\n   * to the document when focus moves inside of a shadow root.\n   */\n  private _rootNodeFocusListenerCount = new Map<HTMLElement | Document | ShadowRoot, number>();\n\n  /**\n   * The specified detection mode, used for attributing the origin of a focus\n   * event.\n   */\n  private readonly _detectionMode: FocusMonitorDetectionMode;\n\n  /**\n   * Event listener for `focus` events on the window.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _windowFocusListener = () => {\n    // Make a note of when the window regains focus, so we can\n    // restore the origin info for the focused element.\n    this._windowFocused = true;\n    this._windowFocusTimeoutId = setTimeout(() => (this._windowFocused = false));\n  };\n\n  /** Used to reference correct document/window */\n  protected _document = inject(DOCUMENT);\n\n  /** Subject for stopping our InputModalityDetector subscription. */\n  private readonly _stopInputModalityDetector = new Subject<void>();\n\n  constructor(...args: unknown[]);\n\n  constructor() {\n    const options = inject<FocusMonitorOptions | null>(FOCUS_MONITOR_DEFAULT_OPTIONS, {\n      optional: true,\n    });\n\n    this._detectionMode = options?.detectionMode || FocusMonitorDetectionMode.IMMEDIATE;\n  }\n  /**\n   * Event listener for `focus` and 'blur' events on the document.\n   * Needs to be an arrow function in order to preserve the context when it gets bound.\n   */\n  private _rootNodeFocusAndBlurListener = (event: Event) => {\n    const target = _getEventTarget<HTMLElement>(event);\n\n    // We need to walk up the ancestor chain in order to support `checkChildren`.\n    for (let element = target; element; element = element.parentElement) {\n      if (event.type === 'focus') {\n        this._onFocus(event as FocusEvent, element);\n      } else {\n        this._onBlur(event as FocusEvent, element);\n      }\n    }\n  };\n\n  /**\n   * Monitors focus on an element and applies appropriate CSS classes.\n   * @param element The element to monitor\n   * @param checkChildren Whether to count the element as focused when its children are focused.\n   * @returns An observable that emits when the focus state of the element changes.\n   *     When the element is blurred, null will be emitted.\n   */\n  monitor(element: HTMLElement, checkChildren?: boolean): Observable<FocusOrigin>;\n\n  /**\n   * Monitors focus on an element and applies appropriate CSS classes.\n   * @param element The element to monitor\n   * @param checkChildren Whether to count the element as focused when its children are focused.\n   * @returns An observable that emits when the focus state of the element changes.\n   *     When the element is blurred, null will be emitted.\n   */\n  monitor(element: ElementRef<HTMLElement>, checkChildren?: boolean): Observable<FocusOrigin>;\n\n  monitor(\n    element: HTMLElement | ElementRef<HTMLElement>,\n    checkChildren: boolean = false,\n  ): Observable<FocusOrigin> {\n    const nativeElement = coerceElement(element);\n\n    // Do nothing if we're not on the browser platform or the passed in node isn't an element.\n    if (!this._platform.isBrowser || nativeElement.nodeType !== 1) {\n      // Note: we don't want the observable to emit at all so we don't pass any parameters.\n      return observableOf();\n    }\n\n    // If the element is inside the shadow DOM, we need to bind our focus/blur listeners to\n    // the shadow root, rather than the `document`, because the browser won't emit focus events\n    // to the `document`, if focus is moving within the same shadow root.\n    const rootNode = _getShadowRoot(nativeElement) || this._document;\n    const cachedInfo = this._elementInfo.get(nativeElement);\n\n    // Check if we're already monitoring this element.\n    if (cachedInfo) {\n      if (checkChildren) {\n        // TODO(COMP-318): this can be problematic, because it'll turn all non-checkChildren\n        // observers into ones that behave as if `checkChildren` was turned on. We need a more\n        // robust solution.\n        cachedInfo.checkChildren = true;\n      }\n\n      return cachedInfo.subject;\n    }\n\n    // Create monitored element info.\n    const info: MonitoredElementInfo = {\n      checkChildren: checkChildren,\n      subject: new Subject<FocusOrigin>(),\n      rootNode,\n    };\n    this._elementInfo.set(nativeElement, info);\n    this._registerGlobalListeners(info);\n\n    return info.subject;\n  }\n\n  /**\n   * Stops monitoring an element and removes all focus classes.\n   * @param element The element to stop monitoring.\n   */\n  stopMonitoring(element: HTMLElement): void;\n\n  /**\n   * Stops monitoring an element and removes all focus classes.\n   * @param element The element to stop monitoring.\n   */\n  stopMonitoring(element: ElementRef<HTMLElement>): void;\n\n  stopMonitoring(element: HTMLElement | ElementRef<HTMLElement>): void {\n    const nativeElement = coerceElement(element);\n    const elementInfo = this._elementInfo.get(nativeElement);\n\n    if (elementInfo) {\n      elementInfo.subject.complete();\n\n      this._setClasses(nativeElement);\n      this._elementInfo.delete(nativeElement);\n      this._removeGlobalListeners(elementInfo);\n    }\n  }\n\n  /**\n   * Focuses the element via the specified focus origin.\n   * @param element Element to focus.\n   * @param origin Focus origin.\n   * @param options Options that can be used to configure the focus behavior.\n   */\n  focusVia(element: HTMLElement, origin: FocusOrigin, options?: FocusOptions): void;\n\n  /**\n   * Focuses the element via the specified focus origin.\n   * @param element Element to focus.\n   * @param origin Focus origin.\n   * @param options Options that can be used to configure the focus behavior.\n   */\n  focusVia(element: ElementRef<HTMLElement>, origin: FocusOrigin, options?: FocusOptions): void;\n\n  focusVia(\n    element: HTMLElement | ElementRef<HTMLElement>,\n    origin: FocusOrigin,\n    options?: FocusOptions,\n  ): void {\n    const nativeElement = coerceElement(element);\n    const focusedElement = this._document.activeElement;\n\n    // If the element is focused already, calling `focus` again won't trigger the event listener\n    // which means that the focus classes won't be updated. If that's the case, update the classes\n    // directly without waiting for an event.\n    if (nativeElement === focusedElement) {\n      this._getClosestElementsInfo(nativeElement).forEach(([currentElement, info]) =>\n        this._originChanged(currentElement, origin, info),\n      );\n    } else {\n      this._setOrigin(origin);\n\n      // `focus` isn't available on the server\n      if (typeof nativeElement.focus === 'function') {\n        nativeElement.focus(options);\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this._elementInfo.forEach((_info, element) => this.stopMonitoring(element));\n  }\n\n  /** Use defaultView of injected document if available or fallback to global window reference */\n  private _getWindow(): Window {\n    return this._document.defaultView || window;\n  }\n\n  private _getFocusOrigin(focusEventTarget: HTMLElement | null): FocusOrigin {\n    if (this._origin) {\n      // If the origin was realized via a touch interaction, we need to perform additional checks\n      // to determine whether the focus origin should be attributed to touch or program.\n      if (this._originFromTouchInteraction) {\n        return this._shouldBeAttributedToTouch(focusEventTarget) ? 'touch' : 'program';\n      } else {\n        return this._origin;\n      }\n    }\n\n    // If the window has just regained focus, we can restore the most recent origin from before the\n    // window blurred. Otherwise, we've reached the point where we can't identify the source of the\n    // focus. This typically means one of two things happened:\n    //\n    // 1) The element was programmatically focused, or\n    // 2) The element was focused via screen reader navigation (which generally doesn't fire\n    //    events).\n    //\n    // Because we can't distinguish between these two cases, we default to setting `program`.\n    if (this._windowFocused && this._lastFocusOrigin) {\n      return this._lastFocusOrigin;\n    }\n\n    // If the interaction is coming from an input label, we consider it a mouse interactions.\n    // This is a special case where focus moves on `click`, rather than `mousedown` which breaks\n    // our detection, because all our assumptions are for `mousedown`. We need to handle this\n    // special case, because it's very common for checkboxes and radio buttons.\n    if (focusEventTarget && this._isLastInteractionFromInputLabel(focusEventTarget)) {\n      return 'mouse';\n    }\n\n    return 'program';\n  }\n\n  /**\n   * Returns whether the focus event should be attributed to touch. Recall that in IMMEDIATE mode, a\n   * touch origin isn't immediately reset at the next tick (see _setOrigin). This means that when we\n   * handle a focus event following a touch interaction, we need to determine whether (1) the focus\n   * event was directly caused by the touch interaction or (2) the focus event was caused by a\n   * subsequent programmatic focus call triggered by the touch interaction.\n   * @param focusEventTarget The target of the focus event under examination.\n   */\n  private _shouldBeAttributedToTouch(focusEventTarget: HTMLElement | null): boolean {\n    // Please note that this check is not perfect. Consider the following edge case:\n    //\n    // <div #parent tabindex=\"0\">\n    //   <div #child tabindex=\"0\" (click)=\"#parent.focus()\"></div>\n    // </div>\n    //\n    // Suppose there is a FocusMonitor in IMMEDIATE mode attached to #parent. When the user touches\n    // #child, #parent is programmatically focused. This code will attribute the focus to touch\n    // instead of program. This is a relatively minor edge-case that can be worked around by using\n    // focusVia(parent, 'program') to focus #parent.\n    return (\n      this._detectionMode === FocusMonitorDetectionMode.EVENTUAL ||\n      !!focusEventTarget?.contains(this._inputModalityDetector._mostRecentTarget)\n    );\n  }\n\n  /**\n   * Sets the focus classes on the element based on the given focus origin.\n   * @param element The element to update the classes on.\n   * @param origin The focus origin.\n   */\n  private _setClasses(element: HTMLElement, origin?: FocusOrigin): void {\n    element.classList.toggle('cdk-focused', !!origin);\n    element.classList.toggle('cdk-touch-focused', origin === 'touch');\n    element.classList.toggle('cdk-keyboard-focused', origin === 'keyboard');\n    element.classList.toggle('cdk-mouse-focused', origin === 'mouse');\n    element.classList.toggle('cdk-program-focused', origin === 'program');\n  }\n\n  /**\n   * Updates the focus origin. If we're using immediate detection mode, we schedule an async\n   * function to clear the origin at the end of a timeout. The duration of the timeout depends on\n   * the origin being set.\n   * @param origin The origin to set.\n   * @param isFromInteraction Whether we are setting the origin from an interaction event.\n   */\n  private _setOrigin(origin: FocusOrigin, isFromInteraction = false): void {\n    this._ngZone.runOutsideAngular(() => {\n      this._origin = origin;\n      this._originFromTouchInteraction = origin === 'touch' && isFromInteraction;\n\n      // If we're in IMMEDIATE mode, reset the origin at the next tick (or in `TOUCH_BUFFER_MS` ms\n      // for a touch event). We reset the origin at the next tick because Firefox focuses one tick\n      // after the interaction event. We wait `TOUCH_BUFFER_MS` ms before resetting the origin for\n      // a touch event because when a touch event is fired, the associated focus event isn't yet in\n      // the event queue. Before doing so, clear any pending timeouts.\n      if (this._detectionMode === FocusMonitorDetectionMode.IMMEDIATE) {\n        clearTimeout(this._originTimeoutId);\n        const ms = this._originFromTouchInteraction ? TOUCH_BUFFER_MS : 1;\n        this._originTimeoutId = setTimeout(() => (this._origin = null), ms);\n      }\n    });\n  }\n\n  /**\n   * Handles focus events on a registered element.\n   * @param event The focus event.\n   * @param element The monitored element.\n   */\n  private _onFocus(event: FocusEvent, element: HTMLElement) {\n    // NOTE(mmalerba): We currently set the classes based on the focus origin of the most recent\n    // focus event affecting the monitored element. If we want to use the origin of the first event\n    // instead we should check for the cdk-focused class here and return if the element already has\n    // it. (This only matters for elements that have includesChildren = true).\n\n    // If we are not counting child-element-focus as focused, make sure that the event target is the\n    // monitored element itself.\n    const elementInfo = this._elementInfo.get(element);\n    const focusEventTarget = _getEventTarget<HTMLElement>(event);\n    if (!elementInfo || (!elementInfo.checkChildren && element !== focusEventTarget)) {\n      return;\n    }\n\n    this._originChanged(element, this._getFocusOrigin(focusEventTarget), elementInfo);\n  }\n\n  /**\n   * Handles blur events on a registered element.\n   * @param event The blur event.\n   * @param element The monitored element.\n   */\n  _onBlur(event: FocusEvent, element: HTMLElement) {\n    // If we are counting child-element-focus as focused, make sure that we aren't just blurring in\n    // order to focus another child of the monitored element.\n    const elementInfo = this._elementInfo.get(element);\n\n    if (\n      !elementInfo ||\n      (elementInfo.checkChildren &&\n        event.relatedTarget instanceof Node &&\n        element.contains(event.relatedTarget))\n    ) {\n      return;\n    }\n\n    this._setClasses(element);\n    this._emitOrigin(elementInfo, null);\n  }\n\n  private _emitOrigin(info: MonitoredElementInfo, origin: FocusOrigin) {\n    if (info.subject.observers.length) {\n      this._ngZone.run(() => info.subject.next(origin));\n    }\n  }\n\n  private _registerGlobalListeners(elementInfo: MonitoredElementInfo) {\n    if (!this._platform.isBrowser) {\n      return;\n    }\n\n    const rootNode = elementInfo.rootNode;\n    const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode) || 0;\n\n    if (!rootNodeFocusListeners) {\n      this._ngZone.runOutsideAngular(() => {\n        rootNode.addEventListener(\n          'focus',\n          this._rootNodeFocusAndBlurListener,\n          captureEventListenerOptions,\n        );\n        rootNode.addEventListener(\n          'blur',\n          this._rootNodeFocusAndBlurListener,\n          captureEventListenerOptions,\n        );\n      });\n    }\n\n    this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners + 1);\n\n    // Register global listeners when first element is monitored.\n    if (++this._monitoredElementCount === 1) {\n      // Note: we listen to events in the capture phase so we\n      // can detect them even if the user stops propagation.\n      this._ngZone.runOutsideAngular(() => {\n        const window = this._getWindow();\n        window.addEventListener('focus', this._windowFocusListener);\n      });\n\n      // The InputModalityDetector is also just a collection of global listeners.\n      this._inputModalityDetector.modalityDetected\n        .pipe(takeUntil(this._stopInputModalityDetector))\n        .subscribe(modality => {\n          this._setOrigin(modality, true /* isFromInteraction */);\n        });\n    }\n  }\n\n  private _removeGlobalListeners(elementInfo: MonitoredElementInfo) {\n    const rootNode = elementInfo.rootNode;\n\n    if (this._rootNodeFocusListenerCount.has(rootNode)) {\n      const rootNodeFocusListeners = this._rootNodeFocusListenerCount.get(rootNode)!;\n\n      if (rootNodeFocusListeners > 1) {\n        this._rootNodeFocusListenerCount.set(rootNode, rootNodeFocusListeners - 1);\n      } else {\n        rootNode.removeEventListener(\n          'focus',\n          this._rootNodeFocusAndBlurListener,\n          captureEventListenerOptions,\n        );\n        rootNode.removeEventListener(\n          'blur',\n          this._rootNodeFocusAndBlurListener,\n          captureEventListenerOptions,\n        );\n        this._rootNodeFocusListenerCount.delete(rootNode);\n      }\n    }\n\n    // Unregister global listeners when last element is unmonitored.\n    if (!--this._monitoredElementCount) {\n      const window = this._getWindow();\n      window.removeEventListener('focus', this._windowFocusListener);\n\n      // Equivalently, stop our InputModalityDetector subscription.\n      this._stopInputModalityDetector.next();\n\n      // Clear timeouts for all potentially pending timeouts to prevent the leaks.\n      clearTimeout(this._windowFocusTimeoutId);\n      clearTimeout(this._originTimeoutId);\n    }\n  }\n\n  /** Updates all the state on an element once its focus origin has changed. */\n  private _originChanged(\n    element: HTMLElement,\n    origin: FocusOrigin,\n    elementInfo: MonitoredElementInfo,\n  ) {\n    this._setClasses(element, origin);\n    this._emitOrigin(elementInfo, origin);\n    this._lastFocusOrigin = origin;\n  }\n\n  /**\n   * Collects the `MonitoredElementInfo` of a particular element and\n   * all of its ancestors that have enabled `checkChildren`.\n   * @param element Element from which to start the search.\n   */\n  private _getClosestElementsInfo(element: HTMLElement): [HTMLElement, MonitoredElementInfo][] {\n    const results: [HTMLElement, MonitoredElementInfo][] = [];\n\n    this._elementInfo.forEach((info, currentElement) => {\n      if (currentElement === element || (info.checkChildren && currentElement.contains(element))) {\n        results.push([currentElement, info]);\n      }\n    });\n\n    return results;\n  }\n\n  /**\n   * Returns whether an interaction is likely to have come from the user clicking the `label` of\n   * an `input` or `textarea` in order to focus it.\n   * @param focusEventTarget Target currently receiving focus.\n   */\n  private _isLastInteractionFromInputLabel(focusEventTarget: HTMLElement): boolean {\n    const {_mostRecentTarget: mostRecentTarget, mostRecentModality} = this._inputModalityDetector;\n\n    // If the last interaction used the mouse on an element contained by one of the labels\n    // of an `input`/`textarea` that is currently focused, it is very likely that the\n    // user redirected focus using the label.\n    if (\n      mostRecentModality !== 'mouse' ||\n      !mostRecentTarget ||\n      mostRecentTarget === focusEventTarget ||\n      (focusEventTarget.nodeName !== 'INPUT' && focusEventTarget.nodeName !== 'TEXTAREA') ||\n      (focusEventTarget as HTMLInputElement | HTMLTextAreaElement).disabled\n    ) {\n      return false;\n    }\n\n    const labels = (focusEventTarget as HTMLInputElement | HTMLTextAreaElement).labels;\n\n    if (labels) {\n      for (let i = 0; i < labels.length; i++) {\n        if (labels[i].contains(mostRecentTarget)) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n}\n\n/**\n * Directive that determines how a particular element was focused (via keyboard, mouse, touch, or\n * programmatically) and adds corresponding classes to the element.\n *\n * There are two variants of this directive:\n * 1) cdkMonitorElementFocus: does not consider an element to be focused if one of its children is\n *    focused.\n * 2) cdkMonitorSubtreeFocus: considers an element focused if it or any of its children are focused.\n */\n@Directive({\n  selector: '[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]',\n  exportAs: 'cdkMonitorFocus',\n})\nexport class CdkMonitorFocus implements AfterViewInit, OnDestroy {\n  private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n  private _focusMonitor = inject(FocusMonitor);\n\n  private _monitorSubscription: Subscription | undefined;\n  private _focusOrigin: FocusOrigin = null;\n\n  @Output() readonly cdkFocusChange = new EventEmitter<FocusOrigin>();\n\n  constructor(...args: unknown[]);\n  constructor() {}\n\n  get focusOrigin(): FocusOrigin {\n    return this._focusOrigin;\n  }\n\n  ngAfterViewInit() {\n    const element = this._elementRef.nativeElement;\n    this._monitorSubscription = this._focusMonitor\n      .monitor(element, element.nodeType === 1 && element.hasAttribute('cdkMonitorSubtreeFocus'))\n      .subscribe(origin => {\n        this._focusOrigin = origin;\n        this.cdkFocusChange.emit(origin);\n      });\n  }\n\n  ngOnDestroy() {\n    this._focusMonitor.stopMonitoring(this._elementRef);\n    this._monitorSubscription?.unsubscribe();\n  }\n}\n"],"names":["INPUT_MODALITY_DETECTOR_OPTIONS","InjectionToken","INPUT_MODALITY_DETECTOR_DEFAULT_OPTIONS","ignoreKeys","ALT","CONTROL","MAC_META","META","SHIFT","TOUCH_BUFFER_MS","modalityEventListenerOptions","passive","capture","InputModalityDetector","_platform","inject","Platform","_listenerCleanups","modalityDetected","modalityChanged","mostRecentModality","_modality","value","_mostRecentTarget","BehaviorSubject","_options","_lastTouchMs","_onKeydown","event","some","keyCode","next","_getEventTarget","_onMousedown","Date","now","isFakeMousedownFromScreenReader","_onTouchstart","isFakeTouchstartFromScreenReader","constructor","ngZone","NgZone","document","DOCUMENT","options","optional","pipe","skip","distinctUntilChanged","isBrowser","renderer","RendererFactory2","createRenderer","runOutsideAngular","listen","ngOnDestroy","complete","forEach","cleanup","deps","target","i0","ɵɵFactoryTarget","Injectable","ɵprov","ɵɵngDeclareInjectable","minVersion","version","ngImport","type","decorators","providedIn","FocusMonitorDetectionMode","FOCUS_MONITOR_DEFAULT_OPTIONS","captureEventListenerOptions","normalizePassiveListenerOptions","FocusMonitor","_ngZone","_inputModalityDetector","_origin","_lastFocusOrigin","_windowFocused","_windowFocusTimeoutId","_originTimeoutId","_originFromTouchInteraction","_elementInfo","Map","_monitoredElementCount","_rootNodeFocusListenerCount","_detectionMode","_windowFocusListener","setTimeout","_document","_stopInputModalityDetector","Subject","detectionMode","IMMEDIATE","_rootNodeFocusAndBlurListener","element","parentElement","_onFocus","_onBlur","monitor","checkChildren","nativeElement","coerceElement","nodeType","observableOf","rootNode","_getShadowRoot","cachedInfo","get","subject","info","set","_registerGlobalListeners","stopMonitoring","elementInfo","_setClasses","delete","_removeGlobalListeners","focusVia","origin","focusedElement","activeElement","_getClosestElementsInfo","currentElement","_originChanged","_setOrigin","focus","_info","_getWindow","defaultView","window","_getFocusOrigin","focusEventTarget","_shouldBeAttributedToTouch","_isLastInteractionFromInputLabel","EVENTUAL","contains","classList","toggle","isFromInteraction","clearTimeout","ms","relatedTarget","Node","_emitOrigin","observers","length","run","rootNodeFocusListeners","addEventListener","takeUntil","subscribe","modality","has","removeEventListener","results","push","mostRecentTarget","nodeName","disabled","labels","i","CdkMonitorFocus","_elementRef","ElementRef","_focusMonitor","_monitorSubscription","_focusOrigin","cdkFocusChange","EventEmitter","focusOrigin","ngAfterViewInit","hasAttribute","emit","unsubscribe","Directive","isStandalone","selector","outputs","exportAs","args","Output"],"mappings":"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"}