dauth-context-react 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +173 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +173 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/DauthProfileModal.tsx +194 -4
- package/src/index.tsx +2 -0
- package/src/interfaces.ts +8 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/initialDauthState.ts","../src/reducer/dauth.types.ts","../src/reducer/dauth.reducer.ts","../src/api/dauth.api.ts","../src/webauthn.ts","../src/reducer/dauth.actions.ts","../src/api/utils/config.ts","../src/constants.ts","../src/api/utils/routes.ts","../src/DauthProfileModal.tsx"],"sourcesContent":["import React, {\n useReducer,\n useMemo,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport initialDauthState from './initialDauthState';\nimport userReducer from './reducer/dauth.reducer';\nimport * as action from './reducer/dauth.actions';\nimport { getClientBasePath, setDauthUrl } from './api/utils/config';\nimport { AUTH_CODE_PARAM } from './constants';\nimport { routes } from './api/utils/routes';\nimport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IDauthUser,\n IFormField,\n IModalTheme,\n IPasskeyCredential,\n DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\n IModalTheme,\n IPasskeyCredential,\n DauthProfileModalProps,\n};\n\nconst defaultOnError = (error: Error) => console.error(error);\n\nexport const DauthProvider: React.FC<IDauthProviderProps> = (\n props: IDauthProviderProps\n) => {\n const {\n domainName,\n children,\n authProxyPath = '/api/auth',\n onError,\n env,\n dauthUrl,\n } = props;\n const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);\n\n // Configure custom dauth URL before any API calls\n useEffect(() => {\n setDauthUrl(dauthUrl);\n }, [dauthUrl]);\n\n const handleError = useCallback(\n (error: Error) => (onError ?? defaultOnError)(error),\n [onError]\n );\n\n const ctx = useMemo(\n () => ({ dispatch, authProxyPath, onError: handleError }),\n [authProxyPath, handleError]\n );\n\n // On mount: exchange code or auto-login via session cookie\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const code = params.get(AUTH_CODE_PARAM);\n if (code) {\n action.exchangeCodeAction(ctx, code);\n } else {\n action.autoLoginAction(ctx);\n }\n }, []);\n\n const loginWithRedirect = useCallback(() => {\n const base = `${getClientBasePath()}/${domainName}/${routes.signin}`;\n const url = env ? `${base}?env=${encodeURIComponent(env)}` : base;\n return window.location.replace(url);\n }, [domainName, env]);\n\n const logout = useCallback(() => action.logoutAction(ctx), [ctx]);\n\n const updateUser = useCallback(\n async (fields: Partial<IDauthUser>) => {\n const {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } = fields;\n const user = {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } as Partial<IDauthUser>;\n return action.updateUserAction(ctx, user);\n },\n [ctx]\n );\n\n const deleteAccount = useCallback(\n () => action.deleteAccountAction(ctx),\n [ctx]\n );\n\n const getPasskeyCredentials = useCallback(\n () => action.getPasskeyCredentialsAction(ctx),\n [ctx]\n );\n\n const registerPasskey = useCallback(\n (name?: string) => action.registerPasskeyAction(ctx, name),\n [ctx]\n );\n\n const deletePasskeyCredential = useCallback(\n (credentialId: string) =>\n action.deletePasskeyCredentialAction(ctx, credentialId),\n [ctx]\n );\n\n const memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n }),\n [\n dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n ]\n );\n\n return (\n <DauthContext.Provider value={memoProvider}>\n {children}\n </DauthContext.Provider>\n );\n};\n\nconst DauthContext = createContext(initialDauthState);\n\nexport const useDauth = () => {\n const context = useContext(DauthContext);\n if (!context) {\n throw new Error('useDauth must be used inside DauthProvider');\n }\n return context;\n};\n","import { IDauthDomainState, IDauthState, IDauthUser } from './interfaces';\n\nconst initialDauthState: IDauthState = {\n user: {\n language:\n (typeof window !== 'undefined'\n ? window.document.documentElement.getAttribute('lang')\n : null) || 'es',\n } as IDauthUser,\n domain: {} as IDauthDomainState,\n isLoading: true,\n isAuthenticated: false,\n loginWithRedirect: () => {},\n logout: () => {},\n updateUser: () => Promise.resolve(false),\n deleteAccount: () => Promise.resolve(false),\n getPasskeyCredentials: () => Promise.resolve([]),\n registerPasskey: () => Promise.resolve(null),\n deletePasskeyCredential: () => Promise.resolve(false),\n};\n\nexport default initialDauthState;\n","export const LOGIN = 'LOGIN';\nexport const SET_IS_LOADING = 'SET_IS_LOADING';\nexport const UPDATE_USER = 'UPDATE_USER';\n","import { IDauthState } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport default function userReducer(state: IDauthState, action: any) {\n const { type, payload } = action;\n\n switch (type) {\n case DauthTypes.LOGIN: {\n const login: IDauthState = {\n ...state,\n user: payload.user,\n domain: payload.domain,\n isAuthenticated: payload.isAuthenticated,\n };\n return login;\n }\n\n case DauthTypes.SET_IS_LOADING: {\n const isLoading: IDauthState = {\n ...state,\n isLoading: payload.isLoading,\n };\n return isLoading;\n }\n\n case DauthTypes.UPDATE_USER: {\n const updateUser: IDauthState = {\n ...state,\n user: {\n ...state.user,\n ...payload,\n },\n };\n return updateUser;\n }\n\n default:\n return state;\n }\n}\n","import { IDauthUser } from '../interfaces';\nimport {\n IExchangeCodeResponse,\n ISessionResponse,\n IUpdateUserResponse,\n IDeleteAccountResponse,\n IPasskeyCredentialsResponse,\n IPasskeyRegistrationStartResponse,\n IPasskeyRegistrationFinishResponse,\n IDeletePasskeyResponse,\n} from './interfaces/dauth.api.responses';\n\nfunction getCsrfToken(): string {\n const match = document.cookie.match(\n /(?:^|;\\s*)(?:__Host-csrf|csrf-token)=([^;]*)/\n );\n if (!match?.[1]) return '';\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport async function exchangeCodeAPI(\n basePath: string,\n code: string\n): Promise<IExchangeCodeResponse> {\n const response = await fetch(`${basePath}/exchange-code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getSessionAPI(\n basePath: string\n): Promise<ISessionResponse> {\n const response = await fetch(`${basePath}/session`, {\n method: 'GET',\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function logoutAPI(\n basePath: string\n): Promise<{ response: Response }> {\n const response = await fetch(`${basePath}/logout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n });\n return { response };\n}\n\nexport async function updateUserAPI(\n basePath: string,\n user: Partial<IDauthUser>\n): Promise<IUpdateUserResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(user),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deleteAccountAPI(\n basePath: string\n): Promise<IDeleteAccountResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getPasskeyCredentialsAPI(\n basePath: string\n): Promise<IPasskeyCredentialsResponse> {\n const response = await fetch(\n `${basePath}/passkey/credentials`,\n {\n method: 'GET',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function startPasskeyRegistrationAPI(\n basePath: string\n): Promise<IPasskeyRegistrationStartResponse> {\n const response = await fetch(\n `${basePath}/passkey/register/start`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function finishPasskeyRegistrationAPI(\n basePath: string,\n body: { credential: unknown; name?: string }\n): Promise<IPasskeyRegistrationFinishResponse> {\n const response = await fetch(\n `${basePath}/passkey/register/finish`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(body),\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deletePasskeyCredentialAPI(\n basePath: string,\n credentialId: string\n): Promise<IDeletePasskeyResponse> {\n const response = await fetch(\n `${basePath}/passkey/credentials/${credentialId}`,\n {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n","/**\n * Minimal WebAuthn helpers for passkey registration.\n * Uses the raw Web Credentials API — no external dependencies.\n */\n\nexport function base64urlToBuffer(\n base64url: string\n): ArrayBuffer {\n const base64 = base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n const pad = base64.length % 4;\n const padded = pad ? base64 + '='.repeat(4 - pad) : base64;\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nexport function bufferToBase64url(\n buffer: ArrayBuffer\n): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Converts server-provided registration options (base64url strings)\n * into the format expected by navigator.credentials.create(),\n * executes the WebAuthn ceremony, and serializes the response\n * back to JSON with base64url-encoded ArrayBuffers.\n */\nexport async function createPasskeyCredential(\n options: Record<string, any>\n): Promise<Record<string, any>> {\n const publicKey = {\n ...options,\n challenge: base64urlToBuffer(options.challenge),\n user: {\n ...options.user,\n id: base64urlToBuffer(options.user.id),\n },\n excludeCredentials: (options.excludeCredentials ?? []).map(\n (c: any) => ({\n ...c,\n id: base64urlToBuffer(c.id),\n })\n ),\n } as PublicKeyCredentialCreationOptions;\n\n const credential = (await navigator.credentials.create({\n publicKey,\n })) as PublicKeyCredential;\n\n if (!credential) {\n throw new Error('Passkey registration was cancelled');\n }\n\n const attestation =\n credential.response as AuthenticatorAttestationResponse;\n\n return {\n id: credential.id,\n rawId: bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64url(\n attestation.clientDataJSON\n ),\n attestationObject: bufferToBase64url(\n attestation.attestationObject\n ),\n ...(attestation.getTransports\n ? { transports: attestation.getTransports() }\n : {}),\n ...(attestation.getPublicKeyAlgorithm\n ? {\n publicKeyAlgorithm:\n attestation.getPublicKeyAlgorithm(),\n }\n : {}),\n ...(attestation.getPublicKey\n ? {\n publicKey: bufferToBase64url(\n attestation.getPublicKey()!\n ),\n }\n : {}),\n ...(attestation.getAuthenticatorData\n ? {\n authenticatorData: bufferToBase64url(\n attestation.getAuthenticatorData()\n ),\n }\n : {}),\n },\n clientExtensionResults:\n credential.getClientExtensionResults(),\n authenticatorAttachment:\n credential.authenticatorAttachment ?? undefined,\n };\n}\n","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n getPasskeyCredentialsAPI,\n startPasskeyRegistrationAPI,\n finishPasskeyRegistrationAPI,\n deletePasskeyCredentialAPI,\n} from '../api/dauth.api';\nimport type { IPasskeyCredential } from '../api/interfaces/dauth.api.responses';\nimport { createPasskeyCredential } from '../webauthn';\nimport { IDauthDomainState, IDauthUser } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport interface ActionContext {\n dispatch: React.Dispatch<any>;\n authProxyPath: string;\n onError: (error: Error) => void;\n}\n\nexport async function exchangeCodeAction(ctx: ActionContext, code: string) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n // Clean URL immediately (before any fetch)\n window.history.replaceState({}, document.title, window.location.pathname);\n const result = await exchangeCodeAPI(authProxyPath, code);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function autoLoginAction(ctx: ActionContext) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n const result = await getSessionAPI(authProxyPath);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n // No session — not authenticated (not an error)\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function logoutAction(ctx: ActionContext) {\n const { dispatch, authProxyPath } = ctx;\n try {\n await logoutAPI(authProxyPath);\n } catch {\n // Best-effort server-side logout\n }\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {\n language: window.document.documentElement.getAttribute('lang') || 'es',\n },\n domain: {},\n isAuthenticated: false,\n },\n });\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n}\n\nexport async function updateUserAction(\n ctx: ActionContext,\n user: Partial<IDauthUser>\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n if (user.language) {\n window.document.documentElement.setAttribute('lang', user.language);\n }\n try {\n const result = await updateUserAPI(authProxyPath, user);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.UPDATE_USER,\n payload: result.data.user,\n });\n return true;\n }\n onError(new Error('Update user error: ' + result.data.message));\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Update user error'));\n return false;\n }\n}\n\nexport async function deleteAccountAction(\n ctx: ActionContext\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n try {\n const result = await deleteAccountAPI(authProxyPath);\n if (result.response.status === 200) {\n resetUser(dispatch);\n return true;\n }\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Delete account error'));\n return false;\n }\n}\n\nexport async function getPasskeyCredentialsAction(\n ctx: ActionContext\n): Promise<IPasskeyCredential[]> {\n const { authProxyPath, onError } = ctx;\n try {\n const result = await getPasskeyCredentialsAPI(authProxyPath);\n if (result.response.status === 200) {\n return result.data.credentials ?? [];\n }\n return [];\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Get passkey credentials error')\n );\n return [];\n }\n}\n\nexport async function registerPasskeyAction(\n ctx: ActionContext,\n name?: string\n): Promise<IPasskeyCredential | null> {\n const { authProxyPath, onError } = ctx;\n try {\n // Step 1: Get registration options from server\n const startResult =\n await startPasskeyRegistrationAPI(authProxyPath);\n if (startResult.response.status !== 200) {\n onError(new Error('Failed to start passkey registration'));\n return null;\n }\n\n // Step 2: Execute WebAuthn ceremony in the browser\n const credential = await createPasskeyCredential(\n startResult.data\n );\n\n // Step 3: Send the credential back to the server\n const finishResult = await finishPasskeyRegistrationAPI(\n authProxyPath,\n { credential, name }\n );\n if (\n finishResult.response.status === 200 ||\n finishResult.response.status === 201\n ) {\n return finishResult.data.credential;\n }\n onError(\n new Error('Failed to finish passkey registration')\n );\n return null;\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Passkey registration error')\n );\n return null;\n }\n}\n\nexport async function deletePasskeyCredentialAction(\n ctx: ActionContext,\n credentialId: string\n): Promise<boolean> {\n const { authProxyPath, onError } = ctx;\n try {\n const result = await deletePasskeyCredentialAPI(\n authProxyPath,\n credentialId\n );\n return result.response.status === 200;\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Delete passkey error')\n );\n return false;\n }\n}\n\nexport const resetUser = (dispatch: React.Dispatch<any>) => {\n return dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {} as IDauthUser,\n domain: {} as IDauthDomainState,\n isAuthenticated: false,\n },\n });\n};\n","export const serverDomain = 'dauth.ovh';\n\nlet _dauthUrl: string | undefined;\n\nexport function setDauthUrl(url: string | undefined) {\n _dauthUrl = url?.replace(/\\/+$/, '');\n}\n\nfunction checkIsLocalhost(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n return (\n hostname === 'localhost' ||\n hostname === '[::1]' ||\n /^127(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n ) ||\n /^192\\.168(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){2}$/.test(\n hostname\n ) ||\n /^10(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n )\n );\n}\n\nexport function getClientBasePath() {\n if (_dauthUrl) return _dauthUrl;\n const isLocalhost = checkIsLocalhost();\n const clientPort = 5185;\n const clientLocalUrl = `${window.location.protocol}//${window.location.hostname}:${clientPort}`;\n const clientProdUrl = `https://${serverDomain}`;\n return isLocalhost ? clientLocalUrl : clientProdUrl;\n}\n","export const AUTH_CODE_PARAM = 'code';\n","export const routes = {\n signin: 'signin',\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDauth } from './index';\nimport type {\n DauthProfileModalProps,\n IPasskeyCredential,\n} from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\ntype Tab = 'profile' | 'security' | 'account';\n\nconst TRANSITION_MS = 200;\nconst MOBILE_TRANSITION_MS = 300;\nconst SUCCESS_TIMEOUT_MS = 4000;\nconst CONFIRM_WORD = 'DELETE';\n\n// --- Inline SVG icons ---\n\nfunction IconClose() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction IconBack() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\" />\n <polyline points=\"12 19 5 12 12 5\" />\n </svg>\n );\n}\n\nfunction IconFingerprint() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n\nfunction IconShield() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n );\n}\n\nfunction IconTrash() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n );\n}\n\nfunction IconLogOut() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction IconCamera() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\" />\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\n </svg>\n );\n}\n\nfunction Spinner() {\n return <span style={spinnerStyle} aria-hidden=\"true\" />;\n}\n\n// --- Hooks ---\n\nfunction useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(\n () =>\n typeof window !== 'undefined' &&\n window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) =>\n setMatches(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [query]);\n return matches;\n}\n\nfunction useModalAnimation(open: boolean): Phase {\n const [phase, setPhase] = useState<Phase>('exited');\n\n useEffect(() => {\n if (open) {\n setPhase('entering');\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('entered'));\n });\n return () => cancelAnimationFrame(raf);\n }\n if (phase === 'entered' || phase === 'entering') {\n setPhase('exiting');\n const timer = setTimeout(\n () => setPhase('exited'),\n MOBILE_TRANSITION_MS\n );\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [open]);\n\n return phase;\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n onEscape: () => void\n) {\n const previousFocus = useRef<Element | null>(null);\n\n useEffect(() => {\n if (!active) return;\n previousFocus.current = document.activeElement;\n\n const container = containerRef.current;\n if (!container) return;\n\n const focusFirst = () => {\n const firstInput = container.querySelector<HTMLElement>(\n 'input:not([disabled])'\n );\n (firstInput ?? container).focus();\n };\n const raf = requestAnimationFrame(focusFirst);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onEscape();\n return;\n }\n if (e.key !== 'Tab') return;\n const focusable =\n container.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (\n !e.shiftKey &&\n document.activeElement === last\n ) {\n e.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n cancelAnimationFrame(raf);\n document.removeEventListener('keydown', handleKeyDown);\n if (previousFocus.current instanceof HTMLElement) {\n previousFocus.current.focus();\n }\n };\n }, [active, containerRef, onEscape]);\n}\n\nfunction useScrollLock(active: boolean) {\n useEffect(() => {\n if (!active) return;\n const scrollbarWidth =\n window.innerWidth -\n document.documentElement.clientWidth;\n const prevOverflow = document.body.style.overflow;\n const prevPaddingRight = document.body.style.paddingRight;\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n return () => {\n document.body.style.overflow = prevOverflow;\n document.body.style.paddingRight = prevPaddingRight;\n };\n }, [active]);\n}\n\n// --- Component ---\n\nexport function DauthProfileModal({\n open,\n onClose,\n onAvatarUpload,\n}: DauthProfileModalProps) {\n const {\n user,\n domain,\n updateUser,\n deleteAccount,\n logout,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n const avatarInputRef = useRef<HTMLInputElement>(null);\n\n // Tab state\n const showSecurity = domain.authMethods?.passkey === true;\n const [activeTab, setActiveTab] = useState<Tab>('profile');\n\n // Profile form state\n const [name, setName] = useState('');\n const [lastname, setLastname] = useState('');\n const [nickname, setNickname] = useState('');\n const [country, setCountry] = useState('');\n const [populated, setPopulated] = useState(false);\n\n // Status\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Delete\n const [showDelete, setShowDelete] = useState(false);\n const [deleteText, setDeleteText] = useState('');\n const [deleting, setDeleting] = useState(false);\n\n // Passkey state\n const [credentials, setCredentials] = useState<\n IPasskeyCredential[]\n >([]);\n const [loadingCreds, setLoadingCreds] = useState(false);\n const [showRegister, setShowRegister] = useState(false);\n const [passkeyName, setPasskeyName] = useState('');\n const [registering, setRegistering] = useState(false);\n const [passkeyStatus, setPasskeyStatus] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Avatar upload state\n const [uploadingAvatar, setUploadingAvatar] =\n useState(false);\n\n // Populate form when modal opens\n useEffect(() => {\n if (open && user?._id && !populated) {\n setName(user.name || '');\n setLastname(user.lastname || '');\n setNickname(user.nickname || '');\n setCountry(user.country || '');\n setPopulated(true);\n }\n if (!open) {\n setPopulated(false);\n setStatus(null);\n setShowDelete(false);\n setDeleteText('');\n setActiveTab('profile');\n setPasskeyStatus(null);\n setShowRegister(false);\n setPasskeyName('');\n }\n }, [open, user, populated]);\n\n // Fetch passkey credentials when Security tab is active\n useEffect(() => {\n if (activeTab !== 'security' || !showSecurity) return;\n setLoadingCreds(true);\n getPasskeyCredentials().then((creds) => {\n setCredentials(creds);\n setLoadingCreds(false);\n });\n }, [activeTab, showSecurity, getPasskeyCredentials]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(\n () => setStatus(null),\n SUCCESS_TIMEOUT_MS\n );\n return () => clearTimeout(timer);\n }, [status]);\n\n useEffect(() => {\n if (passkeyStatus?.type !== 'success') return;\n const timer = setTimeout(\n () => setPasskeyStatus(null),\n SUCCESS_TIMEOUT_MS\n );\n return () => clearTimeout(timer);\n }, [passkeyStatus]);\n\n useFocusTrap(modalRef, phase === 'entered', onClose);\n useScrollLock(phase !== 'exited');\n\n const hasField = useCallback(\n (field: string) =>\n domain.formFields?.some((f) => f.field === field) ??\n false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)\n ?.required ?? false,\n [domain.formFields]\n );\n\n const hasChanges = useMemo(() => {\n if (!user?._id) return false;\n return (\n name !== (user.name || '') ||\n lastname !== (user.lastname || '') ||\n nickname !== (user.nickname || '') ||\n country !== (user.country || '')\n );\n }, [name, lastname, nickname, country, user]);\n\n const canSave =\n name.trim().length > 0 && hasChanges && !saving;\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setStatus(null);\n const fields: Record<string, string> = { name };\n if (hasField('lastname')) fields.lastname = lastname;\n if (hasField('nickname')) fields.nickname = nickname;\n if (hasField('country')) fields.country = country;\n const ok = await updateUser(fields);\n setSaving(false);\n if (ok) {\n setStatus({\n type: 'success',\n message: 'Profile updated successfully',\n });\n } else {\n setStatus({\n type: 'error',\n message: 'Something went wrong. Please try again.',\n });\n }\n }, [name, lastname, nickname, country, hasField, updateUser]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n const ok = await deleteAccount();\n setDeleting(false);\n if (ok) {\n onClose();\n } else {\n setStatus({\n type: 'error',\n message:\n 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, onClose]);\n\n const handleLanguage = useCallback(\n async (lang: string) => {\n await updateUser({ language: lang } as any);\n },\n [updateUser]\n );\n\n const handleRegisterPasskey = useCallback(async () => {\n setRegistering(true);\n setPasskeyStatus(null);\n const cred = await registerPasskey(\n passkeyName || undefined\n );\n setRegistering(false);\n if (cred) {\n setCredentials((prev) => [...prev, cred]);\n setPasskeyName('');\n setShowRegister(false);\n setPasskeyStatus({\n type: 'success',\n message: 'Passkey registered successfully',\n });\n } else {\n setPasskeyStatus({\n type: 'error',\n message: 'Failed to register passkey',\n });\n }\n }, [passkeyName, registerPasskey]);\n\n const handleDeletePasskey = useCallback(\n async (credentialId: string) => {\n const ok = await deletePasskeyCredential(credentialId);\n if (ok) {\n setCredentials((prev) =>\n prev.filter((c) => c._id !== credentialId)\n );\n }\n },\n [deletePasskeyCredential]\n );\n\n const handleAvatarClick = useCallback(() => {\n if (onAvatarUpload) {\n avatarInputRef.current?.click();\n }\n }, [onAvatarUpload]);\n\n const handleAvatarChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onAvatarUpload) return;\n setUploadingAvatar(true);\n try {\n const url = await onAvatarUpload(file);\n if (url) {\n await updateUser({ avatar: url } as any);\n }\n } catch {\n // Error handled by onError callback\n }\n setUploadingAvatar(false);\n if (avatarInputRef.current) {\n avatarInputRef.current.value = '';\n }\n },\n [onAvatarUpload, updateUser]\n );\n\n const handleSignOut = useCallback(() => {\n logout();\n onClose();\n }, [logout, onClose]);\n\n // Build CSS custom property overrides from domain.modalTheme\n const themeVars = useMemo(() => {\n const t = domain.modalTheme;\n if (!t) return {};\n const vars: Record<string, string> = {};\n if (t.accent) vars['--dauth-accent'] = t.accent;\n if (t.accentHover)\n vars['--dauth-accent-hover'] = t.accentHover;\n if (t.surface) vars['--dauth-surface'] = t.surface;\n if (t.surfaceHover)\n vars['--dauth-surface-hover'] = t.surfaceHover;\n if (t.textPrimary)\n vars['--dauth-text-primary'] = t.textPrimary;\n if (t.textSecondary)\n vars['--dauth-text-secondary'] = t.textSecondary;\n if (t.border) vars['--dauth-border'] = t.border;\n return vars;\n }, [domain.modalTheme]);\n\n if (phase === 'exited') return null;\n\n const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;\n const easing = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n const backdrop: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: 2147483647,\n backgroundColor:\n 'var(--dauth-backdrop, rgba(0, 0, 0, 0.6))',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: phase === 'entered' ? 1 : 0,\n transition: `opacity ${dur}ms ease-out`,\n };\n\n const modalDesktop: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: 480,\n maxHeight: '90vh',\n margin: 16,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n borderRadius: 'var(--dauth-radius, 12px)',\n boxShadow:\n 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n opacity: phase === 'entered' ? 1 : 0,\n transform:\n phase === 'entered'\n ? 'translateY(0)'\n : 'translateY(16px)',\n transition: `opacity ${dur}ms ${easing}, transform ${dur}ms ${easing}`,\n };\n\n const modalMobile: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n transform:\n phase === 'entered'\n ? 'translateY(0)'\n : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n const tabs: { key: Tab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n ...(showSecurity\n ? [{ key: 'security' as Tab, label: 'Security' }]\n : []),\n { key: 'account', label: 'Account' },\n ];\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html:\n '@keyframes dauth-spin{to{transform:rotate(360deg)}}',\n }}\n />\n <div\n style={{ ...backdrop, ...themeVars }}\n onClick={isDesktop ? onClose : undefined}\n data-testid=\"dauth-profile-backdrop\"\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dauth-profile-title\"\n style={isDesktop ? modalDesktop : modalMobile}\n onClick={(e) => e.stopPropagation()}\n tabIndex={-1}\n >\n {/* Header */}\n <div style={headerStyle(isDesktop)}>\n <button\n type=\"button\"\n onClick={onClose}\n style={closeBtn}\n aria-label=\"Close\"\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n {isDesktop ? <IconClose /> : <IconBack />}\n </button>\n <h2 id=\"dauth-profile-title\" style={titleStyle}>\n Your Profile\n </h2>\n <div style={{ width: 36 }} />\n </div>\n\n {/* Tab bar */}\n <div style={tabBar} role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t.key}\n role=\"tab\"\n type=\"button\"\n aria-selected={activeTab === t.key}\n style={{\n ...tabBtn,\n color:\n activeTab === t.key\n ? 'var(--dauth-accent, #6366f1)'\n : 'var(--dauth-text-secondary, #a1a1aa)',\n borderBottomColor:\n activeTab === t.key\n ? 'var(--dauth-accent, #6366f1)'\n : 'transparent',\n }}\n onClick={() => setActiveTab(t.key)}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* ========== PROFILE TAB ========== */}\n {activeTab === 'profile' && (\n <>\n {/* Avatar */}\n <div style={avatarSection}>\n <div\n style={{\n ...avatarCircle,\n cursor: onAvatarUpload\n ? 'pointer'\n : 'default',\n position: 'relative' as const,\n }}\n onClick={handleAvatarClick}\n >\n {uploadingAvatar ? (\n <Spinner />\n ) : user.avatar?.url ? (\n <img\n src={user.avatar.url}\n alt=\"\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }}\n />\n ) : (\n avatarInitial\n )}\n {onAvatarUpload && !uploadingAvatar && (\n <div style={avatarOverlay}>\n <IconCamera />\n </div>\n )}\n </div>\n <div style={emailText}>{user.email}</div>\n {onAvatarUpload && (\n <input\n ref={avatarInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleAvatarChange}\n />\n )}\n </div>\n\n {/* Status */}\n {status && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={statusMsg(status.type)}\n >\n {status.message}\n </div>\n )}\n\n {/* Form */}\n <div>\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-name\"\n style={label}\n >\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) =>\n setName(e.target.value)\n }\n placeholder=\"Your name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n\n {hasField('lastname') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-lastname\"\n style={label}\n >\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) =>\n setLastname(e.target.value)\n }\n placeholder=\"Your last name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('nickname') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-nickname\"\n style={label}\n >\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) =>\n setNickname(e.target.value)\n }\n placeholder=\"Choose a nickname\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('country') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-country\"\n style={label}\n >\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) =>\n setCountry(e.target.value)\n }\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Language selector */}\n <hr style={separator} />\n <div style={fieldGroup}>\n <div style={label}>Language</div>\n <div style={{ display: 'flex', gap: 8 }}>\n {(['es', 'en'] as const).map((lang) => (\n <button\n key={lang}\n type=\"button\"\n style={{\n ...langBtn,\n backgroundColor:\n user.language === lang\n ? 'var(--dauth-accent, #6366f1)'\n : 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n color:\n user.language === lang\n ? '#ffffff'\n : 'var(--dauth-text-secondary, #a1a1aa)',\n }}\n onClick={() => handleLanguage(lang)}\n >\n {lang === 'es'\n ? 'Espa\\u00f1ol'\n : 'English'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* ========== SECURITY TAB ========== */}\n {activeTab === 'security' && showSecurity && (\n <>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 16,\n }}\n >\n <div\n style={{\n ...label,\n marginBottom: 0,\n fontWeight: 600,\n }}\n >\n Passkeys\n </div>\n <button\n type=\"button\"\n style={outlineBtn}\n onClick={() =>\n setShowRegister(!showRegister)\n }\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n + Add passkey\n </button>\n </div>\n\n {/* Register passkey form */}\n {showRegister && (\n <div style={registerPanel}>\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-passkey-name\"\n style={label}\n >\n Passkey name (optional)\n </label>\n <input\n id=\"dauth-passkey-name\"\n type=\"text\"\n value={passkeyName}\n onChange={(e) =>\n setPasskeyName(e.target.value)\n }\n placeholder=\"e.g. MacBook Touch ID\"\n disabled={registering}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n <div\n style={{\n display: 'flex',\n gap: 8,\n }}\n >\n <button\n type=\"button\"\n style={{\n ...smallAccentBtn,\n opacity: registering ? 0.6 : 1,\n }}\n disabled={registering}\n onClick={handleRegisterPasskey}\n >\n {registering ? (\n <Spinner />\n ) : (\n <IconFingerprint />\n )}\n {registering\n ? 'Registering...'\n : 'Register'}\n </button>\n <button\n type=\"button\"\n style={cancelBtn}\n onClick={() =>\n setShowRegister(false)\n }\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* Passkey status */}\n {passkeyStatus && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n ...statusMsg(passkeyStatus.type),\n marginTop: 12,\n }}\n >\n {passkeyStatus.message}\n </div>\n )}\n\n {/* Credentials list */}\n <div style={{ marginTop: 12 }}>\n {loadingCreds ? (\n <div\n style={{\n textAlign: 'center',\n padding: 24,\n }}\n >\n <Spinner />\n </div>\n ) : credentials.length > 0 ? (\n credentials.map((cred) => (\n <div\n key={cred._id}\n style={credentialRow}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n flex: 1,\n minWidth: 0,\n }}\n >\n <span\n style={{\n color:\n 'var(--dauth-accent, #6366f1)',\n flexShrink: 0,\n }}\n >\n <IconFingerprint />\n </span>\n <div\n style={{\n minWidth: 0,\n flex: 1,\n }}\n >\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color:\n 'var(--dauth-text-primary, #e4e4e7)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace:\n 'nowrap' as const,\n }}\n >\n {cred.name || 'Passkey'}\n </div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-xs, 0.75rem)',\n color:\n 'var(--dauth-text-muted, #71717a)',\n }}\n >\n {cred.deviceType ===\n 'multiDevice'\n ? 'Synced'\n : 'Device-bound'}\n {cred.createdAt &&\n ` \\u00b7 Created ${new Date(cred.createdAt).toLocaleDateString()}`}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n handleDeletePasskey(cred._id)\n }\n style={trashBtn}\n onMouseEnter={(e) =>\n (e.currentTarget.style.color =\n 'var(--dauth-error, #ef4444)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.color =\n 'var(--dauth-text-muted, #71717a)')\n }\n aria-label={`Delete passkey ${cred.name || ''}`}\n >\n <IconTrash />\n </button>\n </div>\n ))\n ) : (\n <div style={emptyState}>\n <span\n style={{\n color:\n 'var(--dauth-accent, #6366f1)',\n }}\n >\n <IconShield />\n </span>\n <div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color:\n 'var(--dauth-text-primary, #e4e4e7)',\n }}\n >\n No passkeys registered\n </div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-xs, 0.75rem)',\n color:\n 'var(--dauth-text-secondary, #a1a1aa)',\n }}\n >\n Add a passkey for faster, more\n secure sign-in.\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ========== ACCOUNT TAB ========== */}\n {activeTab === 'account' && (\n <>\n {/* Status (shared) */}\n {status && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={statusMsg(status.type)}\n >\n {status.message}\n </div>\n )}\n\n {/* Delete account */}\n <div>\n <div style={dangerTitle}>\n Delete account\n </div>\n <div style={dangerDesc}>\n Permanently delete your account and all\n associated data.\n </div>\n {!showDelete ? (\n <button\n type=\"button\"\n style={deleteBtn}\n onClick={() => setShowDelete(true)}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'rgba(239, 68, 68, 0.2)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))')\n }\n >\n Delete account\n </button>\n ) : (\n <div style={deletePanel}>\n <div style={deletePanelText}>\n This action is permanent and cannot\n be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to\n confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) =>\n setDeleteText(e.target.value)\n }\n placeholder={`Type ${CONFIRM_WORD}`}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n disabled={deleting}\n />\n <div\n style={{\n display: 'flex',\n gap: 8,\n marginTop: 12,\n }}\n >\n <button\n type=\"button\"\n style={cancelBtn}\n onClick={() => {\n setShowDelete(false);\n setDeleteText('');\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD ||\n deleting\n ? 0.5\n : 1,\n cursor:\n deleteText !== CONFIRM_WORD ||\n deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={\n deleteText !== CONFIRM_WORD ||\n deleting\n }\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Sign out */}\n <hr style={separator} />\n <button\n type=\"button\"\n style={signOutBtn}\n onClick={handleSignOut}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'rgba(239, 68, 68, 0.2)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))')\n }\n >\n <IconLogOut />\n Sign out\n </button>\n </>\n )}\n </div>\n\n {/* Footer — only for Profile tab */}\n {activeTab === 'profile' && (\n <div style={footerStyle(isDesktop)}>\n <button\n type=\"button\"\n style={{\n ...saveBtn,\n opacity: canSave ? 1 : 0.5,\n cursor: canSave ? 'pointer' : 'not-allowed',\n }}\n disabled={!canSave}\n onClick={handleSave}\n aria-busy={saving}\n onMouseEnter={(e) => {\n if (canSave)\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent-hover, #818cf8)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent, #6366f1)';\n }}\n >\n {saving && <Spinner />}\n {saving ? 'Saving...' : 'Save changes'}\n </button>\n </div>\n )}\n </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (\n isDesktop: boolean\n): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px 0',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor:\n 'var(--dauth-surface, #1a1a2e)',\n }\n : {}),\n});\n\nconst titleStyle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-lg, 1.25rem)',\n fontWeight: 600,\n margin: 0,\n lineHeight: 1.4,\n textAlign: 'center',\n flex: 1,\n};\n\nconst closeBtn: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n cursor: 'pointer',\n transition: 'background-color 150ms, color 150ms',\n padding: 0,\n};\n\nconst tabBar: React.CSSProperties = {\n display: 'flex',\n padding: '0 24px',\n borderBottom:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n};\n\nconst tabBtn: React.CSSProperties = {\n flex: 1,\n padding: '12px 4px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n border: 'none',\n borderBottom: '2px solid transparent',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'color 150ms, border-color 150ms',\n fontFamily: 'inherit',\n textAlign: 'center',\n};\n\nconst bodyStyle: React.CSSProperties = {\n flex: 1,\n overflowY: 'auto',\n padding: 24,\n WebkitOverflowScrolling: 'touch',\n};\n\nconst avatarSection: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: 24,\n gap: 8,\n};\n\nconst avatarCircle: React.CSSProperties = {\n width: 64,\n height: 64,\n borderRadius: '50%',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n color: '#ffffff',\n fontSize: '1.5rem',\n fontWeight: 600,\n};\n\nconst avatarOverlay: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n opacity: 0.7,\n transition: 'opacity 150ms',\n color: '#ffffff',\n};\n\nconst emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (\n type: 'success' | 'error'\n): React.CSSProperties => ({\n padding: '10px 14px',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n marginBottom: 16,\n backgroundColor:\n type === 'success'\n ? 'var(--dauth-success-bg, rgba(34, 197, 94, 0.1))'\n : 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n color:\n type === 'success'\n ? 'var(--dauth-success, #22c55e)'\n : 'var(--dauth-error, #ef4444)',\n textAlign: 'center',\n lineHeight: 1.5,\n});\n\nconst fieldGroup: React.CSSProperties = {\n marginBottom: 16,\n};\n\nconst label: React.CSSProperties = {\n display: 'block',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 6,\n};\n\nconst input: React.CSSProperties = {\n width: '100%',\n padding: '10px 14px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n lineHeight: 1.5,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-input, 8px)',\n outline: 'none',\n transition: 'border-color 150ms, box-shadow 150ms',\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n};\n\nconst inputFocusHandler = (\n e: React.FocusEvent<HTMLInputElement>\n) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow =\n '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (\n e: React.FocusEvent<HTMLInputElement>\n) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst langBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms, color 150ms',\n fontFamily: 'inherit',\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor:\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\n};\n\nconst outlineBtn: React.CSSProperties = {\n padding: '6px 12px',\n fontSize: 'var(--dauth-font-size-xs, 0.75rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n backgroundColor: 'transparent',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst registerPanel: React.CSSProperties = {\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n marginBottom: 12,\n};\n\nconst smallAccentBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'opacity 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n};\n\nconst credentialRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n marginBottom: 8,\n};\n\nconst trashBtn: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--dauth-text-muted, #71717a)',\n cursor: 'pointer',\n transition: 'color 150ms',\n padding: 0,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n flexShrink: 0,\n};\n\nconst emptyState: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n};\n\nconst dangerTitle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 600,\n color: 'var(--dauth-error, #ef4444)',\n marginBottom: 4,\n};\n\nconst dangerDesc: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-xs, 0.75rem)',\n color: 'var(--dauth-text-muted, #71717a)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst deleteBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-error, #ef4444)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms, border-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deletePanel: React.CSSProperties = {\n marginTop: 12,\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n};\n\nconst deletePanelText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst cancelBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n backgroundColor: 'transparent',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deleteConfirmBtn: React.CSSProperties = {\n flex: 1,\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-error, #ef4444)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'opacity 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n};\n\nconst signOutBtn: React.CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n fontWeight: 500,\n color: 'var(--dauth-error, #ef4444)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n};\n\nconst footerStyle = (\n isDesktop: boolean\n): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n bottom: 0,\n zIndex: 1,\n backgroundColor:\n 'var(--dauth-surface, #1a1a2e)',\n paddingBottom:\n 'max(16px, env(safe-area-inset-bottom))',\n }\n : {}),\n});\n\nconst saveBtn: React.CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n fontWeight: 600,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n transition: 'opacity 150ms, background-color 150ms',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n fontFamily: 'inherit',\n};\n\nconst spinnerStyle: React.CSSProperties = {\n display: 'inline-block',\n width: 16,\n height: 16,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: '#ffffff',\n borderRadius: '50%',\n animation: 'dauth-spin 0.6s linear infinite',\n};\n"],"mappings":"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","names":["useMemo","useEffect","useCallback","jsx","useEffect","useCallback","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/initialDauthState.ts","../src/reducer/dauth.types.ts","../src/reducer/dauth.reducer.ts","../src/api/dauth.api.ts","../src/webauthn.ts","../src/reducer/dauth.actions.ts","../src/api/utils/config.ts","../src/constants.ts","../src/api/utils/routes.ts","../src/DauthProfileModal.tsx"],"sourcesContent":["import React, {\n useReducer,\n useMemo,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport initialDauthState from './initialDauthState';\nimport userReducer from './reducer/dauth.reducer';\nimport * as action from './reducer/dauth.actions';\nimport { getClientBasePath, setDauthUrl } from './api/utils/config';\nimport { AUTH_CODE_PARAM } from './constants';\nimport { routes } from './api/utils/routes';\nimport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IDauthUser,\n IFormField,\n ICustomField,\n IModalTheme,\n IPasskeyCredential,\n DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\n ICustomField,\n IModalTheme,\n IPasskeyCredential,\n DauthProfileModalProps,\n};\n\nconst defaultOnError = (error: Error) => console.error(error);\n\nexport const DauthProvider: React.FC<IDauthProviderProps> = (\n props: IDauthProviderProps\n) => {\n const {\n domainName,\n children,\n authProxyPath = '/api/auth',\n onError,\n env,\n dauthUrl,\n } = props;\n const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);\n\n // Configure custom dauth URL before any API calls\n useEffect(() => {\n setDauthUrl(dauthUrl);\n }, [dauthUrl]);\n\n const handleError = useCallback(\n (error: Error) => (onError ?? defaultOnError)(error),\n [onError]\n );\n\n const ctx = useMemo(\n () => ({ dispatch, authProxyPath, onError: handleError }),\n [authProxyPath, handleError]\n );\n\n // On mount: exchange code or auto-login via session cookie\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const code = params.get(AUTH_CODE_PARAM);\n if (code) {\n action.exchangeCodeAction(ctx, code);\n } else {\n action.autoLoginAction(ctx);\n }\n }, []);\n\n const loginWithRedirect = useCallback(() => {\n const base = `${getClientBasePath()}/${domainName}/${routes.signin}`;\n const url = env ? `${base}?env=${encodeURIComponent(env)}` : base;\n return window.location.replace(url);\n }, [domainName, env]);\n\n const logout = useCallback(() => action.logoutAction(ctx), [ctx]);\n\n const updateUser = useCallback(\n async (fields: Partial<IDauthUser>) => {\n const {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } = fields;\n const user = {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } as Partial<IDauthUser>;\n return action.updateUserAction(ctx, user);\n },\n [ctx]\n );\n\n const deleteAccount = useCallback(\n () => action.deleteAccountAction(ctx),\n [ctx]\n );\n\n const getPasskeyCredentials = useCallback(\n () => action.getPasskeyCredentialsAction(ctx),\n [ctx]\n );\n\n const registerPasskey = useCallback(\n (name?: string) => action.registerPasskeyAction(ctx, name),\n [ctx]\n );\n\n const deletePasskeyCredential = useCallback(\n (credentialId: string) =>\n action.deletePasskeyCredentialAction(ctx, credentialId),\n [ctx]\n );\n\n const memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n }),\n [\n dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n ]\n );\n\n return (\n <DauthContext.Provider value={memoProvider}>\n {children}\n </DauthContext.Provider>\n );\n};\n\nconst DauthContext = createContext(initialDauthState);\n\nexport const useDauth = () => {\n const context = useContext(DauthContext);\n if (!context) {\n throw new Error('useDauth must be used inside DauthProvider');\n }\n return context;\n};\n","import { IDauthDomainState, IDauthState, IDauthUser } from './interfaces';\n\nconst initialDauthState: IDauthState = {\n user: {\n language:\n (typeof window !== 'undefined'\n ? window.document.documentElement.getAttribute('lang')\n : null) || 'es',\n } as IDauthUser,\n domain: {} as IDauthDomainState,\n isLoading: true,\n isAuthenticated: false,\n loginWithRedirect: () => {},\n logout: () => {},\n updateUser: () => Promise.resolve(false),\n deleteAccount: () => Promise.resolve(false),\n getPasskeyCredentials: () => Promise.resolve([]),\n registerPasskey: () => Promise.resolve(null),\n deletePasskeyCredential: () => Promise.resolve(false),\n};\n\nexport default initialDauthState;\n","export const LOGIN = 'LOGIN';\nexport const SET_IS_LOADING = 'SET_IS_LOADING';\nexport const UPDATE_USER = 'UPDATE_USER';\n","import { IDauthState } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport default function userReducer(state: IDauthState, action: any) {\n const { type, payload } = action;\n\n switch (type) {\n case DauthTypes.LOGIN: {\n const login: IDauthState = {\n ...state,\n user: payload.user,\n domain: payload.domain,\n isAuthenticated: payload.isAuthenticated,\n };\n return login;\n }\n\n case DauthTypes.SET_IS_LOADING: {\n const isLoading: IDauthState = {\n ...state,\n isLoading: payload.isLoading,\n };\n return isLoading;\n }\n\n case DauthTypes.UPDATE_USER: {\n const updateUser: IDauthState = {\n ...state,\n user: {\n ...state.user,\n ...payload,\n },\n };\n return updateUser;\n }\n\n default:\n return state;\n }\n}\n","import { IDauthUser } from '../interfaces';\nimport {\n IExchangeCodeResponse,\n ISessionResponse,\n IUpdateUserResponse,\n IDeleteAccountResponse,\n IPasskeyCredentialsResponse,\n IPasskeyRegistrationStartResponse,\n IPasskeyRegistrationFinishResponse,\n IDeletePasskeyResponse,\n} from './interfaces/dauth.api.responses';\n\nfunction getCsrfToken(): string {\n const match = document.cookie.match(\n /(?:^|;\\s*)(?:__Host-csrf|csrf-token)=([^;]*)/\n );\n if (!match?.[1]) return '';\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport async function exchangeCodeAPI(\n basePath: string,\n code: string\n): Promise<IExchangeCodeResponse> {\n const response = await fetch(`${basePath}/exchange-code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getSessionAPI(\n basePath: string\n): Promise<ISessionResponse> {\n const response = await fetch(`${basePath}/session`, {\n method: 'GET',\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function logoutAPI(\n basePath: string\n): Promise<{ response: Response }> {\n const response = await fetch(`${basePath}/logout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n });\n return { response };\n}\n\nexport async function updateUserAPI(\n basePath: string,\n user: Partial<IDauthUser>\n): Promise<IUpdateUserResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(user),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deleteAccountAPI(\n basePath: string\n): Promise<IDeleteAccountResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getPasskeyCredentialsAPI(\n basePath: string\n): Promise<IPasskeyCredentialsResponse> {\n const response = await fetch(\n `${basePath}/passkey/credentials`,\n {\n method: 'GET',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function startPasskeyRegistrationAPI(\n basePath: string\n): Promise<IPasskeyRegistrationStartResponse> {\n const response = await fetch(\n `${basePath}/passkey/register/start`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function finishPasskeyRegistrationAPI(\n basePath: string,\n body: { credential: unknown; name?: string }\n): Promise<IPasskeyRegistrationFinishResponse> {\n const response = await fetch(\n `${basePath}/passkey/register/finish`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(body),\n }\n );\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deletePasskeyCredentialAPI(\n basePath: string,\n credentialId: string\n): Promise<IDeletePasskeyResponse> {\n const response = await fetch(\n `${basePath}/passkey/credentials/${credentialId}`,\n {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n","/**\n * Minimal WebAuthn helpers for passkey registration.\n * Uses the raw Web Credentials API — no external dependencies.\n */\n\nexport function base64urlToBuffer(\n base64url: string\n): ArrayBuffer {\n const base64 = base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n const pad = base64.length % 4;\n const padded = pad ? base64 + '='.repeat(4 - pad) : base64;\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nexport function bufferToBase64url(\n buffer: ArrayBuffer\n): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Converts server-provided registration options (base64url strings)\n * into the format expected by navigator.credentials.create(),\n * executes the WebAuthn ceremony, and serializes the response\n * back to JSON with base64url-encoded ArrayBuffers.\n */\nexport async function createPasskeyCredential(\n options: Record<string, any>\n): Promise<Record<string, any>> {\n const publicKey = {\n ...options,\n challenge: base64urlToBuffer(options.challenge),\n user: {\n ...options.user,\n id: base64urlToBuffer(options.user.id),\n },\n excludeCredentials: (options.excludeCredentials ?? []).map(\n (c: any) => ({\n ...c,\n id: base64urlToBuffer(c.id),\n })\n ),\n } as PublicKeyCredentialCreationOptions;\n\n const credential = (await navigator.credentials.create({\n publicKey,\n })) as PublicKeyCredential;\n\n if (!credential) {\n throw new Error('Passkey registration was cancelled');\n }\n\n const attestation =\n credential.response as AuthenticatorAttestationResponse;\n\n return {\n id: credential.id,\n rawId: bufferToBase64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: bufferToBase64url(\n attestation.clientDataJSON\n ),\n attestationObject: bufferToBase64url(\n attestation.attestationObject\n ),\n ...(attestation.getTransports\n ? { transports: attestation.getTransports() }\n : {}),\n ...(attestation.getPublicKeyAlgorithm\n ? {\n publicKeyAlgorithm:\n attestation.getPublicKeyAlgorithm(),\n }\n : {}),\n ...(attestation.getPublicKey\n ? {\n publicKey: bufferToBase64url(\n attestation.getPublicKey()!\n ),\n }\n : {}),\n ...(attestation.getAuthenticatorData\n ? {\n authenticatorData: bufferToBase64url(\n attestation.getAuthenticatorData()\n ),\n }\n : {}),\n },\n clientExtensionResults:\n credential.getClientExtensionResults(),\n authenticatorAttachment:\n credential.authenticatorAttachment ?? undefined,\n };\n}\n","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n getPasskeyCredentialsAPI,\n startPasskeyRegistrationAPI,\n finishPasskeyRegistrationAPI,\n deletePasskeyCredentialAPI,\n} from '../api/dauth.api';\nimport type { IPasskeyCredential } from '../api/interfaces/dauth.api.responses';\nimport { createPasskeyCredential } from '../webauthn';\nimport { IDauthDomainState, IDauthUser } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport interface ActionContext {\n dispatch: React.Dispatch<any>;\n authProxyPath: string;\n onError: (error: Error) => void;\n}\n\nexport async function exchangeCodeAction(ctx: ActionContext, code: string) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n // Clean URL immediately (before any fetch)\n window.history.replaceState({}, document.title, window.location.pathname);\n const result = await exchangeCodeAPI(authProxyPath, code);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function autoLoginAction(ctx: ActionContext) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n const result = await getSessionAPI(authProxyPath);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n // No session — not authenticated (not an error)\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function logoutAction(ctx: ActionContext) {\n const { dispatch, authProxyPath } = ctx;\n try {\n await logoutAPI(authProxyPath);\n } catch {\n // Best-effort server-side logout\n }\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {\n language: window.document.documentElement.getAttribute('lang') || 'es',\n },\n domain: {},\n isAuthenticated: false,\n },\n });\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n}\n\nexport async function updateUserAction(\n ctx: ActionContext,\n user: Partial<IDauthUser>\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n if (user.language) {\n window.document.documentElement.setAttribute('lang', user.language);\n }\n try {\n const result = await updateUserAPI(authProxyPath, user);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.UPDATE_USER,\n payload: result.data.user,\n });\n return true;\n }\n onError(new Error('Update user error: ' + result.data.message));\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Update user error'));\n return false;\n }\n}\n\nexport async function deleteAccountAction(\n ctx: ActionContext\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n try {\n const result = await deleteAccountAPI(authProxyPath);\n if (result.response.status === 200) {\n resetUser(dispatch);\n return true;\n }\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Delete account error'));\n return false;\n }\n}\n\nexport async function getPasskeyCredentialsAction(\n ctx: ActionContext\n): Promise<IPasskeyCredential[]> {\n const { authProxyPath, onError } = ctx;\n try {\n const result = await getPasskeyCredentialsAPI(authProxyPath);\n if (result.response.status === 200) {\n return result.data.credentials ?? [];\n }\n return [];\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Get passkey credentials error')\n );\n return [];\n }\n}\n\nexport async function registerPasskeyAction(\n ctx: ActionContext,\n name?: string\n): Promise<IPasskeyCredential | null> {\n const { authProxyPath, onError } = ctx;\n try {\n // Step 1: Get registration options from server\n const startResult =\n await startPasskeyRegistrationAPI(authProxyPath);\n if (startResult.response.status !== 200) {\n onError(new Error('Failed to start passkey registration'));\n return null;\n }\n\n // Step 2: Execute WebAuthn ceremony in the browser\n const credential = await createPasskeyCredential(\n startResult.data\n );\n\n // Step 3: Send the credential back to the server\n const finishResult = await finishPasskeyRegistrationAPI(\n authProxyPath,\n { credential, name }\n );\n if (\n finishResult.response.status === 200 ||\n finishResult.response.status === 201\n ) {\n return finishResult.data.credential;\n }\n onError(\n new Error('Failed to finish passkey registration')\n );\n return null;\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Passkey registration error')\n );\n return null;\n }\n}\n\nexport async function deletePasskeyCredentialAction(\n ctx: ActionContext,\n credentialId: string\n): Promise<boolean> {\n const { authProxyPath, onError } = ctx;\n try {\n const result = await deletePasskeyCredentialAPI(\n authProxyPath,\n credentialId\n );\n return result.response.status === 200;\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Delete passkey error')\n );\n return false;\n }\n}\n\nexport const resetUser = (dispatch: React.Dispatch<any>) => {\n return dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {} as IDauthUser,\n domain: {} as IDauthDomainState,\n isAuthenticated: false,\n },\n });\n};\n","export const serverDomain = 'dauth.ovh';\n\nlet _dauthUrl: string | undefined;\n\nexport function setDauthUrl(url: string | undefined) {\n _dauthUrl = url?.replace(/\\/+$/, '');\n}\n\nfunction checkIsLocalhost(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n return (\n hostname === 'localhost' ||\n hostname === '[::1]' ||\n /^127(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n ) ||\n /^192\\.168(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){2}$/.test(\n hostname\n ) ||\n /^10(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n )\n );\n}\n\nexport function getClientBasePath() {\n if (_dauthUrl) return _dauthUrl;\n const isLocalhost = checkIsLocalhost();\n const clientPort = 5185;\n const clientLocalUrl = `${window.location.protocol}//${window.location.hostname}:${clientPort}`;\n const clientProdUrl = `https://${serverDomain}`;\n return isLocalhost ? clientLocalUrl : clientProdUrl;\n}\n","export const AUTH_CODE_PARAM = 'code';\n","export const routes = {\n signin: 'signin',\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDauth } from './index';\nimport type {\n DauthProfileModalProps,\n IPasskeyCredential,\n} from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\ntype Tab = 'profile' | 'security' | 'account';\n\nconst TRANSITION_MS = 200;\nconst MOBILE_TRANSITION_MS = 300;\nconst SUCCESS_TIMEOUT_MS = 4000;\nconst CONFIRM_WORD = 'DELETE';\n\n// --- Inline SVG icons ---\n\nfunction IconClose() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction IconBack() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\" />\n <polyline points=\"12 19 5 12 12 5\" />\n </svg>\n );\n}\n\nfunction IconFingerprint() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n <path d=\"M2 12a10 10 0 0 1 18-6\" />\n <path d=\"M2 16h.01\" />\n <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n <path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" />\n <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n <path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" />\n </svg>\n );\n}\n\nfunction IconShield() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n );\n}\n\nfunction IconTrash() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n );\n}\n\nfunction IconLogOut() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction IconCamera() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z\" />\n <circle cx=\"12\" cy=\"13\" r=\"3\" />\n </svg>\n );\n}\n\nfunction Spinner() {\n return <span style={spinnerStyle} aria-hidden=\"true\" />;\n}\n\n// --- Hooks ---\n\nfunction useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(\n () =>\n typeof window !== 'undefined' &&\n window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) =>\n setMatches(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [query]);\n return matches;\n}\n\nfunction useModalAnimation(open: boolean): Phase {\n const [phase, setPhase] = useState<Phase>('exited');\n\n useEffect(() => {\n if (open) {\n setPhase('entering');\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('entered'));\n });\n return () => cancelAnimationFrame(raf);\n }\n if (phase === 'entered' || phase === 'entering') {\n setPhase('exiting');\n const timer = setTimeout(\n () => setPhase('exited'),\n MOBILE_TRANSITION_MS\n );\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [open]);\n\n return phase;\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n onEscape: () => void\n) {\n const previousFocus = useRef<Element | null>(null);\n\n useEffect(() => {\n if (!active) return;\n previousFocus.current = document.activeElement;\n\n const container = containerRef.current;\n if (!container) return;\n\n const focusFirst = () => {\n const firstInput = container.querySelector<HTMLElement>(\n 'input:not([disabled])'\n );\n (firstInput ?? container).focus();\n };\n const raf = requestAnimationFrame(focusFirst);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onEscape();\n return;\n }\n if (e.key !== 'Tab') return;\n const focusable =\n container.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (\n !e.shiftKey &&\n document.activeElement === last\n ) {\n e.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n cancelAnimationFrame(raf);\n document.removeEventListener('keydown', handleKeyDown);\n if (previousFocus.current instanceof HTMLElement) {\n previousFocus.current.focus();\n }\n };\n }, [active, containerRef, onEscape]);\n}\n\nfunction useScrollLock(active: boolean) {\n useEffect(() => {\n if (!active) return;\n const scrollbarWidth =\n window.innerWidth -\n document.documentElement.clientWidth;\n const prevOverflow = document.body.style.overflow;\n const prevPaddingRight = document.body.style.paddingRight;\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n return () => {\n document.body.style.overflow = prevOverflow;\n document.body.style.paddingRight = prevPaddingRight;\n };\n }, [active]);\n}\n\n// --- Component ---\n\nexport function DauthProfileModal({\n open,\n onClose,\n onAvatarUpload,\n}: DauthProfileModalProps) {\n const {\n user,\n domain,\n updateUser,\n deleteAccount,\n logout,\n getPasskeyCredentials,\n registerPasskey,\n deletePasskeyCredential,\n } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n const avatarInputRef = useRef<HTMLInputElement>(null);\n\n // Tab state\n const showSecurity = domain.authMethods?.passkey === true;\n const [activeTab, setActiveTab] = useState<Tab>('profile');\n\n // Profile form state\n const [name, setName] = useState('');\n const [lastname, setLastname] = useState('');\n const [nickname, setNickname] = useState('');\n const [country, setCountry] = useState('');\n const [telPrefix, setTelPrefix] = useState('');\n const [telSuffix, setTelSuffix] = useState('');\n const [birthDate, setBirthDate] = useState('');\n const [customFieldValues, setCustomFieldValues] = useState<\n Record<string, string>\n >({});\n const [populated, setPopulated] = useState(false);\n\n // Status\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Delete\n const [showDelete, setShowDelete] = useState(false);\n const [deleteText, setDeleteText] = useState('');\n const [deleting, setDeleting] = useState(false);\n\n // Passkey state\n const [credentials, setCredentials] = useState<\n IPasskeyCredential[]\n >([]);\n const [loadingCreds, setLoadingCreds] = useState(false);\n const [showRegister, setShowRegister] = useState(false);\n const [passkeyName, setPasskeyName] = useState('');\n const [registering, setRegistering] = useState(false);\n const [passkeyStatus, setPasskeyStatus] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Avatar upload state\n const [uploadingAvatar, setUploadingAvatar] =\n useState(false);\n\n // Populate form when modal opens\n useEffect(() => {\n if (open && user?._id && !populated) {\n setName(user.name || '');\n setLastname(user.lastname || '');\n setNickname(user.nickname || '');\n setCountry(user.country || '');\n setTelPrefix(user.telPrefix || '');\n setTelSuffix(user.telSuffix || '');\n setBirthDate(\n user.birthDate\n ? new Date(user.birthDate)\n .toISOString()\n .split('T')[0]\n : ''\n );\n const cf: Record<string, string> = {};\n for (const f of domain.customFields ?? []) {\n cf[f.key] = user.customFields?.[f.key] ?? '';\n }\n setCustomFieldValues(cf);\n setPopulated(true);\n }\n if (!open) {\n setPopulated(false);\n setStatus(null);\n setShowDelete(false);\n setDeleteText('');\n setActiveTab('profile');\n setPasskeyStatus(null);\n setShowRegister(false);\n setPasskeyName('');\n }\n }, [open, user, populated]);\n\n // Fetch passkey credentials when Security tab is active\n useEffect(() => {\n if (activeTab !== 'security' || !showSecurity) return;\n setLoadingCreds(true);\n getPasskeyCredentials().then((creds) => {\n setCredentials(creds);\n setLoadingCreds(false);\n });\n }, [activeTab, showSecurity, getPasskeyCredentials]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(\n () => setStatus(null),\n SUCCESS_TIMEOUT_MS\n );\n return () => clearTimeout(timer);\n }, [status]);\n\n useEffect(() => {\n if (passkeyStatus?.type !== 'success') return;\n const timer = setTimeout(\n () => setPasskeyStatus(null),\n SUCCESS_TIMEOUT_MS\n );\n return () => clearTimeout(timer);\n }, [passkeyStatus]);\n\n useFocusTrap(modalRef, phase === 'entered', onClose);\n useScrollLock(phase !== 'exited');\n\n const hasField = useCallback(\n (field: string) =>\n domain.formFields?.some((f) => f.field === field) ??\n false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)\n ?.required ?? false,\n [domain.formFields]\n );\n\n const hasChanges = useMemo(() => {\n if (!user?._id) return false;\n const origBirthDate = user.birthDate\n ? new Date(user.birthDate).toISOString().split('T')[0]\n : '';\n const cfChanged = (domain.customFields ?? []).some(\n (f) =>\n (customFieldValues[f.key] ?? '') !==\n (user.customFields?.[f.key] ?? '')\n );\n return (\n name !== (user.name || '') ||\n lastname !== (user.lastname || '') ||\n nickname !== (user.nickname || '') ||\n country !== (user.country || '') ||\n telPrefix !== (user.telPrefix || '') ||\n telSuffix !== (user.telSuffix || '') ||\n birthDate !== origBirthDate ||\n cfChanged\n );\n }, [\n name,\n lastname,\n nickname,\n country,\n telPrefix,\n telSuffix,\n birthDate,\n customFieldValues,\n user,\n domain.customFields,\n ]);\n\n const canSave =\n name.trim().length > 0 && hasChanges && !saving;\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setStatus(null);\n const fields: Record<string, any> = { name };\n if (hasField('lastname')) fields.lastname = lastname;\n if (hasField('nickname')) fields.nickname = nickname;\n if (hasField('country')) fields.country = country;\n if (hasField('tel_prefix'))\n fields.telPrefix = telPrefix;\n if (hasField('tel_suffix'))\n fields.telSuffix = telSuffix;\n if (hasField('birth_date') && birthDate)\n fields.birthDate = birthDate;\n if ((domain.customFields ?? []).length > 0)\n fields.customFields = customFieldValues;\n const ok = await updateUser(fields);\n setSaving(false);\n if (ok) {\n setStatus({\n type: 'success',\n message: 'Profile updated successfully',\n });\n } else {\n setStatus({\n type: 'error',\n message: 'Something went wrong. Please try again.',\n });\n }\n }, [\n name,\n lastname,\n nickname,\n country,\n telPrefix,\n telSuffix,\n birthDate,\n customFieldValues,\n hasField,\n updateUser,\n domain.customFields,\n ]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n const ok = await deleteAccount();\n setDeleting(false);\n if (ok) {\n onClose();\n } else {\n setStatus({\n type: 'error',\n message:\n 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, onClose]);\n\n const handleLanguage = useCallback(\n async (lang: string) => {\n await updateUser({ language: lang } as any);\n },\n [updateUser]\n );\n\n const handleRegisterPasskey = useCallback(async () => {\n setRegistering(true);\n setPasskeyStatus(null);\n const cred = await registerPasskey(\n passkeyName || undefined\n );\n setRegistering(false);\n if (cred) {\n setCredentials((prev) => [...prev, cred]);\n setPasskeyName('');\n setShowRegister(false);\n setPasskeyStatus({\n type: 'success',\n message: 'Passkey registered successfully',\n });\n } else {\n setPasskeyStatus({\n type: 'error',\n message: 'Failed to register passkey',\n });\n }\n }, [passkeyName, registerPasskey]);\n\n const handleDeletePasskey = useCallback(\n async (credentialId: string) => {\n const ok = await deletePasskeyCredential(credentialId);\n if (ok) {\n setCredentials((prev) =>\n prev.filter((c) => c._id !== credentialId)\n );\n }\n },\n [deletePasskeyCredential]\n );\n\n const handleAvatarClick = useCallback(() => {\n if (onAvatarUpload) {\n avatarInputRef.current?.click();\n }\n }, [onAvatarUpload]);\n\n const handleAvatarChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onAvatarUpload) return;\n setUploadingAvatar(true);\n try {\n const url = await onAvatarUpload(file);\n if (url) {\n await updateUser({ avatar: url } as any);\n }\n } catch {\n // Error handled by onError callback\n }\n setUploadingAvatar(false);\n if (avatarInputRef.current) {\n avatarInputRef.current.value = '';\n }\n },\n [onAvatarUpload, updateUser]\n );\n\n const handleSignOut = useCallback(() => {\n logout();\n onClose();\n }, [logout, onClose]);\n\n // Build CSS custom property overrides from domain.modalTheme\n const themeVars = useMemo(() => {\n const t = domain.modalTheme;\n if (!t) return {};\n const vars: Record<string, string> = {};\n if (t.accent) vars['--dauth-accent'] = t.accent;\n if (t.accentHover)\n vars['--dauth-accent-hover'] = t.accentHover;\n if (t.surface) vars['--dauth-surface'] = t.surface;\n if (t.surfaceHover)\n vars['--dauth-surface-hover'] = t.surfaceHover;\n if (t.textPrimary)\n vars['--dauth-text-primary'] = t.textPrimary;\n if (t.textSecondary)\n vars['--dauth-text-secondary'] = t.textSecondary;\n if (t.border) vars['--dauth-border'] = t.border;\n return vars;\n }, [domain.modalTheme]);\n\n if (phase === 'exited') return null;\n\n const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;\n const easing = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n const backdrop: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: 2147483647,\n backgroundColor:\n 'var(--dauth-backdrop, rgba(0, 0, 0, 0.6))',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: phase === 'entered' ? 1 : 0,\n transition: `opacity ${dur}ms ease-out`,\n };\n\n const modalDesktop: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: 480,\n maxHeight: '90vh',\n margin: 16,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n borderRadius: 'var(--dauth-radius, 12px)',\n boxShadow:\n 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n opacity: phase === 'entered' ? 1 : 0,\n transform:\n phase === 'entered'\n ? 'translateY(0)'\n : 'translateY(16px)',\n transition: `opacity ${dur}ms ${easing}, transform ${dur}ms ${easing}`,\n };\n\n const modalMobile: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n transform:\n phase === 'entered'\n ? 'translateY(0)'\n : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n const tabs: { key: Tab; label: string }[] = [\n { key: 'profile', label: 'Profile' },\n ...(showSecurity\n ? [{ key: 'security' as Tab, label: 'Security' }]\n : []),\n { key: 'account', label: 'Account' },\n ];\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html:\n '@keyframes dauth-spin{to{transform:rotate(360deg)}}',\n }}\n />\n <div\n style={{ ...backdrop, ...themeVars }}\n onClick={isDesktop ? onClose : undefined}\n data-testid=\"dauth-profile-backdrop\"\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dauth-profile-title\"\n style={isDesktop ? modalDesktop : modalMobile}\n onClick={(e) => e.stopPropagation()}\n tabIndex={-1}\n >\n {/* Header */}\n <div style={headerStyle(isDesktop)}>\n <button\n type=\"button\"\n onClick={onClose}\n style={closeBtn}\n aria-label=\"Close\"\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n {isDesktop ? <IconClose /> : <IconBack />}\n </button>\n <h2 id=\"dauth-profile-title\" style={titleStyle}>\n Your Profile\n </h2>\n <div style={{ width: 36 }} />\n </div>\n\n {/* Tab bar */}\n <div style={tabBar} role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t.key}\n role=\"tab\"\n type=\"button\"\n aria-selected={activeTab === t.key}\n style={{\n ...tabBtn,\n color:\n activeTab === t.key\n ? 'var(--dauth-accent, #6366f1)'\n : 'var(--dauth-text-secondary, #a1a1aa)',\n borderBottomColor:\n activeTab === t.key\n ? 'var(--dauth-accent, #6366f1)'\n : 'transparent',\n }}\n onClick={() => setActiveTab(t.key)}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* ========== PROFILE TAB ========== */}\n {activeTab === 'profile' && (\n <>\n {/* Avatar */}\n <div style={avatarSection}>\n <div\n style={{\n ...avatarCircle,\n cursor: onAvatarUpload\n ? 'pointer'\n : 'default',\n position: 'relative' as const,\n }}\n onClick={handleAvatarClick}\n >\n {uploadingAvatar ? (\n <Spinner />\n ) : user.avatar?.url ? (\n <img\n src={user.avatar.url}\n alt=\"\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }}\n />\n ) : (\n avatarInitial\n )}\n {onAvatarUpload && !uploadingAvatar && (\n <div style={avatarOverlay}>\n <IconCamera />\n </div>\n )}\n </div>\n <div style={emailText}>{user.email}</div>\n {onAvatarUpload && (\n <input\n ref={avatarInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleAvatarChange}\n />\n )}\n </div>\n\n {/* Status */}\n {status && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={statusMsg(status.type)}\n >\n {status.message}\n </div>\n )}\n\n {/* Form */}\n <div>\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-name\"\n style={label}\n >\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) =>\n setName(e.target.value)\n }\n placeholder=\"Your name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n\n {hasField('lastname') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-lastname\"\n style={label}\n >\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) =>\n setLastname(e.target.value)\n }\n placeholder=\"Your last name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('nickname') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-nickname\"\n style={label}\n >\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) =>\n setNickname(e.target.value)\n }\n placeholder=\"Choose a nickname\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('country') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-country\"\n style={label}\n >\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) =>\n setCountry(e.target.value)\n }\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {(hasField('tel_prefix') ||\n hasField('tel_suffix')) && (\n <div style={fieldGroup}>\n <div style={label}>\n Phone\n {isRequired('tel_prefix') ||\n isRequired('tel_suffix')\n ? ' *'\n : ''}\n </div>\n <div\n style={{\n display: 'flex',\n gap: 8,\n }}\n >\n {hasField('tel_prefix') && (\n <input\n id=\"dauth-tel-prefix\"\n type=\"text\"\n value={telPrefix}\n onChange={(e) =>\n setTelPrefix(e.target.value)\n }\n placeholder=\"+34\"\n disabled={saving}\n style={{\n ...input,\n width: 80,\n flexShrink: 0,\n }}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n aria-label=\"Phone prefix\"\n />\n )}\n {hasField('tel_suffix') && (\n <input\n id=\"dauth-tel-suffix\"\n type=\"tel\"\n value={telSuffix}\n onChange={(e) =>\n setTelSuffix(e.target.value)\n }\n placeholder=\"612 345 678\"\n disabled={saving}\n style={{\n ...input,\n flex: 1,\n }}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n aria-label=\"Phone number\"\n />\n )}\n </div>\n </div>\n )}\n\n {hasField('birth_date') && (\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-birthdate\"\n style={label}\n >\n Birth date\n {isRequired('birth_date')\n ? ' *'\n : ''}\n </label>\n <input\n id=\"dauth-birthdate\"\n type=\"date\"\n value={birthDate}\n onChange={(e) =>\n setBirthDate(e.target.value)\n }\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {(domain.customFields ?? []).length >\n 0 && (\n <>\n <hr style={separator} />\n {domain.customFields!.map((cf) => (\n <div\n key={cf.key}\n style={fieldGroup}\n >\n <label\n htmlFor={`dauth-cf-${cf.key}`}\n style={label}\n >\n {cf.label}\n {cf.required ? ' *' : ''}\n </label>\n <input\n id={`dauth-cf-${cf.key}`}\n type=\"text\"\n value={\n customFieldValues[cf.key] ??\n ''\n }\n onChange={(e) =>\n setCustomFieldValues(\n (prev) => ({\n ...prev,\n [cf.key]:\n e.target.value,\n })\n )\n }\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n ))}\n </>\n )}\n </div>\n\n {/* Language selector */}\n <hr style={separator} />\n <div style={fieldGroup}>\n <div style={label}>Language</div>\n <div style={{ display: 'flex', gap: 8 }}>\n {(['es', 'en'] as const).map((lang) => (\n <button\n key={lang}\n type=\"button\"\n style={{\n ...langBtn,\n backgroundColor:\n user.language === lang\n ? 'var(--dauth-accent, #6366f1)'\n : 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n color:\n user.language === lang\n ? '#ffffff'\n : 'var(--dauth-text-secondary, #a1a1aa)',\n }}\n onClick={() => handleLanguage(lang)}\n >\n {lang === 'es'\n ? 'Espa\\u00f1ol'\n : 'English'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* ========== SECURITY TAB ========== */}\n {activeTab === 'security' && showSecurity && (\n <>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 16,\n }}\n >\n <div\n style={{\n ...label,\n marginBottom: 0,\n fontWeight: 600,\n }}\n >\n Passkeys\n </div>\n <button\n type=\"button\"\n style={outlineBtn}\n onClick={() =>\n setShowRegister(!showRegister)\n }\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n + Add passkey\n </button>\n </div>\n\n {/* Register passkey form */}\n {showRegister && (\n <div style={registerPanel}>\n <div style={fieldGroup}>\n <label\n htmlFor=\"dauth-passkey-name\"\n style={label}\n >\n Passkey name (optional)\n </label>\n <input\n id=\"dauth-passkey-name\"\n type=\"text\"\n value={passkeyName}\n onChange={(e) =>\n setPasskeyName(e.target.value)\n }\n placeholder=\"e.g. MacBook Touch ID\"\n disabled={registering}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n <div\n style={{\n display: 'flex',\n gap: 8,\n }}\n >\n <button\n type=\"button\"\n style={{\n ...smallAccentBtn,\n opacity: registering ? 0.6 : 1,\n }}\n disabled={registering}\n onClick={handleRegisterPasskey}\n >\n {registering ? (\n <Spinner />\n ) : (\n <IconFingerprint />\n )}\n {registering\n ? 'Registering...'\n : 'Register'}\n </button>\n <button\n type=\"button\"\n style={cancelBtn}\n onClick={() =>\n setShowRegister(false)\n }\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {/* Passkey status */}\n {passkeyStatus && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{\n ...statusMsg(passkeyStatus.type),\n marginTop: 12,\n }}\n >\n {passkeyStatus.message}\n </div>\n )}\n\n {/* Credentials list */}\n <div style={{ marginTop: 12 }}>\n {loadingCreds ? (\n <div\n style={{\n textAlign: 'center',\n padding: 24,\n }}\n >\n <Spinner />\n </div>\n ) : credentials.length > 0 ? (\n credentials.map((cred) => (\n <div\n key={cred._id}\n style={credentialRow}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n flex: 1,\n minWidth: 0,\n }}\n >\n <span\n style={{\n color:\n 'var(--dauth-accent, #6366f1)',\n flexShrink: 0,\n }}\n >\n <IconFingerprint />\n </span>\n <div\n style={{\n minWidth: 0,\n flex: 1,\n }}\n >\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color:\n 'var(--dauth-text-primary, #e4e4e7)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace:\n 'nowrap' as const,\n }}\n >\n {cred.name || 'Passkey'}\n </div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-xs, 0.75rem)',\n color:\n 'var(--dauth-text-muted, #71717a)',\n }}\n >\n {cred.deviceType ===\n 'multiDevice'\n ? 'Synced'\n : 'Device-bound'}\n {cred.createdAt &&\n ` \\u00b7 Created ${new Date(cred.createdAt).toLocaleDateString()}`}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n handleDeletePasskey(cred._id)\n }\n style={trashBtn}\n onMouseEnter={(e) =>\n (e.currentTarget.style.color =\n 'var(--dauth-error, #ef4444)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.color =\n 'var(--dauth-text-muted, #71717a)')\n }\n aria-label={`Delete passkey ${cred.name || ''}`}\n >\n <IconTrash />\n </button>\n </div>\n ))\n ) : (\n <div style={emptyState}>\n <span\n style={{\n color:\n 'var(--dauth-accent, #6366f1)',\n }}\n >\n <IconShield />\n </span>\n <div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color:\n 'var(--dauth-text-primary, #e4e4e7)',\n }}\n >\n No passkeys registered\n </div>\n <div\n style={{\n fontSize:\n 'var(--dauth-font-size-xs, 0.75rem)',\n color:\n 'var(--dauth-text-secondary, #a1a1aa)',\n }}\n >\n Add a passkey for faster, more\n secure sign-in.\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ========== ACCOUNT TAB ========== */}\n {activeTab === 'account' && (\n <>\n {/* Status (shared) */}\n {status && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={statusMsg(status.type)}\n >\n {status.message}\n </div>\n )}\n\n {/* Delete account */}\n <div>\n <div style={dangerTitle}>\n Delete account\n </div>\n <div style={dangerDesc}>\n Permanently delete your account and all\n associated data.\n </div>\n {!showDelete ? (\n <button\n type=\"button\"\n style={deleteBtn}\n onClick={() => setShowDelete(true)}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'rgba(239, 68, 68, 0.2)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))')\n }\n >\n Delete account\n </button>\n ) : (\n <div style={deletePanel}>\n <div style={deletePanelText}>\n This action is permanent and cannot\n be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to\n confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) =>\n setDeleteText(e.target.value)\n }\n placeholder={`Type ${CONFIRM_WORD}`}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n disabled={deleting}\n />\n <div\n style={{\n display: 'flex',\n gap: 8,\n marginTop: 12,\n }}\n >\n <button\n type=\"button\"\n style={cancelBtn}\n onClick={() => {\n setShowDelete(false);\n setDeleteText('');\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD ||\n deleting\n ? 0.5\n : 1,\n cursor:\n deleteText !== CONFIRM_WORD ||\n deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={\n deleteText !== CONFIRM_WORD ||\n deleting\n }\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Sign out */}\n <hr style={separator} />\n <button\n type=\"button\"\n style={signOutBtn}\n onClick={handleSignOut}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'rgba(239, 68, 68, 0.2)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))')\n }\n >\n <IconLogOut />\n Sign out\n </button>\n </>\n )}\n </div>\n\n {/* Footer — only for Profile tab */}\n {activeTab === 'profile' && (\n <div style={footerStyle(isDesktop)}>\n <button\n type=\"button\"\n style={{\n ...saveBtn,\n opacity: canSave ? 1 : 0.5,\n cursor: canSave ? 'pointer' : 'not-allowed',\n }}\n disabled={!canSave}\n onClick={handleSave}\n aria-busy={saving}\n onMouseEnter={(e) => {\n if (canSave)\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent-hover, #818cf8)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent, #6366f1)';\n }}\n >\n {saving && <Spinner />}\n {saving ? 'Saving...' : 'Save changes'}\n </button>\n </div>\n )}\n </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (\n isDesktop: boolean\n): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px 0',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor:\n 'var(--dauth-surface, #1a1a2e)',\n }\n : {}),\n});\n\nconst titleStyle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-lg, 1.25rem)',\n fontWeight: 600,\n margin: 0,\n lineHeight: 1.4,\n textAlign: 'center',\n flex: 1,\n};\n\nconst closeBtn: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n cursor: 'pointer',\n transition: 'background-color 150ms, color 150ms',\n padding: 0,\n};\n\nconst tabBar: React.CSSProperties = {\n display: 'flex',\n padding: '0 24px',\n borderBottom:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n};\n\nconst tabBtn: React.CSSProperties = {\n flex: 1,\n padding: '12px 4px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n border: 'none',\n borderBottom: '2px solid transparent',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n transition: 'color 150ms, border-color 150ms',\n fontFamily: 'inherit',\n textAlign: 'center',\n};\n\nconst bodyStyle: React.CSSProperties = {\n flex: 1,\n overflowY: 'auto',\n padding: 24,\n WebkitOverflowScrolling: 'touch',\n};\n\nconst avatarSection: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: 24,\n gap: 8,\n};\n\nconst avatarCircle: React.CSSProperties = {\n width: 64,\n height: 64,\n borderRadius: '50%',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n color: '#ffffff',\n fontSize: '1.5rem',\n fontWeight: 600,\n};\n\nconst avatarOverlay: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n opacity: 0.7,\n transition: 'opacity 150ms',\n color: '#ffffff',\n};\n\nconst emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (\n type: 'success' | 'error'\n): React.CSSProperties => ({\n padding: '10px 14px',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n marginBottom: 16,\n backgroundColor:\n type === 'success'\n ? 'var(--dauth-success-bg, rgba(34, 197, 94, 0.1))'\n : 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n color:\n type === 'success'\n ? 'var(--dauth-success, #22c55e)'\n : 'var(--dauth-error, #ef4444)',\n textAlign: 'center',\n lineHeight: 1.5,\n});\n\nconst fieldGroup: React.CSSProperties = {\n marginBottom: 16,\n};\n\nconst label: React.CSSProperties = {\n display: 'block',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 6,\n};\n\nconst input: React.CSSProperties = {\n width: '100%',\n padding: '10px 14px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n lineHeight: 1.5,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-input, 8px)',\n outline: 'none',\n transition: 'border-color 150ms, box-shadow 150ms',\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n};\n\nconst inputFocusHandler = (\n e: React.FocusEvent<HTMLInputElement>\n) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow =\n '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (\n e: React.FocusEvent<HTMLInputElement>\n) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst langBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms, color 150ms',\n fontFamily: 'inherit',\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor:\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\n};\n\nconst outlineBtn: React.CSSProperties = {\n padding: '6px 12px',\n fontSize: 'var(--dauth-font-size-xs, 0.75rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n backgroundColor: 'transparent',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst registerPanel: React.CSSProperties = {\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n marginBottom: 12,\n};\n\nconst smallAccentBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'opacity 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n};\n\nconst credentialRow: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 12,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n marginBottom: 8,\n};\n\nconst trashBtn: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--dauth-text-muted, #71717a)',\n cursor: 'pointer',\n transition: 'color 150ms',\n padding: 0,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n flexShrink: 0,\n};\n\nconst emptyState: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n backgroundColor:\n 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n};\n\nconst dangerTitle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 600,\n color: 'var(--dauth-error, #ef4444)',\n marginBottom: 4,\n};\n\nconst dangerDesc: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-xs, 0.75rem)',\n color: 'var(--dauth-text-muted, #71717a)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst deleteBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-error, #ef4444)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms, border-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deletePanel: React.CSSProperties = {\n marginTop: 12,\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n};\n\nconst deletePanelText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst cancelBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n backgroundColor: 'transparent',\n border:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deleteConfirmBtn: React.CSSProperties = {\n flex: 1,\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-error, #ef4444)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'opacity 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n};\n\nconst signOutBtn: React.CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n fontWeight: 500,\n color: 'var(--dauth-error, #ef4444)',\n backgroundColor:\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n};\n\nconst footerStyle = (\n isDesktop: boolean\n): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop:\n '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n bottom: 0,\n zIndex: 1,\n backgroundColor:\n 'var(--dauth-surface, #1a1a2e)',\n paddingBottom:\n 'max(16px, env(safe-area-inset-bottom))',\n }\n : {}),\n});\n\nconst saveBtn: React.CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n fontWeight: 600,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n transition: 'opacity 150ms, background-color 150ms',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n fontFamily: 'inherit',\n};\n\nconst spinnerStyle: React.CSSProperties = {\n display: 'inline-block',\n width: 16,\n height: 16,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: '#ffffff',\n borderRadius: '50%',\n animation: 'dauth-spin 0.6s linear infinite',\n};\n"],"mappings":"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","names":["useMemo","useEffect","useCallback","jsx","useEffect","useCallback","useMemo"]}
|