{"version":3,"file":"talenra-ngx-base-select.mjs","sources":["../../../projects/ngx-base/select/src/chip/chip.component.ts","../../../projects/ngx-base/select/src/chip/chip.component.html","../../../projects/ngx-base/select/src/select/select.types.ts","../../../projects/ngx-base/select/src/option-list/option-list.component.ts","../../../projects/ngx-base/select/src/option-list/option-list.component.html","../../../projects/ngx-base/select/src/option-group/option-group.component.ts","../../../projects/ngx-base/select/src/option-group/option-group.component.html","../../../projects/ngx-base/select/src/select/select.component.ts","../../../projects/ngx-base/select/src/select/select.component.html","../../../projects/ngx-base/select/src/option/option.component.ts","../../../projects/ngx-base/select/src/option/option.component.html","../../../projects/ngx-base/select/talenra-ngx-base-select.ts"],"sourcesContent":["import { Component, EventEmitter, input, Input, Output } from '@angular/core';\nimport { FormFieldSize, TFormFieldSize } from '@talenra/ngx-base/form-field';\n\n/**\n * `<talenra-chip>` is used to display a chip with a label and a close button in a multiselect.\n * The close button emits an event when clicked.\n *\n * The label is displayed in the chip and the value is emitted when the close button is clicked.\n *\n * @internal\n */\n@Component({\n  selector: 'talenra-chip',\n  templateUrl: './chip.component.html',\n  styleUrl: './chip.component.scss',\n  host: {\n    '[class]': 'hostClass',\n  },\n})\nexport class ChipComponent {\n  @Input({ required: true }) value: string = '';\n  @Input({ required: true }) label: string = '';\n  @Input() disabled: boolean = false;\n  public size = input<TFormFieldSize>(FormFieldSize.M);\n  @Output() closeClicked: EventEmitter<string> = new EventEmitter();\n\n  protected closeClick($event: MouseEvent) {\n    $event.stopPropagation();\n    this.closeClicked.emit(this.value);\n  }\n\n  private get hostClass(): string {\n    return `size--${this.size()}`;\n  }\n}\n","<span class=\"label\">{{ label }}</span>\n<button class=\"button\" (click)=\"closeClick($event)\" [disabled]=\"disabled\">\n  <span class=\"talenra-icon talenra-icon--close\"></span>\n</button>\n","import { SelectComponent } from './select.component';\n\n/**\n * Values accepted by the `Select`'s `kind` property.\n *\n * ```html\n * <talenra-select kind=\"ghost\">\n * <!-- ... -->\n * </talenra-select>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SelectKind } from '@talenra/ngx-base/select';\n * ```\n *\n * @see {@link SelectComponent}\n */\nexport const SelectKind = {\n  Ghost: 'ghost',\n  Primary: 'primary',\n} as const;\n\n/**\n * Type of values accepted by the `SelectComponent`'s `kind` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TSelectKind } from '@talenra/ngx-base/select';\n * ```\n *\n * @see {@link SelectComponent}\n */\nexport type TSelectKind = (typeof SelectKind)[keyof typeof SelectKind];\n\n/**\n * Event emitted when the user has changed the select's value.\n *\n * ### Import\n *\n * ```typescript\n * import { SelectChange } from '@talenra/ngx-base/select';\n * ```\n *\n * @see {@link SelectComponent}\n */\nexport interface SelectChange {\n  /** Reference to the emitting select component */\n  source: SelectComponent;\n  /** Current value of the emitting select component */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  value: any;\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  ViewChild,\n  computed,\n  effect,\n  input,\n  signal,\n} from '@angular/core';\nimport { ScrollContainerComponent, ScrollContainerDimensions } from '@talenra/ngx-base/scroll-container';\nimport { SearchInputComponent, SearchFieldComponent } from '@talenra/ngx-base/search';\nimport { asapScheduler } from 'rxjs';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { MessageComponent } from '@talenra/ngx-base/message';\n\n/**\n * OptionList is a wrapper for a group of Options. The option list panel is positioned in Material CDK's overlay\n * container (which is the main reason to encapsulate the list from Select).\n *\n * @internal\n */\n@Component({\n  selector: 'talenra-option-list',\n  templateUrl: './option-list.component.html',\n  styleUrls: ['./option-list.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(keydown)': 'handleKeydown($event)',\n  },\n  imports: [\n    FormsModule,\n    MessageComponent,\n    ReactiveFormsModule,\n    ScrollContainerComponent,\n    SearchFieldComponent,\n    SearchInputComponent,\n  ],\n})\nexport class OptionListComponent implements AfterViewInit {\n  /**\n   * Determines whether the options filter is shown.\n   */\n  @Input() useFilter: boolean = false;\n\n  /**\n   * Message displayed to the user if Select contains no Options (e.g. while loading, due to backend issues etc.).\n   */\n  public noOptionsMessage = input<string>('');\n\n  /**\n   * Message displayed to the user if the filter query does not match any option.\n   */\n  @Input() noMatchMessage: string = '';\n\n  /**\n   * Number of options available\n   */\n  public optionsCount = input<number>(0);\n\n  /**\n   * Count of matches for the current filter query.\n   */\n  @Input() matchesCount?: number;\n\n  /**\n   * Message displayed to the user if no Options available.\n   */\n  protected emptyMessage = computed<string>(() => {\n    return this.filterQuery() ? this.noMatchMessage : this.noOptionsMessage();\n  });\n\n  /**\n   * Emits the filter query whenever it changes.\n   */\n  @Output() filterQueryChange: EventEmitter<string> = new EventEmitter<string>();\n\n  /**\n   * Emits to ask the parent select to take focus\n   */\n  @Output() focusOptions: EventEmitter<void> = new EventEmitter<void>();\n\n  /**\n   * Emits to ask the parent to close the panel\n   */\n  @Output() requestClose: EventEmitter<void> = new EventEmitter<void>();\n\n  /**\n   * Scroll container reference\n   */\n  @ViewChild(ScrollContainerComponent) private scrollContainer?: ScrollContainerComponent;\n\n  /**\n   * Query to filter options\n   */\n  public filterQuery = signal<string>('');\n\n  /**\n   * Filter input field\n   *\n   * @internal\n   */\n  @ViewChild('input') private filterInput?: SearchInputComponent;\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    asapScheduler.schedule(() => {\n      this.filterInput?.focus();\n    });\n  }\n\n  private handleKeydown(event: KeyboardEvent): void {\n    const key: string = event.key;\n\n    // -- ArrowDown\n    if (key === 'ArrowDown') {\n      // Pass focus to option list\n      this.focusOptions.emit();\n      event.preventDefault();\n    }\n\n    // -- Tab\n    if (key === 'Tab') {\n      // Shift + Tab while filter has focus: close panel\n      if (this.filterInput?.hasFocus && event.shiftKey) {\n        this.requestClose.emit();\n        event.preventDefault();\n      }\n      // Tab while query is empty --or-- filter field's clear-button has focus: Focus option list\n      else if (!event.shiftKey && (!this.filterQuery() || !this.filterInput?.hasFocus)) {\n        this.focusOptions.emit();\n        event.preventDefault();\n      }\n    }\n\n    // -- Escape\n    if (key === 'Escape') {\n      // Make sure focus is returned to select when closed with escape key.\n      this.requestClose.emit();\n    }\n  }\n\n  // Using effect instead of `model` so we can return empty string instead of `undefined`.\n  private filterQueryChangeEffect = effect(() => {\n    this.filterQueryChange.emit(this.filterQuery() || '');\n  });\n\n  /**\n   * Focusses the filter input field if available\n   *\n   * @internal\n   */\n  public focus(): void {\n    this.filterInput?.focus();\n  }\n\n  /**\n   * Updates the vertical scroll offset to ensure the option at the given dimension is visible.\n   *\n   * @param optionHeight The height of the option\n   * @param optionOffset The vertical offset of the option relative to the options list\n   * @internal\n   */\n  public scrollToOption(optionHeight: number, optionOffset: number): void {\n    if (!this.scrollContainer) return;\n    const container: ScrollContainerDimensions = this.scrollContainer.dimensions;\n\n    // Option is at least partially above visible area\n    if (optionOffset < container.scrollTop) {\n      this.scrollContainer.scrollTop = optionOffset;\n    }\n    // Option is at least partially below visible area\n    else if (optionOffset + optionHeight > container.scrollTop + container.offsetHeight) {\n      this.scrollContainer.scrollTop = optionOffset - container.offsetHeight + optionHeight;\n    }\n  }\n}\n","@if (useFilter && optionsCount() > 1) {\n  <div class=\"filter\">\n    <talenra-search-field showIcon>\n      <input\n        talenra-search\n        kind=\"no-indent\"\n        [(ngModel)]=\"filterQuery\"\n        title=\"Filter\"\n        #input\n        data-testid=\"option-list-filter-search-input\" />\n    </talenra-search-field>\n  </div>\n}\n<div class=\"options\">\n  @if (!optionsCount() || !matchesCount) {\n    <div class=\"no-options-message\">\n      <talenra-message kind=\"ghost\" [text]=\"emptyMessage()\" />\n    </div>\n  }\n  <talenra-scroll-container useOverlay useOffset class=\"scroll\">\n    <ng-content />\n  </talenra-scroll-container>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChildren,\n  forwardRef,\n  inject,\n  Input,\n  QueryList,\n} from '@angular/core';\nimport { OptionComponent } from '../option/option.component';\nimport { SelectComponent } from '../select/select.component';\n\n/**\n * OptionGroup is a container for single options in the context of a Select.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   animalia: new FormControl(),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-form-field label=\"Size\">\n *     <talenra-select formControlName=\"animalia\">\n *       <talenra-option-group label=\"Insects\">\n *         <talenra-option value=\"ant\">Ant</talenra-option>\n *         <talenra-option value=\"bee\">Bee</talenra-option>\n *       </talenra-option-group>\n *       <talenra-option-group label=\"Mammals\">\n *         <talenra-option value=\"cat\">Cat</talenra-option>\n *         <talenra-option value=\"cow\">Cow</talenra-option>\n *         <talenra-option value=\"dog\">Dog</talenra-option>\n *       </talenra-option-group>\n *     </talenra-select>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SelectModule } from '@talenra/ngx-base/select';\n * ```\n *\n * <example-url>../../#/select</example-url>\n *\n * @see {@link FormFieldComponent}\n * @see {@link SelectComponent}\n */\n@Component({\n  selector: 'talenra-option-group',\n  templateUrl: './option-group.component.html',\n  styleUrl: './option-group.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[class]': 'hostClass',\n    '[class.is-hidden]': 'isHidden',\n  },\n})\nexport class OptionGroupComponent {\n  /** Label to be displayed for the option group */\n  @Input() label: string = '';\n\n  /**\n   * Determines whether the option is shown in the UI. Used to hide options when they do not match filter.\n   *\n   * @internal\n   */\n  @Input()\n  /** @internal */\n  public get isHidden(): boolean {\n    return this._isHidden;\n  }\n\n  /** @internal */\n  public set isHidden(value: boolean) {\n    if (value === this._isHidden) return;\n    this._isHidden = value;\n    this.changeDetector.markForCheck();\n  }\n\n  private _isHidden = false;\n\n  /**\n   * The options associated with this option group\n   *\n   * @internal\n   */\n  @ContentChildren(forwardRef(() => OptionComponent), { descendants: true })\n  public options?: QueryList<OptionComponent>;\n\n  private select: SelectComponent = inject(SelectComponent);\n  private changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n  private get hostClass(): string {\n    return `size--${this.select.formField?.size() || 'm'}`;\n  }\n}\n","<span class=\"label\">{{ label }}</span>\n<div class=\"option-list\">\n  <ng-content />\n</div>\n","import {\n  AfterContentInit,\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChildren,\n  DestroyRef,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Injector,\n  Input,\n  input,\n  OnDestroy,\n  OnInit,\n  Output,\n  QueryList,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';\nimport { asapScheduler } from 'rxjs';\nimport { FormFieldControl, FormFieldControlBaseComponent, FormFieldStatus } from '@talenra/ngx-base/form-field';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CdkConnectedOverlay, CdkOverlayOrigin, Overlay, ScrollStrategy } from '@angular/cdk/overlay';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { SelectChange, SelectKind, TSelectKind } from './select.types';\nimport { OptionComponent, OptionDimensions } from '../option/option.component';\nimport { OptionListComponent } from '../option-list/option-list.component';\nimport { OptionGroupComponent } from '../option-group/option-group.component';\nimport { ChipComponent } from '../chip/chip.component';\n\n/**\n * Used to create a \"unique\" ID for each instance.\n *\n * @internal\n */\nlet nextId = 0;\n\n/** @internal */\ninterface Option {\n  value: string;\n  label: string;\n}\n\n/**\n * Select is a form control for selecting a value from a set of options, similar to the native `<select>` element. It is\n * typically used in a form context (in combination with FormField). Kind \"ghost\" offers an alternative appearance and\n * slightly different behavior which is typically applied when Select is used outside a classic form context, e.g. in a\n * toolbar.\n *\n * Use Option as children of Select to add options. Each Option has a value property that can be used to set the value\n * that will be selected if the user chooses this option. The content of the Option is displayed in the option list.\n *\n * Select supports selection of multiple options. Use the `allowMultiple` input property to activate this optional\n * feature.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   size: new FormControl('m'),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-form-field label=\"Size\">\n *     <talenra-select formControlName=\"size\">\n *       <talenra-option value=\"s\">S</talenra-option>\n *       <talenra-option value=\"m\">M</talenra-option>\n *       <talenra-option value=\"l\">L</talenra-option>\n *     </talenra-select>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * #### Reactive form (Multiselect with multiple items)\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   sizes: new FormControl(['S', 'M']),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-form-field label=\"Size\">\n *     <talenra-select allowMultiple=\"true\" formControlName=\"size\">\n *       <talenra-option value=\"s\">S</talenra-option>\n *       <talenra-option value=\"m\">M</talenra-option>\n *       <talenra-option value=\"l\">L</talenra-option>\n *       <talenra-option value=\"xl\">XL</talenra-option>\n *     </talenra-select>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * #### Template driven form\n *\n * ```typescript\n * // Import `FormsModule` in the declaring module\n * import { FormsModule } from '@angular/forms';\n * @NgModule({\n *  // ...\n *  imports: [FormsModule],\n *})\n * ```\n *\n * ```typescript\n * // Component class\n * size = 'm';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form #templateDrivenForm=\"ngForm\">\n *   <talenra-form-field label=\"Size\">\n *     <talenra-select name=\"size\" [(ngModel)]=\"size\">\n *       <talenra-option value=\"s\">S</talenra-option>\n *       <talenra-option value=\"m\">M</talenra-option>\n *       <talenra-option value=\"l\">L</talenra-option>\n *     </talenra-select>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * #### Formless\n *\n * ```typescript\n * // Component class\n * size = 'm';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-form-field label=\"Size\">\n *   <talenra-select [(ngModel)]=\"size\">\n *     <talenra-option value=\"s\">S</talenra-option>\n *     <talenra-option value=\"m\">M</talenra-option>\n *     <talenra-option value=\"l\">L</talenra-option>\n *   </talenra-select>\n * </talenra-form-field>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SelectModule } from '@talenra/ngx-base/select';\n * ```\n *\n * <example-url>../../#/select</example-url>\n *\n * @see {@link FormFieldComponent}\n * @see {@link OptionComponent}\n */\n@Component({\n  selector: 'talenra-select',\n  templateUrl: './select.component.html',\n  styleUrls: ['./select.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(click)': 'handleClick()',\n    '(keydown)': 'handleKeydown($event)',\n    '(focus)': 'focusChanged($event)',\n    '(blur)': 'focusChanged($event)',\n    '[class]': 'hostClass',\n  },\n  providers: [\n    { provide: FormFieldControl, useExisting: SelectComponent },\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => SelectComponent),\n      multi: true,\n    },\n  ],\n  imports: [IconComponent, ChipComponent, CdkOverlayOrigin, CdkConnectedOverlay, OptionListComponent],\n})\nexport class SelectComponent\n  extends FormFieldControlBaseComponent\n  implements OnInit, OnDestroy, AfterViewInit, AfterContentInit, ControlValueAccessor, FormFieldControl<SelectComponent>\n{\n  /**\n   * Shows a input field to filter options if `true` and option list contains at least two items.\n   */\n  @Input({ transform: booleanAttribute }) useFilter: boolean = false;\n\n  /**\n   * Allow to select multiple values.\n   */\n  @Input({ transform: booleanAttribute }) allowMultiple: boolean = false;\n\n  /**\n   * Message displayed to the user if Select contains no Options (e.g. while loading, due to backend issues etc.).\n   *\n   * ```html\n   * <talenra-form-field label=\"Animal\">\n   *   <talenra-select formControlName=\"animal\" noOptionsMessage=\"No options available.\">\n   *   </talenra-select>\n   * </talenra-form-field>\n   * ```\n   */\n  public noOptionsMessage = input<string>('No options available');\n\n  /**\n   * Message displayed to the user if the filter query does not match any option.\n   *\n   * ```html\n   * <talenra-form-field label=\"Animal\">\n   *   <talenra-select formControlName=\"animal\" useFilter noMatchMessage=\"No option matches your query.\">\n   *     <talenra-option value=\"alpaca\">Alpaca</talenra-option>\n   *     <talenra-option value=\"donkey\">Donkey</talenra-option>\n   *     <!-- a bunch of options -->\n   *   </talenra-select>\n   * </talenra-form-field>\n   * ```\n   */\n  @Input() noMatchMessage: string = 'Filter query does not match any option';\n\n  /** Determines whether the control is disabled/enabled. */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's disabled state */\n  get disabled(): boolean {\n    return this._disabled;\n  }\n\n  /** Set the control's disabled state */\n  set disabled(value: boolean) {\n    if (value === this._disabled) return;\n    this._disabled = value;\n    this.updateTabindex();\n    this.stateChanges.next();\n  }\n\n  /** The control's current value. */\n  @Input()\n  /** Get the control's current value. */\n  get value() {\n    return this._value;\n  }\n\n  /** Set the control's current value. */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  set value(value: any) {\n    const newValue = this.allowMultiple ? this.calculateNewValue(value) : value;\n    this.setValue(newValue);\n  }\n\n  /** @internal */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  override setValue(value: any) {\n    if (this.allowMultiple && !Array.isArray(value) && value !== null && this.formField?.control) {\n      const selectComponent = this.formField?.control as SelectComponent;\n      console.error(\n        `Please provide an empty array as initial value for a multiselect form field (FormControlName: ${selectComponent?.formControlName})`\n      );\n    }\n    // References to previous and next option\n    const current: OptionComponent | undefined = this.optionByValue(this.value);\n    const next: OptionComponent | undefined = this.optionByValue(value);\n    // Unselect the previous option, select the next option\n    if (current) current.isSelected = false;\n    if (next && this.allowMultiple) next.isSelectedForMultiselect = true;\n    if (next && !this.allowMultiple) next.isSelected = true;\n    // Update the select properties\n    this._value = value;\n    this.label = next?.label || '';\n    if (this.allowMultiple && Array.isArray(value)) {\n      this.setSelectedOptions(value);\n    }\n    // Update the associated FormControl\n    // When setting a value, we need to invoke `onChange` to update validation. As this will mark the control as dirty,\n    // we do not invoke `onChange` when resetting the control (value is `null`). Better solutions welcome…!\n    if (value !== null) this.onChange(this.value);\n    this.selectionChange.emit({ source: this, value: this.value });\n    // Update state delayed as the control's state won't update immediately.\n    asapScheduler.schedule(() => {\n      this.stateChanges.next();\n      this.changeDetector.markForCheck();\n    });\n    // Hide the options list slightly delayed, so the user realizes the option has been selected.\n    // has a dependency to the query-builder, which uses the select component, check when delay time is changed the query-selection-field component\n    setTimeout(() => {\n      if (!this.allowMultiple) this.showPanel = false;\n    }, 100);\n  }\n\n  /**\n   * Determines whether the control is read-only.\n   *\n   * ```html\n   * <talenra-form-field label=\"Role\">\n   *  <talenra-select readonly formControlName=\"role\">\n   *    <talenra-option value=\"reader\">Reader</talenra-option>\n   *    <talenra-option value=\"editor\">Editor</talenra-option>\n   *  </talenra-select>\n   * </talenra-form-field>\n   * ```\n   */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's read-only state */\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  /** Set the control's read-only state */\n  set readonly(value: boolean) {\n    if (value === this._readonly) return;\n    this._readonly = value;\n    this.updateTabindex();\n    this.stateChanges.next();\n  }\n\n  /** @internal */\n  _readonly: boolean = false;\n\n  /**\n   * Determines the Select's style. Kind \"ghost\" is typically used when Select is used outside a classic form context,\n   * e.g. in a toolbar.\n   *\n   * ```html\n   * <talenra-select formControlName=\"role\" kind=\"ghost\">\n   *   <talenra-option value=\"reader\">Reader</talenra-option>\n   *   <talenra-option value=\"editor\">Editor</talenra-option>\n   * </talenra-select>\n   * ```\n   */\n  kind = input<TSelectKind>(SelectKind.Primary);\n\n  /**\n   * Placeholder displayed if Select's value is not set. Has no effect if Select's `kind` is not \"ghost\".\n   *\n   * ```typescript\n   * // Component class\n   * role: FormControl = new FormControl();\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-select formControlName=\"role\" kind=\"ghost\" placeholder=\"Choose user role…\">\n   *   <talenra-option value=\"reader\">Reader</talenra-option>\n   *   <talenra-option value=\"editor\">Editor</talenra-option>\n   * </talenra-select>\n   * ```\n   */\n  placeholder = input<string>('');\n\n  /**\n   * Emitted when the selected value has been changed by the user.\n   * Emitted (with [] or null) when the clear button (×) is clicked.\n   * Emitted when the clear button (×) in a Chips component is clicked.\n   *\n   *\n   * ```typescript\n   * // Component class\n   * import { SelectChange } from '@talenra/ngx-base/select';\n   * public selectionChange(change: SelectChange): void {\n   *   console.log(`Select (id: ${change.source.id}) has value ${change.value}`);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-form-field label=\"Size\" (selectionChange)=\"selectionChange($event)\">\n   *   <talenra-select [(ngModel)]=\"formless.size\">\n   *     <talenra-option value=\"s\">S</talenra-option>\n   *     <talenra-option value=\"m\">M</talenra-option>\n   *     <talenra-option value=\"l\">L</talenra-option>\n   *   </talenra-select>\n   * </talenra-form-field>\n   * ```\n   *\n   * @see {@link SelectChange}\n   */\n  @Output() selectionChange: EventEmitter<SelectChange> = new EventEmitter<SelectChange>();\n\n  /**\n   * @internal\n   */\n  public selectedOptions: Option[] = [];\n\n  /**\n   * Controls whether the control is focusable.\n   */\n  private updateTabindex(): void {\n    this.tabindex = this.disabled || this.readonly ? -1 : 0;\n  }\n\n  /**\n   * Label displayed to the user. Derived from the currently selected option.\n   */\n  public label = '';\n\n  /** @internal */\n  get isEmpty(): boolean {\n    if (this.allowMultiple) {\n      return this.value === null || this.value.length === 0;\n    } else {\n      return this.value !== false && this.value !== 0 && !this.value; // Consider `false` and 0 non-empty\n    }\n  }\n\n  /**\n   * The options associated with this select\n   *\n   * @internal\n   */\n  @ContentChildren(forwardRef(() => OptionComponent), { descendants: true })\n  protected options?: QueryList<OptionComponent>;\n\n  /**\n   * The OptionGroups associated with this select\n   *\n   * @internal\n   */\n  @ContentChildren(forwardRef(() => OptionGroupComponent), { descendants: true })\n  private optionGroups?: QueryList<OptionGroupComponent>;\n\n  /**\n   * Options matched by the current filter query. Array holding indexes for matching options from `options` property.\n   *\n   * @internal\n   */\n  public matches: number[] = [];\n\n  /**\n   * The options list component\n   *\n   * @internal\n   */\n  @ViewChild(OptionListComponent)\n  private optionsList?: OptionListComponent;\n\n  private destroyRef = inject(DestroyRef);\n\n  /**\n   * Index of the focussed option. Can be triggered by pointer/mouse or keyboard and needs to\n   * be synced.\n   *\n   * @internal\n   */\n  set focussedOptionIndex(index: number | undefined) {\n    // Refenreces to previous and next option\n    const current: OptionComponent | undefined = this.optionByIndex(this._focussedOptionIndex);\n    const next: OptionComponent | undefined = this.optionByIndex(index);\n    // Blur the previous option, focus the next option\n    if (current) current.hasFocus = false;\n    if (next) next.hasFocus = true;\n    // Update the select's properties\n    this._focussedOptionIndex = index;\n  }\n\n  /** @internal */\n  get focussedOptionIndex(): number | undefined {\n    return this._focussedOptionIndex;\n  }\n\n  private _focussedOptionIndex?: number;\n\n  /**\n   * Determines whether the option list is displayed.\n   */\n  public set showPanel(value: boolean) {\n    if (value === this._showPanel) return;\n    this._showPanel = value;\n    // Focus the first option if no option selected and the options list is shown.\n    this.focussedOptionIndex = this.showPanel && !this.useFilter ? 0 : undefined;\n    // Reset filter whenever the panel opens\n    this.showPanel && this.filterOptions('');\n    this.changeDetector.markForCheck();\n  }\n\n  /** @internal */\n  public get showPanel(): boolean {\n    return this._showPanel;\n  }\n\n  private _showPanel = false;\n\n  /**\n   * State of the option list panel (attached or detached).\n   * The value is derived from the overlay.\n   */\n  private panelAttached = false;\n\n  /**\n   * References for resize observers so we can disconnect when the component is destroyed.\n   */\n  private resizeObservers: ResizeObserver[] = [];\n\n  /**\n   * Width of the control in px. Used to set the overlay panel width.\n   *\n   * @internal\n   */\n  public width = 0;\n\n  /**\n   * Scroll strategy for the overlay panel.\n   */\n  private overlay: Overlay = inject(Overlay);\n  protected scrollStrategy: ScrollStrategy = this.overlay.scrollStrategies.noop();\n\n  protected injector: Injector = inject(Injector);\n  private elementRef = inject(ElementRef);\n\n  /** @internal */\n  ngOnInit(): void {\n    // Set a \"unique\" id\n    this.id = `talenra-select--${nextId++}`;\n    // Observe the native element for resizes so we can update the overlay panel's width.\n    const originObserver: ResizeObserver = new ResizeObserver((entries) => {\n      this.width = entries[0].borderBoxSize[0].inlineSize;\n    });\n    originObserver.observe(this.elementRef.nativeElement);\n    this.resizeObservers.push(originObserver);\n  }\n\n  /** @internal */\n  ngOnDestroy(): void {\n    for (const observer of this.resizeObservers) {\n      observer.disconnect();\n    }\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    this.control = this.injector.get(NgControl, null)?.control || null;\n    this.control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((values: string | string[]) => {\n      if (this.allowMultiple && Array.isArray(values)) {\n        this.setSelectedOptions(values);\n        this.options?.forEach((option) =>\n          values.includes(option.value)\n            ? (option.isSelectedForMultiselect = true)\n            : (option.isSelectedForMultiselect = false)\n        );\n      }\n    });\n  }\n\n  /** @internal */\n  ngAfterContentInit(): void {\n    asapScheduler.schedule(() => {\n      this.options?.forEach((option: OptionComponent, index: number) => {\n        if (this.allowMultiple) {\n          if (!this.value) this.value = [];\n          option.isSelectedForMultiselect = this.value?.includes(option.value);\n          // If it's the selected option: Update the select's values\n          if (option.isSelectedForMultiselect) this.value = option.value;\n          // Update the option's state and index\n          option.index = index;\n        } else {\n          // Trigger value's setter to update the select's state.\n          if (this.value === option.value) this.value = option.value;\n          // Update the option's state and index\n          option.isSelected = this.value === option.value;\n          option.index = index;\n        }\n      });\n\n      // Filter without query to create `matches` list\n      this.filterOptions('');\n      this.stateChanges.next();\n      this.changeDetector.markForCheck();\n    });\n  }\n\n  private focusChanged(event: FocusEvent): void {\n    const hasFocus = event.type === 'focus';\n    // No focus while disabled/read-only\n    if (hasFocus && (this.disabled || this.readonly)) return;\n    // Do not blur while panel is attached (prevent flickering of visual focus effect)\n    if (!hasFocus && this.panelAttached) return;\n    if (hasFocus === this.hasFocus) return;\n    this.hasFocus = hasFocus;\n    // Consider the control as 'touched' once the user has triggered a blur event.\n    !this.hasFocus && !this.panelAttached && this.onTouched();\n    this.stateChanges.next();\n  }\n\n  private handleClick(): void {\n    if (this.disabled || this.readonly) return;\n    this.showPanel = !this.showPanel;\n  }\n\n  /** @internal */\n  public attached(): void {\n    this.panelAttached = true;\n  }\n\n  /** @internal */\n  public detached(): void {\n    this.panelAttached = false;\n    // As attaching the options panel removes focus from the control\n    // we have to reclaim focus after the panel is detached.\n    asapScheduler.schedule(() => {\n      this.focus();\n    });\n  }\n\n  /** @internal */\n  public closePanel(): void {\n    this.showPanel = false;\n  }\n\n  /**\n   * Triggered when the user changes the value (typically by picking an option).\n   * Emits the selectionChange event and updates the value.\n   *\n   * @internal\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public changeSelection(value: any): void {\n    this.value = value;\n    const option = this.options?.find((option) => option.value === value);\n    if (option && this.allowMultiple) {\n      option.isSelectedForMultiselect = true;\n      // Remove selected Option from matches to ensure it does not appear in keyboard navigation\n      this.matches = this.matches.filter((index) => index !== option.index);\n    }\n    if (option && !this.allowMultiple) option.isSelected = true;\n  }\n\n  /**\n   * Handling keyboard events\n   */\n  private handleKeydown(event: KeyboardEvent): void {\n    // Ignore keyboard events while disabled\n    if (this.disabled || this.readonly) return;\n    const key = event.key;\n\n    // -- Space and Enter\n    if (key === ' ' || key === 'Enter') {\n      event.preventDefault();\n      // Options visible: Select the current option\n      if (this.showPanel) this.changeSelection(this.optionByIndex(this.focussedOptionIndex)?.value);\n      this.showPanel = true;\n    }\n\n    // -- Tab + shift and has filter: Focus filter\n    else if (key === 'Tab' && event.shiftKey && this.useFilter && this.optionsList) {\n      event.preventDefault();\n      this.focusFilter();\n    }\n\n    // -- Tab: Select current option (if options visible), then focus next input (browser default)\n    else if (key === 'Tab' && this.showPanel) {\n      this.changeSelection(this.optionByIndex(this.focussedOptionIndex)?.value);\n      this.showPanel = false;\n    }\n\n    // -- Escape: Hide options if visible\n    else if (key === 'Escape' && this.showPanel) {\n      event.preventDefault();\n      this.showPanel = false;\n    }\n\n    // -- Up/Down: Focus previous/next option (if options visible), select previous/next option (if options not visible)\n    else if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'ArrowRight' || key === 'ArrowLeft') {\n      event.preventDefault();\n      // Check how many matches we have\n      const optionsLength: number = this.matches?.length || 0;\n      // Determine the direction we're about to navigate\n      const step: number = key === 'ArrowDown' || key === 'ArrowRight' ? 1 : -1;\n      // Start with the current focus -- if not available -- with the selected index\n      const startIndex = this.focussedOptionIndex ?? this.optionByValue(this.value)?.index;\n      // Now this is a little quirky: Get the index of the currently focussed option from the _matches_ list.\n      const matchIndex: number | false = startIndex !== undefined && this.matches.indexOf(startIndex);\n      // Use the index from the previous step. Start from top (ArrowDown) or bottom (ArrowUp) if no option has focus.\n      const currentIndex = typeof matchIndex === 'number' ? matchIndex : step > 0 ? -1 : optionsLength;\n      // Limit the index to stay inside the matches list. Here's where you might want to add a \"roundtrip\" option.\n      const itemIndex: number = Math.max(Math.min(currentIndex + step, optionsLength - 1), 0);\n      // Move focus\n      this.focussedOptionIndex = this.matches[itemIndex];\n      this.scrollToOption(this.matches[itemIndex]);\n      // Move selection if panel is closed\n      if (!this.showPanel) this.changeSelection(this.optionByIndex(this.matches[itemIndex])?.value);\n    }\n  }\n\n  /**\n   * Focusses the select\n   *\n   * @internal\n   */\n  public focus(): void {\n    this.elementRef.nativeElement.focus();\n    // Focus the first option if panel is open\n    if (this.showPanel) this.focussedOptionIndex = this.matches[0] ?? undefined;\n  }\n\n  /**\n   * Focus the option list's filter\n   */\n  private focusFilter(): void {\n    this.focussedOptionIndex = undefined;\n    this.optionsList?.focus();\n  }\n\n  /**\n   * Clear the value and focus the input element. Triggered by the clear button in FormField.\n   *\n   * @internal\n   */\n  clearValue(): void {\n    // Empty string means \"no value\" which will invalidate the control while `null` is used to reset the control.\n    this.setValue(Array.isArray(this._value) ? [] : '');\n    this.onTouched();\n    this.focus();\n  }\n\n  /**\n   * Updates the options visibility whenever the filter query changes.\n   *\n   * @internal\n   */\n  public filterOptions(query: string): void {\n    query = query.trim().toLowerCase();\n    const matches: number[] = [];\n    const optionsArray = this.options?.toArray() || [];\n    const handledIndexes: number[] = [];\n\n    this.optionGroups?.forEach((optionGroup) => {\n      const groupMatch = optionGroup.label?.toLowerCase().includes(query);\n      if (groupMatch) {\n        optionGroup.isHidden = false;\n        optionGroup.options?.forEach((option: OptionComponent) => {\n          option.isHidden = false;\n          const optionIndex = optionsArray.findIndex((o) => o.value === option.value);\n          handledIndexes.push(optionIndex);\n          matches.push(optionIndex);\n        });\n      } else {\n        let groupVisible = false;\n        optionGroup.options?.forEach((option: OptionComponent) => {\n          const match = option.label?.toLowerCase().includes(query);\n          if (match && !option.isSelectedForMultiselect) groupVisible = true;\n          option.isHidden = !match;\n          const optionIndex = optionsArray.findIndex((o) => o.value === option.value);\n          handledIndexes.push(optionIndex);\n          match && matches.push(optionIndex);\n        });\n        optionGroup.isHidden = !groupVisible;\n      }\n    });\n\n    optionsArray.forEach((option: OptionComponent, index: number) => {\n      if (handledIndexes.includes(index)) return;\n      const match = option.label?.toLowerCase().includes(query) && !option.isSelectedForMultiselect;\n      option.isHidden = !match;\n      match && matches.push(index);\n    });\n\n    this.matches = matches;\n  }\n\n  /**\n   * Public handle to close the panel.\n   *\n   * @internal\n   */\n  public hidePanel(): void {\n    this.showPanel = false;\n  }\n\n  /**\n   * Scroll the given option into view.\n   */\n  private scrollToOption(index?: number): void {\n    const sizes: OptionDimensions | undefined = this.optionByIndex(index)?.dimensions;\n    sizes && this.optionsList?.scrollToOption(sizes?.offsetHeight, sizes?.offsetTop);\n  }\n\n  private get hostClass(): string {\n    return [\n      `kind--${this.kind()}`,\n      this.disabled ? 'disabled' : '',\n      this.readonly ? 'readonly' : '',\n      this.formField?.status() === FormFieldStatus.Invalid ? 'status--invalid' : '',\n      this.allowMultiple ? 'allow-multiple' : '',\n      this.formField ? `size--${this.formField.size()}` : '',\n    ]\n      .filter((item) => item)\n      .join(' ');\n  }\n\n  /**\n   * Helper: Get option by index\n   */\n  private optionByIndex(index?: number): OptionComponent | undefined {\n    if (index === undefined) return undefined;\n    return this.options?.get(index);\n  }\n\n  /**\n   * Helper: Get option by value. Returns the first option matching a given value.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private optionByValue(value: any): OptionComponent | undefined {\n    return this.options?.find((option: OptionComponent) => option.value === value);\n  }\n\n  /**\n   * Removes a single option from a multi-select value. Triggered when the clear button (×) in a Chips component is\n   * clicked.\n   */\n  protected removeOption(value: string) {\n    const newValue = this.calculateNewValue(value, false);\n    const option = this.options?.find((option) => option.value === value);\n    // Note: Actually there's no way to invoke this method when `allowMultiple` is _not_ true, right? If so, the check\n    // below might be unnecessary.\n    if (option) option[this.allowMultiple ? 'isSelectedForMultiselect' : 'isSelected'] = false;\n    this.setValue(newValue);\n  }\n\n  private calculateNewValue(value: string, addValue = true) {\n    let valueToSet: string[] = this._value;\n    if (Array.isArray(value)) {\n      value.forEach((strVal) => {\n        valueToSet = addValue\n          ? this.handleValueSelected(valueToSet, strVal)\n          : this.handleValueRemoved(valueToSet, strVal);\n      });\n    } else {\n      valueToSet = addValue ? this.handleValueSelected(valueToSet, value) : this.handleValueRemoved(valueToSet, value);\n    }\n    return valueToSet;\n  }\n\n  private handleValueSelected(valueToSet: string[], value: string): string[] {\n    const optionComponent = this.optionByValue(value);\n    if (!optionComponent) return valueToSet;\n    const currentValue: string[] = this._value === null ? [] : this._value;\n    if (!currentValue.includes(value)) {\n      valueToSet = [...currentValue, value];\n    }\n    if (!this.selectedOptions.map((so) => so.value).includes(value)) {\n      this.selectedOptions = [...this.selectedOptions, { value: optionComponent.value, label: optionComponent.label }];\n    }\n    if (this.options && this.options.length === this.selectedOptions.length) this.hidePanel();\n    return valueToSet;\n  }\n\n  private handleValueRemoved(valueToSet: string[], value: string): string[] {\n    const optionComponent = this.optionByValue(value);\n    if (!optionComponent) return valueToSet;\n    if (this._value.includes(value)) {\n      valueToSet = this._value.filter((v: string) => v !== value);\n    }\n    if (this.selectedOptions.map((so) => so.value).includes(value)) {\n      this.selectedOptions = this.selectedOptions.filter((option) => option.value !== value);\n    }\n    return valueToSet;\n  }\n\n  private setSelectedOptions(values: string[]) {\n    this.selectedOptions = values.map((value: string) => {\n      return {\n        value: value,\n        label: this.optionByValue(value)?.label || value,\n      };\n    });\n  }\n}\n","@if (kind() === 'ghost') {\n  @if (isEmpty) {\n    <span class=\"placeholder\">{{ placeholder() }}</span>\n  } @else if (!allowMultiple) {\n    <span class=\"label\">{{ label }}</span>\n  }\n  @if (readonly) {\n    <talenra-icon class=\"readonly\" name=\"lock\" />\n  }\n} @else {\n  @if (!isEmpty && !allowMultiple) {\n    <span class=\"label\">{{ label }}</span>\n  }\n}\n\n@if (allowMultiple && !isEmpty) {\n  <div class=\"multiselect-container\">\n    <div class=\"chips-container\">\n      @for (option of selectedOptions; track option.value) {\n        <talenra-chip\n          [value]=\"option.value\"\n          [label]=\"option.label\"\n          (closeClicked)=\"removeOption($event)\"\n          [disabled]=\"disabled || readonly\"\n          [size]=\"formField?.size() || 'm'\" />\n      }\n    </div>\n  </div>\n}\n\n<div class=\"origin\" cdkOverlayOrigin #overlayOrigin=\"cdkOverlayOrigin\"></div>\n<ng-template\n  cdkConnectedOverlay\n  cdkConnectedOverlayFlexibleDimensions\n  cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n  [cdkConnectedOverlayHasBackdrop]=\"true\"\n  [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n  [cdkConnectedOverlayOpen]=\"showPanel\"\n  [cdkConnectedOverlayWidth]=\"width\"\n  [cdkConnectedOverlayViewportMargin]=\"24\"\n  [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n  (backdropClick)=\"closePanel()\"\n  (attach)=\"attached()\"\n  (detach)=\"detached()\">\n  <talenra-option-list\n    class=\"options\"\n    [useFilter]=\"useFilter\"\n    [optionsCount]=\"options?.length || 0\"\n    [matchesCount]=\"matches.length\"\n    [noOptionsMessage]=\"noOptionsMessage()\"\n    [noMatchMessage]=\"noMatchMessage\"\n    (filterQueryChange)=\"filterOptions($event)\"\n    (focusOptions)=\"focus()\"\n    (requestClose)=\"hidePanel()\">\n    <ng-content />\n  </talenra-option-list>\n</ng-template>\n","import {\n  AfterContentInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  Input,\n  inject,\n} from '@angular/core';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { SelectComponent } from '../select/select.component';\n\n/** @internal */\nexport interface OptionDimensions {\n  offsetHeight: number;\n  offsetTop: number;\n}\n\n/**\n * Option represents a single option in the context of a Select. Each Option has a value property that can be used to\n * set the value that will be selected if the user chooses this option. The content of the Option is displayed in the\n * Select's dropdown list.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   size: new FormControl('m'),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-form-field label=\"Size\">\n *     <talenra-select formControlName=\"size\">\n *       <talenra-option value=\"s\">S</talenra-option>\n *       <talenra-option value=\"m\">M</talenra-option>\n *       <talenra-option value=\"l\">L</talenra-option>\n *     </talenra-select>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { SelectModule } from '@talenra/ngx-base/select';\n * ```\n *\n * <example-url>../../#/select</example-url>\n *\n * @see {@link FormFieldComponent}\n * @see {@link SelectComponent}\n */\n@Component({\n  selector: 'talenra-option',\n  templateUrl: './option.component.html',\n  styleUrls: ['./option.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(click)': 'selectOption($event)',\n    '(mouseenter)': 'handleMouseEvent($event)',\n    '(mouseleave)': 'handleMouseEvent($event)',\n    '[class]': 'hostClass',\n    '[class.is-hidden]': 'isHidden || isSelectedForMultiselect',\n    '[class.is-selected]': 'isSelected',\n    '[class.has-focus]': 'hasFocus',\n  },\n  imports: [IconComponent],\n})\nexport class OptionComponent implements AfterContentInit {\n  /**\n   * The option's value. Might differ from the label shown to the user.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  @Input() public value: any;\n\n  /**\n   * The icon to be displayed beside the label.\n   *\n   * See `@talenra/icons` for a list of available icons.\n   */\n  @Input() public icon?: string;\n\n  /**\n   * Label displayed to the user\n   *\n   * @internal\n   */\n  public label = '';\n\n  /**\n   * The option's index in the containing `SelectComponent`'s options array.\n   *\n   * @internal\n   */\n  public index?: number;\n\n  /**\n   * Determines whether the option is shown in the UI. Used to hide options when they do not match filter.\n   *\n   * @internal\n   */\n  @Input()\n  /** @internal */\n  public get isHidden(): boolean {\n    return this._isHidden;\n  }\n  /** @internal */\n  public set isHidden(value: boolean) {\n    if (value === this._isHidden) return;\n    this._isHidden = value;\n    this.changeDetector.markForCheck();\n  }\n  private _isHidden = false;\n\n  /** @internal */\n  public get isSelected(): boolean {\n    return this._isSelected;\n  }\n  /** @internal */\n  public set isSelected(value: boolean) {\n    if (value === this._isSelected) return;\n    this._isSelected = value;\n    this.changeDetector.markForCheck();\n  }\n  private _isSelected = false;\n\n  /** @internal */\n  public get isSelectedForMultiselect(): boolean {\n    return this._isSelectedForMultiselect;\n  }\n  /** @internal */\n  public set isSelectedForMultiselect(value: boolean) {\n    if (value === this._isSelectedForMultiselect) return;\n    this._isSelectedForMultiselect = value;\n    this.changeDetector.markForCheck();\n  }\n  private _isSelectedForMultiselect = false;\n\n  /** @internal */\n  public get hasFocus(): boolean {\n    return this._hasFocus;\n  }\n  /** @internal */\n  public set hasFocus(value: boolean) {\n    if (value === this._hasFocus) return;\n    this._hasFocus = value;\n    this.changeDetector.markForCheck();\n  }\n  private _hasFocus = false;\n\n  private elementRef = inject(ElementRef);\n  private changeDetector = inject(ChangeDetectorRef);\n  private select = inject(SelectComponent);\n\n  /** @internal */\n  ngAfterContentInit(): void {\n    this.label = this.elementRef.nativeElement.textContent;\n  }\n\n  /**\n   * Returns the height and the vertical offset relative to the options list.\n   *\n   * @internal\n   */\n  public get dimensions(): OptionDimensions {\n    const element: HTMLElement = this.elementRef.nativeElement;\n    return { offsetHeight: element.offsetHeight, offsetTop: element.offsetTop };\n  }\n\n  private selectOption(event: MouseEvent): void {\n    this.select.changeSelection(this.value);\n    this.hasFocus = false;\n    event.stopPropagation();\n  }\n\n  private handleMouseEvent(event: MouseEvent): void {\n    this.hasFocus = event.type === 'mouseenter';\n  }\n\n  private get hostClass(): string {\n    return `size--${this.select.formField?.size() || 'm'}`;\n  }\n}\n","<span class=\"label\"><ng-content /></span>\n@if (icon) {\n  <talenra-icon class=\"icon\" [name]=\"icon\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}