{"version":3,"file":"PasswordInput.cjs","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — on top of the SDK's shared field props,\n * showStrength/strength/strengthLabels are the meter and toggleLabels is the\n * show/hide button's accessible name — both need their copy from the app, since\n * neither can be translated by the SDK.\n */\nimport { forwardRef, useId, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n    InputHTMLAttributes<HTMLInputElement>,\n    \"type\" | \"size\"\n> {\n    /** Label rendered above the input. */\n    label?: ReactNode;\n    /** Helper text below — replaced by `error` when set. */\n    helperText?: ReactNode;\n    /** Error message. Adds `aria-invalid` + red border. */\n    error?: string;\n    /** Visual size of the input. */\n    size?: \"sm\" | \"md\" | \"lg\";\n    /** Show a strength meter below the field. Default `false`. */\n    showStrength?: boolean;\n    /** Override the automatic strength calc (0–4). */\n    strength?: PasswordStrength;\n    /** Custom labels per strength level (5 entries). */\n    strengthLabels?: readonly [string, string, string, string, string];\n    /** Custom toggle button labels for accessibility. */\n    toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n    if (!value) return 0;\n    let score = 0;\n    if (value.length >= 8) score += 1;\n    if (value.length >= 12) score += 1;\n    if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n    if (/[0-9]/.test(value)) score += 1;\n    if (/[^A-Za-z0-9]/.test(value)) score += 1;\n    return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n    function PasswordInput(\n        {\n            label,\n            helperText,\n            error,\n            size = \"md\",\n            showStrength = false,\n            strength,\n            strengthLabels = DEFAULT_STRENGTH_LABELS,\n            toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n            className,\n            value,\n            defaultValue,\n            id,\n            ...inputProps\n        },\n        ref,\n    ) {\n        const generatedId = useId();\n        const inputId = id ?? generatedId;\n        const describedById = error\n            ? `${inputId}-error`\n            : helperText\n              ? `${inputId}-helper`\n              : undefined;\n        const [revealed, setRevealed] = useState<boolean>(false);\n        const stringValue = String((value ?? defaultValue ?? \"\") as string);\n        const computedStrength: PasswordStrength =\n            strength ?? estimatePasswordStrength(stringValue);\n\n        return (\n            <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n                {label && (\n                    <label htmlFor={inputId} className={styles.label}>\n                        {label}\n                    </label>\n                )}\n                <div className={styles.field}>\n                    <input\n                        ref={ref}\n                        {...inputProps}\n                        id={inputId}\n                        value={value}\n                        defaultValue={defaultValue}\n                        type={revealed ? \"text\" : \"password\"}\n                        aria-invalid={!!error}\n                        aria-describedby={describedById}\n                        className={styles.input}\n                    />\n                    <button\n                        type=\"button\"\n                        className={styles.toggle}\n                        aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n                        aria-pressed={revealed}\n                        onClick={() => setRevealed((on) => !on)}\n                    >\n                        {revealed ? \"🙈\" : \"👁\"}\n                    </button>\n                </div>\n                {showStrength && (\n                    <div\n                        className={cn(styles.strength, styles[`level${computedStrength}`])}\n                        aria-label={strengthLabels[computedStrength]}\n                    >\n                        <div className={styles.strengthBar}>\n                            <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n                        </div>\n                        <span className={styles.strengthLabel}>\n                            {strengthLabels[computedStrength]}\n                        </span>\n                    </div>\n                )}\n                {error ? (\n                    <span id={`${inputId}-error`} className={styles.errorText}>\n                        {error}\n                    </span>\n                ) : helperText ? (\n                    <span id={`${inputId}-helper`} className={styles.helper}>\n                        {helperText}\n                    </span>\n                ) : null}\n            </div>\n        );\n    },\n);\n"],"mappings":"oIAmCA,IAAM,EAA0B,CAAC,cAAe,QAAS,WAAY,QAAS,WAAW,EAEzF,SAAgB,EAAyB,EAAiC,CACtE,GAAI,CAAC,EAAO,MAAO,GACnB,IAAI,EAAQ,EAMZ,OALI,EAAM,QAAU,IAAG,GAAS,GAC5B,EAAM,QAAU,KAAI,GAAS,GAC7B,QAAQ,KAAK,CAAK,GAAK,QAAQ,KAAK,CAAK,IAAG,GAAS,GACrD,QAAQ,KAAK,CAAK,IAAG,GAAS,GAC9B,eAAe,KAAK,CAAK,IAAG,GAAS,GAClC,KAAK,IAAI,EAAG,CAAK,CAC5B,CAQA,IAAa,GAAA,EAAgB,EAAA,WAAA,CACzB,SACI,CACI,QACA,aACA,QACA,OAAO,KACP,eAAe,GACf,WACA,iBAAiB,EACjB,eAAe,CAAE,KAAM,gBAAiB,KAAM,gBAAiB,EAC/D,YACA,QACA,eACA,KACA,GAAG,GAEP,EACF,CACE,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAU,GAAM,EAChB,EAAgB,EAChB,GAAG,EAAQ,QACX,EACE,GAAG,EAAQ,SACX,IAAA,GACF,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAkB,EAAK,EAEjD,EACF,GAAY,EAFI,OAAQ,GAAS,GAAgB,EAEZ,CAAW,EAEpD,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,GAAO,GAAS,EAAA,QAAO,MAAO,CAAS,EAAjF,SAAA,CACK,IACG,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,QAAS,EAAS,UAAW,EAAA,QAAO,MACtC,SAAA,CACE,CAAA,GAEX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,MAAvB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,QAAD,CACS,MACL,GAAI,EACJ,GAAI,EACG,QACO,eACd,KAAM,EAAW,OAAS,WAC1B,eAAc,CAAC,CAAC,EAChB,mBAAkB,EAClB,UAAW,EAAA,QAAO,KACrB,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAY,EAAW,EAAa,KAAO,EAAa,KACxD,eAAc,EACd,YAAe,EAAa,GAAO,CAAC,CAAE,EAErC,SAAA,EAAW,KAAO,IACf,CAAA,CACP,IACJ,IACG,EAAA,EAAA,KAAA,CAAC,MAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,SAAU,EAAA,QAAO,QAAQ,IAAmB,EACjE,aAAY,EAAe,GAF/B,SAAA,EAII,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,YACnB,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,MAAO,CAAE,MAAO,GAAI,EAAmB,EAAK,IAAI,EAAG,CAAI,CAAA,CAC5D,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,cACnB,SAAA,EAAe,EACd,CAAA,CACL,IAER,GACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAQ,QAAS,UAAW,EAAA,QAAO,UAC3C,SAAA,CACC,CAAA,EACN,GACA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAQ,SAAU,UAAW,EAAA,QAAO,OAC5C,SAAA,CACC,CAAA,EACN,IACH,GAEb,CACJ"}