{"version":3,"file":"metadev-lux.mjs","names":["i1","i0","i0","i0","i0","i1","i0","i0","i0","i0","i0","i0","i0","i0","i0","i0","i1","i2","i0","i0","i1","i0","i0","i0","i0","i1","i0","i0","i0","i0","searchResults"],"sources":["../../../projects/lux/src/lib/helperFns.ts","../../../projects/lux/src/lib/autocomplete/autocomplete.component.ts","../../../projects/lux/src/lib/autocomplete/autocomplete.component.html","../../../projects/lux/src/lib/lang.ts","../../../projects/lux/src/lib/autocomplete-list/autocomplete-list.component.ts","../../../projects/lux/src/lib/autocomplete-list/autocomplete-list.component.html","../../../projects/lux/src/lib/breadcrumb/breadcrumb.component.ts","../../../projects/lux/src/lib/breadcrumb/breadcrumb.component.html","../../../projects/lux/src/lib/checkbox/checkbox.component.ts","../../../projects/lux/src/lib/checkbox/checkbox.component.html","../../../projects/lux/src/lib/datetime/datetime.component.ts","../../../projects/lux/src/lib/datetime/datetime.component.html","../../../projects/lux/src/lib/filter/filter.component.ts","../../../projects/lux/src/lib/filter/filter.component.html","../../../projects/lux/src/lib/geolocation/openlayer-loader.service.ts","../../../projects/lux/src/lib/map/map.component.ts","../../../projects/lux/src/lib/map/map.component.html","../../../projects/lux/src/lib/modal/modal-backdrop.ts","../../../projects/lux/src/lib/modal/modal-config.ts","../../../projects/lux/src/lib/modal/modal-ref.ts","../../../projects/lux/src/lib/modal/modal-dismiss-reasons.ts","../../../projects/lux/src/lib/modal/util.ts","../../../projects/lux/src/lib/modal/modal-window.ts","../../../projects/lux/src/lib/modal/modal-stack.ts","../../../projects/lux/src/lib/modal/modal.service.ts","../../../projects/lux/src/lib/geolocation/geolocation.service.ts","../../../projects/lux/src/lib/geolocation/geolocation.component.ts","../../../projects/lux/src/lib/geolocation/geolocation.component.html","../../../projects/lux/src/lib/input/regexp.service.ts","../../../projects/lux/src/lib/input/input.component.ts","../../../projects/lux/src/lib/input/input.component.html","../../../projects/lux/src/lib/tooltip/placement.ts","../../../projects/lux/src/lib/tooltip/tooltip.component.ts","../../../projects/lux/src/lib/tooltip/tooltop-content.ts","../../../projects/lux/src/lib/tooltip/tooltip.service.ts","../../../projects/lux/src/lib/tooltip/tooltip.directive.ts","../../../projects/lux/src/lib/pagination/pagination.component.ts","../../../projects/lux/src/lib/pagination/pagination.component.html","../../../projects/lux/src/lib/radiogroup/radiogroup.component.ts","../../../projects/lux/src/lib/radiogroup/radiogroup.component.html","../../../projects/lux/src/lib/select/select.component.ts","../../../projects/lux/src/lib/select/select.component.html","../../../projects/lux/src/lib/voice-recognition/voice-recognition.directive.ts","../../../projects/lux/src/lib/window/window.service.ts","../../../projects/lux/src/lib/lux.module.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\n// undefined and null functions\n\nexport const exists = (value: any): boolean =>\n  value !== null && value !== undefined;\n\nexport const hasValue = (value: any): boolean =>\n  exists(value) && (typeof value === 'string' ? !isEmptyString(value) : true);\n\n// string functions\n\nexport const isEmptyString = (value: string): boolean => value.trim() === '';\n\nexport const isValidEmail = (value: string): boolean => {\n  const re =\n    /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n  return re.test(String(value).toLowerCase().trim());\n};\n\nexport const isValidUrl = (value: string): boolean => {\n  const pattern =\n    // eslint-disable-next-line max-len\n    /^((([a-z]+?:\\/\\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\\.)+[a-z]{2,})|((([0-9]{1,3}\\.){3}[0-9]{1,3}))|(localhost))(\\:[0-9]+)?))?((\\/[a-zA-Z0-9\\-_+=~.,:;%]+)*\\/?)((\\?|;)[a-zA-Z0-9\\-_+~.,:;%]+=[a-zA-Z0-9\\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\\-_+~.,:;%]+=[a-zA-Z0-9\\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\\-_+~.,:;%]+(=[a-zA-Z0-9\\*\\-_+~.,:;%]+)?)?$/;\n  return pattern.test(value);\n};\n\nexport const isValidRelativeUrl = (value: string): boolean => {\n  const pattern =\n    // eslint-disable-next-line max-len\n    /^((([a-z]+?:\\/\\/)?(((([a-z0-9]([a-z0-9-]*[a-z0-9])*)\\.)+[a-z]{2,})|((([0-9]{1,3}\\.){3}[0-9]{1,3}))|(localhost))(\\:[0-9]+)?)|([a-zA-Z0-9\\-_+=~.,:;%]+))?((\\/[a-zA-Z0-9\\-_+=~.,:;%]+)*\\/?)((\\?|;)[a-zA-Z0-9\\-_+~.,:;%]+=[a-zA-Z0-9\\-_+~.,:;%]+(((&|;)[a-zA-Z0-9\\-_+~.,:;%]+=[a-zA-Z0-9\\-_+~.,:;%]+)*))?(#[a-zA-Z0-9\\-_+~.,:;%]+(=[a-zA-Z0-9\\*\\-_+~.,:;%]+)?)?$/;\n  return pattern.test(value);\n};\n\nexport const isValidColor = (value: string | null | undefined): boolean => {\n  value = String(value).toLowerCase();\n  // valid values for CSS color property, yet not valid colors by themselves\n  if (\n    value === 'currentcolor' ||\n    value === 'inherit' ||\n    value === 'initial' ||\n    value === 'revert' ||\n    value === 'unset'\n  ) {\n    return false;\n  }\n  return CSS.supports('color', value);\n};\n\n// date functions\n\nexport const isValidDate = (date: Date): boolean =>\n  exists(date) ? !isNaN(date.getTime()) : false;\n\nexport const normalizeDate = (value: any): string | null => {\n  if (typeof value === 'string' && value.length > 10) {\n    return value.substring(0, 10);\n  }\n  return value ? value.toString() : null;\n};\n\nexport const addTimezoneOffset = (date: Date): Date => {\n  if (!isValidDate(date)) {\n    return date;\n  } else {\n    return new Date(date.getTime() - date.getTimezoneOffset() * 60000);\n  }\n};\n\n// number functions\n\nexport const isValidNumber = (\n  value: string | number | undefined | null\n): boolean => (hasValue(value) ? !Number.isNaN(Number(value)) : false);\n\nexport const numberOfDecimalDigits = (\n  x: number | string\n): number | undefined => {\n  if (isValidNumber(x)) {\n    const xString = String(Number(x));\n    if (xString === 'Infinity') {\n      return 0;\n    }\n    const indexOfE = xString.indexOf('e');\n    if (indexOfE >= 0) {\n      return 0;\n    }\n    const indexOfDecimalPoint = xString.indexOf('.');\n    if (indexOfDecimalPoint < 0) {\n      return 0;\n    } else {\n      return xString.length - indexOfDecimalPoint - 1;\n    }\n  }\n  return undefined;\n};\n\nexport const numberOfWholeDigits = (x: number | string): number | undefined => {\n  if (isValidNumber(x)) {\n    let xString = String(Number(x));\n    if (xString.indexOf('-') === 0) {\n      xString = xString.slice(1, xString.length);\n    }\n    if (xString === 'Infinity') {\n      return Infinity;\n    }\n    if (xString.indexOf('0') === 0) {\n      xString = xString.slice(1, xString.length);\n    }\n    const indexOfE = xString.indexOf('e');\n    if (indexOfE >= 0) {\n      return Number(xString.slice(indexOfE + 1, xString.length)) + 1;\n    }\n    const indexOfDecimalPoint = xString.indexOf('.');\n    if (indexOfDecimalPoint < 0) {\n      return xString.length;\n    } else {\n      return indexOfDecimalPoint;\n    }\n  }\n  return undefined;\n};\n\nexport const roundToMultipleOf = (x: number, modulo: number): number => {\n  const moduloString = String(modulo);\n  // approximates the result\n  // prone to inexactitude because of floating point arithmetic\n  const approximation = Math.round(x / modulo) * modulo;\n  const approximationString = String(approximation);\n  // remove useless decimals\n  const uselessDecimalsInApproximation =\n    (numberOfDecimalDigits(approximationString) ?? 1) -\n    (numberOfDecimalDigits(moduloString) ?? 0);\n  const resultString = approximationString.slice(\n    0,\n    approximationString.length - uselessDecimalsInApproximation\n  );\n  return Number(resultString);\n};\n\n// other functions\n\nexport const isInitialAndEmpty = (\n  previousValue: any,\n  newValue: any\n): boolean => {\n  const isPrevArray = Array.isArray(previousValue);\n  const isNewArray = Array.isArray(newValue);\n  return !(\n    (isPrevArray ? previousValue.length !== 0 : Boolean(previousValue)) ||\n    (isNewArray ? newValue.length !== 0 : Boolean(newValue))\n  );\n};\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  signal,\n  ViewChild\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport { Observable, of } from 'rxjs';\nimport { debounceTime, first, map } from 'rxjs/operators';\nimport {\n  DataSource,\n  DataSourceItem,\n  DecoratedDataSource,\n  DecoratedDataSourceItem\n} from '../datasource';\nimport { isInitialAndEmpty } from '../helperFns';\n\nexport const LOST_FOCUS_TIME_WINDOW_MS = 200; // ms\n@Component({\n  selector: 'lux-autocomplete',\n  templateUrl: './autocomplete.component.html',\n  styleUrls: ['./autocomplete.component.scss'],\n  imports: [FormsModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => AutocompleteComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => AutocompleteComponent)\n    }\n  ]\n})\nexport class AutocompleteComponent\n  implements ControlValueAccessor, Validator, OnInit, AfterViewInit, OnDestroy\n{\n  private cd = inject(ChangeDetectorRef);\n  private document = inject(DOCUMENT);\n  private appendToContainer: HTMLElement | null = null;\n\n  static idCounter = 0;\n\n  @ViewChild('i0', { static: true }) i0!: ElementRef;\n  @ViewChild('completeDiv', { static: true }) completeDiv!: ElementRef;\n\n  private _dataSource!: DataSource<any, string>;\n  private _placeholder!: string;\n  private _value: any;\n  private lostFocusHandled = true;\n  private t0 = 0;\n\n  // Signals, not plain fields: every one of these is written from inside an\n  // async callback (RxJS subscribe, setTimeout) - a plain field mutated there\n  // has no way to tell a zoneless host to repaint (no zone.js patching the\n  // callback, and no markForCheck() called at the moment the value actually\n  // changes). Signals notify the view directly, without either.\n  showSpinner = signal(false);\n  touched = false;\n  completionList = signal<DecoratedDataSource>([]);\n  showCompletion = signal(false);\n  focusItem = signal<DataSourceItem<any, string> | null>(null);\n\n  @Output() valueChange = new EventEmitter<any>();\n  @Output() dataSourceChange = new EventEmitter<DataSource<any, string>>();\n\n  @Input() public inputId!: string;\n  @Input() public disabled: boolean | null = null;\n  @Input() public readonly: boolean | null = null;\n  @Input() label = '';\n  /** If canAddNewValues, user can type items not present in the data-source. */\n  @Input() canAddNewValues = false;\n  /** After cleaning the selection should the completion list remain open or closed:\n   *  false: (default) close on filters, to clean a filter and select all.\n   *  true: keep open (when the action most likely is to pick another one).\n   */\n  @Input() keepOpenAfterDelete = false;\n  /** Append dropdown to body or custom selector. Uses position absolute. */\n  @Input() appendTo?: string;\n\n  @Input()\n  get value(): any {\n    return this._value;\n  }\n  set value(v: any) {\n    const initialAndEmpty = isInitialAndEmpty(this._value, v);\n    this._value = v;\n    this.onChange(v);\n    this.completeLabel();\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n  }\n  @Input()\n  get dataSource(): DataSource<any, string> {\n    return this._dataSource;\n  }\n  set dataSource(v: DataSource<any, string>) {\n    this._dataSource = v;\n    this.dataSourceChange.emit(v);\n  }\n  @Input() required = false;\n\n  @Input()\n  set placeholder(v: string) {\n    this._placeholder = v;\n  }\n  get placeholder(): string {\n    return this._placeholder ? this._placeholder : '';\n  }\n\n  @Input() resolveLabelsFunction?: (\n    instance: any,\n    keys: any[]\n  ) => Observable<DataSource<any, string>> = undefined;\n  @Input() populateFunction?: (\n    instance: any,\n    search: string\n  ) => Observable<DataSource<any, string>> = undefined;\n  @Input() instance: any;\n\n  // ControlValueAccessor Interface\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n\n  writeValue(value: any): void {\n    this.value = value;\n  }\n\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched && !this.disabled) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    if (\n      this.required &&\n      (value === '' || value === null || value === undefined)\n    ) {\n      return { required: { value, reason: 'Required field.' } };\n    }\n    return null;\n  }\n  // End of Validator interface\n\n  clear(): void {\n    this.value = null;\n    this.toggleCompletion(this.keepOpenAfterDelete, '');\n  }\n\n  private completeLabel(): void {\n    if (this.value) {\n      if (this.dataSource) {\n        this.label = findLabelForId(this.dataSource, this.value) || '';\n      } else if (this.instance && this.resolveLabelsFunction) {\n        this.resolveLabelsFunction(this.instance, [this.value])\n          .pipe(debounceTime(1), first())\n          .subscribe((data) => {\n            this.label = findLabelForId(data, this.value) || '';\n            // `label` stays a plain @Input (bound with [(ngModel)], which\n            // signals don't plug into directly) - it is the one write in this\n            // file not covered by a signal, so it still needs an explicit\n            // markForCheck() to reach the view in a zoneless host.\n            this.cd.markForCheck();\n          });\n      }\n    } else {\n      this.label = '';\n    }\n  }\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `autocompletelist${AutocompleteComponent.idCounter++}`;\n    this.completeLabel();\n  }\n  ngAfterViewInit(): void {\n    this.setSameWidth();\n    this.handleAppendTo();\n  }\n\n  ngOnDestroy(): void {\n    this.removeDropdownFromContainer();\n  }\n\n  private handleAppendTo(): void {\n    if (!this.appendTo) {\n      return;\n    }\n\n    const container =\n      this.appendTo === 'body'\n        ? this.document.body\n        : this.document.querySelector(this.appendTo);\n\n    if (container) {\n      this.appendToContainer = container as HTMLElement;\n      this.appendToContainer.appendChild(this.completeDiv.nativeElement);\n    }\n  }\n\n  private removeDropdownFromContainer(): void {\n    if (this.appendToContainer && this.completeDiv) {\n      const dropdown = this.completeDiv.nativeElement;\n      if (dropdown.parentElement === this.appendToContainer) {\n        this.appendToContainer.removeChild(dropdown);\n      }\n    }\n  }\n\n  private updateDropdownPosition(): void {\n    if (!this.appendTo || !this.appendToContainer) {\n      return;\n    }\n\n    const inputRect = this.i0.nativeElement.getBoundingClientRect();\n    const dropdown = this.completeDiv.nativeElement;\n\n    let top: number;\n    let left: number;\n\n    if (this.appendToContainer === this.document.body) {\n      // For body, use viewport coordinates + scroll\n      top = inputRect.bottom + window.scrollY;\n      left = inputRect.left + window.scrollX;\n    } else {\n      // For custom containers, calculate relative position\n      const containerRect = this.appendToContainer.getBoundingClientRect();\n      top =\n        inputRect.bottom - containerRect.top + this.appendToContainer.scrollTop;\n      left =\n        inputRect.left - containerRect.left + this.appendToContainer.scrollLeft;\n    }\n\n    dropdown.style.top = `${top}px`;\n    dropdown.style.left = `${left}px`;\n    dropdown.style.width = `${inputRect.width}px`;\n  }\n  onInputResized(): void {\n    this.setSameWidth();\n  }\n  private setSameWidth(): void {\n    if (this.appendTo) {\n      this.updateDropdownPosition();\n    } else {\n      const width = this.i0.nativeElement.getBoundingClientRect().width;\n      this.completeDiv.nativeElement.style.width = `${width}px`;\n    }\n  }\n\n  onKeydown(event: KeyboardEvent, label: string): void {\n    switch (event.key) {\n      case 'Tab':\n        if (label) {\n          this.pickSelectionOrFirstMatch(label);\n        }\n        this.showCompletion.set(false);\n        break;\n    }\n    this.markAsTouched();\n  }\n  onKeypress(event: KeyboardEvent, label: string): void {\n    switch (event.key) {\n      case 'Intro':\n      case 'Enter':\n        this.pickSelectionOrFirstMatch(label);\n        event.preventDefault();\n        break;\n    }\n    this.markAsTouched();\n  }\n  onKeyup(event: KeyboardEvent, label: string): void {\n    switch (event.key) {\n      case 'PageDown':\n        this.focusOnNext(5);\n        event.preventDefault();\n        break;\n      case 'ArrowDown':\n        this.focusOnNext(1);\n        event.preventDefault();\n        break;\n      case 'PageUp':\n        this.focusOnPrevious(5);\n        event.preventDefault();\n        break;\n      case 'ArrowUp':\n        this.focusOnPrevious(1);\n        event.preventDefault();\n        break;\n      case 'Escape':\n        this.complete(null);\n        event.preventDefault();\n        break;\n      case 'Intro':\n      case 'Enter':\n        event.preventDefault();\n        break;\n      default:\n        this.showCompletionList(label);\n      // event.preventDefault();\n    }\n    this.markAsTouched();\n  }\n  private focusOnNext(offset: number): void {\n    const list = this.completionList() || [];\n    const currentFocus = this.focusItem();\n    const index = list.findIndex(\n      (it) => currentFocus && it.key === currentFocus.key\n    );\n    const indexNext =\n      index !== -1 && list.length > index + offset\n        ? index + offset\n        : list.length - 1;\n    this.focusItem.set(list[indexNext]);\n    this.ensureItemVisible(index);\n  }\n  private focusOnPrevious(offset: number): void {\n    const list = this.completionList() || [];\n    const currentFocus = this.focusItem();\n    const index = list.findIndex(\n      (it) => currentFocus && it.key === currentFocus.key\n    );\n    const indexPrevious = index !== -1 && index > offset ? index - offset : 0;\n    this.focusItem.set(list[indexPrevious]);\n    this.ensureItemVisible(index);\n  }\n  onLostFocus(label: string): void {\n    this.lostFocusHandled = false;\n    this.t0 = performance.now();\n    // console.log('Init LostFocus');\n    setTimeout(() => {\n      // needs to postpone actions some milliseconds to verify if\n      // lost focus was followed by a list selection -> then cancel\n      // if not -> make side effect\n      if (!this.lostFocusHandled) {\n        // console.log(\n        //   'Lost focus 2',\n        //   this.lostFocusHandled,\n        //   'SIDE EFFECT',\n        //   performance.now() - this.t0,\n        //   'label:',\n        //   label\n        // );\n        if (label && this.label !== label) {\n          this.pickSelectionOrFirstMatch(label);\n        } else {\n          this.lostFocusHandled = true;\n        }\n        this.toggleCompletion(false, label);\n      } else {\n        // do nothing (list selection took place)\n        // console.log(\n        //   'onlost focus 2',\n        //   this.lostFocusHandled,\n        //   'nothing',\n        //   performance.now() - this.t0\n        // );\n      }\n    }, LOST_FOCUS_TIME_WINDOW_MS);\n  }\n  complete(item: DataSourceItem<Record<string, unknown>, string> | null): void {\n    if (!this.lostFocusHandled) {\n      this.lostFocusHandled = true; // prevent a previous lostFocus to trigger a side effect\n      const ellapsed = performance.now() - this.t0;\n      if (ellapsed > LOST_FOCUS_TIME_WINDOW_MS) {\n        console.warn(\n          'complete. lostfocus->click timeout of ',\n          LOST_FOCUS_TIME_WINDOW_MS,\n          'ms exceed: ',\n          performance.now() - this.t0,\n          ' ms'\n        );\n      }\n      // console.log(\n      //   'complete. set to true. CANCELED side effect',\n      //   performance.now() - this.t0\n      // );\n    }\n    if (item !== null) {\n      this.value = item.key;\n      this.label = item.label;\n    } else {\n      this.value = null;\n      this.label = '';\n    }\n    this.toggleCompletion(false, null);\n    this.markAsTouched();\n  }\n  toggleCompletion(show: boolean, label: string | null): void {\n    // No trailing markForCheck(): every branch below either sets a signal\n    // (self-notifying) or is reached from a template event binding, which\n    // Angular schedules a check for on its own regardless of zone.js.\n    if (show && !this.disabled) {\n      this.i0.nativeElement.focus();\n      if (this.appendTo) {\n        this.updateDropdownPosition();\n      }\n      this.showCompletionList(label ?? '');\n    } else {\n      this.showCompletion.set(false);\n      if (this.canAddNewValues) {\n        this.syncCustomValue(this.label);\n        return;\n      }\n    }\n  }\n\n  get selectedOption(): string | null {\n    const currentFocus = this.focusItem();\n    const index = this.completionList().findIndex(\n      (i) => i.key === currentFocus?.key\n    );\n    if (index === -1 || !currentFocus) {\n      return null;\n    }\n    return `${this.inputId}_${index}`;\n  }\n\n  private ensureItemVisible(index: number): void {\n    const target = this.completeDiv.nativeElement.querySelectorAll('li')[index];\n    if (target) {\n      target.scrollIntoView({ block: 'center' });\n    }\n  }\n  private syncCustomValue(text: string): void {\n    this.value = text;\n    this.label = text;\n  }\n  /** Pick selection based on text filtering (ingnores drowdown state) */\n  private pickSelectionOrFirstMatch(text: string): void {\n    if (this.canAddNewValues) {\n      this.syncCustomValue(text);\n      return;\n    }\n    const currentFocus = this.focusItem();\n    const focusIndex = this.completionList().findIndex(\n      (it) => currentFocus && it.key === currentFocus.key\n    );\n    if (this.showCompletion() && focusIndex > 0 && currentFocus?.label) {\n      if (text === currentFocus.label && currentFocus.key === this.value) {\n        // do nothing if value does not change & close dropdow\n        this.showCompletion.set(false);\n        return;\n      }\n      // complete selected using selected item on drowdown\n      this.complete(currentFocus);\n      return;\n    }\n    const source = (text || '').trim();\n    if (!source) {\n      this.showCompletion.set(false);\n      // select null value\n      if (this.value !== null) {\n        this.value = null;\n      }\n      return;\n    }\n    this.completionList.set([]);\n    this.computeCompletionList(source).subscribe((suggestions) => {\n      const candidate =\n        suggestions && suggestions.length > 0 ? suggestions[0] : null;\n      this.complete(candidate);\n    });\n  }\n  public showCompletionList(text: string): void {\n    this.setSameWidth();\n    const useSpinner = this.hasExternalDataSource();\n    this.spinnerVisibility(useSpinner, true);\n    setTimeout(() => {\n      // for spinner to be shown\n      this.computeCompletionList(text).subscribe({\n        next: (cl) => {\n          this.completionList.set(cl);\n          this.focusItem.set(selectElement(cl, text));\n          this.showCompletion.set(true);\n          this.spinnerVisibility(useSpinner, false);\n        },\n        error: () => {\n          this.spinnerVisibility(useSpinner, false);\n        },\n        complete: () => {\n          this.spinnerVisibility(useSpinner, false);\n        }\n      });\n    }, 1);\n  }\n\n  private spinnerVisibility(useSpinner: boolean, value: boolean): void {\n    if (useSpinner) {\n      this.showSpinner.set(value);\n    }\n  }\n  private hasExternalDataSource(): boolean {\n    return !this.dataSource && !!this.instance && !!this.populateFunction;\n  }\n  private computeCompletionList(text: string): Observable<DecoratedDataSource> {\n    const searchText = (text || '').toLowerCase();\n    if (this.dataSource) {\n      const ds = (this.dataSource || [])\n        .filter((it) => ignoreAccentsInclude(it.label, searchText))\n        .sort((a, b) => a.label.localeCompare(b.label));\n      return of(decorateDataSource(ds, searchText));\n    } else if (this.instance && this.populateFunction) {\n      return this.populateFunction(this.instance, searchText).pipe(\n        debounceTime(1),\n        first(),\n        map((ds) => {\n          const dsFiltered = ds\n            .filter((it) => ignoreAccentsInclude(it.label, searchText))\n            .sort((a, b) => a.label.localeCompare(b.label));\n          return decorateDataSource(dsFiltered, searchText);\n        })\n      );\n    } else {\n      return of([]);\n    }\n  }\n}\n\n/** Returns true if text includes substring. No accents considered. Ignorecase */\nconst ignoreAccentsInclude = (text: string, substring: string): boolean => {\n  text = normalizedString(text).toLowerCase();\n  substring = normalizedString(substring).toLowerCase();\n  return text.includes(substring);\n};\n\n/** Returns a normalized string with no accents: used for comparison */\nconst normalizedString = (a: string): string =>\n  (a || '').normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n\nconst decorateDataSource = (\n  dataSource: DataSource<any, string>,\n  subString: string\n): DecoratedDataSource => dataSource.map((it) => decorateItem(it, subString));\n\nconst decorateItem = (\n  item: DataSourceItem<any, string>,\n  tx: string\n): DecoratedDataSourceItem => {\n  const index = normalizedString(item.label)\n    .toLowerCase()\n    .indexOf(normalizedString(tx).toLowerCase());\n  const labelPrefix = index === -1 ? item.label : item.label.substr(0, index);\n  const labelMatch = index === -1 ? '' : item.label.substr(index, tx.length);\n  const labelPostfix = index === -1 ? '' : item.label.substr(index + tx.length);\n  const newItem: DecoratedDataSourceItem = {\n    ...item,\n    labelPrefix,\n    labelMatch,\n    labelPostfix\n  };\n  return newItem;\n};\n\nconst findLabelForId = (\n  data: DataSource<any, string>,\n  id: any\n): string | null => {\n  const found = data.find((it) => it.key === id);\n  return found ? found.label : null;\n};\n\nexport const selectElement = (\n  completionList: DecoratedDataSource,\n  label: string\n): DataSourceItem<any, string> | null => {\n  label = (label || '').toLowerCase();\n  if (!completionList || completionList.length === 0) {\n    return null;\n  }\n  if (completionList.length === 1) {\n    return completionList[0];\n  }\n  const found = completionList.find((it) => it.label.toLowerCase() === label);\n  return found || completionList[0];\n};\n","<div class=\"lux-autocomplete\" (blur)=\"toggleCompletion(false, i0.value)\">\n  <div class=\"lux-autocomplete-box\">\n    <input\n      #i0\n      [id]=\"inputId\"\n      [(ngModel)]=\"label\"\n      [placeholder]=\"placeholder\"\n      [attr.disabled]=\"disabled || null\"\n      [attr.readonly]=\"readonly || null\"\n      (keydown)=\"onKeydown($event, i0.value)\"\n      (keypress)=\"onKeypress($event, i0.value)\"\n      (keyup)=\"onKeyup($event, i0.value)\"\n      (blur)=\"onLostFocus(i0.value)\"\n      (focus)=\"toggleCompletion(true, i0.value)\"\n      (click)=\"toggleCompletion(true, i0.value)\"\n      (resized)=\"onInputResized()\"\n      (window:resize)=\"onInputResized()\"\n      role=\"combobox\"\n      aria-autocomplete=\"list\"\n      [attr.aria-expanded]=\"showCompletion()\"\n      aria-haspopup=\"true\"\n      attr.aria-owns=\"{{ inputId + '_list' }}\"\n      [attr.aria-activedescendant]=\"selectedOption\"\n    />\n    @if (canAddNewValues) {\n      <div class=\"icon-suggestions\"></div>\n    }\n    @if (showSpinner()) {\n      <div class=\"icon-spinner\"></div>\n    }\n    @if (!disabled && i0.value && !showCompletion()) {\n      <button\n        type=\"button\"\n        class=\"icon-clear\"\n        aria-label=\"Clear\"\n        (click)=\"clear()\"\n      ></button>\n    } @else {\n      <div\n        class=\"icon-dropdown\"\n        (click)=\"toggleCompletion(!showCompletion(), i0.value)\"\n      ></div>\n    }\n  </div>\n  <div\n    #completeDiv\n    [class.showCompletion]=\"showCompletion()\"\n    [class.lux-completion-list-appended]=\"appendTo\"\n    class=\"lux-completion-list\"\n    id=\"{{ inputId + '_list' }}\"\n  >\n    <ul>\n      @for (item of completionList(); track item.key; let index = $index) {\n        <li\n          id=\"{{ inputId + '_' + index }}\"\n          class=\"lux-completion-item\"\n          [class.selected]=\"focusItem()?.key === item.key\"\n          (click)=\"complete(item)\"\n          [attr.aria-label]=\"item.label\"\n        >\n          <span class=\"preserve-white-space\">{{ item.labelPrefix }}</span>\n          <span class=\"preserve-white-space bold\">{{ item.labelMatch }}</span>\n          <span class=\"preserve-white-space\">{{ item.labelPostfix }}</span>\n        </li>\n      }\n    </ul>\n  </div>\n</div>\n","/** Language detector based on Navigator preferences */\nexport const languageDetector = (): string => {\n  const lang = navigator.language.split('-')[0];\n  if (lang === 'es' || lang === 'en') {\n    return lang;\n  }\n  return 'en'; // default\n};\n","import {\n  Component,\n  EventEmitter,\n  forwardRef,\n  Input,\n  OnInit,\n  Output,\n  signal,\n  ViewChild\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { first } from 'rxjs/operators';\nimport { AutocompleteComponent } from '../autocomplete/autocomplete.component';\nimport { DataSource } from '../datasource';\nimport { isInitialAndEmpty } from '../helperFns';\nimport { languageDetector } from '../lang';\n\nexport interface AutocompleteTranslations {\n  placeholder: string;\n  deleteLabelTemplate: string;\n  addMessage: string;\n}\n\n@Component({\n  selector: 'lux-autocomplete-list',\n  templateUrl: './autocomplete-list.component.html',\n  styleUrls: ['./autocomplete-list.component.scss'],\n  imports: [AutocompleteComponent],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => AutocompleteListComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => AutocompleteListComponent)\n    }\n  ]\n})\nexport class AutocompleteListComponent\n  implements ControlValueAccessor, Validator, OnInit\n{\n  static idCounter = 0;\n\n  @ViewChild('auto') auto!: AutocompleteListComponent;\n\n  literals: { [lang: string]: AutocompleteTranslations } = {\n    en: {\n      placeholder: 'new item',\n      deleteLabelTemplate: 'Delete <<label>>',\n      addMessage: 'Add'\n    },\n    es: {\n      placeholder: 'nuevo elemento',\n      deleteLabelTemplate: 'Eliminar <<label>>',\n      addMessage: 'Añadir'\n    }\n  };\n\n  // Signals: both are written inside async subscribe callbacks\n  // (ensureLabelsForIds/populateWith's resolveLabelsFunction/populateFunction\n  // paths) - see autocomplete.component.ts's identical rationale.\n  internalDataSource = signal<DataSource<any, string>>([]);\n  labels = signal<string[]>([]);\n  private autoPopulate = false;\n\n  private _value: any[] = [];\n  @Input()\n  set value(val: any[]) {\n    if (val === this._value) {\n      return;\n    }\n    const initialAndEmpty = isInitialAndEmpty(this._value, val);\n    this._value = val;\n    this.ensureLabelsForIds();\n    this.populateWith('');\n    this.onChange(this._value);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(this._value);\n    }\n  }\n  get value(): any[] {\n    return this._value;\n  }\n  newEntry: any;\n  canAdd = false;\n  touched = false;\n\n  private _lang = languageDetector();\n  @Input()\n  get lang(): string {\n    return this._lang;\n  }\n  set lang(l: string) {\n    if (l === this._lang) {\n      return;\n    }\n    if (Object.keys(this.literals).includes(l)) {\n      this._lang = l;\n    } else {\n      this._lang = 'en';\n    }\n  }\n\n  @Input() inputId: string | undefined;\n  @Input() dataSource: DataSource<any, any> = [];\n  @Input() placeholder?: string;\n  @Input() disabled = false;\n  @Input() deleteLabelTemplate?: string;\n  @Input() addMessage?: string;\n  @Input() required = false;\n\n  @Input() resolveLabelsFunction?: (\n    instance: any,\n    ids: any[]\n  ) => Observable<DataSource<any, string>> = undefined;\n  @Input() populateFunction?: (\n    instance: any,\n    search: string\n  ) => Observable<DataSource<any, string>> = undefined;\n  @Input() instance: any;\n\n  @Output() valueChange = new EventEmitter<any[]>();\n\n  // ControlValueAccessor Interface\n  onChange = (value: unknown): void => {};\n  onTouched = (): void => {};\n\n  writeValue(value: any): void {\n    this.value = value;\n  }\n\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched && !this.disabled) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    if (\n      this.required &&\n      (value === '' || value === null || value === undefined)\n    ) {\n      return { required: { value, reason: 'Required field.' } };\n    }\n    return null;\n  }\n  // End of Validator interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `autocompletelist${AutocompleteListComponent.idCounter++}`;\n    this.autoPopulate =\n      !!this.resolveLabelsFunction && !!this.populateFunction && this.instance;\n    this.ensureLabelsForIds();\n  }\n  ensureLabelsForIds(): void {\n    if (this.autoPopulate && this.resolveLabelsFunction) {\n      this.resolveLabelsFunction(this.instance, this._value)\n        .pipe(first())\n        .subscribe((data) => {\n          const res: string[] = [];\n          (this._value || []).map((id) => {\n            const found = data.find((it) => it.key === id);\n            if (found) {\n              res.push(found.label);\n            } else {\n              res.push('(unset)');\n            }\n          });\n          this.labels.set(res);\n        });\n    } else if (this.dataSource) {\n      const res: string[] = [];\n      (this._value || []).map((id) => {\n        const found = this.dataSource.find((it) => it.key === id);\n        if (found) {\n          res.push(found.label);\n        } else {\n          res.push('(unset)');\n        }\n      });\n      this.labels.set(res);\n    } else {\n      this.labels.set(\n        this._value.map((it) => (it ? it.toString() : '(unset)'))\n      );\n    }\n  }\n  removeAt(index: number): void {\n    if (this._value.length > index) {\n      const key = this._value.splice(index, 1)[0];\n      const currentLabels = this.labels();\n      const label = currentLabels[index];\n      // Signals are immutable-update: unlike the plain array this replaced,\n      // splicing/pushing in place would never notify a reader of this signal.\n      this.labels.set(currentLabels.filter((_, i) => i !== index));\n      this.internalDataSource.update((ds) => [...ds, { key, label }]);\n    }\n    this.markAsTouched();\n  }\n  onValueChange(): void {\n    this.updateCanAdd();\n  }\n  onNewEntryChange(event: KeyboardEvent, auto: AutocompleteComponent): void {\n    if (event.key === 'Enter' && !!auto.value) {\n      this.addNew(auto);\n    } else if (event.key === 'Delete' || event.key === 'Backspace') {\n      // todo\n    } else {\n      this.populateWith(auto.label + event.key);\n    }\n    this.updateCanAdd();\n  }\n  populateWith(searchText: string): void {\n    if (this.autoPopulate && this.populateFunction && this.instance) {\n      this.populateFunction(this.instance, searchText)\n        .pipe(first())\n        .subscribe((data) => {\n          this.internalDataSource.set(\n            data.filter((it) => !(this._value || []).includes(it.key))\n          );\n        });\n    } else if (this.dataSource) {\n      this.internalDataSource.set(\n        this.dataSource.filter((it) => !(this._value || []).includes(it.key))\n      );\n    }\n  }\n  updateCanAdd(): void {\n    this.canAdd =\n      !this.disabled &&\n      this.auto &&\n      !!this.auto.value && // has value\n      !this.value.find((it) => it === this.auto.value); // not already in\n  }\n\n  addNew(auto: AutocompleteComponent): void {\n    this.value.push(auto.value);\n    this.ensureLabelsForIds();\n    this.newEntry = '';\n    this.internalDataSource.update((ds) =>\n      ds.filter((it) => !this._value.includes(it.key))\n    );\n    this.markAsTouched();\n  }\n\n  getDeleteMessage(label: string): string {\n    const i18n = (this.literals as any)[this.lang];\n    return (this.deleteLabelTemplate ?? i18n.deleteLabelTemplate).replace(\n      '<<label>>',\n      label\n    );\n  }\n}\n","<div [id]=\"inputId\">\n  <ul>\n    @for (label of labels(); track label; let index = $index) {\n      <li>\n        <span>{{ label }}</span>\n        @if (!disabled) {\n          <button\n            class=\"remove-item\"\n            (click)=\"removeAt(index)\"\n            attr.aria-label=\"{{ getDeleteMessage(label) }}\"\n          ></button>\n        }\n      </li>\n    }\n  </ul>\n  @if (!disabled) {\n    <div class=\"new-entry\">\n      <lux-autocomplete\n        #auto\n        [dataSource]=\"internalDataSource()\"\n        [placeholder]=\"placeholder ?? literals[lang].placeholder\"\n        [(value)]=\"newEntry\"\n        (valueChange)=\"onValueChange()\"\n        (keypress)=\"onNewEntryChange($event, auto)\"\n      >\n      </lux-autocomplete>\n      @if (canAdd) {\n        <button\n          type=\"button\"\n          class=\"add-item\"\n          aria-label=\"addMessage ?? literals[lang].addMessage\"\n          (click)=\"addNew(auto)\"\n        ></button>\n      }\n    </div>\n  }\n</div>\n","import { Component, OnDestroy, OnInit, inject, signal } from '@angular/core';\nimport {\n  ActivatedRoute,\n  ActivatedRouteSnapshot,\n  NavigationEnd,\n  Router,\n  RouterModule\n} from '@angular/router';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nexport interface BreadcrumbItem {\n  label: string;\n  url: string;\n}\n@Component({\n  selector: 'lux-breadcrumb',\n  imports: [RouterModule],\n  templateUrl: './breadcrumb.component.html',\n  styleUrls: ['./breadcrumb.component.scss']\n})\nexport class LuxBreadcrumbComponent implements OnInit, OnDestroy {\n  private route = inject(Router);\n  private activedRoute = inject(ActivatedRoute);\n\n  // Signal: written from inside the router-events subscribe below (async -\n  // see autocomplete.component.ts's identical rationale).\n  breadcrumbs = signal<BreadcrumbItem[]>([]);\n  private subs: Subscription[] = [];\n  public imagePath = '../assets/img/arrow-forward.svg';\n\n  ngOnInit(): void {\n    this.subs.push(\n      this.route.events\n        .pipe(filter((event) => event instanceof NavigationEnd))\n        .subscribe((_) => {\n          const acc: BreadcrumbItem[] = [];\n          this.addBreadcrumbs(this.activedRoute.snapshot.root, true, null, acc);\n          this.breadcrumbs.set(acc);\n        })\n    );\n  }\n\n  ngOnDestroy(): void {\n    this.subs.forEach((s) => s.unsubscribe());\n    this.subs = [];\n  }\n\n  private addBreadcrumbs(\n    activedRouteSnapshot: ActivatedRouteSnapshot,\n    isRoot: boolean,\n    urlPrefix: string | null,\n    acc: BreadcrumbItem[]\n  ): void {\n    const routeConfig = activedRouteSnapshot.routeConfig;\n    let url = urlPrefix || '';\n    url += routeConfig ? '/' + this.getUrl(activedRouteSnapshot) : '';\n    const label = routeConfig\n      ? this.getLabel(activedRouteSnapshot)\n      : isRoot\n        ? 'Home'\n        : '';\n    if (label && url !== '/') {\n      acc.push({ label, url });\n    }\n    if (activedRouteSnapshot.children.length) {\n      this.addBreadcrumbs(activedRouteSnapshot.children[0], false, url, acc);\n    }\n  }\n\n  private getUrl(activedRouteSnapshot: ActivatedRouteSnapshot): string {\n    if (!activedRouteSnapshot.url[0]) {\n      return '';\n    }\n    const id = activedRouteSnapshot.params.id;\n    return id\n      ? `${activedRouteSnapshot.url[0]}/${id}`\n      : activedRouteSnapshot.routeConfig?.path || '';\n  }\n\n  private getLabel(\n    activedRouteSnapshot: ActivatedRouteSnapshot\n  ): string | null {\n    const routeConfig = activedRouteSnapshot.routeConfig;\n    if (!routeConfig) {\n      return null;\n    }\n    if (activedRouteSnapshot.data && activedRouteSnapshot.data.title) {\n      const data = activedRouteSnapshot.data;\n      if (data.objectTitle) {\n        return `${data.title} ${data.objectTitle}`;\n      } else {\n        return data.title;\n      }\n    }\n    return activedRouteSnapshot.params.id || routeConfig.path;\n  }\n}\n","<ul class=\"lux-breadcrumb\">\n  @for (\n    breadcrumb of breadcrumbs();\n    track breadcrumb.url;\n    let isLast = $last;\n    let isFirst = $first\n  ) {\n    <li class=\"lux-breadcrumb-item\">\n      <a [class.first]=\"isFirst\" routerLink=\"{{ breadcrumb.url }}\">{{\n        breadcrumb.label\n      }}</a>\n      @if (!isLast) {\n        <div class=\"lux-breadcrumb-separator\"></div>\n      }\n    </li>\n  }\n</ul>\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnInit,\n  Output,\n  ViewChild\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { isInitialAndEmpty } from '../helperFns';\nimport { languageDetector } from '../lang';\n\nconst KEY_SPACE = ' ';\n\nexport interface CheckboxTranslations {\n  yesLabel: string;\n  noLabel: string;\n}\n\n@Component({\n  selector: 'lux-checkbox',\n  templateUrl: './checkbox.component.html',\n  styleUrls: ['./checkbox.component.scss'],\n  imports: [],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => CheckboxComponent)\n    }\n  ]\n})\nexport class CheckboxComponent\n  implements ControlValueAccessor, OnInit, AfterViewInit\n{\n  static idCounter = 0;\n\n  @ViewChild('ck', { static: false }) ck!: ElementRef;\n\n  private _lang = languageDetector();\n  @Input()\n  set lang(l: string) {\n    if (l === this._lang) {\n      return;\n    }\n    if (Object.keys(this.literals).includes(l)) {\n      this._lang = l;\n    } else {\n      this._lang = 'en';\n    }\n  }\n  get lang(): string {\n    return this._lang;\n  }\n  private internalValue: boolean = false;\n  @Input()\n  get value(): boolean {\n    return this.internalValue;\n  }\n  set value(v: boolean) {\n    if (this.internalValue === v) {\n      return;\n    }\n    const initialAndEmpty = isInitialAndEmpty(this.internalValue, v);\n    this.internalValue = v;\n    this.syncModel();\n    this.onChange(v);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n    this.cdr.markForCheck();\n  }\n\n  get tabindexValue(): string | undefined {\n    return this.disabled ? undefined : '0';\n  }\n\n  @Input() label: string | undefined = undefined;\n  @Input() name: string | undefined = undefined;\n  private _disabled = false;\n  @Input()\n  get disabled(): boolean {\n    return this._disabled;\n  }\n  set disabled(v: boolean) {\n    if (v === this._disabled) {\n      return;\n    }\n    this._disabled = v;\n    this.syncModel();\n    this.cdr.markForCheck();\n  }\n  @Input() inputId: string | undefined;\n\n  literals: { [lang: string]: CheckboxTranslations } = {\n    en: {\n      yesLabel: 'Yes',\n      noLabel: 'No'\n    },\n    es: {\n      yesLabel: 'Sí',\n      noLabel: 'No'\n    }\n  };\n  touched = false;\n\n  @Output() valueChange = new EventEmitter<boolean>();\n\n  private cdr = inject(ChangeDetectorRef);\n\n  // ControlValueAccessor Interface\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n  writeValue(value: any): void {\n    this.value = !!value;\n  }\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `${this.name || 'checkbox'}$${CheckboxComponent.idCounter++}`;\n  }\n  ngAfterViewInit(): void {\n    setTimeout(() => {\n      this.syncModel();\n    });\n  }\n\n  clicked(): void {\n    if (!this.disabled) {\n      this.value = !this.internalValue;\n      this.markAsTouched();\n    }\n  }\n  onKey(event: KeyboardEvent): void {\n    if (event.key === KEY_SPACE && !this.disabled) {\n      this.value = !this.internalValue;\n      this.markAsTouched();\n      event.preventDefault();\n    }\n  }\n\n  private syncModel(): void {\n    if (this.ck) {\n      this.ck.nativeElement.checked = this.internalValue;\n    }\n  }\n}\n","<div class=\"switch\">\n  <div>\n    @if (label) {\n      <label [for]=\"inputId\">{{ label }}</label>\n    }\n  </div>\n  @if (!disabled) {\n    <div class=\"switch-item\" (click)=\"clicked()\">\n      <input #ck [name]=\"name\" type=\"checkbox\" [id]=\"inputId\" />\n      <div\n        class=\"slider round\"\n        [class.on]=\"value\"\n        [class.disabled]=\"disabled\"\n        [tabindex]=\"tabindexValue\"\n        (keyup)=\"onKey($event)\"\n      ></div>\n    </div>\n  }\n  <div>\n    @if (value) {\n      <span class=\"checkbox-label\">{{ literals[lang].yesLabel }}</span>\n    }\n    @if (!value) {\n      <span class=\"checkbox-label\">{{ literals[lang].noLabel }}</span>\n    }\n  </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  ViewChild,\n  forwardRef\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport {\n  addTimezoneOffset,\n  hasValue,\n  isInitialAndEmpty,\n  isValidDate\n} from '../helperFns';\nimport { languageDetector } from '../lang';\n\nexport interface DatetimeTranslations {\n  required: string;\n  min: string;\n  max: string;\n}\n\n@Component({\n  selector: 'lux-datetime',\n  templateUrl: './datetime.component.html',\n  styleUrls: ['./datetime.component.scss'],\n  imports: [FormsModule, CommonModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => DatetimeComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => DatetimeComponent)\n    }\n  ]\n})\nexport class DatetimeComponent\n  implements OnInit, ControlValueAccessor, Validator\n{\n  static idCounter = 0;\n\n  @ViewChild('dateInput', { static: true }) dateInput!: ElementRef;\n  @ViewChild('timeInput', { static: true }) timeInput!: ElementRef;\n\n  touched = false;\n  dirty = false;\n  lastErrors: ValidationErrors | null = null;\n\n  private _disabled: string | boolean | undefined = undefined;\n  private _required: boolean | undefined = undefined;\n  private _value: string | undefined = undefined;\n\n  public dateValue?: string = undefined;\n  public timeValue?: string = undefined;\n\n  public userErrors: { [lang: string]: DatetimeTranslations } = {\n    en: {\n      required: 'Required field.',\n      min: 'Minimum value is $min.',\n      max: 'Maximum value is $max.'\n    },\n    es: {\n      required: 'El campo es obligatorio.',\n      min: 'El valor mínimo es $min.',\n      max: 'El valor máximo es $max.'\n    }\n  };\n\n  @Input()\n  public min?: string = '1900-01-01T00:00:00Z';\n  @Input()\n  public max?: string = '2100-01-01T00:00:00Z';\n  @Input()\n  public includeSeconds: boolean = true;\n  @Input()\n  public localTime: boolean = true;\n\n  get className(): string {\n    return this.checkClassName();\n  }\n\n  @Input() lang = languageDetector();\n  @Input() public inlineErrors = false;\n  @Input() public inputId: string | undefined;\n  @Input('aria-label') public ariaLabel: string | undefined;\n  @Input() public readonly: boolean | null = null;\n\n  @Input()\n  set disabled(v: string | boolean) {\n    v = typeof v === 'string' && v !== 'false' ? true : v;\n    this._disabled = v;\n  }\n  get disabled(): boolean {\n    return !!this._disabled;\n  }\n\n  @Input()\n  set required(v: boolean) {\n    this._required = v;\n  }\n  get required(): boolean {\n    return !!this._required;\n  }\n\n  @Input()\n  set value(v: string | undefined) {\n    if (v === this._value) {\n      return; // prevent events when there is no changes\n    }\n    const initialAndEmpty = isInitialAndEmpty(this._value, v);\n    const datetime = new Date(v ?? '');\n    if (!v) {\n      this._value = undefined;\n      this.setDateInControl(undefined);\n      this.setTimeInControl(undefined);\n    } else if (!isValidDate(datetime)) {\n      this._value = v;\n      // we don't set value in control if the value is not valid\n      // if we do, the content of the control changes and can erase what the user is typing\n    } else {\n      this._value = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ\n      this.setValueInControl(datetime);\n    }\n    this.onChange(v);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n  }\n  get value(): string | undefined {\n    return this._value;\n  }\n\n  @Output() valueChange = new EventEmitter<any>();\n  @Output() keyPress = new EventEmitter<KeyboardEvent>();\n\n  onChange = (_value: any): void => {};\n  onTouched = (): void => {};\n\n  constructor() {}\n\n  // ControlValueAccessor Interface implementation\n  writeValue(value: any): void {\n    this.value = value;\n  }\n\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End of ControlValueAccessor Interface implementation\n\n  private setDateInControl(date: string | undefined): void {\n    // this.dateInput.nativeElement.value = date;\n    this.dateValue = date;\n  }\n  private setTimeInControl(time: string | undefined): void {\n    // this.timeInput.nativeElement.value = time;\n    this.timeValue = time;\n  }\n  private setValueInControl(datetime: Date): void {\n    const offsetDatetime = this.localTime\n      ? addTimezoneOffset(datetime)\n      : datetime;\n    const offsetDatetimeString = offsetDatetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ\n    this.setDateInControl(offsetDatetimeString.slice(0, 10)); // YYYY-MM-DD\n    if (this.includeSeconds) {\n      this.setTimeInControl(offsetDatetimeString.slice(11, 19)); // hh:mm:ss\n    } else {\n      this.setTimeInControl(offsetDatetimeString.slice(11, 16)); // hh:mm\n    }\n  }\n  clear(): void {\n    this.setDateInControl(undefined);\n    this.setTimeInControl(undefined);\n    this.value = undefined;\n  }\n  isClearable(): boolean {\n    return hasValue(this.value);\n  }\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    let result: ValidationErrors | null = null;\n\n    if (\n      this.required &&\n      !hasValue(value) &&\n      !hasValue(this.dateValue) &&\n      !hasValue(this.timeValue)\n    ) {\n      result = result || {};\n      result.required = { value, reason: 'Required field.' };\n    }\n    if (!hasValue(this.dateValue) && hasValue(this.timeValue)) {\n      result = result || {};\n      result.existsDate = {\n        value,\n        reason: 'Date not specified.'\n      };\n    }\n    if (hasValue(this.dateValue) && !hasValue(this.timeValue)) {\n      result = result || {};\n      result.existsTime = {\n        value,\n        reason: 'Time not specified.'\n      };\n    }\n    if (\n      hasValue(this.min) &&\n      hasValue(value) &&\n      hasValue(this.dateValue) &&\n      hasValue(this.timeValue) &&\n      String(value).localeCompare(this.min!) === -1\n    ) {\n      result = result || {};\n      result.min = {\n        value,\n        min: this.min,\n        reason: `Value is lower than minimum value: ${this.min}.`\n      };\n    }\n    if (\n      hasValue(this.max) &&\n      hasValue(value) &&\n      hasValue(this.dateValue) &&\n      hasValue(this.timeValue) &&\n      String(value).localeCompare(this.max!) !== -1\n    ) {\n      result = result || {};\n      result.max = {\n        value,\n        max: this.max,\n        reason: `Value is greater than than maximum value: ${this.max}.`\n      };\n    }\n    this.lastErrors = result;\n    return result;\n  }\n  // End of Validator interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `datetime$${DatetimeComponent.idCounter++}`;\n    this.setPatterns();\n  }\n\n  onLostFocus(): void {\n    this.markAsTouched();\n  }\n  onKeyPress(event: KeyboardEvent): void {\n    this.keyPress.emit(event);\n  }\n\n  onEventDatetime(newDate: string, newTime: string): void {\n    if (this.disabled || this.readonly) {\n      return;\n    }\n    if (!newDate || !newTime) {\n      this.value = undefined;\n    } else {\n      const newValue = `${newDate}T${newTime}`;\n      const datetime = new Date(newValue);\n      if (isValidDate(datetime)) {\n        let datetimeString;\n        if (this.localTime) {\n          datetimeString = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ\n        } else {\n          datetimeString = addTimezoneOffset(datetime).toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ\n        }\n        if (this.includeSeconds) {\n          this.value = datetimeString.slice(0, 19) + 'Z'; // YYYY-MM-DDThh:mm:ssZ\n        } else {\n          this.value = datetimeString.slice(0, 16) + 'Z'; // YYYY-MM-DDThh:mmZ\n        }\n      } else {\n        this.value = newValue;\n      }\n    }\n  }\n\n  checkClassName(): string {\n    return this.disabled\n      ? this.readonly\n        ? 'disabled readonly'\n        : 'disabled'\n      : this.readonly\n        ? 'readonly'\n        : '';\n  }\n\n  setPatterns(): void {\n    this.min = this.min || '1900-01-01';\n    this.max = this.max || '2100-01-01';\n  }\n}\n","<input\n  #dateInput\n  class=\"rounded-left prefix\"\n  [ngClass]=\"className\"\n  type=\"date\"\n  [id]=\"inputId + '$date'\"\n  [(ngModel)]=\"dateValue\"\n  [attr.aria-label]=\"ariaLabel\"\n  [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n  [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n  [placeholder]=\"\"\n  (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n  (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n  (keypress)=\"onKeyPress($event)\"\n  (blur)=\"onLostFocus()\"\n/>\n<input\n  #timeInput\n  [class]=\"\n    (disabled || readonly || !isClearable()) && localTime ? 'rounded-right' : ''\n  \"\n  [ngClass]=\"className\"\n  type=\"time\"\n  [id]=\"inputId + '$time'\"\n  [(ngModel)]=\"timeValue\"\n  [attr.aria-label]=\"ariaLabel\"\n  [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n  [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n  [placeholder]=\"\"\n  [step]=\"includeSeconds ? 1 : 60\"\n  (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n  (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n  (keypress)=\"onKeyPress($event)\"\n  (blur)=\"onLostFocus()\"\n/>\n@if (!localTime) {\n  <div\n    [class]=\"\n      disabled || readonly || !isClearable()\n        ? 'rounded-right postfix symbol'\n        : 'postfix symbol'\n    \"\n    [ngClass]=\"className\"\n  >\n    <span>{{ localTime ? '' : 'UTC' }}</span>\n  </div>\n}\n@if (!disabled && !readonly && isClearable()) {\n  <button\n    #clearButton\n    type=\"button\"\n    class=\"rounded-right postfix bordered icon-clear\"\n    [id]=\"inputId + '$clear'\"\n    (click)=\"clear()\"\n    aria-label=\"clear\"\n  ></button>\n}\n@if (inlineErrors && lastErrors && (dirty || touched)) {\n  <div class=\"alert\">\n    @if (lastErrors.required) {\n      <div>{{ userErrors[lang].required }}</div>\n    }\n    @if (lastErrors.min) {\n      <div>{{ userErrors[lang].min.replace('$min', lastErrors.min.min) }}</div>\n    }\n    @if (lastErrors.max) {\n      <div>{{ userErrors[lang].max.replace('$max', lastErrors.max.max) }}</div>\n    }\n  </div>\n}\n","import {\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  forwardRef\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALUE_ACCESSOR\n} from '@angular/forms';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/** Filter component to query for objects. */\n@Component({\n  selector: 'lux-filter',\n  templateUrl: './filter.component.html',\n  styleUrls: ['./filter.component.scss'],\n  imports: [FormsModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => FilterComponent)\n    }\n  ]\n})\nexport class FilterComponent\n  implements ControlValueAccessor, OnInit, OnDestroy\n{\n  static idCounter = 0;\n\n  private touched = false;\n  private _searchValue = '';\n\n  @Input() disabled = false;\n  /** id for the input. If left blank, it is autogenerated */\n  @Input() inputId: string | undefined;\n  /** Placeholder default text. */\n  @Input() placeholder = '';\n  /** Search value introduced by the user. */\n  @Input()\n  get searchValue(): string {\n    return this._searchValue;\n  }\n  set searchValue(v: string) {\n    v = (v || '').toString();\n    if (v === this._searchValue) {\n      return;\n    }\n    this.onChange(v);\n    this._searchValue = v;\n  }\n  /** Search on type: (default true) Auto-search when user types in. */\n  @Input() searchOnType = true;\n  /** Custom aria label in case of not using a label */\n  @Input('aria-label') ariaLabel: string | undefined;\n\n  private debounceValue = 300; // 300 ms\n  /** Debounce time in milliseconds. (defaults to 300 ms) */\n  @Input()\n  set debounce(val: number) {\n    this.debounceValue = val;\n    this.recreateObservable();\n  }\n  get debounce(): number {\n    return this.debounceValue;\n  }\n\n  /** Search value changed by user. */\n  @Output() searchValueChange = new EventEmitter<string>();\n\n  searchValue$?: Observable<string>;\n\n  private subject = new Subject<string>();\n  private sub?: Subscription;\n\n  constructor() {\n    this.recreateObservable();\n  }\n\n  // ControlValueAccessor Interface\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n  writeValue(value: any): void {\n    this.searchValue = (value || '').toString();\n  }\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `filter$${FilterComponent.idCounter++}`;\n  }\n  ngOnDestroy(): void {\n    this.freeSubscriptions();\n  }\n  clear(): void {\n    this.searchValue = '';\n    this.search();\n  }\n  search(): void {\n    this.searchValueChange.emit(this.searchValue);\n  }\n  keyup(event: KeyboardEvent, newValue: string): void {\n    this.markAsTouched();\n    this.searchValue = newValue;\n    if (event.key === 'Enter') {\n      this.searchNow(this.searchValue);\n    }\n    if (this.searchOnType) {\n      this.addEvent();\n    }\n  }\n  onInputValueChange(newValue: string): void {\n    this.markAsTouched();\n    this.searchValue = newValue;\n  }\n\n  private recreateObservable(): void {\n    this.searchValue$ = this.subject\n      .asObservable()\n      .pipe(debounceTime(this.debounce));\n\n    this.freeSubscriptions();\n    this.sub = this.searchValue$.subscribe((value) => {\n      this.searchValueChange.emit(value);\n    });\n  }\n  private freeSubscriptions(): void {\n    if (this.sub) {\n      this.sub.unsubscribe();\n      this.sub = undefined;\n    }\n  }\n  private searchNow(value: string): void {\n    this.searchValueChange.emit(value);\n  }\n  private addEvent(): void {\n    this.subject.next(this.searchValue);\n  }\n}\n","<div class=\"filter\">\n  <input\n    #i0\n    type=\"text\"\n    [attr.aria-label]=\"ariaLabel\"\n    [placeholder]=\"placeholder\"\n    [id]=\"inputId\"\n    [disabled]=\"disabled\"\n    [value]=\"searchValue\"\n    (valueChange)=\"onInputValueChange(i0.value)\"\n    (keyup)=\"keyup($event, i0.value)\"\n  />\n\n  <button\n    [class.hide]=\"!searchValue\"\n    aria-label=\"Clear\"\n    class=\"clear-indicator icon icon-clear\"\n    type=\"button\"\n    (click)=\"clear()\"\n  ></button>\n  @if (searchOnType) {\n    <i class=\"search-indicator icon icon-search\"></i>\n  }\n  @if (!searchOnType) {\n    <button\n      class=\"btn-search\"\n      type=\"button\"\n      [disabled]=\"disabled\"\n      (click)=\"search()\"\n    >\n      Search\n    </button>\n  }\n</div>\n","import { Injectable } from '@angular/core';\nimport { from, Observable, of, shareReplay } from 'rxjs';\n\nlet loading$: Observable<boolean> | null = null;\n\n@Injectable({ providedIn: 'root' })\nexport class OpenLayerLoaderService {\n  load(): Observable<boolean> {\n    if ((window as any).ol) {\n      return of(true);\n    }\n\n    if (!loading$) {\n      const openLayerJsUrl = 'https://openlayers.org/en/v5.3.0/build/ol.js';\n      const openLayerCssUrl = 'https://openlayers.org/en/v5.3.0/css/ol.css';\n      loadCss(openLayerCssUrl, () => {});\n      loading$ = from(\n        new Promise<boolean>((resolve, _) => {\n          loadScript(openLayerJsUrl, () => resolve(true));\n        })\n      ).pipe(shareReplay(1));\n    }\n    return loading$;\n  }\n}\n\n/** Dynamically load a script from url and return a callback */\nconst loadScript = (url: string, callback: () => void): void => {\n  const script: any = document.createElement('script');\n  script.type = 'text/javascript';\n\n  if (script.readyState) {\n    // for old IE\n    script.onreadystatechange = (): void => {\n      if (script.readyState === 'loaded' || script.readyState === 'complete') {\n        script.onreadystatechange = null;\n        callback();\n      }\n    };\n  } else {\n    // Others browsers\n    script.onload = (): void => {\n      callback();\n    };\n  }\n  script.src = url;\n  document.getElementsByTagName('head')[0].appendChild(script);\n};\n\n/** Dynamically load css from url and return a callback */\nconst loadCss = (url: string, callback: () => void): void => {\n  const link: any = document.createElement('link');\n  link.type = 'text/css';\n  link.rel = 'stylesheet';\n  link.type = 'text/javascript';\n  link.href = url;\n  link.onload = (): void => {\n    callback();\n  };\n  document.getElementsByTagName('head')[0].appendChild(link);\n};\n","/* eslint-disable no-self-assign */\n\nimport {\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  inject\n} from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { OpenLayerLoaderService } from '../geolocation/openlayer-loader.service';\n\nimport { GeoPoint } from './geopoint';\n\n// @dynamic\ndeclare const ol: any;\n\n@Component({\n  selector: 'lux-map',\n  templateUrl: './map.component.html',\n  styleUrls: ['./map.component.scss'],\n  imports: []\n})\nexport class MapComponent implements OnInit, AfterViewInit {\n  static idCounter = 0;\n\n  private loaded$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n  private _map: any;\n\n  @Input() mapId: string | undefined;\n\n  _zoom: number | undefined;\n  @Input()\n  set zoom(zoom: number | undefined) {\n    if (zoom != null && !isNaN(zoom)) {\n      this._zoom = zoom;\n      if (this._map) {\n        this._map.getView().setZoom(zoom);\n      }\n    }\n  }\n  get zoom(): number | undefined {\n    return this._zoom;\n  }\n\n  _center: GeoPoint | undefined;\n  @Input()\n  set center(center: GeoPoint | undefined) {\n    if (center && center.coordinates && center.coordinates.length === 2) {\n      this._center = center;\n      if (this._map) {\n        this._map.getView().setCenter(ol.proj.fromLonLat(center.coordinates));\n      }\n    }\n  }\n  get center(): GeoPoint | undefined {\n    return this._center;\n  }\n\n  _readonly: boolean | undefined;\n  @Input()\n  set readonly(readonly: boolean) {\n    if (!readonly) {\n      if (this._map) {\n        this._map.on('click', (args: any) => {\n          // args.coordinate is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)\n          const coordinates = ol.proj.toLonLat(args.coordinate);\n          // alternatively: const lonLat = ol.proj.transform(args.coordinate,'EPSG:3857','EPSG:4326');\n          this.addMarkerAtCoordinates(coordinates);\n        });\n        this._map.on('pointermove', (event: any) => {\n          const pixel = this._map.getEventPixel(event.originalEvent);\n          const hit = this._map.hasFeatureAtPixel(pixel);\n          this._map.getViewport().style.cursor = hit ? 'move' : 'grab';\n        });\n      }\n    } else {\n      if (this._map) {\n        this._map.on('click', (args: any) => {});\n        this._map.on('pointermove', (event: any) => {});\n        this._map.getViewport().style.cursor = 'grab';\n      }\n    }\n    this._readonly = readonly;\n    // reset marker coordinates so marker interactions can be created or recreated accordingly\n    // to the changes to readonly\n    this.markerCoordinates = this.markerCoordinates;\n  }\n  get readonly(): boolean {\n    return !!this._readonly;\n  }\n\n  private _marker: any;\n  private _markerInteraction: any;\n  private _markerCoordinates: number[] | undefined;\n  @Input()\n  private set markerCoordinates(markerCoordinates: number[] | undefined) {\n    if (markerCoordinates && markerCoordinates.length === 2) {\n      this._markerCoordinates = markerCoordinates;\n      if (this._map) {\n        this.addMarkerAtCoordinates(markerCoordinates);\n      }\n    } else {\n      this._markerCoordinates = undefined;\n      if (this._map) {\n        this.removeMarker();\n      }\n    }\n  }\n  private get markerCoordinates(): number[] | undefined {\n    return this._markerCoordinates;\n  }\n  @Input()\n  set markerPoint(markerPoint: GeoPoint | undefined) {\n    if (\n      !markerPoint ||\n      !(markerPoint.coordinates && markerPoint.coordinates.length === 2)\n    ) {\n      this.markerCoordinates = undefined;\n    } else {\n      this.markerCoordinates = [\n        +markerPoint.coordinates[0],\n        +markerPoint.coordinates[1]\n      ];\n    }\n    this.valueChange.emit(markerPoint);\n  }\n  get markerPoint(): GeoPoint {\n    return {\n      type: 'Point',\n      coordinates: this.markerCoordinates ?? [0, 0]\n    };\n  }\n  @Output() valueChange = new EventEmitter<GeoPoint>();\n\n  private _markerSource: any;\n  private _markerStyle: any;\n\n  constructor() {\n    const olLoader = inject(OpenLayerLoaderService);\n\n    olLoader.load().subscribe((_) => {\n      // Initialize\n      this._markerSource = new ol.source.Vector();\n      this._markerStyle = new ol.style.Style({\n        image: new ol.style.Icon({\n          anchor: [0.5, 1],\n          scale: 0.25,\n          src: '/assets/img/marker.png'\n        })\n      });\n      this.loaded$.next(true);\n    });\n  }\n\n  ngOnInit(): void {\n    this.mapId = this.mapId ? this.mapId : 'map' + MapComponent.idCounter++;\n  }\n\n  ngAfterViewInit(): void {\n    this.loaded$.subscribe((loaded) => {\n      if (loaded) {\n        this.initMap();\n      }\n    });\n  }\n  private initMap(): void {\n    this._map = new ol.Map({\n      target: this.mapId,\n      controls: ol.control.defaults({ attribution: false }),\n      layers: [\n        new ol.layer.Tile({\n          source: new ol.source.OSM()\n        }),\n        new ol.layer.Vector({\n          source: this._markerSource,\n          style: this._markerStyle\n        })\n      ],\n      view: new ol.View({\n        center: ol.proj.fromLonLat(\n          this.center !== undefined ? this.center.coordinates : [0, 0]\n        ),\n        zoom: this.zoom\n      })\n    });\n\n    if (this.center === undefined || this.center === null) {\n      // if the center is not set, we set its default value\n      if ('geolocation' in navigator) {\n        navigator.geolocation.getCurrentPosition(\n          (position) => {\n            this.center = {\n              type: 'Point',\n              coordinates: [position.coords.longitude, position.coords.latitude]\n            };\n          },\n          (error) => {\n            this.center = {\n              type: 'Point',\n              coordinates: [0, 0]\n            };\n          }\n        );\n      } else {\n        this.center = {\n          type: 'Point',\n          coordinates: [0, 0]\n        };\n      }\n    } else {\n      // the center needs the map to be properly set, so if it was set before the map was initialized,\n      // we set the center again to perform necessary adjustements\n      this.center = this.center;\n    }\n\n    if (this.zoom === undefined || this.zoom === null) {\n      // if the zoom is not set, we set its default value\n      this.zoom = 18;\n    } else {\n      // the zoom needs the map to be properly set, so if it was set before the map was initialized,\n      // we set the zoom again to perform necessary adjustements\n      this.zoom = this.zoom;\n    }\n\n    if (this.readonly === undefined || this.readonly === null) {\n      // if readonly is not set, we set its default value\n      this.readonly = false;\n    } else {\n      // readonly needs the map to be properly set, so if it was set before the map was initialized,\n      // we set readonly again to perform necessary adjustements\n      this.readonly = this.readonly;\n    }\n\n    if (\n      this.markerCoordinates !== undefined &&\n      this.markerCoordinates !== null\n    ) {\n      // the marker coordinates need the map to be properly set, so if they were set before the map was initialized,\n      // we set the marker coordinates again to perform necessary adjustements\n      this.markerCoordinates = this.markerCoordinates;\n    }\n  }\n\n  private addMarkerAtCoordinates(coordinates: number[]): void {\n    if (coordinates && coordinates.length === 2) {\n      if (this._marker !== undefined) {\n        this.removeMarker();\n      }\n      this._marker = new ol.Feature({\n        geometry: new ol.geom.Point(\n          // [lon, lat] is in EPSG:4326 (degrees), we transform it into EPSG:3857 (meters)\n          ol.proj.transform(coordinates, 'EPSG:4326', 'EPSG:3857')\n        )\n      });\n      this._markerSource.addFeature(this._marker);\n      this._markerCoordinates = this.getMarkerCoordinates() ?? undefined;\n\n      if (!this.readonly) {\n        const dragInteraction = new ol.interaction.Modify({\n          features: new ol.Collection([this._marker]),\n          style: this._markerStyle,\n          pixelTolerance: 50,\n          hitDetection: true\n        });\n        this._markerInteraction = dragInteraction;\n        this._map.addInteraction(dragInteraction);\n      }\n\n      this._marker.on(\n        'change',\n        () => {\n          this._markerCoordinates = this.getMarkerCoordinates();\n        },\n        this._marker\n      );\n    }\n  }\n\n  private removeMarker(): void {\n    if (this._marker !== undefined) {\n      this._markerSource.removeFeature(this._marker);\n      this._marker = undefined;\n    }\n    if (this._markerInteraction !== undefined) {\n      this._map.getInteractions().pop();\n      this._markerInteraction = undefined;\n    }\n  }\n\n  private getMarkerCoordinates(): number[] | undefined {\n    if (this._marker === undefined || this._marker == null) {\n      return this._marker;\n    }\n    const coordinates = this._marker.getGeometry().getCoordinates();\n    // coordinates is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)\n    return ol.proj.transform(coordinates, 'EPSG:3857', 'EPSG:4326');\n  }\n\n  onResize(): void {\n    if (this._map) {\n      this._map.updateSize();\n    }\n  }\n}\n","<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n","import { Component, HostBinding, Input } from '@angular/core';\n\n@Component({\n  imports: [],\n  selector: 'lux-modal-backdrop',\n  template: ''\n})\nexport class LuxModalBackdropComponent {\n  @Input() backdropClass: string | undefined;\n\n  @HostBinding('class') class = 'modal-backdrop fade show';\n  @HostBinding('style') style = 'z-index: 1050';\n}\n","import { Injectable } from '@angular/core';\n\nexport interface LuxModalOptions {\n  ariaDescribedBy?: string;\n  ariaLabelledBy?: string;\n  backdrop?: boolean;\n  keyboard?: boolean;\n  windowClass?: string;\n  backdropClass?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LuxModalConfig implements LuxModalOptions {\n  backdrop = true;\n}\n","import { ComponentRef } from '@angular/core';\nimport { LuxModalWindowComponent } from './modal-window';\nimport { ContentRef } from './util';\nimport { LuxModalBackdropComponent } from './modal-backdrop';\n\nexport class ActiveModal {\n  close(result?: any): void {}\n  dismiss(reason?: any): void {}\n}\n\nexport class ModalRef {\n  private _resolve: ((result?: any) => void) | undefined = undefined;\n  private _reject: ((reason?: any) => void) | undefined = undefined;\n\n  /**\n   * The instance of a component used for the modal content.\n   *\n   * When a `TemplateRef` is used as the content, will return `undefined`.\n   */\n  get componentInstance(): any {\n    if (this._contentRef.componentRef) {\n      return this._contentRef.componentRef.instance;\n    }\n  }\n\n  /**\n   * The promise that is resolved when the modal is closed and rejected when the modal is dismissed.\n   */\n  result: Promise<any>;\n\n  constructor(\n    private _windowCmptRef: ComponentRef<LuxModalWindowComponent>,\n    private _contentRef: ContentRef,\n    private _backdropCmptRef?: ComponentRef<LuxModalBackdropComponent>,\n    private _beforeDismiss?: () => any\n  ) {\n    _windowCmptRef.instance.dismissEvent.subscribe((reason: any) => {\n      this.dismiss(reason);\n    });\n\n    this.result = new Promise((resolve, reject) => {\n      this._resolve = resolve;\n      this._reject = reject;\n    });\n    this.result.then(null, () => {});\n  }\n\n  /**\n   * Closes the modal with an optional `result` value.\n   *\n   * The `NgbMobalRef.result` promise will be resolved with the provided value.\n   */\n  close(result?: any): void {\n    if (this._windowCmptRef) {\n      if (this._resolve) {\n        this._resolve(result);\n      }\n      this._removeModalElements();\n    }\n  }\n\n  private _dismiss(reason?: any): void {\n    if (this._reject) {\n      this._reject(reason);\n    }\n    this._removeModalElements();\n  }\n\n  /**\n   * Dismisses the modal with an optional `reason` value.\n   *\n   * The `NgbModalRef.result` promise will be rejected with the provided value.\n   */\n  dismiss(reason?: any): void {\n    if (this._windowCmptRef) {\n      if (!this._beforeDismiss) {\n        this._dismiss(reason);\n      } else {\n        const dismiss = this._beforeDismiss();\n        if (dismiss && dismiss.then) {\n          dismiss.then(\n            (result: unknown) => {\n              if (result !== false) {\n                this._dismiss(reason);\n              }\n            },\n            () => {}\n          );\n        } else if (dismiss !== false) {\n          this._dismiss(reason);\n        }\n      }\n    }\n  }\n\n  private _removeModalElements(): void {\n    const windowNativeEl = this._windowCmptRef.location.nativeElement;\n    windowNativeEl.parentNode.removeChild(windowNativeEl);\n    this._windowCmptRef.destroy();\n\n    if (this._backdropCmptRef) {\n      const backdropNativeEl = this._backdropCmptRef.location.nativeElement;\n      backdropNativeEl.parentNode.removeChild(backdropNativeEl);\n      this._backdropCmptRef.destroy();\n    }\n\n    if (this._contentRef && this._contentRef.viewRef) {\n      this._contentRef.viewRef.destroy();\n    }\n\n    (this._windowCmptRef as any) = undefined;\n    (this._backdropCmptRef as any) = undefined;\n    (this._contentRef as any) = undefined;\n  }\n}\n","export enum ModalDismissReasons {\n  BackdropClick,\n  Esc\n}\n","import { ComponentRef, ViewRef } from '@angular/core';\nimport { Observable, fromEvent } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\n\nexport const FOCUS = 'focus';\n\nexport enum Key {\n  Tab = 9,\n  Enter = 13,\n  Escape = 27,\n  Space = 32,\n  PageUp = 33,\n  PageDown = 34,\n  End = 35,\n  Home = 36,\n  ArrowLeft = 37,\n  ArrowUp = 38,\n  ArrowRight = 39,\n  ArrowDown = 40\n}\n\nexport const isDefined = (value: any): boolean =>\n  value !== undefined && value !== null;\n\nexport class ContentRef {\n  constructor(\n    public nodes: any[],\n    public viewRef?: ViewRef,\n    public componentRef?: ComponentRef<any>\n  ) {}\n}\n\nconst FOCUSABLE_ELEMENTS_SELECTOR = [\n  'a[href]',\n  'button:not([disabled])',\n  'input:not([disabled]):not([type=\"hidden\"])',\n  'select:not([disabled])',\n  'textarea:not([disabled])',\n  '[contenteditable]',\n  '[tabindex]:not([tabindex=\"-1\"])'\n].join(', ');\n\n/**\n * Returns first and last focusable elements inside of a given element based on specific CSS selector\n */\nexport const getFocusableBoundaryElements = (\n  element: HTMLElement\n): HTMLElement[] => {\n  const list: HTMLElement[] = Array.from(\n    element.querySelectorAll(\n      FOCUSABLE_ELEMENTS_SELECTOR\n    ) as NodeListOf<HTMLElement>\n  ).filter((el) => el.tabIndex !== -1);\n  return [list[0], list[list.length - 1]];\n};\n\n/**\n * Function that enforces browser focus to be trapped inside a DOM element.\n *\n * Works only for clicks inside the element and navigation with 'Tab', ignoring clicks outside of the element\n *\n * @param element The element around which focus will be trapped inside\n * @param stopFocusTrap$ The observable stream. When completed the focus trap will clean up listeners\n * and free internal resources\n * @param refocusOnClick Put the focus back to the last focused element whenever a click occurs on element (default to\n * false)\n */\nexport const focusTrap = (\n  element: HTMLElement,\n  stopFocusTrap$: Observable<any>,\n  refocusOnClick = false\n): void => {\n  // last focused element\n  const lastFocusedElement$ = fromEvent<FocusEvent>(element, 'focusin').pipe(\n    takeUntil(stopFocusTrap$),\n    map((e) => e.target)\n  );\n\n  // 'tab' / 'shift+tab' stream\n  fromEvent<KeyboardEvent>(element, 'keydown')\n    .pipe(\n      takeUntil(stopFocusTrap$),\n\n      filter((e) => e.which === Key.Tab),\n\n      withLatestFrom(lastFocusedElement$)\n    )\n    .subscribe(([tabEvent, focusedElement]) => {\n      const [first, last] = getFocusableBoundaryElements(element);\n\n      if (\n        (focusedElement === first || focusedElement === element) &&\n        tabEvent.shiftKey\n      ) {\n        last.focus();\n        tabEvent.preventDefault();\n      }\n\n      if (focusedElement === last && !tabEvent.shiftKey) {\n        first.focus();\n        tabEvent.preventDefault();\n      }\n    });\n\n  // inside click\n  if (refocusOnClick) {\n    fromEvent(element, 'click')\n      .pipe(\n        takeUntil(stopFocusTrap$),\n        withLatestFrom(lastFocusedElement$),\n        map((arr) => arr[1] as HTMLElement)\n      )\n      .subscribe((lastFocusedElement) => lastFocusedElement.focus());\n  }\n};\n","import { DOCUMENT } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  HostListener,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  inject\n} from '@angular/core';\n\nimport { ModalDismissReasons } from './modal-dismiss-reasons';\nimport { FOCUS, getFocusableBoundaryElements } from './util';\n\n@Component({\n  selector: 'lux-modal-window',\n  imports: [],\n  template: `\n    <div class=\"modal-dialog\" role=\"document\">\n      <div class=\"modal-content\"><ng-content></ng-content></div>\n    </div>\n  `\n})\nexport class LuxModalWindowComponent\n  implements OnInit, AfterViewInit, OnDestroy\n{\n  private _document = inject(DOCUMENT);\n  private _elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  private _elWithFocus: Element | null | undefined; // element that is focused prior to modal opening\n\n  @Input() ariaDescribedBy: string | undefined;\n  @Input() ariaLabelledBy: string | undefined;\n  @Input() backdrop: boolean | string = false;\n  @Input() keyboard = true;\n  @Input() windowClass: string | undefined;\n\n  @Output() dismissEvent = new EventEmitter();\n\n  @HostBinding('class') get class(): string {\n    return `modal ${this.windowClass || ''}`;\n  }\n  @HostBinding('attr.role') role = 'dialog';\n  @HostBinding('tabindex') tabindex = '-1';\n  @HostBinding('attr.aria-modal') ariamodal = true;\n  @HostBinding('attr.aria-labelledby') get hostAriaLabelledBy():\n    string | undefined {\n    return this.ariaLabelledBy;\n  }\n  @HostBinding('attr.aria-describedby') get hostAriaDescribedBy():\n    string | undefined {\n    return this.ariaDescribedBy;\n  }\n  @HostListener('click', ['$event']) backdropClick(event: any): void {\n    const btn: HTMLElement = event.target;\n    if (this.backdrop === true && this._elRef.nativeElement === btn) {\n      this.dismiss(ModalDismissReasons.BackdropClick);\n    }\n  }\n  @HostListener('keyup.esc', ['$event']) escKey(event: any): void {\n    if (this.keyboard && !event.defaultPrevented) {\n      this.dismiss(ModalDismissReasons.Esc);\n    }\n  }\n\n  dismiss(reason: any): void {\n    this.dismissEvent.emit(reason);\n  }\n\n  ngOnInit(): void {\n    this._elWithFocus = this._document.activeElement;\n  }\n\n  ngAfterViewInit(): void {\n    if (!this._elRef.nativeElement.contains(document.activeElement)) {\n      const firstFocusable = getFocusableBoundaryElements(\n        this._elRef.nativeElement\n      )[0];\n\n      const elementToFocus = firstFocusable || this._elRef.nativeElement;\n      elementToFocus.focus();\n    }\n  }\n\n  ngOnDestroy(): void {\n    const body = this._document.body;\n    const elWithFocus = this._elWithFocus;\n\n    let elementToFocus: any;\n    if (\n      elWithFocus &&\n      (elWithFocus as any)[FOCUS] &&\n      body.contains(elWithFocus)\n    ) {\n      elementToFocus = elWithFocus;\n    } else {\n      elementToFocus = body;\n    }\n    elementToFocus.focus();\n    this._elWithFocus = null;\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  ApplicationRef,\n  ComponentRef,\n  EnvironmentInjector,\n  Injectable,\n  Injector,\n  RendererFactory2,\n  TemplateRef,\n  createComponent,\n  inject\n} from '@angular/core';\n\nimport { Subject } from 'rxjs';\nimport { LuxModalBackdropComponent } from './modal-backdrop';\nimport { LuxModalConfig, LuxModalOptions } from './modal-config';\nimport { ActiveModal, ModalRef } from './modal-ref';\nimport { LuxModalWindowComponent } from './modal-window';\nimport { ContentRef, focusTrap, isDefined } from './util';\n\n@Injectable({ providedIn: 'root' })\nexport class ModalStack {\n  private _applicationRef = inject(ApplicationRef);\n  private _document = inject(DOCUMENT);\n  private _environmentInjector = inject(EnvironmentInjector);\n  private _injector = inject(Injector);\n  private _rendererFactory = inject(RendererFactory2);\n  private modalConfig = inject(LuxModalConfig);\n\n  private _activeWindowCmptHasChanged = new Subject();\n  private _modalRefs: ModalRef[] = [];\n  private _windowCmpts: ComponentRef<LuxModalWindowComponent>[] = [];\n  private _ariaHiddenValues: Map<Element, string> = new Map();\n  private _backdropAttributes = ['backdropClass'];\n  private _windowAttributes = [\n    'ariaLabelledBy',\n    'backdrop',\n    'centered',\n    'keyboard',\n    'scrollable',\n    'size',\n    'windowClass'\n  ];\n\n  constructor() {\n    this._activeWindowCmptHasChanged.subscribe(() => {\n      if (this._windowCmpts.length) {\n        const activeWindowCmpt =\n          this._windowCmpts[this._windowCmpts.length - 1];\n        focusTrap(\n          activeWindowCmpt.location.nativeElement,\n          this._activeWindowCmptHasChanged\n        );\n        this._revertAriaHidden();\n        this._setAriaHidden(activeWindowCmpt.location.nativeElement);\n      }\n    });\n  }\n\n  open(content: any, options: LuxModalOptions): ModalRef {\n    const config = Object.assign({}, this.modalConfig, options);\n    const containerEl = this._document.body;\n    const renderer = this._rendererFactory.createRenderer(null, null);\n    const removeBodyClass = (): void => {\n      if (!this._modalRefs.length) {\n        renderer.removeClass(this._document.body, 'modal-open');\n        this._revertAriaHidden();\n      }\n    };\n    const activeModal = new ActiveModal();\n    const contentRef = this.getContentRef(content, activeModal)!;\n    const backdropCmptRef: ComponentRef<LuxModalBackdropComponent> | null =\n      config.backdrop ? this._attachBackdrop(containerEl) : null;\n    const windowCmptRef: ComponentRef<LuxModalWindowComponent> =\n      this._attachWindowComponent(containerEl, contentRef);\n    const modalRef: ModalRef = new ModalRef(\n      windowCmptRef,\n      contentRef,\n      backdropCmptRef!\n    );\n    this._registerModalRef(modalRef);\n    this._registerWindowCmpt(windowCmptRef);\n    modalRef.result.then(removeBodyClass, removeBodyClass);\n    activeModal.close = (result: any): void => {\n      modalRef.close(result);\n    };\n    activeModal.dismiss = (reason: any): void => {\n      modalRef.dismiss(reason);\n    };\n\n    this._applyWindowOptions(windowCmptRef.instance, config);\n    if (this._modalRefs.length === 1) {\n      renderer.addClass(this._document.body, 'modal-open');\n    }\n    if (backdropCmptRef && backdropCmptRef.instance) {\n      this._applyBackgroundOptions(backdropCmptRef.instance, config);\n      backdropCmptRef.changeDetectorRef.detectChanges();\n    }\n    windowCmptRef.changeDetectorRef.detectChanges();\n\n    return modalRef;\n  }\n\n  private _applyWindowOptions(\n    windowInstance: LuxModalWindowComponent,\n    config: LuxModalOptions\n  ): void {\n    this._windowAttributes.forEach((optionName: string) => {\n      if (isDefined((config as any)[optionName])) {\n        (windowInstance as any)[optionName] = (config as any)[optionName];\n      }\n    });\n  }\n\n  private _applyBackgroundOptions(\n    backgroudInstance: LuxModalBackdropComponent,\n    config: LuxModalOptions\n  ): void {\n    this._backdropAttributes.forEach((optionName: string) => {\n      if (isDefined((config as any)[optionName])) {\n        (backgroudInstance as any)[optionName] = (config as any)[optionName];\n      }\n    });\n  }\n\n  private _revertAriaHidden(): void {\n    this._ariaHiddenValues.forEach((value, element) => {\n      if (value) {\n        element.setAttribute('aria-hidden', value);\n      } else {\n        element.removeAttribute('aria-hidden');\n      }\n    });\n    this._ariaHiddenValues.clear();\n  }\n\n  private getContentRef(\n    content: any,\n    activeModal: ActiveModal\n  ): ContentRef | undefined {\n    if (content instanceof TemplateRef) {\n      return this.createFromTemplateRef(content, activeModal);\n    }\n    return undefined;\n  }\n\n  private createFromTemplateRef(\n    content: TemplateRef<any>,\n    activeModal: ActiveModal\n  ): ContentRef {\n    const context = {\n      $implicit: activeModal,\n\n      close(result: unknown): void {\n        activeModal.close(result);\n      },\n\n      dismiss(reason: unknown): void {\n        activeModal.dismiss(reason);\n      }\n    };\n    const viewRef = content.createEmbeddedView(context);\n    this._applicationRef.attachView(viewRef);\n    return new ContentRef([viewRef.rootNodes], viewRef);\n  }\n\n  private _attachBackdrop(\n    containerEl: any\n  ): ComponentRef<LuxModalBackdropComponent> {\n    const backdropCmptRef = createComponent(LuxModalBackdropComponent, {\n      environmentInjector: this._environmentInjector,\n      elementInjector: this._injector\n    });\n    this._applicationRef.attachView(backdropCmptRef.hostView);\n    containerEl.appendChild(backdropCmptRef.location.nativeElement);\n    return backdropCmptRef;\n  }\n\n  private _attachWindowComponent(\n    containerEl: any,\n    contentRef: any\n  ): ComponentRef<LuxModalWindowComponent> {\n    const windowCmptRef = createComponent(LuxModalWindowComponent, {\n      environmentInjector: this._environmentInjector,\n      elementInjector: this._injector,\n      projectableNodes: contentRef.nodes\n    });\n    this._applicationRef.attachView(windowCmptRef.hostView);\n    containerEl.appendChild(windowCmptRef.location.nativeElement);\n    return windowCmptRef;\n  }\n\n  private _registerModalRef(modalRef: ModalRef): void {\n    const unregisterModalRef = (): void => {\n      const index = this._modalRefs.indexOf(modalRef);\n      if (index > -1) {\n        this._modalRefs.splice(index, 1);\n      }\n    };\n    this._modalRefs.push(modalRef);\n    modalRef.result.then(unregisterModalRef, unregisterModalRef);\n  }\n\n  private _registerWindowCmpt(\n    windowCmpt: ComponentRef<LuxModalWindowComponent>\n  ): void {\n    this._windowCmpts.push(windowCmpt);\n    this._activeWindowCmptHasChanged.next(null);\n\n    windowCmpt.onDestroy(() => {\n      const index = this._windowCmpts.indexOf(windowCmpt);\n      if (index > -1) {\n        this._windowCmpts.splice(index, 1);\n        this._activeWindowCmptHasChanged.next(null);\n      }\n    });\n  }\n\n  private _setAriaHidden(element: Element): void {\n    const parent = element.parentElement;\n    if (parent && element !== this._document.body) {\n      Array.from(parent.children).forEach((sibling) => {\n        if (sibling !== element && sibling.nodeName !== 'SCRIPT') {\n          this._ariaHiddenValues.set(\n            sibling,\n            sibling.getAttribute('aria-hidden') ?? ''\n          );\n          sibling.setAttribute('aria-hidden', 'true');\n        }\n      });\n      this._setAriaHidden(parent);\n    }\n  }\n}\n","import { Injectable, TemplateRef, inject } from '@angular/core';\nimport { LuxModalOptions } from './modal-config';\nimport { ModalRef } from './modal-ref';\nimport { ModalStack } from './modal-stack';\n\n/**\n * A service that it allow open an close modal components\n */\n@Injectable({ providedIn: 'root' })\nexport class ModalService {\n  private modalStack = inject(ModalStack);\n\n  /**Open a modal component\n   * @param content TemplateRef\n   */\n  open(content: TemplateRef<any>, options: LuxModalOptions = {}): ModalRef {\n    return this.modalStack.open(content, options);\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable, of, Subject } from 'rxjs';\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  map,\n  switchMap\n} from 'rxjs/operators';\nimport { DataSource } from '../datasource';\nimport { GeoPoint } from '../map/geopoint';\n\ninterface SearchResult {\n  place_id: number;\n  lat: number;\n  lon: number;\n  display_name: string;\n  icon: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class GeolocationService {\n  private http = inject(HttpClient);\n\n  private debouncePeriodMs = 300; // ms\n  private cacheSize = 20;\n  private lastQueriesWithResults = new Map<string, SearchResult[]>();\n  private lastQueriesLru: string[] = [];\n  private currentSearch$: Subject<string>;\n  private currentQuery$: Observable<SearchResult[]>;\n\n  constructor() {\n    this.currentSearch$ = new Subject<string>();\n\n    const typed$ = this.currentSearch$\n      .asObservable()\n      .pipe(distinctUntilChanged());\n\n    this.currentQuery$ = typed$.pipe(\n      debounceTime(this.debouncePeriodMs),\n\n      switchMap((currentQuery) => {\n        const data = this.getFromCache(currentQuery);\n        if (data !== undefined) {\n          return of(data);\n        }\n        // Nominatim search documentation:\n        // https://nominatim.org/release-docs/develop/api/Search/\n        const url =\n          'https://nominatim.openstreetmap.org/search?format=json&limit=20&q=' +\n          encodeURIComponent(currentQuery);\n        const headers = {\n          'Content-Type': 'application/json'\n        };\n        this.addToCache(currentQuery, []);\n\n        return this.http.get(url, { headers }).pipe(\n          map((response) => {\n            const searchResults = response as unknown as SearchResult[];\n            const uniqueResults = distinct(searchResults);\n            return this.addToCache(currentQuery, uniqueResults);\n          })\n        );\n      })\n    );\n  }\n\n  searchGeolocation(query: string): Observable<SearchResult[]> {\n    this.currentSearch$.next(query);\n    return this.currentQuery$;\n  }\n\n  getLabels(\n    instance: GeolocationService,\n    keys: GeoPoint[]\n  ): Observable<DataSource<GeoPoint, string>> {\n    const searchResults = (\n      instance.lastQueriesWithResults.get(instance.getLatestQuery() ?? '') ?? []\n    ).filter((searchResult) => samePosition(searchResult, keys));\n    return of(\n      searchResults.map((searchResult) => {\n        const key: GeoPoint = {\n          type: 'Point',\n          coordinates: [searchResult.lon, searchResult.lat]\n        };\n        return {\n          key,\n          label: searchResult.display_name\n        };\n      })\n    );\n  }\n\n  getData(\n    instance: GeolocationService,\n    search: string\n  ): Observable<DataSource<GeoPoint, string>> {\n    return instance.searchGeolocation(search).pipe(\n      map((searchResults) =>\n        searchResults.map((searchResult) => {\n          const key: GeoPoint = {\n            type: 'Point',\n            coordinates: [searchResult.lon, searchResult.lat]\n          };\n          const label = searchResult.display_name;\n          return { key, label };\n        })\n      )\n    );\n  }\n\n  // Cache implemementation ---\n  private getFromCache(query: string): SearchResult[] | undefined {\n    if (this.lastQueriesWithResults.has(query)) {\n      return this.lastQueriesWithResults.get(query);\n    }\n    return undefined;\n  }\n  private addToCache(query: string, data: SearchResult[]): SearchResult[] {\n    if (this.lastQueriesWithResults.keys.length >= this.cacheSize) {\n      const deletedQuery = this.lastQueriesLru[0];\n      this.revomeFromCache(deletedQuery);\n    }\n    this.lastQueriesWithResults.set(query, data);\n    this.lastQueriesLru.push(query);\n    return data;\n  }\n  private revomeFromCache(query: string): void {\n    this.lastQueriesWithResults.delete(query);\n    const index = this.lastQueriesLru.findIndex((it) => it === query);\n    this.lastQueriesLru.splice(index, 1);\n  }\n  private getLatestQuery(): string | null {\n    return this.lastQueriesLru.length\n      ? this.lastQueriesLru[this.lastQueriesLru.length - 1]\n      : null;\n  }\n  // End cache implemementation ---\n}\n\nconst samePosition = (\n  searchResult: SearchResult,\n  keys: GeoPoint[]\n): boolean => {\n  let found = false;\n  keys.forEach((item) => {\n    if (\n      searchResult.lon === item.coordinates[0] &&\n      searchResult.lat === item.coordinates[1]\n    ) {\n      found = true;\n    }\n  });\n  return found;\n};\n\nconst distinct = (data: SearchResult[]): SearchResult[] => {\n  const unique: { [key: string]: number } = {};\n  return data.filter((r) => {\n    if (unique[r.display_name]) {\n      return false;\n    }\n    unique[r.display_name] = 1;\n    return true;\n  });\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnInit,\n  Output,\n  TemplateRef,\n  ViewChild\n} from '@angular/core';\nimport {\n  AbstractControl,\n  FormsModule,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n  ValidationErrors\n} from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { AutocompleteComponent } from '../autocomplete/autocomplete.component';\nimport { DataSource } from '../datasource';\nimport {\n  exists,\n  hasValue,\n  isInitialAndEmpty,\n  isValidNumber,\n  roundToMultipleOf\n} from '../helperFns';\nimport { languageDetector } from '../lang';\nimport { GeoPoint } from '../map/geopoint';\nimport { MapComponent } from '../map/map.component';\nimport { ModalService } from '../modal/modal.service';\nimport { GeolocationService } from './geolocation.service';\n\nexport interface GeoTranslations {\n  lat: string;\n  lon: string;\n  selectLocation: string;\n  location: string;\n  selectAction: string;\n  cancelAction: string;\n  closeAction: string;\n  typeToSearch: string;\n  cardinalPoints: {\n    north: string;\n    south: string;\n    east: string;\n    west: string;\n  };\n  userErrors: {\n    required: string;\n    minLatitude: string;\n    maxLatitude: string;\n    minLongitude: string;\n    maxLongitude: string;\n  };\n}\n\n@Component({\n  selector: 'lux-geolocation',\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    AutocompleteComponent,\n    MapComponent\n  ],\n  templateUrl: './geolocation.component.html',\n  styleUrls: ['./geolocation.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => GeolocationComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => GeolocationComponent)\n    }\n  ]\n})\nexport class GeolocationComponent implements OnInit {\n  private modalService = inject(ModalService);\n  locationService = inject(GeolocationService);\n\n  static idCounter = 0;\n\n  @ViewChild('latitude', { static: true }) latitude!: ElementRef;\n  @ViewChild('longitude', { static: true }) longitude!: ElementRef;\n  @ViewChild('map', { static: false }) map?: ElementRef;\n\n  touched = false;\n  dirty = false;\n  lastErrors: ValidationErrors | null = null;\n\n  private _disabled: string | boolean = false;\n  private _required = false;\n  private _value: any;\n\n  latitudeValue?: number = undefined;\n  longitudeValue?: number = undefined;\n\n  isValidNumber = isValidNumber;\n\n  i18n: { [key: string]: GeoTranslations } = {\n    en: {\n      lat: 'latitude',\n      lon: 'longitude',\n      selectLocation: 'Select location',\n      location: 'Location',\n      selectAction: 'Select',\n      cancelAction: 'Cancel',\n      closeAction: 'Close',\n      typeToSearch: 'type to search',\n      cardinalPoints: {\n        north: 'N',\n        south: 'S',\n        east: 'E',\n        west: 'W'\n      },\n      userErrors: {\n        required: 'Required field.',\n        minLatitude: 'Minimum latitude is $minLatitude.',\n        maxLatitude: 'Maximum latitude is $maxLatitude.',\n        minLongitude: 'Minimum longitude is $minLongitude.',\n        maxLongitude: 'Maximum longitude is $maxLongitude.'\n      }\n    },\n    es: {\n      lat: 'latitud',\n      lon: 'longitud',\n      selectLocation: 'Seleccione ubicación',\n      location: 'Ubicación',\n      selectAction: 'Seleccionar',\n      cancelAction: 'Cancelar',\n      closeAction: 'Cerrar',\n      typeToSearch: 'escribe para buscar',\n      cardinalPoints: {\n        north: 'N',\n        south: 'S',\n        east: 'E',\n        west: 'O'\n      },\n      userErrors: {\n        required: 'El campo es obligatorio.',\n        minLatitude: 'La latitud mínima es $minLatitude.',\n        maxLatitude: 'La latitud máxima es $maxLatitude.',\n        minLongitude: 'La longitud mínima es $minLongitude.',\n        maxLongitude: 'La longitud máxima es $maxLongitude.'\n      }\n    }\n  };\n\n  @Input()\n  public minLatitude: number | undefined;\n  @Input()\n  public maxLatitude: number | undefined;\n  @Input()\n  public minLongitude: number | undefined;\n  @Input()\n  public maxLongitude: number | undefined;\n  @Input()\n  public step: number | undefined;\n  @Input()\n  public zoom: number | undefined;\n\n  get className(): string {\n    return this.checkClassName();\n  }\n\n  @Input() lang = languageDetector();\n  @Input() public inlineErrors = false;\n  @Input() public inputId: string | undefined;\n  @Input('aria-label') public ariaLabel: string | undefined;\n  @Input() public readonly: boolean | null = null;\n\n  @Input()\n  set disabled(v: string | boolean) {\n    v = typeof v === 'string' && v !== 'false' ? true : v;\n    this._disabled = v;\n  }\n  get disabled(): string | boolean {\n    return this._disabled;\n  }\n\n  @Input()\n  set required(v: boolean) {\n    this._required = v;\n  }\n  get required(): boolean {\n    return this._required;\n  }\n\n  @Input()\n  set value(v: GeoPoint | undefined) {\n    if (v === this._value) {\n      return; // prevent events when there is no changes\n    }\n    const initialAndEmpty = isInitialAndEmpty(this._value, v);\n    if (\n      v &&\n      v.coordinates &&\n      v.coordinates.length === 2 &&\n      exists(v.coordinates[0] && exists(v.coordinates[1]))\n    ) {\n      this._value = v;\n      this.setLatitudeInControl(v.coordinates[1]);\n      this.setLongitudeInControl(v.coordinates[0]);\n    } else if (!v) {\n      this._value = undefined;\n      this.setLatitudeInControl(undefined);\n      this.setLongitudeInControl(undefined);\n    } else {\n      this._value = v;\n      // we don't set value in control if the value is not valid\n      // if we do, the content of the control changes and can erase what the user is typing\n    }\n    this.onChange(v);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n  }\n  get value(): GeoPoint | undefined {\n    return this._value;\n  }\n\n  @Output() valueChange = new EventEmitter<GeoPoint>();\n  @Output() keyPress = new EventEmitter<KeyboardEvent>();\n\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n\n  // ControlValueAccessor Interface implementation\n  writeValue(value: any): void {\n    this.value = value;\n  }\n\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End of ControlValueAccessor Interface implementation\n\n  private setLatitudeInControl(latitude: number | undefined): void {\n    // this.latitude.nativeElement.value = latitude;\n    this.latitudeValue = latitude;\n  }\n  private setLongitudeInControl(longitude: number | undefined): void {\n    // this.longitude.nativeElement.value = longitude;\n    this.longitudeValue = longitude;\n  }\n  clear(): void {\n    this.setLatitudeInControl(undefined);\n    this.setLongitudeInControl(undefined);\n    this.value = undefined;\n  }\n  isClearable(): boolean {\n    return (\n      isValidNumber(this.latitudeValue) || isValidNumber(this.longitudeValue)\n    );\n  }\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    let result: ValidationErrors | null = null;\n\n    if (\n      this.required &&\n      !hasValue(value) &&\n      !exists(this.latitudeValue) &&\n      !exists(this.longitudeValue)\n    ) {\n      result = result || {};\n      result.required = { value, reason: 'Required field.' };\n    }\n    if (!exists(this.latitudeValue) && exists(this.longitudeValue)) {\n      result = result || {};\n      result.existsLatitude = {\n        value,\n        reason: 'Latitude not specified.'\n      };\n    }\n    if (exists(this.latitudeValue) && !exists(this.longitudeValue)) {\n      result = result || {};\n      result.existsLongitude = {\n        value,\n        reason: 'Longitude not specified.'\n      };\n    }\n    if (exists(this.minLatitude) && this.latitudeValue! < this.minLatitude!) {\n      result = result || {};\n      result.minLatitude = {\n        value,\n        min: this.minLatitude,\n        reason: `Latitude is lower than minimum value: ${this.minLatitude}.`\n      };\n    }\n    if (exists(this.maxLatitude) && this.latitudeValue! > this.maxLatitude!) {\n      result = result || {};\n      result.maxLatitude = {\n        value,\n        max: this.maxLatitude,\n        reason: `Latitude is higher than maximum value: ${this.maxLatitude}.`\n      };\n    }\n    if (\n      exists(this.minLongitude) &&\n      this.longitudeValue! < this.minLongitude!\n    ) {\n      result = result || {};\n      result.minLongitude = {\n        value,\n        min: this.minLongitude,\n        reason: `Longitude is lower than minimum value: ${this.minLongitude}.`\n      };\n    }\n    if (\n      exists(this.maxLongitude) &&\n      this.longitudeValue! > this.maxLongitude!\n    ) {\n      result = result || {};\n      result.maxLongitude = {\n        value,\n        max: this.maxLongitude,\n        reason: `Longitude is higher than maximum value: ${this.maxLongitude}.`\n      };\n    }\n    this.lastErrors = result;\n    return result;\n  }\n  // End of Validator interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `geolocation$${GeolocationComponent.idCounter++}`;\n    this.setPatterns();\n  }\n\n  roundToStepAndUpdateLatitudeAndLongitude(\n    newLatitudeAndLongitude: number[]\n  ): void {\n    const newLatitude = roundToMultipleOf(\n      newLatitudeAndLongitude[1],\n      this.step ?? 1 // review value 1??\n    );\n    const newLongitude = roundToMultipleOf(\n      newLatitudeAndLongitude[0],\n      this.step ?? 1 // review value 1??\n    );\n    if (this.disabled || this.readonly) {\n      return;\n    }\n    if (!exists(newLatitudeAndLongitude)) {\n      this.value = undefined;\n    }\n    this.value = {\n      type: 'Point',\n      coordinates: [newLongitude, newLatitude]\n    };\n  }\n\n  onLostFocus(): void {\n    this.markAsTouched();\n  }\n  onEventLatitude(newLatitude: string): void {\n    if (this.disabled || this.readonly) {\n      return;\n    }\n    const newLatitudeValue = isValidNumber(newLatitude) ? +newLatitude : null;\n    if (\n      !(exists(this.value) && exists(this.value?.coordinates[0])) &&\n      !exists(newLatitudeValue)\n    ) {\n      this.value = undefined;\n    } else {\n      this.value = {\n        type: 'Point',\n        coordinates: [\n          this.value ? this.value?.coordinates[0] : 0,\n          newLatitudeValue ?? 0\n        ]\n      };\n    }\n    this.markAsTouched();\n  }\n  onEventLongitude(newLongitude: string): void {\n    if (this.disabled || this.readonly) {\n      return;\n    }\n    const newLongitudeValue = isValidNumber(newLongitude)\n      ? +newLongitude\n      : null;\n    if (\n      !exists(newLongitudeValue) &&\n      !(exists(this.value) && exists(this._value.coordinates[1]))\n    ) {\n      this.value = undefined;\n    } else {\n      this.value = {\n        type: 'Point',\n        coordinates: [\n          newLongitudeValue ?? 0,\n          this.value ? this.value.coordinates[1] : 0\n        ]\n      };\n    }\n    this.markAsTouched();\n  }\n  onKeyPress(event: KeyboardEvent): void {\n    this.keyPress.emit(event);\n  }\n\n  checkClassName(): string {\n    return this.disabled\n      ? this.readonly\n        ? 'disabled readonly'\n        : 'disabled'\n      : this.readonly\n        ? 'readonly'\n        : '';\n  }\n\n  openModalMap(modal: TemplateRef<any>): void {\n    this.modalService.open(modal).result.then(\n      (result) => {\n        if (result !== 'cancel') {\n          this.roundToStepAndUpdateLatitudeAndLongitude(result);\n        }\n      },\n      (_) => {}\n    );\n  }\n\n  onSearchLocationChanged(newValue: GeoPoint, map: any): void {\n    map.markerPoint = newValue;\n    map.center = map.markerPoint;\n  }\n\n  get mapTitle(): string {\n    const i18n = (this.i18n as any)[this.lang];\n    return this._disabled || !!this.readonly\n      ? i18n.location\n      : i18n.selectLocation;\n  }\n\n  get self(): GeolocationComponent {\n    return this;\n  }\n\n  getLabels(\n    instance: GeolocationComponent,\n    keys: GeoPoint[]\n  ): Observable<DataSource<GeoPoint, string>> {\n    return instance.locationService.getLabels(instance.locationService, keys);\n  }\n\n  getData(\n    instance: GeolocationComponent,\n    search: string\n  ): Observable<DataSource<GeoPoint, string>> {\n    return instance.locationService.getData(instance.locationService, search);\n  }\n\n  setPatterns(): void {\n    this.step = this.step || 0.00001; // 0.00001 degrees = 1.11 meters\n    this.zoom = this.zoom || 18; // (360/2^18) degrees ~ 0.00137 degrees ~ 153 meters\n    this.minLatitude = this.minLatitude || -90;\n    this.maxLatitude = this.maxLatitude || +90;\n    this.minLongitude = this.minLongitude || -180;\n    this.maxLongitude = this.maxLongitude || +180;\n  }\n}\n","<input\n  #latitude\n  class=\"rounded-left prefix\"\n  [ngClass]=\"className\"\n  type=\"number\"\n  [id]=\"inputId + '$latitude'\"\n  [(ngModel)]=\"latitudeValue\"\n  [attr.aria-label]=\"ariaLabel\"\n  [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n  [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n  [attr.min]=\"\n    minLatitude !== undefined && minLatitude !== null\n      ? minLatitude.toString()\n      : undefined\n  \"\n  [attr.max]=\"\n    maxLatitude !== undefined && maxLatitude !== null\n      ? maxLatitude.toString()\n      : undefined\n  \"\n  [attr.step]=\"\n    step !== undefined && step !== null ? step.toString() : undefined\n  \"\n  [placeholder]=\"i18n[lang].lat\"\n  (keyup)=\"onEventLatitude(latitude.value)\"\n  (change)=\"onEventLatitude(latitude.value)\"\n  (keypress)=\"onKeyPress($event)\"\n  (blur)=\"onLostFocus()\"\n/>\n<div\n  class=\"infix symbol monospace clickable\"\n  [ngClass]=\"className\"\n  (click)=\"openModalMap(modalMap)\"\n>\n  @if (isValidNumber(latitudeValue) && latitudeValue! >= 0) {\n    <span>{{ i18n[lang].cardinalPoints.north }}</span>\n  }\n  @if (isValidNumber(latitudeValue) && latitudeValue! < 0) {\n    <span>{{ i18n[lang].cardinalPoints.south }}</span>\n  }\n  @if (!isValidNumber(latitudeValue)) {\n    <span>-</span>\n  }\n</div>\n<input\n  #longitude\n  class=\"prefix\"\n  [ngClass]=\"className\"\n  type=\"number\"\n  [id]=\"inputId + '$longitude'\"\n  [(ngModel)]=\"longitudeValue\"\n  [attr.aria-label]=\"ariaLabel\"\n  [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n  [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n  [attr.min]=\"\n    minLongitude !== undefined && minLongitude !== null\n      ? minLongitude.toString()\n      : undefined\n  \"\n  [attr.max]=\"\n    maxLongitude !== undefined && maxLongitude !== null\n      ? maxLongitude.toString()\n      : undefined\n  \"\n  [attr.step]=\"\n    step !== undefined && step !== null ? step.toString() : undefined\n  \"\n  [placeholder]=\"i18n[lang].lon\"\n  (keyup)=\"onEventLongitude(longitude.value)\"\n  (change)=\"onEventLongitude(longitude.value)\"\n  (keypress)=\"onKeyPress($event)\"\n  (blur)=\"onLostFocus()\"\n/>\n<div\n  class=\"infix symbol monospace clickable\"\n  [ngClass]=\"className\"\n  (click)=\"openModalMap(modalMap)\"\n>\n  @if (isValidNumber(longitudeValue) && longitudeValue! >= 0) {\n    <span>{{ i18n[lang].cardinalPoints.east }}</span>\n  }\n  @if (isValidNumber(longitudeValue) && longitudeValue! < 0) {\n    <span>{{ i18n[lang].cardinalPoints.west }}</span>\n  }\n  @if (!isValidNumber(longitudeValue)) {\n    <span>-</span>\n  }\n</div>\n<div\n  [class]=\"\n    disabled || readonly || !isClearable()\n      ? 'clickable rounded-right postfix symbol'\n      : 'clickable postfix symbol'\n  \"\n  [ngClass]=\"className\"\n  (click)=\"openModalMap(modalMap)\"\n>\n  <span class=\"icon-globe\"></span>\n</div>\n@if (!disabled && !readonly && isClearable()) {\n  <button\n    #clearButton\n    class=\"rounded-right postfix bordered icon icon-clear\"\n    [id]=\"inputId + '$clear'\"\n    type=\"button\"\n    (click)=\"clear()\"\n    aria-label=\"clear\"\n  ></button>\n}\n@if (inlineErrors && lastErrors && (dirty || touched)) {\n  <div class=\"alert\">\n    @if (lastErrors.required) {\n      <div>\n        {{ i18n[lang].userErrors.required }}\n      </div>\n    }\n    @if (lastErrors.minLatitude) {\n      <div>\n        {{\n          i18n[lang].userErrors.minLatitude.replace(\n            '$minLatitude',\n            lastErrors.minLatitude.min\n          )\n        }}\n      </div>\n    }\n    @if (lastErrors.maxLatitude) {\n      <div>\n        {{\n          i18n[lang].userErrors.maxLatitude.replace(\n            '$maxLatitude',\n            lastErrors.maxLatitude.max\n          )\n        }}\n      </div>\n    }\n    @if (lastErrors.minLongitude) {\n      <div>\n        {{\n          i18n[lang].userErrors.minLongitude.replace(\n            '$minLongitude',\n            lastErrors.minLongitude.min\n          )\n        }}\n      </div>\n    }\n    @if (lastErrors.maxLongitude) {\n      <div>\n        {{\n          i18n[lang].userErrors.maxLongitude.replace(\n            '$maxLongitude',\n            lastErrors.maxLongitude.max\n          )\n        }}\n      </div>\n    }\n  </div>\n}\n\n<ng-template #modalMap let-modal>\n  <div class=\"lux-modal-header\">\n    <h4 class=\"modal-title default-font\" id=\"modal-basic-title\">\n      {{ mapTitle }}\n    </h4>\n    <button\n      type=\"button\"\n      class=\"close\"\n      aria-label=\"Close\"\n      (click)=\"modal.dismiss('Cross click')\"\n    >\n      <span aria-hidden=\"true\">×</span>\n    </button>\n  </div>\n  <div class=\"lux-modal-body content\">\n    @if (!disabled && !readonly) {\n      <lux-autocomplete\n        #searchBar\n        [attr.aria-label]=\"i18n[lang].typeToSearch\"\n        [placeholder]=\"i18n[lang].typeToSearch\"\n        [instance]=\"self\"\n        [resolveLabelsFunction]=\"getLabels\"\n        [populateFunction]=\"getData\"\n        (valueChange)=\"onSearchLocationChanged(searchBar.value, map)\"\n      ></lux-autocomplete>\n    }\n    <div class=\"map-container\">\n      <lux-map\n        #map\n        [center]=\"value\"\n        [markerPoint]=\"value\"\n        [zoom]=\"zoom\"\n        [readonly]=\"readonly === true || disabled === true ? true : false\"\n      ></lux-map>\n    </div>\n  </div>\n  <div class=\"lux-modal-footer\">\n    @if (disabled || readonly) {\n      <button\n        type=\"button\"\n        class=\"btn btn-cancel\"\n        (click)=\"modal.close('cancel')\"\n      >\n        {{ i18n[lang].closeAction }}\n      </button>\n    }\n    @if (!disabled && !readonly) {\n      <button\n        type=\"button\"\n        class=\"btn btn-cancel\"\n        (click)=\"modal.close('cancel')\"\n      >\n        {{ i18n[lang].cancelAction }}\n      </button>\n    }\n    @if (!disabled && !readonly) {\n      <button\n        type=\"button\"\n        class=\"btn btn-select\"\n        (click)=\"modal.close(map.markerPoint.coordinates)\"\n      >\n        {{ i18n[lang].selectAction }}\n      </button>\n    }\n  </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\n\n/**\n * A service that holds the functionality for advanced handling of regular expressions\n */\n@Injectable({ providedIn: 'root' })\nexport class RegexpService {\n  constructor() {}\n\n  private removeOuterRoundBrackets(regularExpressionString: string): string {\n    while (\n      regularExpressionString[0] === '(' &&\n      regularExpressionString[regularExpressionString.length - 1] === ')'\n    ) {\n      regularExpressionString = regularExpressionString.slice(\n        1,\n        regularExpressionString.length - 1\n      );\n    }\n    return regularExpressionString;\n  }\n\n  private isQuantifier(quantifier: string): boolean {\n    switch (quantifier) {\n      case '{':\n      case '?':\n      case '+':\n      case '*':\n        return true;\n    }\n    return false;\n  }\n\n  private parseMinimalAmountOfQuantifier(quantifier: string): number {\n    switch (quantifier[0]) {\n      case '?':\n      case '*':\n        return 0;\n      case '+':\n        return 1;\n      case '{':\n        for (let index = 1; index < quantifier.length; ++index) {\n          if (quantifier[index] < '0' || quantifier[index] > '9') {\n            return Number(quantifier.slice(1, index));\n          }\n        }\n    }\n    return 0;\n  }\n\n  private sliceRegexByOr(regularExpressionString: string): string[] {\n    const result = [];\n    let slicedRegex: string;\n    let lastSliceIndex = 0;\n    let roundBracketCount = 0;\n    let squareBracketCount = 0;\n    let curlyBracketCount = 0;\n    let index = 0;\n    for (; index < regularExpressionString.length; ++index) {\n      switch (regularExpressionString[index]) {\n        case '\\\\':\n          // escape sequence; skip the next character\n          ++index;\n          break;\n        case '(':\n          roundBracketCount += 1;\n          break;\n        case ')':\n          roundBracketCount -= 1;\n          break;\n        case '[':\n          squareBracketCount += 1;\n          break;\n        case ']':\n          squareBracketCount -= 1;\n          break;\n        case '{':\n          curlyBracketCount += 1;\n          break;\n        case '}':\n          curlyBracketCount -= 1;\n          break;\n        case '|':\n          if (\n            roundBracketCount === 0 &&\n            squareBracketCount === 0 &&\n            curlyBracketCount === 0\n          ) {\n            slicedRegex = this.removeOuterRoundBrackets(\n              regularExpressionString.slice(lastSliceIndex, index)\n            );\n            result.push(slicedRegex);\n            lastSliceIndex = index + 1;\n          }\n          break;\n      }\n    }\n    slicedRegex = this.removeOuterRoundBrackets(\n      regularExpressionString.slice(lastSliceIndex, index)\n    );\n    result.push(slicedRegex);\n    return result;\n  }\n\n  private sliceRegexByThen(regularExpressionString: string): string[][] {\n    // the actual result\n    const resultStart = [];\n    // the remainder of the regex in each case\n    const resultRemainder = [];\n    let roundBracketCount = 0;\n    let squareBracketCount = 0;\n    let curlyBracketCount = 0;\n    for (let index = 0; index < regularExpressionString.length; ++index) {\n      switch (regularExpressionString[index]) {\n        case '\\\\':\n          // escape sequence; skip the next character\n          ++index;\n          break;\n        case '(':\n          roundBracketCount += 1;\n          break;\n        case ')':\n          roundBracketCount -= 1;\n          break;\n        case '[':\n          squareBracketCount += 1;\n          break;\n        case ']':\n          squareBracketCount -= 1;\n          break;\n        case '{':\n          curlyBracketCount += 1;\n          break;\n        case '}':\n          curlyBracketCount -= 1;\n          break;\n      }\n      if (\n        roundBracketCount === 0 &&\n        squareBracketCount === 0 &&\n        curlyBracketCount === 0\n      ) {\n        if (!this.isQuantifier(regularExpressionString[index + 1])) {\n          resultStart.push(regularExpressionString.slice(0, index + 1));\n          resultRemainder.push(regularExpressionString.slice(index + 1));\n        } else {\n          // let minimalAmountOfRepeats = parseMinimalAmountOfQuantifier(regularExpressionString.slice(index + 1));\n          // TODO\n        }\n      }\n    }\n    return [resultStart, resultRemainder];\n  }\n\n  suggestion(beginning: string, regularExpressionString: string): string {\n    if (new RegExp(regularExpressionString).test(beginning)) {\n      // TODO: RETURN AN EMPTY STRING\n      return 'YA ES IGUAL, NO HAY MÁS QUE SUGERIR';\n    }\n    const regexOptions = this.sliceRegexByOr(regularExpressionString);\n    if (regexOptions.length > 1) {\n      for (\n        let regexOptionIndex = 0;\n        regexOptionIndex < regexOptions.length;\n        ++regexOptionIndex\n      ) {\n        const regexParts = this.sliceRegexByThen(\n          regexOptions[regexOptionIndex]\n        );\n        const regexPartsStarts = regexParts[0];\n        const regexPartsRemainders = regexParts[1];\n        // for each option, test if the first part of the regex matches\n        // if it doesn't, continue\n        // if it does, keep checking until what part it matches\n        if (!new RegExp(regexPartsStarts[0]).test(beginning)) {\n          // if there are no more options\n          if (regexOptionIndex === regexOptions.length - 1) {\n            // we return the first option, but we could return any option\n\n            // TODO: RETURN ANY TEXT THAT MATCHES regexOptions[0]\n            return regexOptions[0];\n          }\n        } else {\n          for (\n            let regexPartIndex = 1;\n            regexPartIndex < regexPartsStarts.length;\n            ++regexPartIndex\n          ) {\n            if (!new RegExp(regexPartsStarts[regexPartIndex]).test(beginning)) {\n              // TODO: RETURN ANY TEXT THAT MATCHES regexPartsRemainders[regexPartIndex - 1]\n              return regexPartsRemainders[regexPartIndex - 1];\n            }\n          }\n        }\n      }\n    } else if (regexOptions.length === 1) {\n      const regexParts = this.sliceRegexByThen(regexOptions[0]);\n      const regexPartsStarts = regexParts[0];\n      const regexPartsRemainders = regexParts[1];\n      if (!new RegExp(regexPartsStarts[0]).test(beginning)) {\n        // TODO: RETURN ANY TEXT THAT MATCHES regularExpressionString\n        return regularExpressionString;\n      } else {\n        for (\n          let regexPartIndex = 1;\n          regexPartIndex < regexPartsStarts.length;\n          ++regexPartIndex\n        ) {\n          if (!new RegExp(regexPartsStarts[regexPartIndex]).test(beginning)) {\n            // TODO: RETURN ANY TEXT THAT MATCHES regexPartsRemainders[regexPartIndex - 1]\n            return regexPartsRemainders[regexPartIndex - 1];\n          }\n        }\n      }\n    }\n    // TODO: RETURN AN EMPTY STRING\n    return 'NO DEBERÍA SER POSIBLE';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  ViewChild,\n  forwardRef,\n  inject\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport {\n  hasValue,\n  isInitialAndEmpty,\n  isValidColor,\n  isValidEmail,\n  isValidNumber,\n  isValidRelativeUrl,\n  normalizeDate\n} from '../helperFns';\nimport { languageDetector } from '../lang';\nimport { RegexpService } from './regexp.service';\n\ninterface UserErrorLiteral {\n  required: string;\n  min: string;\n  max: string;\n  email: string;\n  url: string;\n  color: string;\n}\n\n@Component({\n  selector: 'lux-input',\n  templateUrl: './input.component.html',\n  styleUrls: ['./input.component.scss'],\n  imports: [CommonModule, FormsModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => InputComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => InputComponent)\n    }\n  ]\n})\nexport class InputComponent implements OnInit, ControlValueAccessor, Validator {\n  regexpService = inject(RegexpService);\n  private cdr = inject(ChangeDetectorRef);\n\n  static idCounter = 0;\n\n  @ViewChild('input', { static: false }) input!: ElementRef;\n  @ViewChild('textarea', { static: false }) textarea!: ElementRef;\n  @ViewChild('colorpicker', { static: false }) colorpicker!: ElementRef;\n\n  touched = false;\n  dirty = false;\n  lastErrors: ValidationErrors | null = null;\n\n  private _disabled: string | boolean = false;\n  private _value: any = '';\n  private _type: string | undefined;\n  private _placeholder: string | undefined;\n  private _pattern?: string = undefined;\n  private _regexp?: RegExp = undefined;\n  private _currency: string | undefined;\n  private _required: boolean | undefined;\n\n  public userErrors: { [key: string]: UserErrorLiteral } = {\n    en: {\n      required: 'Required field.',\n      min: 'Minimum value is $min.',\n      max: 'Maximum value is $max.',\n      email: 'Format should match example@example.com.',\n      url: 'Format should match https://example.com.',\n      color: 'Format should match #XXXXXX.'\n    },\n    es: {\n      required: 'El campo es obligatorio.',\n      min: 'El valor mínimo es $min.',\n      max: 'El valor máximo es $max.',\n      email: 'El campo debe tener un formato como ejemplo@ejemplo.com.',\n      url: 'El campo debe tener un formato como https://ejemplo.com.',\n      color: 'El campo debe tener un formato como #XXXXXX.'\n    }\n  };\n\n  public domain: string | undefined;\n  @Input()\n  public rows?: number | string;\n  @Input()\n  public cols?: number | string;\n  @Input()\n  public step?: number;\n  @Input()\n  public min?: number | string;\n  @Input()\n  public max?: number | string;\n\n  get className(): string {\n    return this.checkClassName();\n  }\n\n  get color(): string {\n    return this.checkColor();\n  }\n\n  @Input() lang = languageDetector();\n  @Input() public inlineErrors = false;\n  @Input() public inputId: string | undefined;\n  @Input('aria-label') public ariaLabel: string | undefined;\n  @Input() public readonly: boolean | null = null;\n\n  @Input()\n  set disabled(v: string | boolean) {\n    v = typeof v === 'string' ? true : v;\n    this._disabled = v;\n    this.cdr.markForCheck();\n  }\n  get disabled(): string | boolean {\n    return this._disabled;\n  }\n\n  @Input()\n  set pattern(p: string | undefined) {\n    this._pattern = p;\n    if (p === undefined) {\n      this._regexp = undefined;\n    } else {\n      try {\n        this._regexp = new RegExp(p);\n      } catch (e) {\n        this._pattern = undefined;\n        this._regexp = undefined;\n      }\n    }\n  }\n  get pattern(): string | undefined {\n    return this._pattern;\n  }\n\n  @Input()\n  set currency(v: string) {\n    this._currency = v.toUpperCase();\n  }\n  get currency(): string | undefined {\n    return this._currency;\n  }\n\n  @Input()\n  set placeholder(v: string) {\n    this._placeholder = v;\n  }\n  get placeholder(): string {\n    return this._placeholder ? this._placeholder : '';\n  }\n\n  @Input()\n  set required(v: boolean) {\n    this._required = v;\n  }\n  get required(): boolean {\n    return !!this._required;\n  }\n\n  @Input()\n  set type(v: string) {\n    this._type = v.toLowerCase();\n    this.domain = v.toLowerCase();\n    this.checkType(v);\n  }\n  get type(): string {\n    return this._type ? this._type : 'text';\n  }\n\n  @Input()\n  set value(v: any) {\n    v = v === undefined ? null : v;\n    if (v === this._value) {\n      return; // prevent events when there is no changes\n    }\n    const initialAndEmpty = isInitialAndEmpty(this._value, v);\n    if (this.type === 'date') {\n      v = normalizeDate(v);\n    }\n\n    this._value = v;\n    this.onChange(v);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n  }\n  get value(): any {\n    if (this.isPercentage() || this.isPermillage() || this.isNumber()) {\n      const numVal = parseFloat(this._value);\n      if (!Number.isNaN(numVal)) {\n        return numVal;\n      }\n    }\n    return this._value;\n  }\n  @Output() valueChange = new EventEmitter<any>();\n  @Output() keyPress = new EventEmitter<KeyboardEvent>();\n\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n\n  // ControlValueAccessor Interface implementation\n  writeValue(value: any): void {\n    this.value = value;\n    this.setValueInControl(value);\n  }\n\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End of ControlValueAccessor Interface implementation\n\n  private setValueInControl(v: any): void {\n    if (this.domain === 'date') {\n      v = normalizeDate(v);\n    }\n    if (this.input) {\n      this.input.nativeElement.value = v;\n    }\n    if (this.textarea) {\n      this.textarea.nativeElement.value = v;\n    }\n  }\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    let result: ValidationErrors | null = null;\n\n    if (this.required && !hasValue(value)) {\n      result = result || {};\n      result.required = { value, reason: 'Required field.' };\n    }\n    if (this._regexp && hasValue(value) && !this._regexp.test(value)) {\n      result = result || {};\n      result.pattern = {\n        value,\n        reason: `Value must follow the pattern: ${this._pattern}`\n      };\n    }\n    if (this.type === 'email' && hasValue(value) && !isValidEmail(value)) {\n      result = result || {};\n      result.email = { value, reason: 'Invalid email.' };\n    }\n    if (this.type === 'url' && hasValue(value) && !isValidRelativeUrl(value)) {\n      result = result || {};\n      result.url = { value, reason: 'Invalid URL.' };\n    }\n    if (this.type === 'color' && hasValue(value) && !isValidColor(value)) {\n      result = result || {};\n      result.color = { value, reason: 'Invalid color.' };\n    }\n    if (this.type === 'number' && hasValue(value) && !isValidNumber(value)) {\n      result = result || {};\n      result.numeric = { value, reason: 'Invalid number.' };\n    }\n    if (\n      this.type === 'date' ||\n      this.type === 'time' ||\n      this.type === 'timestamp'\n    ) {\n      if (\n        typeof this.min === 'string' &&\n        hasValue(value) &&\n        String(value).localeCompare(this.min) === -1\n      ) {\n        result = result || {};\n        result.min = {\n          value,\n          min: this.min,\n          reason: `Value is lower than minimum value: ${this.min}.`\n        };\n      }\n      if (\n        typeof this.max === 'string' &&\n        hasValue(value) &&\n        String(value).localeCompare(this.max) !== -1\n      ) {\n        result = result || {};\n        result.max = {\n          value,\n          max: this.max,\n          reason: `Value is greater than than maximum value: ${this.max}.`\n        };\n      }\n    }\n\n    if (\n      this.type === 'percentage' ||\n      this.type === 'permillage' ||\n      this.type === 'number' ||\n      this.type === 'currency'\n    ) {\n      if (hasValue(this.min) && hasValue(value) && value < +this.min!) {\n        result = result || {};\n        result.min = {\n          value,\n          min: this.min,\n          reason: `Value is lower than minimum value: ${this.min}.`\n        };\n      }\n      if (hasValue(this.max) && hasValue(value) && value > +this.max!) {\n        result = result || {};\n        result.max = {\n          value,\n          max: this.max,\n          reason: `Value is greater than than maximum value: ${this.max}.`\n        };\n      }\n    }\n    this.lastErrors = result;\n    return result;\n  }\n  // End of Validator interface\n\n  ngOnInit(): void {\n    this.inputId = this.inputId\n      ? this.inputId\n      : `${this.type}$${InputComponent.idCounter++}`;\n  }\n  onLostFocus(): void {\n    this.markAsTouched();\n  }\n  onKeyUp(newValue: string): void {\n    this.value = newValue;\n  }\n  onChangeValue(newValue: string): void {\n    this.value = newValue;\n    if (this.isColor()) {\n      this.colorpicker.nativeElement.value = undefined;\n    }\n    this.markAsTouched();\n  }\n  onKeyPress(event: KeyboardEvent): void {\n    this.keyPress.emit(event);\n  }\n  onColorPicked(newValue: string): void {\n    this.onChangeValue(newValue);\n    this.setValueInControl(newValue);\n  }\n\n  isUrl(): boolean {\n    return this.type === 'url';\n  }\n  isColor(): boolean {\n    return this.type === 'color';\n  }\n  isNumber(): boolean {\n    return this.type === 'number';\n  }\n  isPercentage(): boolean {\n    return this.type === 'percentage';\n  }\n  isPermillage(): boolean {\n    return this.type === 'permillage';\n  }\n  hasPrefix(): boolean {\n    return this.currency === 'USD';\n  }\n  hasPostfix(): boolean {\n    return (\n      this.currency === 'EUR' ||\n      this.isPercentage() ||\n      this.isPermillage() ||\n      (this.isUrl() && !!this.value) ||\n      this.isColor()\n    );\n  }\n\n  checkClassName(): string {\n    return this.disabled\n      ? this.readonly\n        ? 'disabled readonly'\n        : 'disabled'\n      : this.readonly\n        ? 'readonly'\n        : '';\n  }\n\n  checkColor(): string {\n    return this.type === 'color' && isValidColor(this.value)\n      ? this.value\n      : 'initial';\n  }\n\n  checkType(type: string): void {\n    switch (type) {\n      case 'email':\n        this.setEmailPatterns();\n        break;\n      case 'url':\n        this.setUrlPatterns();\n        break;\n      case 'color':\n        this.setColorPatterns();\n        break;\n      case 'date':\n        this.setDatePatterns();\n        break;\n      case 'time':\n        this.setTimePatterns();\n        break;\n      case 'password':\n        this.setPasswordPatterns();\n        break;\n      case 'number':\n        this.setNumberPatterns();\n        break;\n      case 'currency':\n        this.setCurrencyPatterns();\n        break;\n      case 'percentage':\n        this.setPercentagePatterns();\n        break;\n      case 'permillage':\n        this.setPermillagePatterns();\n        break;\n      default:\n        break;\n    }\n  }\n\n  setEmailPatterns(): void {}\n\n  setUrlPatterns(): void {}\n\n  setColorPatterns(): void {\n    this.domain = 'text';\n  }\n\n  setDatePatterns(): void {\n    this.min = this.min || '1900-01-01';\n    this.max = this.max || '2100-01-01';\n  }\n\n  setTimePatterns(): void {}\n\n  setPasswordPatterns(): void {}\n\n  setNumberPatterns(): void {\n    this.domain = 'number';\n    this.placeholder = '0';\n  }\n\n  setCurrencyPatterns(): void {\n    this.domain = 'number';\n    this.step = this.step || 0.1;\n    this.min = this.min || 0.0;\n    this.max = this.max || 10000.0;\n    this.value = 0.0;\n  }\n\n  setPercentagePatterns(): void {\n    this.domain = 'number';\n    this.step = this.step || 0.01;\n    this.min = this.min || 0.0;\n    this.max = this.max || 100.0;\n    this.placeholder = '0.00';\n  }\n\n  setPermillagePatterns(): void {\n    this.domain = 'number';\n    this.step = this.step || 0.01;\n    this.min = this.min || 0.0;\n    this.max = this.max || 1000.0;\n    this.placeholder = '0.00';\n  }\n}\n","@if (currency && currency === 'USD') {\n  <div class=\"prefix rounded-left symbol\" [ngClass]=\"className\">\n    <span>$</span>\n  </div>\n}\n@if (type !== 'textarea') {\n  <input\n    #input\n    [class]=\"\n      hasPrefix()\n        ? hasPostfix()\n          ? 'infix'\n          : 'postfix rounded-right'\n        : hasPostfix()\n          ? 'prefix rounded-left'\n          : 'rounded'\n    \"\n    [ngClass]=\"className\"\n    placement=\"top\"\n    [id]=\"inputId\"\n    [type]=\"domain\"\n    [attr.value]=\"value\"\n    [attr.aria-label]=\"ariaLabel\"\n    [disabled]=\"disabled === true\"\n    [readonly]=\"readonly === true\"\n    [attr.min]=\"min?.toString() || undefined\"\n    [attr.max]=\"max?.toString() || undefined\"\n    [attr.step]=\"step?.toString() || undefined\"\n    [attr.pattern]=\"pattern || undefined\"\n    [placeholder]=\"placeholder\"\n    (keyup)=\"onKeyUp(input.value)\"\n    (change)=\"onChangeValue(input.value)\"\n    (keypress)=\"onKeyPress($event)\"\n    (blur)=\"onLostFocus()\"\n  />\n}\n@if (type === 'textarea') {\n  <textarea\n    #textarea\n    class=\"rounded\"\n    [ngClass]=\"className\"\n    placement=\"top\"\n    [id]=\"inputId\"\n    [attr.value]=\"value\"\n    [attr.aria-label]=\"ariaLabel\"\n    [disabled]=\"disabled === true\"\n    [readonly]=\"readonly === true\"\n    [attr.cols]=\"cols?.toString() || undefined\"\n    [attr.rows]=\"rows?.toString() || undefined\"\n    [placeholder]=\"placeholder\"\n    (keyup)=\"onKeyUp(textarea.value)\"\n    (change)=\"onChangeValue(textarea.value)\"\n    (keypress)=\"onKeyPress($event)\"\n    (blur)=\"onLostFocus()\"\n  ></textarea>\n}\n@if (currency && currency === 'EUR') {\n  <div class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n    <span>€</span>\n  </div>\n}\n@if (isPercentage()) {\n  <div class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n    <span>%</span>\n  </div>\n}\n@if (isPermillage()) {\n  <div class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n    <span>‰</span>\n  </div>\n}\n@if (isUrl() && !!value) {\n  <div class=\"postfix rounded-right symbol clickable\" [ngClass]=\"className\">\n    <a href=\"{{ value }}\" target=\"_blank\">\n      <span class=\"icon-external\"></span>\n    </a>\n  </div>\n}\n@if (isColor()) {\n  <div\n    class=\"postfix rounded-right bordered transparency\"\n    [ngClass]=\"className\"\n  >\n    <div\n      class=\"rounded-right full-space\"\n      [ngStyle]=\"{ 'background-color': color }\"\n    >\n      <input\n        #colorpicker\n        class=\"minimal-space clickable invisible rounded-right full-space\"\n        [id]=\"inputId + '$colorpicker'\"\n        type=\"color\"\n        [attr.value]=\"value\"\n        [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n        [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n        (change)=\"onColorPicked(colorpicker.value)\"\n        (keypress)=\"onKeyPress($event)\"\n        (blur)=\"onLostFocus()\"\n      />\n    </div>\n  </div>\n}\n@if (inlineErrors && lastErrors && (dirty || touched)) {\n  <div class=\"alert\">\n    @if (lastErrors.required) {\n      <div>\n        {{ userErrors[this.lang].required }}\n      </div>\n    }\n    @if (lastErrors.email) {\n      <div>{{ userErrors[this.lang].email }}</div>\n    }\n    @if (lastErrors.url) {\n      <div>{{ userErrors[this.lang].url }}</div>\n    }\n    @if (lastErrors.min) {\n      <div>\n        {{ userErrors[this.lang].min.replace('$min', lastErrors.min.min) }}\n      </div>\n    }\n    @if (lastErrors.max) {\n      <div>\n        {{ userErrors[this.lang].max.replace('$max', lastErrors.max.max) }}\n      </div>\n    }\n  </div>\n}\n","export enum Placement {\n  Top = 'top',\n  Bottom = 'bottom',\n  Left = 'left',\n  Right = 'right'\n}\nexport type PlacementValue = 'left' | 'right' | 'top' | 'bottom';\n","import { Component, Input } from '@angular/core';\nimport { LuxTooltipContext } from './tooltip-context';\n\n/**\n * Default Tooltip Component\n */\n@Component({\n  selector: 'lux-tooltip',\n  imports: [],\n  template: `\n    <span class=\"lux-tooltip\" style=\"transition: opacity 200ms\">{{\n      context?.message\n    }}</span>\n  `\n})\nexport class TooltipComponent {\n  @Input() context: LuxTooltipContext | undefined;\n  constructor() {}\n}\n","import { ViewRef, ComponentRef } from '@angular/core';\n\nexport class TooltipContentRef {\n  constructor(\n    public viewRef?: ViewRef,\n    public componentRef?: ComponentRef<any>\n  ) {}\n}\n","import {\n  ApplicationRef,\n  ComponentRef,\n  ElementRef,\n  EmbeddedViewRef,\n  EnvironmentInjector,\n  Injectable,\n  Injector,\n  TemplateRef,\n  createComponent,\n  inject\n} from '@angular/core';\n\nimport { Placement, PlacementValue } from './placement';\nimport { LuxTooltipContext } from './tooltip-context';\nimport { TooltipComponent } from './tooltip.component';\nimport { TooltipContentRef } from './tooltop-content';\n\n@Injectable()\nexport class TooltipService {\n  private _injector = inject(Injector);\n  private _environmentInjector = inject(EnvironmentInjector);\n  private _applicationRef = inject(ApplicationRef);\n\n  appendComponentToBody(\n    content: any,\n    elHost: ElementRef,\n    placement: PlacementValue\n  ): TooltipContentRef | null {\n    const tooltipContentRef = this.getTooltipContentRef(content);\n    if (tooltipContentRef) {\n      let domElem = (tooltipContentRef.viewRef as EmbeddedViewRef<any>)\n        .rootNodes[0];\n      document.body.appendChild(domElem);\n      if (tooltipContentRef.componentRef) {\n        tooltipContentRef.componentRef.changeDetectorRef.detectChanges();\n      }\n      domElem = this.setStyle(domElem, placement);\n      this.setPosition(domElem, elHost, placement);\n      return tooltipContentRef;\n    }\n    return null;\n  }\n\n  removeComponentFromBody(tooltipContentRef: TooltipContentRef): void {\n    if (tooltipContentRef.viewRef) {\n      this._applicationRef.detachView(tooltipContentRef.viewRef);\n    }\n    if (tooltipContentRef.componentRef) {\n      tooltipContentRef.componentRef.destroy();\n    }\n  }\n\n  private getTooltipContentRef(content: any): TooltipContentRef | null {\n    if (!content) {\n      // nothing to show\n      return null;\n    } else if (content instanceof TemplateRef) {\n      return this.createFromTemplateRef(content);\n    } else if (typeof content === 'string') {\n      return this.createFromComponent(TooltipComponent, { message: content });\n    } else {\n      return this.createFromComponent(content);\n    }\n  }\n\n  private createFromTemplateRef(content: TemplateRef<any>): TooltipContentRef {\n    const viewRef = content.createEmbeddedView({});\n    this._applicationRef.attachView(viewRef);\n    return new TooltipContentRef(viewRef);\n  }\n\n  private createFromComponent(\n    component: any,\n    context?: LuxTooltipContext\n  ): TooltipContentRef {\n    const componentRef: ComponentRef<any> = createComponent(component, {\n      environmentInjector: this._environmentInjector,\n      elementInjector: this._injector\n    });\n    if (context) {\n      componentRef.instance.context = context;\n    }\n    this._applicationRef.attachView(componentRef.hostView);\n    return new TooltipContentRef(componentRef.hostView, componentRef);\n  }\n\n  private setStyle(\n    domElem: HTMLElement,\n    placement: PlacementValue\n  ): HTMLElement {\n    domElem.style.position = 'absolute';\n    domElem.style.minWidth = 'min-content';\n    domElem.style.minHeight = 'min-content';\n    const tooltipElement = this.getTooltipElementFromHTMLElemnt(domElem);\n    placement =\n      placement !== undefined\n        ? (placement.toLocaleLowerCase() as PlacementValue)\n        : 'top'; // 'Top' is the default value of placement\n    tooltipElement.classList.add(`lux-tooltip-${placement}`);\n    tooltipElement.classList.add('lux-tooltip-show');\n    return domElem;\n  }\n\n  private getTooltipElementFromHTMLElemnt(domElem: HTMLElement): any {\n    const elementsArray = Array.from(domElem.classList).filter(\n      (className) => className === 'lux-tooltip'\n    );\n    if (elementsArray.length !== 0) {\n      return domElem;\n    } else if (domElem.hasChildNodes()) {\n      const childrenArray = Array.from(domElem.children).filter(\n        (child) =>\n          this.getTooltipElementFromHTMLElemnt(child as HTMLElement) !== null\n      );\n      if (childrenArray.length !== 0) {\n        return this.getTooltipElementFromHTMLElemnt(\n          childrenArray[0] as HTMLElement\n        );\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  private setPosition(\n    domElem: HTMLElement,\n    elHost: ElementRef,\n    placement: PlacementValue\n  ): HTMLElement {\n    const hostPos = elHost.nativeElement.getBoundingClientRect();\n    const tooltipPos = domElem.getBoundingClientRect();\n    const scrollPos =\n      window.pageYOffset ||\n      document.documentElement.scrollTop ||\n      document.body.scrollTop ||\n      0;\n    let top: number;\n    let left: number;\n    const offset = 10;\n\n    switch (placement) {\n      case Placement.Bottom:\n        top = hostPos.bottom + offset;\n        left = hostPos.left + (hostPos.width - tooltipPos.width) / 2;\n        break;\n      case Placement.Left:\n        top = hostPos.top + (hostPos.height - tooltipPos.height) / 2;\n        left = hostPos.left - tooltipPos.width - offset;\n        break;\n      case Placement.Right:\n        top = hostPos.top + (hostPos.height - tooltipPos.height) / 2;\n        left = hostPos.right + offset;\n        break;\n      case Placement.Top:\n      default:\n        top = hostPos.top - tooltipPos.height - offset;\n        left = hostPos.left + (hostPos.width - tooltipPos.width) / 2;\n        break;\n    }\n    top = Math.max(0, top);\n    left = Math.max(0, left);\n    domElem.style.top = `${top + scrollPos}px`;\n    domElem.style.left = `${left}px`;\n    return domElem;\n  }\n}\n","import {\n  Directive,\n  ElementRef,\n  HostListener,\n  Input,\n  OnDestroy,\n  inject\n} from '@angular/core';\n\nimport { PlacementValue } from './placement';\nimport { TooltipService } from './tooltip.service';\nimport { TooltipContentRef } from './tooltop-content';\n\n/**\n * Tooltip directive\n */\n@Directive({\n  selector: '[luxTooltip]',\n  standalone: true,\n  providers: [TooltipService]\n})\nexport class LuxTooltipDirective implements OnDestroy {\n  private elHost = inject(ElementRef);\n  private tooltipService = inject(TooltipService);\n\n  /** Tooltip title */\n  @Input() luxTooltip: any;\n\n  /** Component, TemplateRef or String */\n  @Input() content: any;\n\n  /** Placement */\n  @Input() placement!: PlacementValue;\n\n  tooltipRef!: TooltipContentRef | null;\n\n  @HostListener('mouseenter') onMouseEnter(): void {\n    if (!this.tooltipRef) {\n      // Use luxTooltip if provided, otherwise use content\n      const tooltipContent = this.luxTooltip || this.content;\n      if (tooltipContent) {\n        this.tooltipRef = this.show(\n          tooltipContent,\n          this.elHost,\n          this.placement\n        );\n      }\n    }\n  }\n\n  @HostListener('mouseleave') onMouseLeave(): void {\n    if (this.tooltipRef) {\n      this.remove(this.tooltipRef);\n      this.tooltipRef = null;\n    }\n  }\n\n  @HostListener('click') onClick(): void {\n    if (this.tooltipRef) {\n      this.remove(this.tooltipRef);\n      this.tooltipRef = null;\n    }\n  }\n\n  show(\n    component: any,\n    elHost: ElementRef,\n    placement: PlacementValue\n  ): TooltipContentRef | null {\n    return this.tooltipService.appendComponentToBody(\n      component,\n      elHost,\n      placement\n    );\n  }\n\n  remove(tooltipRef: TooltipContentRef): void {\n    this.tooltipService.removeComponentFromBody(tooltipRef);\n  }\n\n  ngOnDestroy(): void {\n    if (this.tooltipRef) {\n      this.remove(this.tooltipRef);\n      this.tooltipRef = null;\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { languageDetector } from '../lang';\nimport { LuxTooltipDirective } from '../tooltip/tooltip.directive';\nimport { PaginationInfo } from './pagination';\n\ninterface PaginationLiterals {\n  first: string;\n  previous: string;\n  next: string;\n  last: string;\n}\n\n@Component({\n  selector: 'lux-pagination',\n  imports: [CommonModule, FormsModule, LuxTooltipDirective],\n  templateUrl: './pagination.component.html',\n  styleUrls: ['./pagination.component.scss']\n})\nexport class PaginationComponent implements OnInit {\n  literals: { [key: string]: PaginationLiterals } = {\n    en: {\n      first: 'First',\n      previous: 'Previous',\n      next: 'Next',\n      last: 'Last'\n    },\n    es: {\n      first: 'Primero',\n      previous: 'Anterior',\n      next: 'Siguiente',\n      last: 'Último'\n    }\n  };\n\n  public first: string | undefined;\n  public previous: string | undefined;\n  public next: string | undefined;\n  public last: string | undefined;\n\n  public showPagination = false;\n  public hidePrevious = false;\n  public lastPage = false;\n  public totalPages = 0;\n  public displayNextEllipsis = false;\n  public displayPreviousEllipsis = false;\n\n  public pages: number[] = [];\n\n  @Output() goToPage = new EventEmitter<number>();\n  @Output() pageSizeChange = new EventEmitter<number>();\n\n  /** Current page, total items and items to show per page */\n  private paginationInfoValue!: PaginationInfo;\n\n  private _lang = 'en';\n  @Input()\n  set lang(l: string) {\n    if (l === this._lang) {\n      return;\n    }\n    if (Object.keys(this.literals).includes(l)) {\n      this._lang = l;\n    } else {\n      this._lang = 'en';\n    }\n    this.loadLanguage();\n  }\n  get lang(): string {\n    return this._lang;\n  }\n\n  @Input()\n  set paginationInfo(value: PaginationInfo) {\n    this.paginationInfoValue = value;\n    this.syncState();\n  }\n  get paginationInfo(): PaginationInfo {\n    return this.paginationInfoValue;\n  }\n\n  constructor() {\n    this.lang = languageDetector();\n  }\n\n  ngOnInit(): void {\n    this.calculatePages();\n  }\n\n  pageSizeChanged(pageSize: number): void {\n    this.paginationInfo.pageSize = pageSize;\n    this.syncState();\n    this.pageSizeChange.emit(pageSize);\n  }\n\n  onPage(n: number): void {\n    this.goToPage.emit(n);\n  }\n\n  onFirst(): void {\n    this.goToPage.emit(0);\n  }\n\n  onLast(): void {\n    this.goToPage.emit(this.totalPages - 1);\n  }\n  onNext(): void {\n    const page = (this.paginationInfo.page || 0) + 1;\n    this.goToPage.emit(page);\n  }\n  onPrevious(): void {\n    const page = (this.paginationInfo.page || 0) - 1;\n    this.goToPage.emit(page);\n  }\n\n  private syncState(): void {\n    this.pages = this.calculatePages();\n\n    this.showPagination =\n      this.paginationInfo.total > this.paginationInfo.pageSize;\n    this.hidePrevious = this.paginationInfo.page === 0;\n    this.lastPage =\n      this.paginationInfo.pageSize * (this.paginationInfo.page + 1) >=\n      this.paginationInfo.total;\n    this.totalPages =\n      Math.ceil(this.paginationInfo.total / this.paginationInfo.pageSize) || 0;\n    this.displayNextEllipsis = !this.pages.includes(this.totalPages - 1);\n    this.displayPreviousEllipsis = !this.pages.includes(0);\n  }\n\n  private calculatePages(): number[] {\n    const totalPages =\n      Math.ceil(this.paginationInfo.total / this.paginationInfo.pageSize) - 1; // 0-index\n    const p = this.paginationInfo.page || 0;\n    const pagesToShow = this.paginationInfo.pagesToShow;\n    const pages: number[] = [];\n    pages.push(p);\n    const times = pagesToShow - 1;\n    for (let i = 0; i < times; i++) {\n      if (pages.length < pagesToShow) {\n        if (Math.min(...pages) > 0) {\n          pages.unshift(Math.min(...pages) - 1);\n        }\n      }\n      if (pages.length < pagesToShow) {\n        if (Math.max(...pages) < totalPages) {\n          pages.push(Math.max(...pages) + 1);\n        }\n      }\n    }\n    pages.sort((a, b) => a - b);\n    return pages;\n  }\n\n  private loadLanguage(): void {\n    const l = this.literals[this.lang];\n    this.first = l.first;\n    this.previous = l.previous;\n    this.next = l.next;\n    this.last = l.last;\n  }\n}\n","@if (showPagination) {\n  <div class=\"lux-pagination\">\n    @if (!hidePrevious) {\n      <a\n        luxTooltip\n        [content]=\"first\"\n        placement=\"top\"\n        delay=\"500\"\n        (click)=\"onFirst()\"\n        [ngClass]=\"{\n          enabledFirstLast: !hidePrevious\n        }\"\n        class=\"button-pagination icon arrow-left-end\"\n      ></a>\n      <a\n        luxTooltip\n        [content]=\"previous\"\n        placement=\"top\"\n        delay=\"500\"\n        (click)=\"onPrevious()\"\n        [ngClass]=\"{\n          enabledFirstLast: !hidePrevious\n        }\"\n        class=\"button-pagination icon arrow-left\"\n      ></a>\n    }\n    @if (displayPreviousEllipsis) {\n      <span class=\"ellipsis\">...</span>\n    }\n    @for (pageNum of pages; track pageNum) {\n      <a\n        placement=\"top\"\n        delay=\"500\"\n        [ngClass]=\"{\n          disabled: pageNum === paginationInfo.page,\n          enabled: pageNum !== paginationInfo.page\n        }\"\n        class=\"button-pagination\"\n        (click)=\"onPage(pageNum)\"\n        >{{ pageNum + 1 }}</a\n      >\n    }\n    @if (displayNextEllipsis) {\n      <span class=\"ellipsis\">...</span>\n    }\n    @if (!lastPage) {\n      <a\n        luxTooltip\n        [content]=\"next\"\n        placement=\"top\"\n        delay=\"500\"\n        (click)=\"onNext()\"\n        [ngClass]=\"{\n          enabledFirstLast: !lastPage\n        }\"\n        class=\"button-pagination icon arrow-right\"\n      ></a>\n      <a\n        luxTooltip\n        [content]=\"last\"\n        placement=\"top\"\n        delay=\"500\"\n        (click)=\"onLast()\"\n        [ngClass]=\"{\n          enabledFirstLast: !lastPage\n        }\"\n        class=\"button-pagination icon arrow-right-end\"\n      ></a>\n    }\n  </div>\n}\n","import {\n  Component,\n  EventEmitter,\n  forwardRef,\n  Input,\n  Output\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport { isInitialAndEmpty } from '../helperFns';\n\nexport interface RadioItem {\n  name?: string;\n  label: string;\n  value: any;\n}\n\n@Component({\n  selector: 'lux-radiogroup',\n  imports: [],\n  templateUrl: './radiogroup.component.html',\n  styleUrls: ['./radiogroup.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => RadiogroupComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => RadiogroupComponent)\n    }\n  ]\n})\nexport class RadiogroupComponent implements ControlValueAccessor, Validator {\n  private touched = false;\n\n  @Input() name = 'radiogroup1';\n  @Input() public disabled: boolean | null = false;\n  @Input() public readonly: boolean | null = false;\n  @Input() public required: boolean | null = false;\n\n  @Input()\n  set items(col: RadioItem[]) {\n    this._items = (col || []).map((it, index) =>\n      this.ensureHasUniqueName(it, index)\n    );\n    this.itemsChange.emit(col);\n  }\n  get items(): RadioItem[] {\n    return this._items;\n  }\n  @Output() itemsChange = new EventEmitter<RadioItem[]>();\n\n  @Input()\n  set value(v: any) {\n    if (v === this._value) {\n      return;\n    }\n    const initialAndEmpty = isInitialAndEmpty(this._value, v);\n    this._value = v;\n    this.onChange(v);\n    if (!initialAndEmpty) {\n      this.valueChange.emit(v);\n    }\n  }\n  get value(): any {\n    return this._value;\n  }\n  @Output() valueChange = new EventEmitter<any>();\n\n  private _value: any = undefined;\n  private _items: RadioItem[] = [];\n\n  constructor() {}\n\n  // ControlValueAccessor Interface\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n  writeValue(value: any): void {\n    this.value = value;\n  }\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    if (\n      this.required &&\n      (value === '' || value === null || value === undefined)\n    ) {\n      return { required: { value, reason: 'Required field.' } };\n    }\n    return null;\n  }\n  // End of Validator interface\n\n  setValue(event: MouseEvent, item: RadioItem): void {\n    if (!this.disabled && !this.readonly) {\n      this.value = item.value;\n      this.markAsTouched();\n    }\n    event.preventDefault();\n  }\n  ensureHasUniqueName(item: RadioItem, index: number): RadioItem {\n    if (!item.name) {\n      item.name = `${this.name}_${index}`;\n    }\n    return item;\n  }\n}\n","<div class=\"radiogroup\" [class.disabled]=\"disabled || readonly\">\n  @for (item of items; track item.value; let first = $first; let last = $last) {\n    <div\n      [class.radio-start]=\"first\"\n      [class.radio-end]=\"last\"\n      class=\"radio-item\"\n      [class.selected]=\"item.value === value\"\n      (click)=\"setValue($event, item)\"\n    >\n      <input\n        [id]=\"item.name\"\n        type=\"radio\"\n        [name]=\"name\"\n        [attr.disabled]=\"disabled || null\"\n        [attr.readonly]=\"readonly || null\"\n        [value]=\"item.value\"\n      />\n      <label [for]=\"item.name\" class=\"unselectable\">{{ item.label }}</label>\n    </div>\n  }\n</div>\n","import {\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  forwardRef\n} from '@angular/core';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator\n} from '@angular/forms';\nimport { InputComponent } from '../input/input.component';\n\nlet sequencer = 0;\n\n@Component({\n  selector: 'lux-select',\n  imports: [InputComponent],\n  templateUrl: './select.component.html',\n  styleUrls: ['./select.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => SelectComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => SelectComponent)\n    }\n  ]\n})\nexport class SelectComponent implements ControlValueAccessor, Validator {\n  @Input() id = 'stringList' + sequencer++;\n  @Input() disabled = false;\n  @Input() required = false;\n  /** Allow multiple elements */\n  @Input() multiple = true;\n  @Input() value: string[] = [];\n  @Output() valueChange = new EventEmitter<string[]>();\n  @Input() placeholder = 'Add new';\n  /** If set, check there is no duplicates in the data. */\n  @Input() unique = true;\n  /** Validation function for new items. Returns error or null if valid */\n  @Input() validateItem: (item: string) => string | null = (_) => null;\n\n  newEntry = '';\n  error: string | null = null;\n  isValidNewEntry = false;\n\n  private touched = false;\n\n  constructor() {}\n\n  // ControlValueAccessor Interface\n  onChange = (value: any): void => {};\n  onTouched = (): void => {};\n  writeValue(value: any): void {\n    this.value = value;\n  }\n  registerOnChange(onChange: any): void {\n    this.onChange = onChange;\n  }\n  registerOnTouched(onTouched: any): void {\n    this.onTouched = onTouched;\n  }\n  markAsTouched(): void {\n    if (!this.touched) {\n      this.onTouched();\n      this.touched = true;\n    }\n  }\n  setDisabledState(disabled: boolean): void {\n    this.disabled = disabled;\n  }\n  // End ControlValueAccessor Interface\n\n  // Validator interface\n  registerOnValidatorChange(): void {}\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    const value = control.value;\n    if (\n      this.required &&\n      (value === '' || value === null || value === undefined)\n    ) {\n      return { required: { value, reason: 'Required field.' } };\n    }\n    return null;\n  }\n  // End of Validator interface\n\n  get canAdd(): boolean {\n    return this.multiple || this.value.length === 0;\n  }\n  add(val: string): void {\n    this.value.push(val);\n    this.newEntry = '';\n    this.markAsTouched();\n    this.valueChange.emit(this.value);\n  }\n  remove(index: number): void {\n    if (this.value.length > index) {\n      this.value.splice(index, 1);\n      this.markAsTouched();\n      this.valueChange.emit(this.value);\n    }\n  }\n  onKeyPress(event: KeyboardEvent): void {\n    if (event.key === 'Enter' && !this.error && this.newEntry !== '') {\n      // Add on pressing Enter/Return\n      this.markAsTouched();\n      this.add(this.newEntry);\n    }\n  }\n  onChangeNewEntry(newValue: string): void {\n    this.markAsTouched();\n    if (!newValue) {\n      this.isValidNewEntry = false;\n      this.error = null;\n      return;\n    }\n    if (this.unique) {\n      const found = (this.value || []).find((it) => it === newValue);\n      this.isValidNewEntry = !found;\n      this.error = found\n        ? `Value '${newValue}' is already in. Cannot add duplicates.`\n        : null;\n      if (!this.isValidNewEntry) {\n        return;\n      }\n    }\n    this.error = this.validateItem(newValue);\n    this.isValidNewEntry = !this.error;\n  }\n}\n","<div class=\"lux-select\">\n  <ul class=\"list\">\n    @for (item of value; track i; let i = $index) {\n      <li>\n        <span>{{ item }}</span>\n        @if (!disabled) {\n          <button\n            class=\"remove\"\n            type=\"button\"\n            (click)=\"remove(i)\"\n            [attr.aria-label]=\"'Remove ' + item\"\n          >\n            Remove\n          </button>\n        }\n      </li>\n    }\n  </ul>\n  @if (!disabled) {\n    <div class=\"add-new-item\">\n      <lux-input\n        id=\"{{ id + 'addNew' }}\"\n        type=\"string\"\n        [placeholder]=\"placeholder\"\n        [attr.aria-label]=\"placeholder\"\n        [disabled]=\"disabled\"\n        [(value)]=\"newEntry\"\n        (keyPress)=\"onKeyPress($event)\"\n        (valueChange)=\"onChangeNewEntry($event)\"\n      >\n      </lux-input>\n      @if (canAdd) {\n        <div>\n          @if (isValidNewEntry) {\n            <button type=\"button\" (click)=\"add(newEntry)\">Add</button>\n          }\n        </div>\n      }\n      <div class=\"error\">\n        {{ error }}\n      </div>\n    </div>\n  }\n</div>\n","import {\n  Directive,\n  ElementRef,\n  Input,\n  OnInit,\n  Renderer2,\n  inject\n} from '@angular/core';\n\n@Directive({\n  selector: '[luxVoiceRecognition]'\n})\nexport class VoiceRecognitionDirective implements OnInit {\n  private el = inject(ElementRef);\n  private renderer = inject(Renderer2);\n\n  @Input() language: string = 'en-US';\n  // See API at: https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition\n  private recognition: any;\n  private isRecognizing = false;\n  private mic: any;\n\n  constructor() {\n    const speechRecognition = (window as any).webkitSpeechRecognition;\n    if (speechRecognition) {\n      this.recognition = new speechRecognition();\n    }\n  }\n\n  ngOnInit(): void {\n    if (this.recognition) {\n      // API is available\n      this.recognition.lang = this.language || window.navigator.language;\n      this.recognition.interimResults = false;\n      this.recognition.maxAlternatives = 1;\n\n      // Add mic icon\n      this.mic = document.createElement('div');\n      this.mic.setAttribute('class', 'lux-microphone');\n\n      const parent = this.el.nativeElement.parentElement;\n      parent.appendChild(this.mic);\n\n      // Add event handlers\n      this.mic.onclick = (): void => this.microphoneClick();\n      this.recognition.onresult = (event: any): void =>\n        this.onRecognized(event);\n    }\n  }\n\n  microphoneClick(): void {\n    if (this.isRecognizing) {\n      // stop\n      this.isRecognizing = false;\n      this.renderer.removeClass(this.mic, 'lux-recording');\n      this.recognition.abort();\n    } else {\n      // start\n      this.el.nativeElement.value = getRecordingMessage(this.language);\n      this.isRecognizing = true;\n      this.renderer.addClass(this.mic, 'lux-recording');\n      this.recognition.start();\n    }\n  }\n  onRecognized(event: any): void {\n    const recognizedText = event.results[0][0].transcript;\n    this.isRecognizing = false;\n    this.el.nativeElement.value = recognizedText;\n    this.renderer.removeClass(this.mic, 'lux-recording');\n  }\n}\n\nconst getRecordingMessage = (lang: string): string => {\n  switch (lang.toLowerCase()) {\n    case 'es':\n    case 'es-es':\n      return 'Grabando...';\n    case 'en':\n    case 'en-uk':\n    case 'en-us':\n    default:\n      return 'Recording...';\n  }\n};\n","import { isPlatformBrowser } from '@angular/common';\n\nimport {\n  ClassProvider,\n  FactoryProvider,\n  InjectionToken,\n  PLATFORM_ID\n} from '@angular/core';\n\n/* Create a new injection token for injecting the window into a component. */\nexport const WINDOW = new InjectionToken('WindowToken');\n\n/* Define abstract class for obtaining reference to the global window object. */\nexport abstract class WindowRef {\n  get nativeWindow(): Window | object {\n    throw new Error('Not implemented.');\n  }\n}\n\n/* Define class that implements the abstract class and returns the native window object. */\nexport class BrowserWindowRef extends WindowRef {\n  constructor() {\n    super();\n  }\n\n  get nativeWindow(): Window | object {\n    return window;\n  }\n}\n\n/* Create an factory function that returns the native window object. */\nexport const windowFactory = (\n  browserWindowRef: BrowserWindowRef,\n  platformId: object\n): Window | object => {\n  if (isPlatformBrowser(platformId)) {\n    return browserWindowRef.nativeWindow;\n  }\n  return new Object();\n};\n\n/* Create a injectable provider for the WindowRef token that uses the BrowserWindowRef class. */\nconst browserWindowProvider: ClassProvider = {\n  provide: WindowRef,\n  useClass: BrowserWindowRef\n};\n\n/* Create an injectable provider that uses the windowFactory function for returning the native window object. */\nconst windowProvider: FactoryProvider = {\n  provide: WINDOW,\n  useFactory: windowFactory,\n  deps: [WindowRef, PLATFORM_ID]\n};\n\n/* Create an array of providers. */\nexport const WINDOW_PROVIDERS = [browserWindowProvider, windowProvider];\n","import { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { AutocompleteListComponent } from './autocomplete-list/autocomplete-list.component';\nimport { AutocompleteComponent } from './autocomplete/autocomplete.component';\nimport { LuxBreadcrumbComponent } from './breadcrumb/breadcrumb.component';\nimport { CheckboxComponent } from './checkbox/checkbox.component';\nimport { DatetimeComponent } from './datetime/datetime.component';\nimport { FilterComponent } from './filter/filter.component';\nimport { GeolocationComponent } from './geolocation/geolocation.component';\nimport { InputComponent } from './input/input.component';\nimport { MapComponent } from './map/map.component';\nimport { LuxModalBackdropComponent } from './modal/modal-backdrop';\nimport { LuxModalWindowComponent } from './modal/modal-window';\nimport { ModalService } from './modal/modal.service';\nimport { PaginationComponent } from './pagination/pagination.component';\nimport { RadiogroupComponent } from './radiogroup/radiogroup.component';\nimport { SelectComponent } from './select/select.component';\nimport { TooltipComponent } from './tooltip/tooltip.component';\nimport { LuxTooltipDirective } from './tooltip/tooltip.directive';\nimport { TooltipService } from './tooltip/tooltip.service';\nimport { VoiceRecognitionDirective } from './voice-recognition/voice-recognition.directive';\nimport { WINDOW_PROVIDERS } from './window/window.service';\n\n@NgModule({\n  declarations: [],\n  providers: [ModalService, TooltipService, WINDOW_PROVIDERS],\n  imports: [\n    FormsModule,\n    FilterComponent,\n    GeolocationComponent,\n    InputComponent,\n    AutocompleteListComponent,\n    AutocompleteComponent,\n    CheckboxComponent,\n    DatetimeComponent,\n    LuxBreadcrumbComponent,\n    LuxTooltipDirective,\n    LuxModalWindowComponent,\n    LuxModalBackdropComponent,\n    MapComponent,\n    PaginationComponent,\n    RadiogroupComponent,\n    HttpClientModule,\n    ReactiveFormsModule,\n    RouterModule,\n    SelectComponent,\n    CommonModule,\n    TooltipComponent,\n    VoiceRecognitionDirective\n  ],\n  exports: [\n    AutocompleteComponent,\n    AutocompleteListComponent,\n    FilterComponent,\n    CheckboxComponent,\n    DatetimeComponent,\n    InputComponent,\n    GeolocationComponent,\n    LuxTooltipDirective,\n    MapComponent,\n    SelectComponent,\n    PaginationComponent,\n    RadiogroupComponent,\n    VoiceRecognitionDirective\n  ]\n})\nexport class LuxModule {}\n"],"mappings":"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GACA;GACA;GACA;GACA;GACA;GACA;EAAyB;CAAA,CAAA;CAGhB,OAAA,OAAAA,KAAA,oBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAAA;EAAA,MAAA;EAAS,WAzCT;GAAC;GAAc;GAAgB;EAAgB;EAAC,SAAA;GAEzD;GACA;GACA;GACA;GACA;GACA;GAEA;GACA;GAKA;GAEA;GACA;GACA;GACA;GACA;EAAY;CAAA,CAAA;;AAoBHA,KAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EA3CrB,MAAA;EAAS,MAAA,CAAA;GACR,cAAc,CAAA;GACd,WAAW;IAAC;IAAc;IAAgB;GAAgB;GAC1D,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;GACD,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD;EACF,CAAA"}