{"version":3,"file":"seniorsistemas-angular-components-pin-code-field.mjs","sources":["../../projects/angular-components/pin-code-field/src/lib/pin-code-field/pin-code-field.component.ts","../../projects/angular-components/pin-code-field/src/lib/pin-code-field/pin-code-field.component.html","../../projects/angular-components/pin-code-field/src/lib/pin-code-field.module.ts","../../projects/angular-components/pin-code-field/src/seniorsistemas-angular-components-pin-code-field.ts"],"sourcesContent":["import {\r\n    Component,\r\n    forwardRef,\r\n    viewChildren,\r\n    ElementRef,\r\n    signal,\r\n    input,\r\n    output,\r\n    effect,\r\n    computed,\r\n    model,\r\n    inject,\r\n    DestroyRef,\r\n} from '@angular/core';\r\n\r\nimport { NgClass } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n/**\r\n * @description Componente de entrada de código PIN/OTP com campos individuais para cada dígito.\r\n * Implementa {@link ControlValueAccessor} para integração nativa com Reactive Forms\r\n * e Template-driven Forms do Angular.\r\n *\r\n * Funcionalidades:\r\n * - Campos separados e navegáveis para cada dígito do código\r\n * - Comprimento configurável via input `length`\r\n * - Suporte a entrada numérica ou alfanumérica\r\n * - Navegação por teclado (setas, backspace)\r\n * - Suporte a colar (paste) com truncamento automático ao tamanho definido\r\n * - Estado de erro via input `invalid`\r\n * - Acessibilidade completa com ARIA labels e roles semânticos\r\n *\r\n * @example\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n *   <s-pin-code-field\r\n *     formControlName=\"code\"\r\n *     [length]=\"6\"\r\n *     [alphanumeric]=\"false\"\r\n *     [invalid]=\"(form.get('code')?.invalid && form.get('code')?.dirty) || false\"\r\n *     helpText=\"Digite seu código de 6 dígitos\"\r\n *     (codeFilled)=\"onCodeFilled($event)\">\r\n *   </s-pin-code-field>\r\n * </form>\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-pin-code-field',\r\n    templateUrl: './pin-code-field.component.html',\r\n    standalone: true,\r\n    imports: [NgClass, TranslateModule],\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => PinCodeFieldComponent),\r\n            multi: true,\r\n        },\r\n    ],\r\n})\r\nexport class PinCodeFieldComponent implements ControlValueAccessor {\r\n    private static readonly LAST_INDEX_OFFSET = 1;\r\n    private static readonly EMPTY_VALUE = '';\r\n\r\n    /**\r\n     * @description Número de campos de entrada (comprimento do código PIN).\r\n     * Deve ser ao menos 1.\r\n     *\r\n     * @default 6\r\n     */\r\n    public length = input(6);\r\n\r\n    /**\r\n     * @description Permite entrada alfanumérica e de caracteres especiais.\r\n     * Quando `false`, aceita apenas dígitos numéricos (0–9).\r\n     *\r\n     * @default false\r\n     */\r\n    public alphanumeric = input(false);\r\n\r\n    /**\r\n     * @description Texto de ajuda exibido abaixo dos campos de entrada,\r\n     * fornecendo instruções adicionais ao usuário.\r\n     *\r\n     * @default ''\r\n     */\r\n    public helpText = input('');\r\n\r\n    /**\r\n     * @description Controla a visualização do estado de erro do componente.\r\n     * Quando `true`, exibe borda vermelha nos campos de entrada.\r\n     * Normalmente vinculado ao estado `invalid && dirty` do `FormControl`.\r\n     *\r\n     * @example\r\n     * ```html\r\n     * [invalid]=\"(control?.invalid && control?.dirty) || false\"\r\n     * ```\r\n     * @default false\r\n     */\r\n    public invalid = input(false);\r\n\r\n    /**\r\n     * @description Controla o estado desabilitado do componente via two-way binding.\r\n     * Quando `true`, todos os campos ficam desabilitados e a interação do usuário é bloqueada.\r\n     *\r\n     * @default false\r\n     */\r\n    public disabled = model(false);\r\n\r\n    /**\r\n     * @description Emitido quando todos os campos do código PIN são preenchidos.\r\n     * Emite o código completo como string.\r\n     *\r\n     * @example\r\n     * ```html\r\n     * (codeFilled)=\"onCodeFilled($event)\"\r\n     * ```\r\n     */\r\n    public codeFilled = output<string>();\r\n\r\n    /**\r\n     * @description Signal com os valores atuais de cada campo de entrada.\r\n     * O comprimento do array corresponde ao valor do input `length`.\r\n     */\r\n    public inputs = signal<string[]>([]);\r\n\r\n    /**\r\n     * Signal tracking whether the component has been touched by the user.\r\n     * Set to true when the last input field loses focus (blur event).\r\n     */\r\n    public touched = signal<boolean>(false);\r\n\r\n    /**\r\n     * Computed signal indicating whether all PIN code fields are filled.\r\n     * True only when every field contains a non-empty value.\r\n     */\r\n    public isComplete = computed(() => this.inputs().every((input) => input !== ''));\r\n\r\n    /**\r\n     * Computed signal containing the complete PIN code as a joined string.\r\n     * Returns empty string if no inputs are filled.\r\n     */\r\n    public currentValue = computed(() => this.inputs().join(''));\r\n\r\n    /**\r\n     * Signal tracking if the component host has the ng-invalid class from FormControl validators.\r\n     * Updated reactively whenever the invalid state changes.\r\n     */\r\n    private hasNgInvalidClass = signal<boolean>(false);\r\n\r\n    /**\r\n     * Signal tracking if the FormControl is dirty.\r\n     * Updated reactively whenever the dirty state changes.\r\n     */\r\n    private isControlDirty = signal<boolean>(false);\r\n\r\n    /**\r\n     * Computed signal indicating if the component should show error state.\r\n     * Returns true if:\r\n     * - The `invalid` input is true, OR\r\n     * - The component has the `ng-invalid` class AND the FormControl is dirty (touched/modified)\r\n     * This ensures errors are only shown to the user after they've interacted with the field.\r\n     */\r\n    public hasError = computed(() => this.invalid() || (this.hasNgInvalidClass() && this.isControlDirty()));\r\n\r\n    /**\r\n     * ViewChildren reference to all input DOM elements.\r\n     * Used for DOM manipulation (focus, selection).\r\n     */\r\n    public pinInputs = viewChildren<ElementRef>('pinInput');\r\n\r\n    private readonly elementRef = inject(ElementRef);\r\n    private readonly destroyRef = inject(DestroyRef);\r\n\r\n    private onChange: (value: string) => void = () => {};\r\n    private onTouched: () => void = () => {};\r\n\r\n    constructor() {\r\n        effect(\r\n            () => {\r\n                const newLength = this.length();\r\n                if (newLength < 1) {\r\n                    console.warn('PIN code length must be at least 1');\r\n                    return;\r\n                }\r\n                if (this.inputs().length !== newLength) {\r\n                    this.inputs.set(Array.from({ length: newLength }, () => ''));\r\n                }\r\n            },\r\n            { allowSignalWrites: true },\r\n        );\r\n\r\n        // Monitor ng-invalid and ng-dirty classes on the host element for reactive error state\r\n        effect(\r\n            () => {\r\n                // Access inputs to create dependency on changes\r\n                this.inputs();\r\n                this.invalid();\r\n\r\n                // Use setTimeout to defer the check to next tick to ensure Angular has updated DOM classes\r\n                const timeoutId = window.setTimeout(() => {\r\n                    const hostElement = this.elementRef.nativeElement;\r\n                    const hasNgInvalid = hostElement.classList.contains('ng-invalid');\r\n                    const isDirty = hostElement.classList.contains('ng-dirty');\r\n\r\n                    this.hasNgInvalidClass.set(hasNgInvalid);\r\n                    this.isControlDirty.set(isDirty);\r\n                });\r\n\r\n                // Cleanup timeout on component destroy\r\n                this.destroyRef.onDestroy(() => {\r\n                    clearTimeout(timeoutId);\r\n                });\r\n            },\r\n            { allowSignalWrites: true },\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Handles input event on PIN code fields.\r\n     * Validates character input, prevents multiple characters per field,\r\n     * auto-advances to next field when character is entered.\r\n     *\r\n     * @param index - The input field index (0-based)\r\n     * @param event - The input event\r\n     */\r\n    public onInput(index: number, event: Event): void {\r\n        if (this.disabled()) {\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n\r\n        const target = event.target as HTMLInputElement;\r\n        const value = target.value;\r\n\r\n        if (value.length > 1 || (value && !this.isValidCharacter(value))) {\r\n            this.clearInput(target);\r\n            return;\r\n        }\r\n\r\n        this.setInputAtIndex(index, value);\r\n\r\n        if (value && index < this.length() - 1) {\r\n            this.focusAndSelectInput(index + 1);\r\n        }\r\n\r\n        if (this.isComplete()) {\r\n            this.codeFilled.emit(this.currentValue());\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Handles keyboard events on PIN code fields.\r\n     * Supports arrow navigation (left/right) and backspace key.\r\n     *\r\n     * Keyboard behavior:\r\n     * - ArrowRight: Move focus to next field\r\n     * - ArrowLeft: Move focus to previous field\r\n     * - Backspace: Clear current or previous field and adjust focus\r\n     *\r\n     * @param index - The input field index (0-based)\r\n     * @param event - The keyboard event\r\n     */\r\n    public onKeyDown(index: number, event: KeyboardEvent): void {\r\n        if (this.disabled()) {\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n\r\n        const key = event.key;\r\n\r\n        switch (key) {\r\n            case 'ArrowRight':\r\n                if (index < this.length() - 1) {\r\n                    event.preventDefault();\r\n                    this.focusAndSelectInput(index + 1);\r\n                }\r\n                break;\r\n            case 'ArrowLeft':\r\n                if (index > 0) {\r\n                    event.preventDefault();\r\n                    this.focusAndSelectInput(index - 1);\r\n                }\r\n                break;\r\n            case 'Backspace':\r\n                event.preventDefault();\r\n                this.handleBackspace(index);\r\n                break;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Handles paste (clipboard) events on PIN code fields.\r\n     * Extracts valid characters from pasted content, filters by character type,\r\n     * and automatically truncates to match field length.\r\n     *\r\n     * Behavior:\r\n     * - Filters characters based on `alphanumeric` setting\r\n     * - Truncates to maximum field count\r\n     * - Fills available fields with pasted content\r\n     * - Emits codeFilled event if all fields are filled\r\n     *\r\n     * @param event - The clipboard event\r\n     */\r\n    public onPaste(event: ClipboardEvent): void {\r\n        if (this.disabled()) {\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n\r\n        event.preventDefault();\r\n\r\n        const validChars = this.extractValidCharactersFromPaste(event);\r\n\r\n        if (validChars.length === 0) {\r\n            return;\r\n        }\r\n\r\n        const filledInputs = [...validChars, ...Array(this.length() - validChars.length).fill('')];\r\n\r\n        this.inputs.set(filledInputs);\r\n        this.updateValue();\r\n\r\n        // Focus on the first empty input or the last filled input if all are filled\r\n        const firstEmptyIndex = validChars.length < this.length() ? validChars.length : validChars.length - 1;\r\n        this.focusAndSelectInput(firstEmptyIndex);\r\n\r\n        if (this.isComplete()) {\r\n            this.codeFilled.emit(this.currentValue());\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Handles focus event on PIN code fields.\r\n     * Selects all text in the input field when focused.\r\n     *\r\n     * @param index - The input field index (0-based)\r\n     */\r\n    public onFocus(index: number): void {\r\n        const input = this.pinInputs()[index];\r\n        if (input) {\r\n            input.nativeElement.select();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Handles blur event on PIN code fields.\r\n     * Marks the component as touched when the last input field loses focus.\r\n     * Also notifies the registered onTouched callback for FormControl integration.\r\n     *\r\n     * @param index - The input field index (0-based)\r\n     */\r\n    public onBlur(index: number): void {\r\n        // Only mark as touched when the LAST input loses focus\r\n        if (index === this.length() - PinCodeFieldComponent.LAST_INDEX_OFFSET) {\r\n            this.touched.set(true);\r\n            this.onTouched();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clears the input value at specified index and adjusts focus accordingly.\r\n     * If current field is empty, moves to previous field and clears it.\r\n     *\r\n     * @private\r\n     * @param index - The input field index (0-based)\r\n     */\r\n    private handleBackspace(index: number): void {\r\n        const currentInputs = this.inputs();\r\n\r\n        // If current input has value, clear it\r\n        if (currentInputs[index]) {\r\n            this.setInputAtIndex(index, PinCodeFieldComponent.EMPTY_VALUE);\r\n            return;\r\n        }\r\n\r\n        // Otherwise, clear previous input and focus it\r\n        if (index > 0) {\r\n            this.setInputAtIndex(index - 1, PinCodeFieldComponent.EMPTY_VALUE);\r\n            this.focusAndSelectInput(index - 1);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the value at a specific input field index and updates the form value.\r\n     * Updates the signal and triggers the change detection via onChange callback.\r\n     *\r\n     * @private\r\n     * @param index - The input field index (0-based)\r\n     * @param value - The value to set in the field\r\n     */\r\n    private setInputAtIndex(index: number, value: string): void {\r\n        const currentInputs = this.inputs();\r\n        currentInputs[index] = value;\r\n        this.inputs.set([...currentInputs]);\r\n        this.updateValue();\r\n    }\r\n\r\n    /**\r\n     * Focuses on and selects text in the input field at the specified index.\r\n     * Uses queueMicrotask to ensure DOM is updated before focusing.\r\n     *\r\n     * @private\r\n     * @param index - The input field index (0-based)\r\n     */\r\n    private focusAndSelectInput(index: number): void {\r\n        queueMicrotask(() => {\r\n            const input = this.pinInputs()[index];\r\n            if (input) {\r\n                input.nativeElement.focus();\r\n                input.nativeElement.select();\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Clears the value of an input element.\r\n     * Used for input validation to reject invalid characters.\r\n     *\r\n     * @private\r\n     * @param target - The HTML input element to clear\r\n     */\r\n    private clearInput(target: HTMLInputElement): void {\r\n        target.value = '';\r\n    }\r\n\r\n    /**\r\n     * Extracts valid characters from pasted content.\r\n     * Filters based on alphanumeric setting and limits to component's length.\r\n     *\r\n     * @private\r\n     * @param event - The clipboard event\r\n     * @returns Array of valid characters from the pasted content\r\n     */\r\n    private extractValidCharactersFromPaste(event: ClipboardEvent): string[] {\r\n        const pastedText = (event.clipboardData?.getData('text') || '').trim();\r\n        return pastedText\r\n            .split('')\r\n            .filter((char) => this.isValidCharacter(char))\r\n            .slice(0, this.length());\r\n    }\r\n\r\n    /**\r\n     * Validates if a character is acceptable based on component configuration.\r\n     * For numeric mode, accepts only digits 0-9.\r\n     * For alphanumeric mode, accepts any non-whitespace character.\r\n     *\r\n     * @private\r\n     * @param char - The character to validate\r\n     * @returns true if character is valid, false otherwise\r\n     */\r\n    private isValidCharacter(char: string): boolean {\r\n        if (this.alphanumeric()) {\r\n            return char.trim().length > 0;\r\n        }\r\n        return /^[0-9]$/.test(char);\r\n    }\r\n\r\n    /**\r\n     * Updates the form value by calling the onChange callback registered by FormControl.\r\n     * This ensures the reactive form stays synchronized with component state.\r\n     *\r\n     * @private\r\n     */\r\n    private updateValue(): void {\r\n        this.onChange(this.currentValue());\r\n    }\r\n\r\n    /**\r\n     * Implements ControlValueAccessor interface.\r\n     * Called by the FormControl to write a value to the component.\r\n     * Only accepts string values with length matching the component's length setting.\r\n     *\r\n     * @param value - The value to write (typically from the FormControl)\r\n     */\r\n    public writeValue(value: any): void {\r\n        if (value) {\r\n            const stringValue = String(value);\r\n            if (stringValue.length === this.length()) {\r\n                this.inputs.set(stringValue.split(''));\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Implements ControlValueAccessor interface.\r\n     * Called by the FormControl when value changes.\r\n     * Registers the callback to be called when the component value changes.\r\n     *\r\n     * @param fn - Callback function to invoke when component value changes\r\n     */\r\n    public registerOnChange(fn: (value: string) => void): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    /**\r\n     * Implements ControlValueAccessor interface.\r\n     * Called by the FormControl to register the touched callback.\r\n     * The callback is invoked when the last input field loses focus.\r\n     *\r\n     * @param fn - Callback function to invoke when component is touched\r\n     */\r\n    public registerOnTouched(fn: () => void): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    /**\r\n     * Implements ControlValueAccessor interface.\r\n     * Called by the FormControl to set the disabled state of the component.\r\n     * Updates the disabled model to reflect the form's disabled state.\r\n     *\r\n     * @param isDisabled - Whether the component should be disabled\r\n     */\r\n    public setDisabledState(isDisabled: boolean): void {\r\n        this.disabled.set(isDisabled);\r\n    }\r\n}\r\n","<div class=\"gap-xsmall flex flex-col\">\n    <div\n        class=\"flex gap-2\"\n        role=\"group\"\n        aria-label=\"PIN code input\"\n        [attr.aria-labelledby]=\"helpText() ? 'pin-help-text' : null\"\n    >\n        @for (input of inputs(); let i = $index; track i) {\n            <input\n                #pinInput\n                type=\"text\"\n                class=\"h-12 w-12 rounded-xbig border text-center text-lg font-medium transition-all duration-200\"\n                [ngClass]=\"{\n                    'border-criticality-red focus:ring-criticality-red': hasError(),\n                    'border-grayscale-30 focus:border-primary focus:ring-primary': !hasError(),\n                    'cursor-not-allowed bg-grayscale-10 text-grayscale-60': disabled(),\n                    'bg-grayscale-0 text-grayscale-100 focus:outline-none': !disabled(),\n                }\"\n                [value]=\"input\"\n                [disabled]=\"disabled()\"\n                [attr.maxlength]=\"1\"\n                [attr.inputmode]=\"alphanumeric() ? 'text' : 'numeric'\"\n                [attr.aria-label]=\"\n                    alphanumeric()\n                        ? ('platform.angular_components.pin_code_character_index_of_total'\n                          | translate: { index: i + 1, length: length() })\n                        : ('platform.angular_components.pin_code_digit_index_of_total'\n                          | translate: { index: i + 1, length: length() })\n                \"\n                [attr.aria-describedby]=\"helpText() ? 'pin-help-text' : null\"\n                [attr.aria-required]=\"true\"\n                autocomplete=\"off\"\n                (input)=\"onInput(i, $event)\"\n                (keydown)=\"onKeyDown(i, $event)\"\n                (paste)=\"onPaste($event)\"\n                (focus)=\"onFocus(i)\"\n                (blur)=\"onBlur(i)\"\n            />\n        }\n    </div>\n\n    @if (helpText()) {\n        <div\n            id=\"pin-help-text\"\n            class=\"mt-small text-sm text-grayscale-60\"\n        >\n            {{ helpText() }}\n        </div>\n    }\n</div>\n\n","import { NgModule } from '@angular/core';\nimport { PinCodeFieldComponent } from './pin-code-field/pin-code-field.component';\n\n@NgModule({\n    imports: [PinCodeFieldComponent],\n    exports: [PinCodeFieldComponent],\n})\nexport class PinCodeFieldModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}