{"version":3,"file":"talenra-ngx-base-input.mjs","sources":["../../../projects/ngx-base/input/src/input/input.types.ts","../../../projects/ngx-base/input/src/input/input.component.ts","../../../projects/ngx-base/input/src/pipes/social-security-number/social-security-number.pipe.ts","../../../projects/ngx-base/input/src/social-security-number/social-security-number.directive.ts","../../../projects/ngx-base/input/src/pipes/billing-number/billing-number.pipe.ts","../../../projects/ngx-base/input/src/billing-number/billing-number.directive.ts","../../../projects/ngx-base/input/src/validators/input-validators.ts","../../../projects/ngx-base/input/talenra-ngx-base-input.ts"],"sourcesContent":["/**\n * Values accepted by the `InputComponent`'s `type` property.\n *\n * ```html\n * <input talenra-input type=\"email\"></button>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { InputType } from '@talenra/ngx-base/input';\n * ```\n *\n * @see {@link InputComponent}\n * @see {@link TInputType}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input#input_types|MDN: Input type}\n */\nexport const InputType = {\n  Email: 'email',\n  Number: 'number',\n  Password: 'password',\n  Search: 'search',\n  Tel: 'tel',\n  Text: 'text',\n  Url: 'url',\n} as const;\n\n/**\n * Type of values accepted by the `InputComponent`'s `type` property.\n *\n * ### Import\n *\n * ```typescript\n * import { TInputType } from '@talenra/ngx-base/input';\n * ```\n *\n * @see {@link InputComponent}\n * @see {@link InputType}\n */\nexport type TInputType = (typeof InputType)[keyof typeof InputType];\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  Input,\n  OnInit,\n  booleanAttribute,\n  inject,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { asapScheduler, debounceTime, fromEvent, tap, throttleTime } from 'rxjs';\nimport { FormFieldControl, FormFieldStatus, FormFieldControlBaseComponent } from '@talenra/ngx-base/form-field';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { InputType, TInputType } from './input.types';\n\n/**\n * Used to create a \"unique\" ID for each instance.\n *\n * @internal\n */\nlet nextId = 0;\n\n/**\n * `<input|textarea talenra-input>` provides consistent styling and behaviour for form inputs and textareas.\n * It is typically used as child of `<talenra-form-field>`.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   lastName: new FormControl(''),\n *   comment: new FormControl(''),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-form-field label=\"Lastname\">\n *     <input talenra-input formControlName=\"lastName\" type=\"text\" />\n *   </talenra-form-field>\n *   <talenra-form-field label=\"Comment\">\n *     <textarea talenra-input formControlName=\"comment\"></textarea>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * #### Template driven form\n *\n * ```typescript\n * // Import `FormsModule` in the declaring module\n * import { FormsModule } from '@angular/forms';\n * @NgModule({\n *  // ...\n *  imports: [FormsModule],\n *})\n * ```\n *\n * ```typescript\n * // Component class\n * lastName = '';\n * comment = '';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form #templateDrivenForm=\"ngForm\">\n *   <talenra-form-field label=\"Lastname\">\n *     <input talenra-input name=\"lastName\" [(ngModel)]=\"lastName\" type=\"text\" />\n *   </talenra-form-field>\n *   <talenra-form-field label=\"Comment\">\n *     <textarea talenra-input name=\"comment\" [(ngModel)]=\"comment\"></textarea>\n *   </talenra-form-field>\n * </form>\n * ```\n *\n * #### Formless\n *\n * ```typescript\n * // Component class\n * lastName = '';\n * comment = '';\n * ```\n *\n * ```html\n * <!-- Component template -->\n *\n * <talenra-form-field label=\"Lastname\">\n *   <input talenra-input [(ngModel)]=\"lastName\" />\n * </talenra-form-field>\n * <talenra-form-field label=\"Comment\">\n *   <textarea talenra-input [(ngModel)]=\"comment\"></textarea>\n * </talenra-form-field>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { InputModule } from '@talenra/ngx-base/input';\n * ```\n *\n * <example-url>../../#/input</example-url>\n *\n * @see {@link FormFieldComponent}\n */\n@Component({\n  selector: 'input[talenra-input], textarea[talenra-input]',\n  template: ``,\n  styleUrls: ['./input.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [{ provide: FormFieldControl, useExisting: InputComponent }],\n  host: {\n    '[disabled]': 'disabled',\n    '[required]': 'required',\n    '[readonly]': 'readonly',\n    '[class]': 'hostClass',\n    '(change)': 'handleChange()',\n    '(focus)': 'focusChanged($event)',\n    '(blur)': 'focusChanged($event)',\n    '[class.status--invalid]': `formField?.status() === FormFieldStatus.Invalid`,\n  },\n})\nexport class InputComponent\n  extends FormFieldControlBaseComponent\n  implements OnInit, ControlValueAccessor, FormFieldControl<InputComponent>\n{\n  /**\n   * The value provided to the input elements `type` attribute. Supports a subset of the native input element's types.\n   *\n   * ```html\n   * <input talenra-input type=\"email\" />\n   * ```\n   *\n   * @see {@link InputComponent}\n   * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input#input_types|MDN: Input type}\n   */\n  @Input() type: TInputType = InputType.Text;\n\n  /** Determines whether the control is disabled/enabled. */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's disabled state */\n  get disabled(): boolean {\n    return this._disabled || this.control?.disabled || false;\n  }\n  /** Set the control's disabled state */\n  set disabled(value: boolean) {\n    if (value === this._disabled) return;\n    this._disabled = value;\n    this.updateTabindex();\n    this.stateChanges.next();\n  }\n\n  /**\n   * Determines whether the control is read-only.\n   *\n   * ```html\n   * <input talenra-input readonly />\n   * ```\n   */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's read-only state */\n  get readonly(): boolean {\n    return this._readonly;\n  }\n  /** Set the control's read-only state */\n  set readonly(value: boolean) {\n    if (value === this._readonly) return;\n    this._readonly = value;\n    this.updateTabindex();\n    this.stateChanges.next();\n  }\n  /** @internal */\n  _readonly = false;\n\n  /** Controls whether the control is in focusable. */\n  private updateTabindex(): void {\n    this.tabindex = this.disabled || this.readonly ? -1 : 0;\n  }\n\n  /** @internal */\n  get isEmpty(): boolean {\n    const element: HTMLInputElement | HTMLTextAreaElement = this.elementRef.nativeElement;\n    return !element.value && !element.validity.badInput;\n  }\n\n  /** Determines whether the input has vertical scroll offset (textarea only) */\n  public hasScroll = signal<boolean>(false);\n\n  /** Determines whether the host element is of type textarea */\n  private isTextarea: boolean | null = null;\n\n  private hostClass = '';\n  private destroyRef: DestroyRef = inject(DestroyRef);\n\n  private elementRef = inject<ElementRef<HTMLInputElement | HTMLTextAreaElement>>(ElementRef);\n  private ngControl = inject(NgControl, { optional: true, self: true });\n\n  /** @internal */\n  constructor() {\n    super();\n    const element: HTMLInputElement | HTMLTextAreaElement = this.elementRef.nativeElement;\n    this.isTextarea = element.nodeName.toLowerCase() === 'textarea';\n    this.updateHostClass();\n    // Listen to changes of the FormField's size property\n    this.formField &&\n      toObservable(this.formField.size)\n        .pipe(takeUntilDestroyed(this.destroyRef))\n        .subscribe(() => {\n          this.updateHostClass();\n        });\n    // Textarea: Listen to scroll events. Used to show/hide Form Field's label background (prevent overlapping).\n    if (this.isTextarea) {\n      fromEvent(element, 'scroll')\n        .pipe(\n          takeUntilDestroyed(this.destroyRef),\n          throttleTime(100),\n          tap(this.scrolled.bind(this)),\n          debounceTime(250),\n          tap(this.scrolled.bind(this))\n        )\n        .subscribe();\n    }\n  }\n\n  /** @internal */\n  ngOnInit(): void {\n    this.id = `talenra-input--${nextId++}`;\n    this.control = this.ngControl?.control || null;\n    // UI of the wrapping form field depends on the input's content (e.g. label). If the input is initialized with a\n    // value in a template-driven context, we need to trigger stateChanges once the value is updated.\n    this.control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.stateChanges.next();\n      this.updateHostClass();\n    });\n    this.updateHostClass();\n  }\n\n  /**\n   * Triggered by scroll listener. Checks whether a textarea's content has vertical scroll offset and updates\n   * `hasScroll` property.\n   */\n  private scrolled(): void {\n    this.hasScroll.set(this.elementRef.nativeElement.scrollTop > 0);\n  }\n\n  /** @internal */\n  handleChange() {\n    this.stateChanges.next();\n  }\n\n  private focusChanged(event: FocusEvent): void {\n    const hasFocus = event.type === 'focus';\n    // No focus while disabled/read-only\n    if (hasFocus && (this.disabled || this.readonly)) return;\n    if (hasFocus === this.hasFocus) return;\n    this.hasFocus = hasFocus;\n    // Consider the control as 'touched' once the user has triggered a blur event.\n    !this.hasFocus && this.onTouched();\n    // Update state delayed as the control's state won't update immediately.\n    asapScheduler.schedule(() => {\n      this.stateChanges.next();\n      this.updateHostClass();\n    });\n  }\n\n  /** Sets the focus to the input. */\n  public focus(): void {\n    this.elementRef.nativeElement.focus();\n  }\n\n  /**\n   * Clear the value and focus the input element. Triggered by the clear button in FormField.\n   *\n   * @internal\n   */\n  clearValue(): void {\n    this.control?.setValue(null);\n    this.onChange(this.value);\n    this.onTouched();\n    this.focus();\n  }\n\n  /** @internal */\n  public updateHostClass(): void {\n    this.hostClass = [\n      this.isTextarea ? 'type--textarea' : 'type--input',\n      this.formField ? `size--${this.formField.size()}` : '',\n    ]\n      .filter((item) => item)\n      .join(' ');\n    this.changeDetector.markForCheck();\n  }\n\n  /** Used for property binding in component's metadata */\n  private readonly FormFieldStatus = FormFieldStatus;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Formats string according to the swiss social insurance number (OASI) format.\n *\n * @see {@link https://www.ch.ch/en/retirement/old-age-pension/the-first-pillar/how-to-find-your-oasi-number#what-is-an-oasi-number|What is an OASI number?}\n * @see {@link https://sozialversicherungen.admin.ch/de/d/6938|Definition of Swiss OASI numbers and how to validate (official)}\n *\n * @internal\n */\n@Pipe({\n  name: 'social-security-number',\n})\nexport class SocialSecurityNumberPipe implements PipeTransform {\n  private readonly dot = '.';\n  private readonly dotsIndexes = [3, 8, 13];\n\n  transform(value: string): string {\n    return value ? this.formatInsuranceNumber(value) : '';\n  }\n\n  private formatInsuranceNumber(insuranceNr: string): string {\n    // Remove any dots and non-digits\n    let ret: string[] = Array.from(insuranceNr.replace(/\\./g, '').replace(/[\\D]/g, ''));\n    const maxInsuranceNrLengthWithDots = 16;\n\n    // Add the 3 dots in their place if possible\n    for (let i = 0; i < this.dotsIndexes.length; i++) {\n      if (ret.length > this.dotsIndexes[i]) {\n        ret.splice(this.dotsIndexes[i], 0, this.dot);\n      }\n    }\n\n    // Trim to 13 digits + 3 dots max\n    const curLength = ret.length;\n    ret = ret.slice(0, curLength > maxInsuranceNrLengthWithDots ? maxInsuranceNrLengthWithDots : curLength);\n\n    return ret.join('');\n  }\n}\n","import { Directive, OnInit, inject } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { SocialSecurityNumberPipe } from '../pipes/social-security-number/social-security-number.pipe';\n\n/**\n * Prefix for Swiss OASI (old-age and survivors' insurance number or \"AHV number\" in German) numbers.\n * 756 is the country code for Switzerland.\n *\n * @internal\n */\nconst SSN_PREFIX = '756';\n/** @internal */\nconst SEPARATOR = '.';\n\n/**\n * The directive is applied to an `InputComponent` (`<input talenra-input talenra-social-security-number />`) to support users\n * entering social security numbers (Swiss OASI/AHV/AVS numbers).\n *\n * - Prefill the input-field with the prefix it gets focus.\n * - Auto-format input values\n *\n * You might want to limit the input value to 16 characters (the length of a Swiss OASI/AHV/AVS number including\n * separators).\n *\n * ```html\n * <talenra-form-field label=\"AHV-Nummer\">\n *   <input talenra-input talenra-social-security-number formControlName=\"socialSecurityNumber\" type=\"text\" maxlength=\"16\" />\n * </talenra-form-field>\n * ```\n *\n * You might want to use `InputValidator.socialSecurityNumber` to validate the input.\n *\n * ```typescript\n * form: FormGroup = new FormGroup({\n *  socialSecurityNumber: new FormControl('', [InputValidators.socialSecurityNumber]),\n * });\n * ```\n *\n * Example for a valid input: 756.9217.0769.85\n *\n * ### Import\n *\n * ```typescript\n * import { InputModule } from '@talenra/ngx-base/input';\n * ```\n *\n * @see {@link InputValidators.socialSecurityNumber}\n *\n * <example-url>../../#/input</example-url>\n */\n@Directive({\n  selector: 'input[talenra-input][talenra-social-security-number], input[talenra-search][talenra-social-security-number]',\n  host: {\n    '(blur)': 'handleFocus($event)',\n    '(focus)': 'handleFocus($event)',\n    '(paste)': 'handlePaste($event)',\n    '(input)': 'handleInput($event.target.value)',\n  },\n  providers: [SocialSecurityNumberPipe],\n})\nexport class SocialSecurityNumberDirective implements OnInit {\n  /** @internal */\n  private control: AbstractControl | null = null;\n  private ngControl = inject(NgControl, { optional: true, self: true });\n  private ssnPipe = inject(SocialSecurityNumberPipe);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.control = this.ngControl?.control || null;\n    this.handleInput(this.control?.value);\n  }\n\n  /** Add/remove the prefix '756.' when the field gets/looses focus and the field has no value. */\n  private handleFocus(event: FocusEvent): void {\n    const autofillValue = `${SSN_PREFIX}${SEPARATOR}`;\n    if (event.type === 'focus' && !this.control?.value?.startsWith(SSN_PREFIX)) {\n      // Add the prefix slighly delayed to prevent visual collision with the label transition.\n      // Then set the cursor position after the prefix.\n      setTimeout(() => {\n        this.control?.setValue(autofillValue);\n        (event.target as HTMLInputElement).setSelectionRange(4, 4);\n      }, 100);\n    }\n    if (event.type === 'blur' && this.control?.value === autofillValue) {\n      this.control?.setValue('');\n    }\n  }\n\n  /** Remove the auto-filled prefix if the pasted value already includes it. */\n  private handlePaste(event: ClipboardEvent): void {\n    if (event.clipboardData?.getData('text').startsWith(SSN_PREFIX)) {\n      this.control?.setValue('');\n    }\n  }\n\n  /** Auto-format input */\n  private handleInput(inputValue: string): void {\n    this.control?.setValue(this.ssnPipe.transform(inputValue));\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Formats string according to the billing number (German: \"Abrechnungsnummer\") format.\n *\n *\n * > \"The type of billingNumber is string(16), format: [.]{6,13}. Examples are A23.456, VN0.123, 1.AAU.T68 or\n * 12.345.678. The biggest I have seen in real live system is 12.345.678, but the biggest possible might be\n * 0.111.222.333.444.555 or 222.333.444.555, depending on the dots in it. But you could go with a max. of 12 chars\n * without dots, then you should be save for the next 7 decades... (minLength: 6, maxLength: 16)\"\n *\n * Additionaly, letters shall always be uppercase.\n *\n * @internal\n */\n@Pipe({\n  name: 'billingNumber',\n})\nexport class BillingNumberPipe implements PipeTransform {\n  transform(value: string): string {\n    return value ? this.formatBillingNumber(value) : '';\n  }\n\n  private formatBillingNumber(billingNr: string): string {\n    // Remove dots and transform letters to uppercase\n    let tmpStr = billingNr.replace(/\\./g, '').toUpperCase();\n    // Push fragments of same length to array, from right to left\n    const frags: string[] = [];\n    while (tmpStr.length > 0) {\n      // Push last characters to fragments array\n      frags.push(tmpStr.slice(-3));\n      // Remove these characters from temporary string\n      tmpStr = tmpStr.slice(0, -3);\n    }\n    // Reverse the array and return as formatted string\n    return frags.reverse().join('.');\n  }\n}\n","import { Directive, OnInit, inject } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { BillingNumberPipe } from '../pipes/billing-number/billing-number.pipe';\n\n/**\n * The directive is applied to an `InputComponent` (`<input talenra-input talenra-billing-number />`) to support users\n * entering billing numbers (German: \"Abrechnungsnummer\", e.g. AB.123.456).\n *\n * - Auto-format input values\n * - Converts letters to upper-case\n *\n * You might want to limit the input value to 17 characters (the maximum length of billing numbers including\n * separators).\n *\n * ```html\n * <talenra-form-field label=\"Abrechnungsnummer\">\n *   <input talenra-input talenra-billing-number formControlName=\"billingNumber\" type=\"text\" maxlength=\"17\" />\n * </talenra-form-field>\n * ```\n *\n * You might want to use `InputValidator.billingNumber` to validate the input.\n *\n * ```typescript\n * form: FormGroup = new FormGroup({\n *  billingNumber: new FormControl('', [InputValidators.billingNumber]),\n * });\n * ```\n *\n * Example for a valid input: A1.234.567\n *\n * ### Import\n *\n * ```typescript\n * import { InputModule } from '@talenra/ngx-base/input';\n * ```\n *\n * @see {@link InputValidators.billingNumber}\n *\n * <example-url>../../#/input</example-url>\n */\n@Directive({\n  selector: 'input[talenra-input][talenra-billing-number], input[talenra-search][talenra-billing-number]',\n  host: {\n    '(input)': 'handleInput($event.target.value)',\n  },\n  providers: [BillingNumberPipe],\n})\nexport class BillingNumberDirective implements OnInit {\n  private control: AbstractControl | null = null;\n  private ngControl = inject(NgControl, { optional: true, self: true });\n  private billingNrPipe = inject(BillingNumberPipe);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.control = this.ngControl?.control || null;\n    this.handleInput(this.control?.value);\n  }\n\n  /** Auto-format input */\n  private handleInput(inputValue: string): void {\n    this.control?.setValue(this.billingNrPipe.transform(inputValue));\n  }\n}\n","import { AbstractControl } from '@angular/forms';\n\n/**\n * Helper to validate check digit.\n * Rules for check digit explained at: https://sozialversicherungsnummer.ch/aufbau-neu.htm\n *\n * @internal\n */\nconst calculateCheckDigit = (control: AbstractControl): boolean => {\n  if (!control.value) return false;\n  const multipliers = [3, 1];\n  let acc = 0;\n  let toggle = 0;\n  let multiplier = multipliers[toggle];\n  for (let i = control.value.length - 2; i >= 0; i--) {\n    const value = control.value[i];\n    if (value != '.') {\n      acc += multiplier++ * value;\n      multiplier = multipliers[++toggle % 2];\n    }\n  }\n  const nextTenMultiplier = Math.ceil(acc / 10) * 10;\n  const checkDigit = nextTenMultiplier - acc;\n  // The check digit is the last digit of the social security number\n  return checkDigit === +control.value[control.value.length - 1];\n};\n\n/**\n * Form validators for inputs.\n *\n * ```typescript\n * form: FormGroup = new FormGroup({\n *   socialSecurityNumber: new FormControl('', [InputValidators.socialSecurityNumber])\n * });\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { InputValidators } from '@talenra/ngx-base/input';\n * ```\n */\nexport class InputValidators {\n  /**\n   * Validates a Swiss social security number.\n   *\n   * Example for a valid value: 756.9217.0769.85\n   *\n   * @returns `null` if valid, `{ socialSecurityNumber: true }` if invalid.\n   *\n   * @see {@link SocialSecurityNumberDirective}\n   */\n  static socialSecurityNumber(control: AbstractControl): { socialSecurityNumber: boolean } | null {\n    if (!control.value) return null;\n    const regExp = /^756.\\d{4}.\\d{4}.\\d{2}$/;\n    const valid = regExp.test(control.value) && calculateCheckDigit(control);\n    return valid ? null : { socialSecurityNumber: true };\n  }\n\n  /**\n   * Validates billing number (German: \"Abrechnungsnummer\").\n   *\n   * Examples for a valid values: EF.132, EF1.45K.123\n   *\n   * @returns `null` if valid, `{ socialSecurityNumber: true }` if invalid.\n   *\n   * @see {@link BillingNumberDirective}\n   */\n  static billingNumber(control: AbstractControl): { billingNumber: boolean } | null {\n    if (!control.value) return null;\n    const billingNumber = control.value;\n    const error = { billingNumber: true };\n    // Validate length\n    if (billingNumber.length > 17 || billingNumber.length < 6) return error;\n    // Letters and digits only\n    if (!new RegExp('^[A-Z0-9.]*$').test(control.value)) return error;\n    // Check separator position: From right to left, very 4th character is a dot\n    const isMalformatted =\n      billingNumber\n        .split('.')\n        .find(\n          (group: string, index: number) =>\n            (index > 0 && group.length !== 3) ||\n            (index === 0 && group.length > 3) ||\n            (index === 0 && group.length === 0)\n        ) !== undefined;\n    return isMalformatted ? error : null;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}