"use client"; import { useId, useState, type CSSProperties } from "react"; const digits = (text: string, size: number) => text.replace(/\D/g, "").slice(0, size); export function OneTimeCode({ label, length = 6, value, defaultValue = "", onValueChange, onComplete, name, hint, error, required = false, disabled = false, autoFocus = false, className = "", }: { label: string; length?: number; value?: string; defaultValue?: string; onValueChange?: (value: string) => void; onComplete?: (value: string) => void; name?: string; hint?: string; error?: string; required?: boolean; disabled?: boolean; autoFocus?: boolean; className?: string; }) { const id = useId(); const size = Math.min(12, Math.max(1, Math.floor(length))); const [internal, setInternal] = useState(() => digits(defaultValue, size)); const code = digits(value ?? internal, size); const [selection, setSelection] = useState<[number, number] | null>(null); const described = [hint && `${id}-hint`, error && `${id}-error`].filter(Boolean).join(" ") || undefined; const change = (raw: string) => { const next = digits(raw, size); if (next === code) return; if (value === undefined) setInternal(next); onValueChange?.(next); if (next.length === size) onComplete?.(next); }; const track = (input: HTMLInputElement) => setSelection([ input.selectionStart ?? input.value.length, input.selectionEnd ?? input.value.length, ]); const toEnd = (input: HTMLInputElement) => { input.setSelectionRange(input.value.length, input.value.length); track(input); }; return (