UNPKG

@ngxpert/input-otp

Version:

One-time password input component for Angular.

1 lines 31.1 kB
{"version":3,"file":"ngxpert-input-otp.mjs","sources":["../../../../projects/ngxpert/input-otp/src/lib/control-value-signal.ts","../../../../projects/ngxpert/input-otp/src/lib/components/input-otp/input-otp.component.ts","../../../../projects/ngxpert/input-otp/src/lib/components/input-otp/input-otp.component.html","../../../../projects/ngxpert/input-otp/src/lib/regexp.ts","../../../../projects/ngxpert/input-otp/src/public-api.ts","../../../../projects/ngxpert/input-otp/src/ngxpert-input-otp.ts"],"sourcesContent":["import { computed, type Injector, type Signal, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl } from '@angular/forms';\nimport { startWith } from 'rxjs';\n\n/**\n * Returns a signal that contains the value of a control (or a form).\n * @param control\n * @param injector\n */\nexport function getControlValueSignal<T>(\n control: FormControl<T>,\n injector: Injector,\n): Signal<T | undefined> {\n const valueChanges = computed(() => {\n return untracked(() =>\n toSignal(control.valueChanges.pipe(startWith(control.value)), {\n injector,\n initialValue: undefined,\n }),\n );\n });\n\n return computed(() => valueChanges()());\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n OnDestroy,\n output,\n Renderer2,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormControl,\n FormsModule,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { InputOTPInputsOutputs, OTPSlot } from '../../types';\nimport { DOCUMENT } from '@angular/common';\nimport { getControlValueSignal } from '../../control-value-signal';\n\n// TODO: Fix password manager badge tracking\n// const PWM_BADGE_MARGIN_RIGHT = 18;\nconst PWM_BADGE_SPACE_WIDTH_PX = 40;\nconst PWM_BADGE_SPACE_WIDTH = `${PWM_BADGE_SPACE_WIDTH_PX}px`;\n\n// TODO: Fix password manager badge tracking\n// const PASSWORD_MANAGERS_SELECTORS = [\n// '[data-lastpass-icon-root]', // LastPass\n// 'com-1password-button', // 1Password\n// '[data-dashlanecreated]', // Dashlane\n// '[style$=\"2147483647 !important;\"]', // Bitwarden\n// ].join(',');\n\n@Component({\n selector: 'input-otp',\n imports: [FormsModule, ReactiveFormsModule],\n templateUrl: './input-otp.component.html',\n exportAs: 'inputOtp',\n styleUrls: ['./input-otp.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: InputOTPComponent,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: InputOTPComponent,\n multi: true,\n },\n ],\n host: {\n '[id]': 'id',\n },\n})\nexport class InputOTPComponent\n implements\n AfterViewInit,\n OnDestroy,\n ControlValueAccessor,\n Validator,\n InputOTPInputsOutputs\n{\n static nextId = 0;\n readonly idNextId = `input-otp-${InputOTPComponent.nextId++}`;\n id = input<string | undefined>(this.idNextId);\n name = input<string | undefined>();\n containerRef = viewChild<ElementRef<HTMLDivElement>>('containerRef');\n inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\n\n maxLength = input.required<number>();\n textAlign = input<'left' | 'center' | 'right'>('left');\n pattern = input<string | RegExp>();\n placeholder = input<string>();\n inputMode = input<'numeric' | 'text'>('numeric');\n disabled = input<boolean>(false);\n autoComplete = input<string>();\n pushPasswordManagerStrategy = input<'increase-width' | 'none'>(\n 'increase-width',\n );\n containerClass = input<string>();\n complete = output<string>();\n\n mirrorSelectionStart = signal<number | null>(null);\n mirrorSelectionEnd = signal<number | null>(null);\n isFocused = signal(false);\n isHovering = signal(false);\n hasPWMBadge = signal(false);\n hasPWMBadgeSpace = signal(false);\n done = signal(false);\n formControl = new FormControl('');\n value = getControlValueSignal(this.formControl, inject(Injector));\n slots = computed<OTPSlot[]>(() => {\n const slots: OTPSlot[] = [];\n for (let i = 0; i < this.maxLength(); i++) {\n const mirrorSelectionStart = this.mirrorSelectionStart();\n const mirrorSelectionEnd = this.mirrorSelectionEnd();\n const isActive =\n this.isFocused() &&\n mirrorSelectionStart !== null &&\n mirrorSelectionEnd !== null &&\n ((mirrorSelectionStart === mirrorSelectionEnd &&\n i === mirrorSelectionStart) ||\n (i >= mirrorSelectionStart && i < mirrorSelectionEnd));\n\n const value = this.value();\n const char = value && value[i] !== undefined ? value[i] : null;\n const placeholderChar =\n value && value[0] !== undefined\n ? null\n : (this.placeholder()?.[i] ?? null);\n slots.push({\n char,\n placeholderChar,\n isActive,\n hasFakeCaret: isActive && char === null,\n });\n }\n return slots;\n });\n\n private resizeObserver?: ResizeObserver;\n private previousValue: string | null | undefined;\n private document = inject(DOCUMENT);\n private renderer2 = inject(Renderer2);\n private isIOS = false;\n private inputMetadataRef = linkedSignal<{\n prev: [\n number | null,\n number | null,\n 'none' | 'forward' | 'backward' | null,\n ];\n }>(() => ({\n prev: [\n this.inputRef()?.nativeElement?.selectionStart ?? null,\n this.inputRef()?.nativeElement?.selectionEnd ?? null,\n this.inputRef()?.nativeElement?.selectionDirection ?? 'none',\n ],\n }));\n private onDocumentSelectionChange?: () => void;\n\n constructor() {\n this.formControl.addValidators([this.validate.bind(this)]);\n effect(() => {\n const newValue = this.value();\n if (\n this.previousValue !== null &&\n this.previousValue !== undefined &&\n this.previousValue.length < this.maxLength() &&\n this.formControl.valid\n ) {\n // formControl.valid is true if the value is valid, so we can safely emit the value\n this.valueOrFocusedChanged();\n\n if (\n newValue !== null &&\n newValue !== undefined &&\n newValue.length === this.maxLength()\n ) {\n this.complete.emit(newValue);\n }\n }\n this.previousValue = newValue;\n });\n\n effect(() => {\n const disabled = this.disabled();\n if (disabled) {\n this.formControl.disable();\n } else {\n this.formControl.enable();\n }\n });\n }\n\n writeValue(value: string): void {\n this.formControl.setValue(value);\n }\n registerOnChange(fn: (value: string | null) => void): void {\n this.formControl.valueChanges.subscribe(fn);\n }\n registerOnTouched(fn: () => void): void {\n this.formControl.valueChanges.subscribe(fn);\n }\n setDisabledState(isDisabled: boolean): void {\n if (isDisabled) {\n this.formControl.disable();\n } else {\n this.formControl.enable();\n }\n }\n validate(control: AbstractControl<string | null>): ValidationErrors | null {\n const value = control.value;\n if (value?.length !== this.maxLength()) {\n return { length: true };\n }\n const pattern = this.pattern();\n const regexp = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n if (value?.length > 0 && !regexp?.test(value)) {\n return { pattern: true };\n }\n return null;\n }\n\n private valueOrFocusedChanged() {\n // Forcefully remove :autofill state\n this.inputRef()?.nativeElement?.dispatchEvent(new Event('input'));\n\n // Update the selection state\n const s = this.inputRef()?.nativeElement?.selectionStart;\n const e = this.inputRef()?.nativeElement?.selectionEnd;\n const dir = this.inputRef()?.nativeElement?.selectionDirection;\n if (\n s !== null &&\n s !== undefined &&\n e !== null &&\n e !== undefined &&\n dir !== null &&\n dir !== undefined\n ) {\n this.mirrorSelectionStart.set(s);\n this.mirrorSelectionEnd.set(e);\n this.inputMetadataRef.set({ prev: [s, e, dir] });\n }\n }\n\n rootStyle = computed<Record<string, string>>(() => ({\n position: 'relative',\n cursor: this.disabled() ? 'default' : 'text',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n pointerEvents: 'none',\n }));\n\n inputStyle = computed<Record<string, string | undefined>>(() => {\n const willPushPWMBadge =\n this.pushPasswordManagerStrategy() !== 'none' &&\n this.hasPWMBadge() &&\n this.hasPWMBadgeSpace();\n\n return {\n position: 'absolute',\n inset: '0',\n width: willPushPWMBadge\n ? `calc(100% + ${PWM_BADGE_SPACE_WIDTH})`\n : '100%',\n clipPath: willPushPWMBadge\n ? `inset(0 ${PWM_BADGE_SPACE_WIDTH} 0 0)`\n : undefined,\n height: '100%',\n display: 'flex',\n // textAlign: this.textAlign(),\n opacity: '1',\n color: 'transparent',\n pointerEvents: 'all',\n background: 'transparent',\n caretColor: 'transparent',\n border: '0 solid transparent',\n outline: '0 solid transparent',\n boxShadow: 'none',\n lineHeight: '1',\n letterSpacing: '-0.5em',\n fontSize: 'var(--root-height)',\n fontFamily: 'monospace',\n fontVariantNumeric: 'tabular-nums',\n };\n });\n\n ngAfterViewInit() {\n this.setupResizeObserver();\n const onDocumentSelectionChange = () => {\n const input = this.inputRef()?.nativeElement;\n if (this.document.activeElement !== input) {\n this.mirrorSelectionStart.set(null);\n this.mirrorSelectionEnd.set(null);\n return;\n }\n\n // Aliases\n const _s = input.selectionStart;\n const _e = input.selectionEnd;\n const _dir = input.selectionDirection;\n const _ml = input.maxLength;\n const _val = input.value;\n const _prev = this.inputMetadataRef().prev;\n\n // Algorithm\n let start = -1;\n let end = -1;\n let direction: 'forward' | 'backward' | 'none' | undefined;\n if (_val.length !== 0 && _s !== null && _e !== null) {\n const isSingleCaret = _s === _e;\n const isInsertMode = _s === _val.length && _val.length < _ml;\n\n if (isSingleCaret && !isInsertMode) {\n const c = _s;\n if (c === 0) {\n start = 0;\n end = 1;\n direction = 'forward';\n } else if (c === _ml) {\n start = c - 1;\n end = c;\n direction = 'backward';\n } else if (_ml > 1 && _val.length > 1) {\n let offset = 0;\n if (_prev[0] !== null && _prev[1] !== null) {\n direction = c < _prev[1] ? 'backward' : 'forward';\n const wasPreviouslyInserting =\n _prev[0] === _prev[1] && _prev[0] < _ml;\n if (direction === 'backward' && !wasPreviouslyInserting) {\n offset = -1;\n }\n }\n\n start = offset + c;\n end = offset + c + 1;\n }\n }\n\n if (start !== -1 && end !== -1 && start !== end) {\n input.setSelectionRange(start, end, direction);\n }\n }\n\n // Finally, update the state\n const s = start !== -1 ? start : _s;\n const e = end !== -1 ? end : _e;\n const dir = direction ?? _dir;\n this.mirrorSelectionStart.set(s);\n this.mirrorSelectionEnd.set(e);\n // Store the previous selection value\n this.inputMetadataRef.set({ prev: [s, e, dir] });\n };\n this.document.addEventListener(\n 'selectionchange',\n onDocumentSelectionChange,\n {\n capture: true,\n },\n );\n\n // Set initial mirror state\n onDocumentSelectionChange();\n this.onDocumentSelectionChange = onDocumentSelectionChange;\n if (this.document.activeElement === this.inputRef()?.nativeElement) {\n this.changeFocus(true);\n }\n // Apply needed styles\n if (!this.document.getElementById('input-otp-style')) {\n const styleEl = this.document.createElement('style');\n styleEl.id = 'input-otp-style';\n this.document.head.appendChild(styleEl);\n\n if (styleEl.sheet) {\n const autofillStyles =\n 'background: transparent !important; color: transparent !important; border-color: transparent !important; opacity: 0 !important; box-shadow: none !important; -webkit-box-shadow: none !important; -webkit-text-fill-color: transparent !important;';\n\n this.safeInsertRule(\n styleEl.sheet,\n '[data-input-otp]::selection { background: transparent !important; color: transparent !important; }',\n );\n this.safeInsertRule(\n styleEl.sheet,\n `[data-input-otp]:autofill { ${autofillStyles} }`,\n );\n this.safeInsertRule(\n styleEl.sheet,\n `[data-input-otp]:-webkit-autofill { ${autofillStyles} }`,\n );\n // iOS\n this.safeInsertRule(\n styleEl.sheet,\n `@supports (-webkit-touch-callout: none) { [data-input-otp] { letter-spacing: -.6em !important; font-weight: 100 !important; font-stretch: ultra-condensed; font-optical-sizing: none !important; left: -1px !important; right: 1px !important; } }`,\n );\n // PWM badges\n this.safeInsertRule(\n styleEl.sheet,\n `[data-input-otp] + * { pointer-events: all !important; }`,\n );\n }\n }\n // Track root height\n const updateRootHeight = () => {\n if (this.containerRef()?.nativeElement) {\n this.renderer2.setStyle(\n this.containerRef()?.nativeElement,\n '--root-height',\n `${this.inputRef()?.nativeElement.clientHeight}px`,\n );\n }\n };\n updateRootHeight();\n }\n\n private safeInsertRule(sheet: CSSStyleSheet, rule: string) {\n try {\n sheet.insertRule(rule);\n } catch {\n console.error('input-otp could not insert CSS rule:', rule);\n }\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n if (this.onDocumentSelectionChange) {\n this.document.removeEventListener(\n 'selectionchange',\n this.onDocumentSelectionChange,\n { capture: true },\n );\n }\n }\n\n onMouseEnter() {\n this.isHovering.set(true);\n }\n\n onMouseLeave() {\n this.isHovering.set(false);\n }\n\n onFocus() {\n this.changeFocus(true);\n }\n\n onBlur() {\n this.changeFocus(false);\n }\n\n private changeFocus(value: boolean) {\n this.isFocused.set(value);\n this.valueOrFocusedChanged();\n }\n\n private setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n const input = this.inputRef()?.nativeElement;\n if (!input) return;\n\n this.resizeObserver = new ResizeObserver(() => {\n const container = this.containerRef()?.nativeElement;\n if (container) {\n container.style.setProperty('--root-height', `${input.clientHeight}px`);\n }\n });\n\n this.resizeObserver.observe(input);\n }\n}\n","<div\n #containerRef\n [class]=\"containerClass()\"\n data-input-otp-container\n [style]=\"rootStyle()\"\n>\n <ng-content></ng-content>\n <div\n [style]=\"{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n }\"\n >\n <input\n #inputRef\n data-input-otp\n [id]=\"id() ?? idNextId\"\n [name]=\"name() ?? ''\"\n [attr.data-input-otp-placeholder-shown]=\"formControl.value?.length === 0 || undefined\"\n [attr.data-input-otp-mss]=\"mirrorSelectionStart() || undefined\"\n [attr.data-input-otp-mse]=\"mirrorSelectionEnd() || undefined\"\n [inputMode]=\"inputMode()\"\n [pattern]=\"pattern() ?? ''\"\n [ariaPlaceholder]=\"placeholder()\"\n [style]=\"inputStyle()\"\n [maxLength]=\"maxLength()\"\n [formControl]=\"formControl\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [autocomplete]=\"autoComplete() || 'one-time-code'\"\n />\n </div>\n</div>\n","export const REGEXP_ONLY_DIGITS = '^\\\\d+$';\nexport const REGEXP_ONLY_CHARS = '^[a-zA-Z]+$';\nexport const REGEXP_ONLY_DIGITS_AND_CHARS = '^[a-zA-Z0-9]+$';\n","/*\n * Public API Surface of input-otp\n */\nexport * from './lib/components/input-otp/input-otp.component';\nexport * from './lib/types';\nexport * from './lib/regexp';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}