{"version":3,"file":"ngxsmk-otp-input.mjs","sources":["../../../projects/ngxsmk-otp-input/src/lib/ngxsmk-otp-input.ts","../../../projects/ngxsmk-otp-input/src/ngxsmk-otp-input.ts"],"sourcesContent":["import {CommonModule} from '@angular/common';\r\nimport {\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  forwardRef,\r\n  HostBinding,\r\n  Input,\r\n  Output,\r\n  QueryList,\r\n  ViewChildren\r\n} from '@angular/core';\r\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\n\r\n/**\r\n * ngxsmk-otp-input — Standalone OTP/PIN input for Angular 17+\r\n * - Works with Angular forms via ControlValueAccessor\r\n * - Any length (default 6)\r\n * - Numeric-only option\r\n * - Paste support\r\n * - Arrow/Backspace navigation\r\n * - Masked mode (•) optional\r\n * - Emits (changed) and (completed)\r\n */\r\n@Component({\r\n  selector: 'ngxsmk-otp-input',\r\n  standalone: true,\r\n  imports: [CommonModule, ReactiveFormsModule],\r\n  template: `\r\n    <div class=\"ngx-otp\" [attr.aria-label]=\"ariaLabel\" role=\"group\" [attr.aria-describedby]=\"ariaDescribedby\">\r\n      @for (_ of boxes; track $index) {\r\n        <input\r\n          #otpInput\r\n          class=\"ngx-otp__box\"\r\n          [id]=\"idPrefix + '-' + $index\"\r\n          [attr.inputmode]=\"numeric ? 'numeric' : 'text'\"\r\n          [attr.autocomplete]=\"autocomplete\"\r\n          [attr.aria-label]=\"boxAriaLabel($index)\"\r\n          [attr.aria-invalid]=\"isInvalid ? 'true' : 'false'\"\r\n          maxlength=\"1\"\r\n          [disabled]=\"disabled\"\r\n          [value]=\"displayChar($index)\"\r\n          (input)=\"onInput($event , $index)\"\r\n          (keydown)=\"onKeydown($event, $index)\"\r\n          (paste)=\"onPaste($event, $index)\"\r\n        />\r\n      }\r\n    </div>\r\n  `,\r\n  styleUrls: ['./otp-input.component.scss'],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => OtpInputComponent),\r\n      multi: true\r\n    }\r\n  ]\r\n})\r\nexport class OtpInputComponent implements ControlValueAccessor {\r\n  /** Number of boxes */\r\n  @Input() length = 6;\r\n  /** Only allow 0-9 */\r\n  @Input() numeric = true;\r\n  /** Autofill hint for iOS/Android */\r\n  @Input() autocomplete: 'one-time-code' | 'otp' | 'off' = 'one-time-code';\r\n  /** Mask characters with maskChar */\r\n  @Input() mask = false;\r\n  /** Character used for masking */\r\n  @Input() maskChar = '•';\r\n  /** Optional aria label for the input group */\r\n  @Input() ariaLabel = 'One-time password input';\r\n  /** Optional aria-describedby id */\r\n  @Input() ariaDescribedby?: string;\r\n  /** Optional invalid styling hook */\r\n  @Input() isInvalid = false;\r\n  /** ID prefix for inputs */\r\n  @Input() idPrefix = 'ngxsmk-otp';\r\n\r\n  /** Emits on any change */\r\n  @Output() changed = new EventEmitter<string>();\r\n  /** Emits when all boxes are filled with valid chars */\r\n  @Output() completed = new EventEmitter<string>();\r\n\r\n  @HostBinding('class.ngx-otp-host') hostClass = true;\r\n\r\n  @ViewChildren('otpInput') inputs!: QueryList<ElementRef<HTMLInputElement>>;\r\n\r\n  private values: string[] = [];\r\n  disabled = false;\r\n\r\n  get boxes() {\r\n    const L = Math.max(1, this.length | 0);\r\n    if (this.values.length !== L) {\r\n      this.values = new Array(L).fill('').map((_, i) => this.values[i] ?? '');\r\n      queueMicrotask(() => this.focusFirstIfNeeded());\r\n    }\r\n    return Array.from({length: L});\r\n  }\r\n\r\n  // ---- ControlValueAccessor ----\r\n  private onChange: (v: string) => void = () => {\r\n  };\r\n  private onTouched: () => void = () => {\r\n  };\r\n\r\n  writeValue(v: string | null): void {\r\n    const s = (v ?? '').toString();\r\n    const L = Math.max(1, this.length | 0);\r\n    this.values = new Array(L).fill('').map((_, i) => s[i] ?? '');\r\n  }\r\n\r\n  registerOnChange(fn: (v: string) => void): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: () => void): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.disabled = isDisabled;\r\n  }\r\n\r\n  // ---- UI helpers ----\r\n  private focusFirstIfNeeded() {\r\n    // Do not auto-focus by default; devs can focus programmatically if needed\r\n  }\r\n\r\n  displayChar(i: number): string {\r\n    const ch = this.values[i] ?? '';\r\n    return this.mask && ch ? this.maskChar : ch;\r\n  }\r\n\r\n  private sanitizeChar(ch: string): string {\r\n    if (!ch) return '';\r\n    if (this.numeric) return /\\d/.test(ch) ? ch : '';\r\n    return ch.length === 1 ? ch : '';\r\n  }\r\n\r\n  private getInputAt(i: number): HTMLInputElement | null {\r\n    return this.inputs?.get(i)?.nativeElement ?? null;\r\n  }\r\n\r\n  private emitAll() {\r\n    const joined = this.values.join('');\r\n    this.onChange(joined);\r\n    this.changed.emit(joined);\r\n\r\n    if (joined.length === this.length && !this.values.includes('')) {\r\n      this.completed.emit(joined);\r\n    }\r\n  }\r\n\r\n  boxAriaLabel(i: number) {\r\n    return `OTP character ${i + 1} of ${this.length}`;\r\n  }\r\n\r\n  // ---- Events ----\r\n  onInput(e: any, i: number) {\r\n    const target = e.target as HTMLInputElement;\r\n    const raw = (target.value ?? '').slice(-1);\r\n    const ch = this.sanitizeChar(raw);\r\n\r\n    this.values[i] = ch;\r\n    // Keep the DOM value in sync (for masked mode)\r\n    target.value = this.displayChar(i);\r\n\r\n    // Move focus forward on valid entry\r\n    if (ch && i < this.length - 1) {\r\n      this.getInputAt(i + 1)?.focus();\r\n    }\r\n\r\n    this.onTouched();\r\n    this.emitAll();\r\n  }\r\n\r\n  onKeydown(e: KeyboardEvent, i: number) {\r\n    const key = e.key;\r\n\r\n    if (key === 'ArrowLeft') {\r\n      e.preventDefault();\r\n      if (i > 0) this.getInputAt(i - 1)?.focus();\r\n      return;\r\n    }\r\n    if (key === 'ArrowRight') {\r\n      e.preventDefault();\r\n      if (i < this.length - 1) this.getInputAt(i + 1)?.focus();\r\n      return;\r\n    }\r\n    if (key === 'Backspace') {\r\n      const hadValue = !!this.values[i];\r\n      this.values[i] = '';\r\n      // If already empty, delete previous and move left\r\n      if (!hadValue && i > 0) {\r\n        this.values[i - 1] = '';\r\n        this.getInputAt(i - 1)?.focus();\r\n      }\r\n      // Reflect to DOM (masked or not)\r\n      const el = this.getInputAt(i);\r\n      if (el) el.value = this.displayChar(i);\r\n      this.emitAll();\r\n      return;\r\n    }\r\n\r\n    // Block non-digit keystrokes in numeric mode\r\n    if (this.numeric && key.length === 1 && !/\\d/.test(key)) {\r\n      e.preventDefault();\r\n    }\r\n  }\r\n\r\n  onPaste(e: ClipboardEvent, i: number) {\r\n    const data = e.clipboardData?.getData('text') ?? '';\r\n    if (!data) return;\r\n    e.preventDefault();\r\n\r\n    const chars = data.split('').map(c => this.sanitizeChar(c)).filter(Boolean);\r\n    if (!chars.length) return;\r\n\r\n    let idx = i;\r\n    for (const c of chars) {\r\n      if (idx >= this.length) break;\r\n      this.values[idx] = c;\r\n      const el = this.getInputAt(idx);\r\n      if (el) el.value = this.displayChar(idx);\r\n      idx++;\r\n    }\r\n    if (idx <= this.length - 1) this.getInputAt(idx)?.focus();\r\n    else this.getInputAt(this.length - 1)?.blur();\r\n\r\n    this.emitAll();\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}