{"version":3,"file":"_typeahead-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/a11y/key-manager/typeahead.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 {A, NINE, Z, ZERO} from '../../keycodes';\nimport {Subject, Observable} from 'rxjs';\nimport {debounceTime, filter, map, tap} from 'rxjs/operators';\n\nconst DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS = 200;\n\ninterface TypeaheadItem {\n  getLabel?(): string;\n}\n\ninterface TypeaheadConfig<T> {\n  debounceInterval?: number;\n  skipPredicate?: (item: T) => boolean | undefined;\n}\n\n/**\n * Selects items based on keyboard inputs. Implements the typeahead functionality of\n * `role=\"listbox\"` or `role=\"tree\"` and other related roles.\n */\nexport class Typeahead<T extends TypeaheadItem> {\n  private readonly _letterKeyStream = new Subject<string>();\n  private _items: readonly T[] = [];\n  private _selectedItemIndex = -1;\n\n  /** Buffer for the letters that the user has pressed */\n  private _pressedLetters: string[] = [];\n\n  private _skipPredicateFn?: (item: T) => boolean | undefined;\n\n  private readonly _selectedItem = new Subject<T>();\n  readonly selectedItem: Observable<T> = this._selectedItem;\n\n  constructor(initialItems: readonly T[], config?: TypeaheadConfig<T>) {\n    const typeAheadInterval =\n      typeof config?.debounceInterval === 'number'\n        ? config.debounceInterval\n        : DEFAULT_TYPEAHEAD_DEBOUNCE_INTERVAL_MS;\n\n    if (config?.skipPredicate) {\n      this._skipPredicateFn = config.skipPredicate;\n    }\n\n    if (\n      (typeof ngDevMode === 'undefined' || ngDevMode) &&\n      initialItems.length &&\n      initialItems.some(item => typeof item.getLabel !== 'function')\n    ) {\n      throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');\n    }\n\n    this.setItems(initialItems);\n    this._setupKeyHandler(typeAheadInterval);\n  }\n\n  destroy() {\n    this._pressedLetters = [];\n    this._letterKeyStream.complete();\n    this._selectedItem.complete();\n  }\n\n  setCurrentSelectedItemIndex(index: number) {\n    this._selectedItemIndex = index;\n  }\n\n  setItems(items: readonly T[]) {\n    this._items = items;\n  }\n\n  handleKey(event: KeyboardEvent): void {\n    const keyCode = event.keyCode;\n\n    // Attempt to use the `event.key` which also maps it to the user's keyboard language,\n    // otherwise fall back to resolving alphanumeric characters via the keyCode.\n    if (event.key && event.key.length === 1) {\n      this._letterKeyStream.next(event.key.toLocaleUpperCase());\n    } else if ((keyCode >= A && keyCode <= Z) || (keyCode >= ZERO && keyCode <= NINE)) {\n      this._letterKeyStream.next(String.fromCharCode(keyCode));\n    }\n  }\n\n  /** Gets whether the user is currently typing into the manager using the typeahead feature. */\n  isTyping(): boolean {\n    return this._pressedLetters.length > 0;\n  }\n\n  /** Resets the currently stored sequence of typed letters. */\n  reset(): void {\n    this._pressedLetters = [];\n  }\n\n  private _setupKeyHandler(typeAheadInterval: number) {\n    // Debounce the presses of non-navigational keys, collect the ones that correspond to letters\n    // and convert those letters back into a string. Afterwards find the first item that starts\n    // with that string and select it.\n    this._letterKeyStream\n      .pipe(\n        tap(letter => this._pressedLetters.push(letter)),\n        debounceTime(typeAheadInterval),\n        filter(() => this._pressedLetters.length > 0),\n        map(() => this._pressedLetters.join('').toLocaleUpperCase()),\n      )\n      .subscribe(inputString => {\n        // Start at 1 because we want to start searching at the item immediately\n        // following the current active item.\n        for (let i = 1; i < this._items.length + 1; i++) {\n          const index = (this._selectedItemIndex + i) % this._items.length;\n          const item = this._items[index];\n\n          if (\n            !this._skipPredicateFn?.(item) &&\n            item.getLabel?.().toLocaleUpperCase().trim().indexOf(inputString) === 0\n          ) {\n            this._selectedItem.next(item);\n            break;\n          }\n        }\n\n        this._pressedLetters = [];\n      });\n  }\n}\n"],"names":[],"mappings":"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"}