{"version":3,"file":"talenra-ngx-base-search.mjs","sources":["../../../projects/ngx-base/search/src/search-field/search-field.types.ts","../../../projects/ngx-base/search/src/search-input/search-input.types.ts","../../../projects/ngx-base/search/src/search-input/search-input.component.ts","../../../projects/ngx-base/search/src/search-field/search-field.component.ts","../../../projects/ngx-base/search/src/search-field/search-field.component.html","../../../projects/ngx-base/search/public-api.ts","../../../projects/ngx-base/search/talenra-ngx-base-search.ts"],"sourcesContent":["import { SearchFieldComponent } from './search-field.component';\n\n/**\n * Event emitted when the SearchField is submitted.\n */\nexport type SearchTrigger = {\n  /** Reference to the emitting SearchField component */\n  source: SearchFieldComponent;\n  /** Current value of the SearchInput */\n  value: string;\n};\n\n/**\n * Event emitted when SearchField's `clear` button (×) clicked.\n *\n * ### Import\n *\n * ```typescript\n * import { SearchClear } from '@talenra/ngx-base/search';\n * ```\n *\n * @see {@link SearchFieldComponent}\n */\nexport interface SearchClear {\n  /** Reference to the emitting SearchField component */\n  source: SearchFieldComponent;\n}\n\n/**\n * Values accepted by the `SearchField`'s `spacing` property.\n *\n * ### Import\n *\n * ```typescript\n * import { SearchFieldSize } from '@talenra/ngx-base/search';\n * ```\n *\n * @see {@link SearchField}\n * @see {@link TSearchFieldSize}\n */\nexport const SearchFieldSize = {\n  S: 's',\n  M: 'm',\n} as const;\n\n/**\n * Type of values accepted by the `SearchField`'s `spacing` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TSearchFieldSize } from '@talenra/ngx-base/search';\n * ```\n *\n * @see {@link SearchField}\n * @see {@link SearchFieldSize}\n */\nexport type TSearchFieldSize = (typeof SearchFieldSize)[keyof typeof SearchFieldSize];\n","/**\n * Values accepted by the `kind` property of the SearchInput component.\n *\n * ```html\n * <input talenra-search kind=\"no-indent\"></button>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SearchKind } from '@talenra/ngx-base/search';\n * ```\n *\n * @see {@link SearchInput}\n * @see {@link TSearchKind}\n */\nexport const SearchKind = {\n  Default: 'default',\n  NoIndent: 'no-indent',\n} as const;\n\n/**\n * Type of values accepted by the `kind` property of the SearchInput component.\n *\n * ### Import\n *\n * ```typescript\n * import { TSearchKind } from '@talenra/ngx-base/search';\n * ```\n *\n * @see {@link SearchInput}\n * @see {@link SearchKind}\n */\nexport type TSearchKind = (typeof SearchKind)[keyof typeof SearchKind];\n","import {\n  AfterContentInit,\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  Injector,\n  Input,\n  booleanAttribute,\n  forwardRef,\n  inject,\n} from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SearchKind, TSearchKind } from './search-input.types';\nimport { SearchFieldComponent } from '../search-field/search-field.component';\n\n/**\n * SearchInput provides consistent styling and behaviour for different kinds of search inputs.\n * It is typically wrapped by a SearchField.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * protected searchForm: FormGroup = new FormGroup({\n *   query: new FormControl(''),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"searchForm\">\n *   <talenra-search-field>\n *     <input talenra-search formControlName=\"query\" />\n *   </talenra-search-field>\n * </form>\n * ```\n *\n * #### Template driven form\n *\n * ```typescript\n * // Component class\n * protected query = '';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-search-field>\n *   <input talenra-search [(ngModel)]=\"query\" />\n * </talenra-search-field>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SearchModule } from '@talenra/ngx-base/search';\n * ```\n *\n * <example-url>../../#/search</example-url>\n *\n * @see {@link SearchFieldComponent}\n */\n@Component({\n  selector: 'input[talenra-search]',\n  template: ``,\n  styleUrls: ['./search-input.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SearchInputComponent), multi: true }],\n  host: {\n    '(input)': 'inputHandler($event.target.value)',\n    '(focus)': 'focusHandler($event)',\n    '(blur)': 'focusHandler($event)',\n    '[value]': 'value',\n    '[tabindex]': 'tabindex',\n    '[disabled]': '_disabled',\n    '[class]': 'hostClass',\n  },\n})\nexport class SearchInputComponent implements ControlValueAccessor, AfterContentInit {\n  /**\n   * Determinates the kind (or style) of the input. Used to support style variations.\n   *\n   * NoIndent: Render a search without horizontal indent / padding.\n   *\n   * ```html\n   * <input talenra-search kind=\"no-indent\" [(ngModel)]=\"query\" />\n   * ```\n   */\n  @Input() kind: TSearchKind = SearchKind.Default;\n\n  /** @internal */\n  value: string | null = null;\n\n  private tabindex = 0;\n\n  /** @internal */\n  hasFocus = false;\n\n  /** @internal */\n  stateChanges: Subject<void> = new Subject<void>();\n\n  /** @internal */\n  control: AbstractControl | null = null;\n\n  /**\n   * Determines whether the control is disabled/enabled.\n   *\n   * ```html\n   * <input talenra-search [(ngModel)]=\"query\" disabled />\n   * ```\n   */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's disabled state */\n  get disabled(): null | true {\n    return this._disabled;\n  }\n  /** Set the control's disabled state */\n  set disabled(value: null | true) {\n    if (value === this._disabled) return;\n    this._disabled = value;\n    this.tabindex = value ? -1 : 0;\n    this.stateChanges.next();\n  }\n  private _disabled: null | true = null;\n\n  /**\n   * Determines whether the control's value is empty.\n   *\n   * @internal\n   */\n  get isEmpty(): boolean {\n    const element: HTMLInputElement = this.elementRef.nativeElement;\n    return !element.value && !element.validity.badInput;\n  }\n\n  /** Reference to the wrapping SearchField */\n  private searchField?: SearchFieldComponent;\n\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  private injector = inject(Injector);\n  private elementRef = inject<ElementRef<HTMLInputElement>>(ElementRef);\n\n  /** @internal */\n  constructor() {\n    // Allow usage of control without a wrapping SearchField\n    this.searchField =\n      this.injector.get<SearchFieldComponent>(SearchFieldComponent, undefined, { optional: true }) || undefined;\n  }\n\n  /** @internal */\n  ngAfterContentInit(): void {\n    this.control = this.injector.get(NgControl).control;\n    // UI of the wrapping search field depends on the input's content (e.g. show/hide action \"clear field\"). If the\n    // input is initialized with a value in a template-driven context, we need to trigger stateChanges once the value\n    // is updated.\n    this.control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.stateChanges.next());\n  }\n\n  /** @internal */\n  // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars\n  private onChange(value: string | null): void {}\n\n  /** @internal */\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  private onTouched(): void {}\n\n  /** @internal */\n  writeValue(value: string | null): void {\n    this.value = value;\n  }\n\n  /** @internal */\n  registerOnChange(fn: (value: string | null) => void): void {\n    this.onChange = fn;\n  }\n\n  /** @internal */\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  /** @internal */\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled ? true : null;\n  }\n\n  /** @internal */\n  clearValue(): void {\n    this.value = null;\n    this.onChange(this.value);\n    this.onTouched();\n    this.focus();\n  }\n\n  private inputHandler(value: string): void {\n    this.value = value;\n    this.onChange(value);\n  }\n\n  private focusHandler(event: FocusEvent): void {\n    const hasFocus = event.type === 'focus';\n    // No focus while disabled\n    if (hasFocus && this.disabled) return;\n    if (hasFocus === this.hasFocus) return;\n    this.hasFocus = hasFocus;\n    this.stateChanges.next();\n  }\n\n  /**\n   * Sets the focus to the input.\n   */\n  public focus(): void {\n    this.elementRef.nativeElement.focus();\n  }\n\n  /** @internal */\n  get hostClass(): string {\n    return [\n      this.kind === SearchKind.NoIndent ? 'kind--no-indent' : '',\n      this.searchField ? `size--${this.searchField.size()}` : '',\n    ]\n      .filter((item) => item)\n      .join(' ');\n  }\n}\n","import {\n  AfterContentInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  DestroyRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  booleanAttribute,\n  input,\n  inject,\n} from '@angular/core';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { ButtonComponent } from '@talenra/ngx-base/button';\nimport { FieldUnderlineComponent } from '@talenra/ngx-base/shared';\nimport { ClearButtonComponent } from '@talenra/ngx-base/form-field';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SearchClear, SearchFieldSize, SearchTrigger, TSearchFieldSize } from './search-field.types';\nimport { SearchInputComponent } from '../search-input/search-input.component';\nimport { SearchKind } from '../search-input/search-input.types';\n\n/**\n * Used to create a \"unique\" ID for each SearchField.\n *\n * @internal\n */\nlet nextId = 0;\n\n/**\n * SearchField is a wrapper for SearchField. The wrapper/field-architecture gives the consuming app direct access to and\n * thus full control over the wrapped field.\n *\n * Example:\n *\n * ```typescript\n * // Component class\n * protected searchForm: FormGroup = new FormGroup({\n *   query: new FormControl(''),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-search-field\">\n *   <input talenra-search formControlName=\"query\" />\n * </talenra-search-field>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SearchFieldComponent } from '@talenra/ngx-base/search';\n * ```\n *\n * <example-url>../../#/search</example-url>\n *\n * @see {@link SearchInputComponent}\n */\n@Component({\n  selector: 'talenra-search-field',\n  templateUrl: './search-field.component.html',\n  styleUrls: ['./search-field.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(keydown.enter)': 'onEnter($event)',\n    '(keyup.enter)': 'onSearch()',\n    '[class]': 'hostClass',\n  },\n  imports: [ClearButtonComponent, IconComponent, ButtonComponent, FieldUnderlineComponent],\n})\nexport class SearchFieldComponent implements OnInit, AfterContentInit {\n  /**\n   * Determines whether the magnifying glass icons is displayed.\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-search-field\" showIcon>\n   *   <input talenra-search formControlName=\"query\" />\n   * </talenra-search-field>\n   * ```\n   */\n  @Input({ transform: booleanAttribute }) showIcon = false;\n\n  /**\n   * Determines whether the search button is displayed.\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-search-field\" showButton>\n   *   <input talenra-search formControlName=\"query\" />\n   * </talenra-search-field>\n   * ```\n   */\n  @Input({ transform: booleanAttribute }) showButton = false;\n\n  /**\n   * Determines the size of SearchField. Defaults to 'm'.\n   *\n   * ```html\n   * <talenra-search-field ... size=\"s\"></talenra-search-field>\n   * ```\n   *\n   * @see {@link SearchFieldSize}\n   */\n  size = input<TSearchFieldSize>(SearchFieldSize.M);\n\n  /**\n   * Event emitted when the SearchField is submitted.\n   *\n   * ```typescript\n   * // Component class\n   * import { SearchTrigger } from '@talenra/ngx-base/search';\n   *\n   * protected searchForm: FormGroup = new FormGroup({\n   *   query: new FormControl(''),\n   * });\n   *\n   * onSearch: (search: SearchTrigger) => {\n   *   console.log(`SearchField (id: ${search.source.id}) is submitted with value ${search.value}.`);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <form [formGroup]=\"searchForm\">\n   *   <talenra-search-field showButton (search)=\"onSearch($event)\">\n   *     <input talenra-search formControlName=\"query\" />\n   *   </talenra-search-field>\n   * </form>\n   * ```\n   */\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output() search = new EventEmitter<SearchTrigger>();\n\n  /**\n   * Event emitted when SearchField's `clear` button (×) clicked.\n   */\n  @Output() clear = new EventEmitter<SearchClear>();\n\n  /** @internal */\n  public id = '';\n\n  /**\n   * Reference to the associated search field component.\n   *\n   * @internal\n   */\n  @ContentChild(SearchInputComponent) protected searchInput?: SearchInputComponent;\n\n  private useTransition = false;\n\n  private readonly changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.id = `search-field-${nextId++}`;\n  }\n\n  /** @internal */\n  ngAfterContentInit(): void {\n    this.searchInput?.stateChanges\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.changeDetector.markForCheck());\n    setTimeout(() => (this.useTransition = true));\n  }\n\n  protected onEnter(event: Event): void {\n    event.preventDefault();\n  }\n\n  protected onClear(): void {\n    this.clear.emit({ source: this });\n  }\n\n  protected onSearch(): void {\n    const value: string | null = this.searchInput ? this.searchInput.value : null;\n    if (!value) return;\n    this.search.emit({ source: this, value: value });\n  }\n\n  /** @internal */\n  get hostClass(): string {\n    return [\n      this.showIcon ? 'has-icon' : '',\n      this.showButton ? 'has-button' : '',\n      this.searchInput?.kind === SearchKind.NoIndent ? 'kind--no-indent' : '',\n      this.searchInput?.disabled ? 'disabled' : '',\n      this.useTransition ? 'use-transition' : '',\n      `size--${this.size()}`,\n    ]\n      .filter((item) => item)\n      .join(' ');\n  }\n}\n","<ng-content />\n<div class=\"wrapper\">\n  <span class=\"button-group\">\n    @if (showIcon) {\n      <talenra-icon name=\"search\" class=\"icon\" />\n    }\n  </span>\n  <span class=\"button-group\">\n    <div class=\"clear\" [class.hidden]=\"searchInput?.isEmpty\">\n      <talenra-clear-button\n        [isVisible]=\"!!searchInput && !searchInput.isEmpty\"\n        (click)=\"searchInput?.clearValue(); onClear()\"\n        (keyup.enter)=\"searchInput?.clearValue()\"\n        data-testid=\"clear\" />\n    </div>\n    @if (showButton) {\n      <button\n        talenra-button\n        kind=\"ghost\"\n        size=\"s\"\n        icon=\"search\"\n        [attr.tabindex]=\"searchInput?.isEmpty ? -1 : 0\"\n        [disabled]=\"searchInput?.isEmpty ? true : null\"\n        (click)=\"onSearch()\"\n        data-testid=\"submit\"></button>\n    }\n  </span>\n</div>\n<talenra-field-underline class=\"underline\" [hasFocus]=\"searchInput?.hasFocus\" />\n","/**\n * WORKAROUND to fix error when running unit tests\n *\n * Error during loading: Uncaught ReferenceError: Cannot access 'SearchInputComponent' before initialization\n * An error was thrown in afterAll\n * Uncaught ReferenceError: Cannot access 'SearchInputComponent' before initialization\n * ReferenceError: Cannot access 'SearchInputComponent' before initialization\n *     at http://localhost:9876/_karma_webpack_/webpack:/projects/ngx-search/src/search-field/search-field.component.ts:150:17\n *\n * WORKS: Export SearchFieldComponent _before_ SearchInputComponent\n *\n * export * from './src/search-field/search-field.component';\n * export * from './src/search-field/search-field.types';\n * export * from './src/search-input/search-input.component';\n * export * from './src/search-input/search-input.types';\n *\n * DOES NOT WORK: Exporting SearchFieldComponent _after_ SearchInputComponent\n *\n * export * from './src/search-input/search-input.component';\n * export * from './src/search-input/search-input.types';\n * export * from './src/search-field/search-field.component';\n * export * from './src/search-field/search-field.types';\n */\n\nexport * from './src/search-field/search-field.component';\nexport * from './src/search-field/search-field.types';\nexport * from './src/search-input/search-input.component';\nexport * from './src/search-input/search-input.types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}