dauth-context-react 6.0.0 → 6.1.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 CHANGED
@@ -34,6 +34,15 @@ interface IFormField {
34
34
  field: string;
35
35
  required: boolean;
36
36
  }
37
+ interface IModalTheme {
38
+ accent?: string;
39
+ accentHover?: string;
40
+ surface?: string;
41
+ surfaceHover?: string;
42
+ textPrimary?: string;
43
+ textSecondary?: string;
44
+ border?: string;
45
+ }
37
46
  interface IDauthDomainState {
38
47
  name: string;
39
48
  environments?: IDauthDomainEnvironment[];
@@ -41,6 +50,7 @@ interface IDauthDomainState {
41
50
  allowedOrigins: string[];
42
51
  authMethods?: IDauthAuthMethods;
43
52
  formFields?: IFormField[];
53
+ modalTheme?: IModalTheme;
44
54
  }
45
55
  interface IDauthState {
46
56
  user: IDauthUser;
@@ -72,4 +82,4 @@ declare function DauthProfileModal({ open, onClose }: DauthProfileModalProps): R
72
82
  declare const DauthProvider: React$1.FC<IDauthProviderProps>;
73
83
  declare const useDauth: () => IDauthState;
74
84
 
75
- export { DauthProfileModal, type DauthProfileModalProps, DauthProvider, type IDauthAuthMethods, type IDauthProviderProps, type IFormField, useDauth };
85
+ export { DauthProfileModal, type DauthProfileModalProps, DauthProvider, type IDauthAuthMethods, type IDauthProviderProps, type IFormField, type IModalTheme, useDauth };
package/dist/index.d.ts CHANGED
@@ -34,6 +34,15 @@ interface IFormField {
34
34
  field: string;
35
35
  required: boolean;
36
36
  }
37
+ interface IModalTheme {
38
+ accent?: string;
39
+ accentHover?: string;
40
+ surface?: string;
41
+ surfaceHover?: string;
42
+ textPrimary?: string;
43
+ textSecondary?: string;
44
+ border?: string;
45
+ }
37
46
  interface IDauthDomainState {
38
47
  name: string;
39
48
  environments?: IDauthDomainEnvironment[];
@@ -41,6 +50,7 @@ interface IDauthDomainState {
41
50
  allowedOrigins: string[];
42
51
  authMethods?: IDauthAuthMethods;
43
52
  formFields?: IFormField[];
53
+ modalTheme?: IModalTheme;
44
54
  }
45
55
  interface IDauthState {
46
56
  user: IDauthUser;
@@ -72,4 +82,4 @@ declare function DauthProfileModal({ open, onClose }: DauthProfileModalProps): R
72
82
  declare const DauthProvider: React$1.FC<IDauthProviderProps>;
73
83
  declare const useDauth: () => IDauthState;
74
84
 
75
- export { DauthProfileModal, type DauthProfileModalProps, DauthProvider, type IDauthAuthMethods, type IDauthProviderProps, type IFormField, useDauth };
85
+ export { DauthProfileModal, type DauthProfileModalProps, DauthProvider, type IDauthAuthMethods, type IDauthProviderProps, type IFormField, type IModalTheme, useDauth };
package/dist/index.js CHANGED
@@ -542,6 +542,19 @@ function DauthProfileModal({ open, onClose }) {
542
542
  setDeleteText("");
543
543
  }
544
544
  }, [deleteAccount, onClose]);
545
+ const themeVars = (0, import_react.useMemo)(() => {
546
+ const t = domain.modalTheme;
547
+ if (!t) return {};
548
+ const vars = {};
549
+ if (t.accent) vars["--dauth-accent"] = t.accent;
550
+ if (t.accentHover) vars["--dauth-accent-hover"] = t.accentHover;
551
+ if (t.surface) vars["--dauth-surface"] = t.surface;
552
+ if (t.surfaceHover) vars["--dauth-surface-hover"] = t.surfaceHover;
553
+ if (t.textPrimary) vars["--dauth-text-primary"] = t.textPrimary;
554
+ if (t.textSecondary) vars["--dauth-text-secondary"] = t.textSecondary;
555
+ if (t.border) vars["--dauth-border"] = t.border;
556
+ return vars;
557
+ }, [domain.modalTheme]);
545
558
  if (phase === "exited") return null;
546
559
  const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;
547
560
  const easing = "cubic-bezier(0.16, 1, 0.3, 1)";
@@ -602,7 +615,7 @@ function DauthProfileModal({ open, onClose }) {
602
615
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
603
616
  "div",
604
617
  {
605
- style: backdrop,
618
+ style: { ...backdrop, ...themeVars },
606
619
  onClick: isDesktop ? onClose : void 0,
607
620
  "data-testid": "dauth-profile-backdrop",
608
621
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
package/dist/index.js.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/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 DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\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 memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n }),\n [dauthState, loginWithRedirect, logout, updateUser, deleteAccount]\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};\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} 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","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n} from '../api/dauth.api';\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 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 { DauthProfileModalProps } from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\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 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 () => typeof window !== 'undefined' && window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => 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(() => setPhase('exited'), MOBILE_TRANSITION_MS);\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 // Small delay to let the portal render\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 = 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 (!e.shiftKey && document.activeElement === last) {\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 - 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({ open, onClose }: DauthProfileModalProps) {\n const { user, domain, updateUser, deleteAccount } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // 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 // 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 }\n }, [open, user, populated]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(() => setStatus(null), SUCCESS_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [status]);\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) ?? false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)?.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 = 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: 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, onClose]);\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: '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: 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border: '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: phase === 'entered' ? 'translateY(0)' : '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: phase === 'entered' ? 'translateY(0)' : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: '@keyframes dauth-spin{to{transform:rotate(360deg)}}',\n }}\n />\n <div\n style={backdrop}\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 = '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 {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* Avatar */}\n <div style={avatarSection}>\n <div style={avatarCircle}>\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 </div>\n <div style={emailText}>{user.email}</div>\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 htmlFor=\"dauth-name\" style={label}>\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\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 htmlFor=\"dauth-lastname\" style={label}>\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) => setLastname(e.target.value)}\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 htmlFor=\"dauth-nickname\" style={label}>\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\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 htmlFor=\"dauth-country\" style={label}>\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Danger zone */}\n <hr style={separator} />\n <div>\n <div style={dangerTitle}>Delete account</div>\n <div style={dangerDesc}>\n Permanently delete your account and all 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 be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) => setDeleteText(e.target.value)}\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 = 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD || deleting ? 0.5 : 1,\n cursor:\n deleteText !== CONFIRM_WORD || deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={deleteText !== CONFIRM_WORD || deleting}\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\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 </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (isDesktop: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n borderBottom: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor: '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 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 emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (type: 'success' | 'error'): 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 = { marginBottom: 16 };\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: 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border: '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 = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor: 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\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: '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: '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 flex: 1,\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: '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 footerStyle = (isDesktop: boolean): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop: '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: 'var(--dauth-surface, #1a1a2e)',\n paddingBottom: '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":["import_react","import_jsx_runtime"]}
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/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 DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\n IModalTheme,\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 memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n }),\n [dauthState, loginWithRedirect, logout, updateUser, deleteAccount]\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};\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} 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","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n} from '../api/dauth.api';\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 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 { DauthProfileModalProps } from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\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 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 () => typeof window !== 'undefined' && window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => 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(() => setPhase('exited'), MOBILE_TRANSITION_MS);\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 // Small delay to let the portal render\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 = 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 (!e.shiftKey && document.activeElement === last) {\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 - 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({ open, onClose }: DauthProfileModalProps) {\n const { user, domain, updateUser, deleteAccount } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // 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 // 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 }\n }, [open, user, populated]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(() => setStatus(null), SUCCESS_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [status]);\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) ?? false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)?.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 = 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: 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, 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) vars['--dauth-accent-hover'] = t.accentHover;\n if (t.surface) vars['--dauth-surface'] = t.surface;\n if (t.surfaceHover) vars['--dauth-surface-hover'] = t.surfaceHover;\n if (t.textPrimary) vars['--dauth-text-primary'] = t.textPrimary;\n if (t.textSecondary) 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: '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: 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border: '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: phase === 'entered' ? 'translateY(0)' : '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: phase === 'entered' ? 'translateY(0)' : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: '@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 = '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 {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* Avatar */}\n <div style={avatarSection}>\n <div style={avatarCircle}>\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 </div>\n <div style={emailText}>{user.email}</div>\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 htmlFor=\"dauth-name\" style={label}>\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\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 htmlFor=\"dauth-lastname\" style={label}>\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) => setLastname(e.target.value)}\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 htmlFor=\"dauth-nickname\" style={label}>\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\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 htmlFor=\"dauth-country\" style={label}>\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Danger zone */}\n <hr style={separator} />\n <div>\n <div style={dangerTitle}>Delete account</div>\n <div style={dangerDesc}>\n Permanently delete your account and all 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 be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) => setDeleteText(e.target.value)}\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 = 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD || deleting ? 0.5 : 1,\n cursor:\n deleteText !== CONFIRM_WORD || deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={deleteText !== CONFIRM_WORD || deleting}\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\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 </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (isDesktop: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n borderBottom: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor: '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 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 emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (type: 'success' | 'error'): 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 = { marginBottom: 16 };\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: 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border: '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 = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor: 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\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: '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: '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 flex: 1,\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: '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 footerStyle = (isDesktop: boolean): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop: '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: 'var(--dauth-surface, #1a1a2e)',\n paddingBottom: '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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAOO;;;ACLP,IAAM,oBAAiC;AAAA,EACrC,MAAM;AAAA,IACJ,WACG,OAAO,WAAW,cACf,OAAO,SAAS,gBAAgB,aAAa,MAAM,IACnD,SAAS;AAAA,EACjB;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,QAAQ,MAAM;AAAA,EAAC;AAAA,EACf,YAAY,MAAM,QAAQ,QAAQ,KAAK;AAAA,EACvC,eAAe,MAAM,QAAQ,QAAQ,KAAK;AAC5C;AAEA,IAAO,4BAAQ;;;AClBR,IAAM,QAAQ;AACd,IAAM,iBAAiB;AACvB,IAAM,cAAc;;;ACCZ,SAAR,YAA6B,OAAoB,QAAa;AACnE,QAAM,EAAE,MAAM,QAAQ,IAAI;AAE1B,UAAQ,MAAM;AAAA,IACZ,KAAgB,OAAO;AACrB,YAAM,QAAqB;AAAA,QACzB,GAAG;AAAA,QACH,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,QAChB,iBAAiB,QAAQ;AAAA,MAC3B;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAgB,gBAAgB;AAC9B,YAAM,YAAyB;AAAA,QAC7B,GAAG;AAAA,QACH,WAAW,QAAQ;AAAA,MACrB;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAgB,aAAa;AAC3B,YAAM,aAA0B;AAAA,QAC9B,GAAG;AAAA,QACH,MAAM;AAAA,UACJ,GAAG,MAAM;AAAA,UACT,GAAG;AAAA,QACL;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;;;AC/BA,SAAS,eAAuB;AAC9B,QAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,CAAC,EAAG,QAAO;AACxB,MAAI;AACF,WAAO,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACpC,QAAQ;AACN,WAAO,MAAM,CAAC;AAAA,EAChB;AACF;AAEA,eAAsB,gBACpB,UACA,MACgC;AAChC,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,kBAAkB;AAAA,IACxD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,aAAa;AAAA,IACb,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,EAC/B,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,eAAsB,cACpB,UAC2B;AAC3B,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,YAAY;AAAA,IAClD,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,eAAsB,UACpB,UACiC;AACjC,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,WAAW;AAAA,IACjD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB,aAAa;AAAA,IAC/B;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AACD,SAAO,EAAE,SAAS;AACpB;AAEA,eAAsB,cACpB,UACA,MAC8B;AAC9B,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,SAAS;AAAA,IAC/C,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB,aAAa;AAAA,IAC/B;AAAA,IACA,aAAa;AAAA,IACb,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,eAAsB,iBACpB,UACiC;AACjC,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,SAAS;AAAA,IAC/C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,aAAa,EAAE;AAAA,IAC1C,aAAa;AAAA,EACf,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,EAAE,UAAU,KAAK;AAC1B;;;ACtEA,eAAsB,mBAAmB,KAAoB,MAAc;AACzE,QAAM,EAAE,UAAU,eAAe,QAAQ,IAAI;AAC7C,WAAS;AAAA,IACP,MAAiB;AAAA,IACjB,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AACD,MAAI;AAEF,WAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,OAAO,SAAS,QAAQ;AACxE,UAAM,SAAS,MAAM,gBAAgB,eAAe,IAAI;AACxD,QAAI,OAAO,SAAS,WAAW,KAAK;AAClC,eAAS;AAAA,QACP,MAAiB;AAAA,QACjB,SAAS;AAAA,UACP,MAAM,OAAO,KAAK;AAAA,UAClB,QAAQ,OAAO,KAAK;AAAA,UACpB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,cAAU,QAAQ;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACjE,cAAU,QAAQ;AAAA,EACpB,UAAE;AACA,aAAS;AAAA,MACP,MAAiB;AAAA,MACjB,SAAS,EAAE,WAAW,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,gBAAgB,KAAoB;AACxD,QAAM,EAAE,UAAU,eAAe,QAAQ,IAAI;AAC7C,WAAS;AAAA,IACP,MAAiB;AAAA,IACjB,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AACD,MAAI;AACF,UAAM,SAAS,MAAM,cAAc,aAAa;AAChD,QAAI,OAAO,SAAS,WAAW,KAAK;AAClC,eAAS;AAAA,QACP,MAAiB;AAAA,QACjB,SAAS;AAAA,UACP,MAAM,OAAO,KAAK;AAAA,UAClB,QAAQ,OAAO,KAAK;AAAA,UACpB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,cAAU,QAAQ;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACjE,cAAU,QAAQ;AAAA,EACpB,UAAE;AACA,aAAS;AAAA,MACP,MAAiB;AAAA,MACjB,SAAS,EAAE,WAAW,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,aAAa,KAAoB;AACrD,QAAM,EAAE,UAAU,cAAc,IAAI;AACpC,MAAI;AACF,UAAM,UAAU,aAAa;AAAA,EAC/B,QAAQ;AAAA,EAER;AACA,WAAS;AAAA,IACP,MAAiB;AAAA,IACjB,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AACD,WAAS;AAAA,IACP,MAAiB;AAAA,IACjB,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,UAAU,OAAO,SAAS,gBAAgB,aAAa,MAAM,KAAK;AAAA,MACpE;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACD,WAAS;AAAA,IACP,MAAiB;AAAA,IACjB,SAAS,EAAE,WAAW,MAAM;AAAA,EAC9B,CAAC;AACH;AAEA,eAAsB,iBACpB,KACA,MACkB;AAClB,QAAM,EAAE,UAAU,eAAe,QAAQ,IAAI;AAC7C,MAAI,KAAK,UAAU;AACjB,WAAO,SAAS,gBAAgB,aAAa,QAAQ,KAAK,QAAQ;AAAA,EACpE;AACA,MAAI;AACF,UAAM,SAAS,MAAM,cAAc,eAAe,IAAI;AACtD,QAAI,OAAO,SAAS,WAAW,KAAK;AAClC,eAAS;AAAA,QACP,MAAiB;AAAA,QACjB,SAAS,OAAO,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,MAAM,wBAAwB,OAAO,KAAK,OAAO,CAAC;AAC9D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,mBAAmB,CAAC;AACvE,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBACpB,KACkB;AAClB,QAAM,EAAE,UAAU,eAAe,QAAQ,IAAI;AAC7C,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB,aAAa;AACnD,QAAI,OAAO,SAAS,WAAW,KAAK;AAClC,gBAAU,QAAQ;AAClB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,sBAAsB,CAAC;AAC1E,WAAO;AAAA,EACT;AACF;AAEO,IAAM,YAAY,CAAC,aAAkC;AAC1D,SAAO,SAAS;AAAA,IACd,MAAiB;AAAA,IACjB,SAAS;AAAA,MACP,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,MACT,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;;;AC/JO,IAAM,eAAe;AAE5B,IAAI;AAEG,SAAS,YAAY,KAAyB;AACnD,cAAY,KAAK,QAAQ,QAAQ,EAAE;AACrC;AAEA,SAAS,mBAA4B;AACnC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAM,WAAW,OAAO,SAAS;AACjC,SACE,aAAa,eACb,aAAa,WACb,gDAAgD;AAAA,IAC9C;AAAA,EACF,KACA,qDAAqD;AAAA,IACnD;AAAA,EACF,KACA,+CAA+C;AAAA,IAC7C;AAAA,EACF;AAEJ;AAEO,SAAS,oBAAoB;AAClC,MAAI,UAAW,QAAO;AACtB,QAAM,cAAc,iBAAiB;AACrC,QAAM,aAAa;AACnB,QAAM,iBAAiB,GAAG,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,QAAQ,IAAI,UAAU;AAC7F,QAAM,gBAAgB,WAAW,YAAY;AAC7C,SAAO,cAAc,iBAAiB;AACxC;;;ACjCO,IAAM,kBAAkB;;;ACAxB,IAAM,SAAS;AAAA,EACpB,QAAQ;AACV;;;ACFA,mBAMO;AACP,uBAA6B;AAiBzB;AATJ,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,eAAe;AAIrB,SAAS,YAAY;AACnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MAEf;AAAA,oDAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,4CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,EACtC;AAEJ;AAEA,SAAS,WAAW;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MAEf;AAAA,oDAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,QACrC,4CAAC,cAAS,QAAO,mBAAkB;AAAA;AAAA;AAAA,EACrC;AAEJ;AAEA,SAAS,UAAU;AACjB,SAAO,4CAAC,UAAK,OAAO,cAAc,eAAY,QAAO;AACvD;AAIA,SAAS,cAAc,OAAwB;AAC7C,QAAM,CAAC,SAAS,UAAU,QAAI;AAAA,IAC5B,MAAM,OAAO,WAAW,eAAe,OAAO,WAAW,KAAK,EAAE;AAAA,EAClE;AACA,8BAAU,MAAM;AACd,UAAM,KAAK,OAAO,WAAW,KAAK;AAClC,UAAM,UAAU,CAAC,MAA2B,WAAW,EAAE,OAAO;AAChE,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,KAAK,CAAC;AACV,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAgB,QAAQ;AAElD,8BAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,UAAU;AACnB,YAAM,MAAM,sBAAsB,MAAM;AACtC,8BAAsB,MAAM,SAAS,SAAS,CAAC;AAAA,MACjD,CAAC;AACD,aAAO,MAAM,qBAAqB,GAAG;AAAA,IACvC;AACA,QAAI,UAAU,aAAa,UAAU,YAAY;AAC/C,eAAS,SAAS;AAClB,YAAM,QAAQ,WAAW,MAAM,SAAS,QAAQ,GAAG,oBAAoB;AACvE,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,SAAO;AACT;AAEA,SAAS,aACP,cACA,QACA,UACA;AACA,QAAM,oBAAgB,qBAAuB,IAAI;AAEjD,8BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,kBAAc,UAAU,SAAS;AAEjC,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,UAAM,aAAa,MAAM;AACvB,YAAM,aAAa,UAAU;AAAA,QAC3B;AAAA,MACF;AACA,OAAC,cAAc,WAAW,MAAM;AAAA,IAClC;AAEA,UAAM,MAAM,sBAAsB,UAAU;AAE5C,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,eAAe;AACjB,iBAAS;AACT;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,MAAO;AACrB,YAAM,YAAY,UAAU;AAAA,QAC1B;AAAA,MACF;AACA,UAAI,UAAU,WAAW,EAAG;AAC5B,YAAM,QAAQ,UAAU,CAAC;AACzB,YAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,UAAI,EAAE,YAAY,SAAS,kBAAkB,OAAO;AAClD,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,EAAE,YAAY,SAAS,kBAAkB,MAAM;AACzD,UAAE,eAAe;AACjB,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,aAAa;AAElD,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,eAAS,oBAAoB,WAAW,aAAa;AACrD,UAAI,cAAc,mBAAmB,aAAa;AAChD,sBAAc,QAAQ,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,cAAc,QAAQ,CAAC;AACrC;AAEA,SAAS,cAAc,QAAiB;AACtC,8BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,iBACJ,OAAO,aAAa,SAAS,gBAAgB;AAC/C,UAAM,eAAe,SAAS,KAAK,MAAM;AACzC,UAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,aAAS,KAAK,MAAM,WAAW;AAC/B,QAAI,iBAAiB,GAAG;AACtB,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD;AACA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AACb;AAIO,SAAS,kBAAkB,EAAE,MAAM,QAAQ,GAA2B;AAC3E,QAAM,EAAE,MAAM,QAAQ,YAAY,cAAc,IAAI,SAAS;AAC7D,QAAM,YAAY,cAAc,oBAAoB;AACpD,QAAM,QAAQ,kBAAkB,IAAI;AACpC,QAAM,eAAW,qBAAuB,IAAI;AAG5C,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,EAAE;AACnC,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,EAAE;AAC3C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,EAAE;AAC3C,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAGhD,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAGlB,IAAI;AAGd,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAG9C,8BAAU,MAAM;AACd,QAAI,QAAQ,MAAM,OAAO,CAAC,WAAW;AACnC,cAAQ,KAAK,QAAQ,EAAE;AACvB,kBAAY,KAAK,YAAY,EAAE;AAC/B,kBAAY,KAAK,YAAY,EAAE;AAC/B,iBAAW,KAAK,WAAW,EAAE;AAC7B,mBAAa,IAAI;AAAA,IACnB;AACA,QAAI,CAAC,MAAM;AACT,mBAAa,KAAK;AAClB,gBAAU,IAAI;AACd,oBAAc,KAAK;AACnB,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,SAAS,CAAC;AAG1B,8BAAU,MAAM;AACd,QAAI,QAAQ,SAAS,UAAW;AAChC,UAAM,QAAQ,WAAW,MAAM,UAAU,IAAI,GAAG,kBAAkB;AAClE,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAEX,eAAa,UAAU,UAAU,WAAW,OAAO;AACnD,gBAAc,UAAU,QAAQ;AAEhC,QAAM,eAAW;AAAA,IACf,CAAC,UACC,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK;AAAA,IACvD,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,UACC,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,GAAG,YAAY;AAAA,IACjE,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,QAAM,iBAAa,sBAAQ,MAAM;AAC/B,QAAI,CAAC,MAAM,IAAK,QAAO;AACvB,WACE,UAAU,KAAK,QAAQ,OACvB,cAAc,KAAK,YAAY,OAC/B,cAAc,KAAK,YAAY,OAC/B,aAAa,KAAK,WAAW;AAAA,EAEjC,GAAG,CAAC,MAAM,UAAU,UAAU,SAAS,IAAI,CAAC;AAE5C,QAAM,UAAU,KAAK,KAAK,EAAE,SAAS,KAAK,cAAc,CAAC;AAEzD,QAAM,iBAAa,0BAAY,YAAY;AACzC,cAAU,IAAI;AACd,cAAU,IAAI;AACd,UAAM,SAAiC,EAAE,KAAK;AAC9C,QAAI,SAAS,UAAU,EAAG,QAAO,WAAW;AAC5C,QAAI,SAAS,UAAU,EAAG,QAAO,WAAW;AAC5C,QAAI,SAAS,SAAS,EAAG,QAAO,UAAU;AAC1C,UAAM,KAAK,MAAM,WAAW,MAAM;AAClC,cAAU,KAAK;AACf,QAAI,IAAI;AACN,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH,OAAO;AACL,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,UAAU,SAAS,UAAU,UAAU,CAAC;AAE5D,QAAM,mBAAe,0BAAY,YAAY;AAC3C,gBAAY,IAAI;AAChB,UAAM,KAAK,MAAM,cAAc;AAC/B,gBAAY,KAAK;AACjB,QAAI,IAAI;AACN,cAAQ;AAAA,IACV,OAAO;AACL,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACD,oBAAc,KAAK;AACnB,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,CAAC;AAG3B,QAAM,gBAAY,sBAAQ,MAAM;AAC9B,UAAM,IAAI,OAAO;AACjB,QAAI,CAAC,EAAG,QAAO,CAAC;AAChB,UAAM,OAA+B,CAAC;AACtC,QAAI,EAAE,OAAQ,MAAK,gBAAgB,IAAI,EAAE;AACzC,QAAI,EAAE,YAAa,MAAK,sBAAsB,IAAI,EAAE;AACpD,QAAI,EAAE,QAAS,MAAK,iBAAiB,IAAI,EAAE;AAC3C,QAAI,EAAE,aAAc,MAAK,uBAAuB,IAAI,EAAE;AACtD,QAAI,EAAE,YAAa,MAAK,sBAAsB,IAAI,EAAE;AACpD,QAAI,EAAE,cAAe,MAAK,wBAAwB,IAAI,EAAE;AACxD,QAAI,EAAE,OAAQ,MAAK,gBAAgB,IAAI,EAAE;AACzC,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,UAAU,CAAC;AAEtB,MAAI,UAAU,SAAU,QAAO;AAE/B,QAAM,MAAM,YAAY,gBAAgB;AACxC,QAAM,SAAS;AAEf,QAAM,WAAgC;AAAA,IACpC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS,UAAU,YAAY,IAAI;AAAA,IACnC,YAAY,WAAW,GAAG;AAAA,EAC5B;AAEA,QAAM,eAAoC;AAAA,IACxC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,IACV,YACE;AAAA,IACF,OAAO;AAAA,IACP,SAAS,UAAU,YAAY,IAAI;AAAA,IACnC,WAAW,UAAU,YAAY,kBAAkB;AAAA,IACnD,YAAY,WAAW,GAAG,MAAM,MAAM,eAAe,GAAG,MAAM,MAAM;AAAA,EACtE;AAEA,QAAM,cAAmC;AAAA,IACvC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,eAAe;AAAA,IACf,YACE;AAAA,IACF,OAAO;AAAA,IACP,WAAW,UAAU,YAAY,kBAAkB;AAAA,IACnD,YAAY,aAAa,GAAG,MAAM,MAAM;AAAA,EAC1C;AAEA,QAAM,iBAAiB,KAAK,QAAQ,KAAK,SAAS,KAC/C,OAAO,CAAC,EACR,YAAY;AAEf,aAAO;AAAA,IACL,4EACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,yBAAyB;AAAA,YACvB,QAAQ;AAAA,UACV;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,GAAG,UAAU,GAAG,UAAU;AAAA,UACnC,SAAS,YAAY,UAAU;AAAA,UAC/B,eAAY;AAAA,UAEZ;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,cAAW;AAAA,cACX,mBAAgB;AAAA,cAChB,OAAO,YAAY,eAAe;AAAA,cAClC,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAClC,UAAU;AAAA,cAGV;AAAA,6DAAC,SAAI,OAAO,YAAY,SAAS,GAC/B;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,cAAW;AAAA,sBACX,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBACrB;AAAA,sBAEJ,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBAAkB;AAAA,sBAG1C,sBAAY,4CAAC,aAAU,IAAK,4CAAC,YAAS;AAAA;AAAA,kBACzC;AAAA,kBACA,4CAAC,QAAG,IAAG,uBAAsB,OAAO,YAAY,0BAEhD;AAAA,kBACA,4CAAC,SAAI,OAAO,EAAE,OAAO,GAAG,GAAG;AAAA,mBAC7B;AAAA,gBAGA,6CAAC,SAAI,OAAO,WAEV;AAAA,+DAAC,SAAI,OAAO,eACV;AAAA,gEAAC,SAAI,OAAO,cACT,eAAK,QAAQ,MACZ;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,KAAK,OAAO;AAAA,wBACjB,KAAI;AAAA,wBACJ,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,WAAW;AAAA,wBACb;AAAA;AAAA,oBACF,IAEA,eAEJ;AAAA,oBACA,4CAAC,SAAI,OAAO,WAAY,eAAK,OAAM;AAAA,qBACrC;AAAA,kBAGC,UACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,aAAU;AAAA,sBACV,OAAO,UAAU,OAAO,IAAI;AAAA,sBAE3B,iBAAO;AAAA;AAAA,kBACV;AAAA,kBAIF,6CAAC,SACC;AAAA,iEAAC,SAAI,OAAO,YACV;AAAA,kEAAC,WAAM,SAAQ,cAAa,OAAO,OAAO,oBAE1C;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,0BACvC,aAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,oBAEC,SAAS,UAAU,KAClB,6CAAC,SAAI,OAAO,YACV;AAAA,mEAAC,WAAM,SAAQ,kBAAiB,OAAO,OAAO;AAAA;AAAA,wBAE3C,WAAW,UAAU,IAAI,OAAO;AAAA,yBACnC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,0BAC3C,aAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,oBAGD,SAAS,UAAU,KAClB,6CAAC,SAAI,OAAO,YACV;AAAA,mEAAC,WAAM,SAAQ,kBAAiB,OAAO,OAAO;AAAA;AAAA,wBAE3C,WAAW,UAAU,IAAI,OAAO;AAAA,yBACnC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,0BAC3C,aAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,oBAGD,SAAS,SAAS,KACjB,6CAAC,SAAI,OAAO,YACV;AAAA,mEAAC,WAAM,SAAQ,iBAAgB,OAAO,OAAO;AAAA;AAAA,wBAE1C,WAAW,SAAS,IAAI,OAAO;AAAA,yBAClC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,0BAC1C,aAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA;AAAA,sBACV;AAAA,uBACF;AAAA,qBAEJ;AAAA,kBAGA,4CAAC,QAAG,OAAO,WAAW;AAAA,kBACtB,6CAAC,SACC;AAAA,gEAAC,SAAI,OAAO,aAAa,4BAAc;AAAA,oBACvC,4CAAC,SAAI,OAAO,YAAY,sEAExB;AAAA,oBACC,CAAC,aACA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,OAAO;AAAA,wBACP,SAAS,MAAM,cAAc,IAAI;AAAA,wBACjC,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBACrB;AAAA,wBAEJ,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBACrB;AAAA,wBAEL;AAAA;AAAA,oBAED,IAEA,6CAAC,SAAI,OAAO,aACV;AAAA,mEAAC,SAAI,OAAO,iBAAiB;AAAA;AAAA,wBACyB;AAAA,wBACpD,4CAAC,YAAQ,wBAAa;AAAA,wBAAS;AAAA,yBACjC;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,0BAC7C,aAAa,QAAQ,YAAY;AAAA,0BACjC,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA,0BACR,UAAU;AAAA;AAAA,sBACZ;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,KAAK;AAAA,4BACL,WAAW;AAAA,0BACb;AAAA,0BAEA;AAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,MAAK;AAAA,gCACL,OAAO;AAAA,gCACP,SAAS,MAAM;AACb,gDAAc,KAAK;AACnB,gDAAc,EAAE;AAAA,gCAClB;AAAA,gCACA,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBACrB;AAAA,gCAEJ,cAAc,CAAC,MACZ,EAAE,cAAc,MAAM,kBAAkB;AAAA,gCAE5C;AAAA;AAAA,4BAED;AAAA,4BACA;AAAA,8BAAC;AAAA;AAAA,gCACC,MAAK;AAAA,gCACL,OAAO;AAAA,kCACL,GAAG;AAAA,kCACH,SACE,eAAe,gBAAgB,WAAW,MAAM;AAAA,kCAClD,QACE,eAAe,gBAAgB,WAC3B,gBACA;AAAA,gCACR;AAAA,gCACA,UAAU,eAAe,gBAAgB;AAAA,gCACzC,SAAS;AAAA,gCAER;AAAA,8CAAY,4CAAC,WAAQ;AAAA,kCAAG;AAAA;AAAA;AAAA,4BAE3B;AAAA;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,qBAEJ;AAAA,mBACF;AAAA,gBAGA,4CAAC,SAAI,OAAO,YAAY,SAAS,GAC/B;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,sBACL,GAAG;AAAA,sBACH,SAAS,UAAU,IAAI;AAAA,sBACvB,QAAQ,UAAU,YAAY;AAAA,oBAChC;AAAA,oBACA,UAAU,CAAC;AAAA,oBACX,SAAS;AAAA,oBACT,aAAW;AAAA,oBACX,cAAc,CAAC,MAAM;AACnB,0BAAI;AACF,0BAAE,cAAc,MAAM,kBACpB;AAAA,oBACN;AAAA,oBACA,cAAc,CAAC,MAAM;AACnB,wBAAE,cAAc,MAAM,kBACpB;AAAA,oBACJ;AAAA,oBAEC;AAAA,gCAAU,4CAAC,WAAQ;AAAA,sBACnB,SAAS,cAAc;AAAA;AAAA;AAAA,gBAC1B,GACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAIA,IAAM,cAAc,CAAC,eAA6C;AAAA,EAChE,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,GAAI,CAAC,YACD;AAAA,IACE,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,iBAAiB;AAAA,EACnB,IACA,CAAC;AACP;AAEA,IAAM,aAAkC;AAAA,EACtC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AACR;AAEA,IAAM,WAAgC;AAAA,EACpC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AACX;AAEA,IAAM,YAAiC;AAAA,EACrC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,yBAAyB;AAC3B;AAEA,IAAM,gBAAqC;AAAA,EACzC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,KAAK;AACP;AAEA,IAAM,eAAoC;AAAA,EACxC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AACd;AAEA,IAAM,YAAiC;AAAA,EACrC,UAAU;AAAA,EACV,OAAO;AACT;AAEA,IAAM,YAAY,CAAC,UAAoD;AAAA,EACrE,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBACE,SAAS,YACL,oDACA;AAAA,EACN,OACE,SAAS,YACL,kCACA;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,aAAkC,EAAE,cAAc,GAAG;AAE3D,IAAM,QAA6B;AAAA,EACjC,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB;AAEA,IAAM,QAA6B;AAAA,EACjC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,oBAAoB,CAAC,MAA0C;AACnE,IAAE,cAAc,MAAM,cACpB;AACF,IAAE,cAAc,MAAM,YAAY;AACpC;AAEA,IAAM,mBAAmB,CAAC,MAA0C;AAClE,IAAE,cAAc,MAAM,cACpB;AACF,IAAE,cAAc,MAAM,YAAY;AACpC;AAEA,IAAM,YAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,cAAmC;AAAA,EACvC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB;AAEA,IAAM,aAAkC;AAAA,EACtC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,YAAiC;AAAA,EACrC,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AACd;AAEA,IAAM,cAAmC;AAAA,EACvC,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAEA,IAAM,kBAAuC;AAAA,EAC3C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,YAAiC;AAAA,EACrC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AACd;AAEA,IAAM,mBAAwC;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AACP;AAEA,IAAM,cAAc,CAAC,eAA6C;AAAA,EAChE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,GAAI,CAAC,YACD;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB,IACA,CAAC;AACP;AAEA,IAAM,UAA+B;AAAA,EACnC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,YAAY;AACd;AAEA,IAAM,eAAoC;AAAA,EACxC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,WAAW;AACb;;;ATxvBI,IAAAC,sBAAA;AAjGJ,IAAM,iBAAiB,CAAC,UAAiB,QAAQ,MAAM,KAAK;AAErD,IAAM,gBAA+C,CAC1D,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,CAAC,YAAY,QAAQ,QAAI,0BAAW,aAAa,yBAAiB;AAGxE,+BAAU,MAAM;AACd,gBAAY,QAAQ;AAAA,EACtB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAc;AAAA,IAClB,CAAC,WAAkB,WAAW,gBAAgB,KAAK;AAAA,IACnD,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,UAAM;AAAA,IACV,OAAO,EAAE,UAAU,eAAe,SAAS,YAAY;AAAA,IACvD,CAAC,eAAe,WAAW;AAAA,EAC7B;AAGA,+BAAU,MAAM;AACd,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,OAAO,OAAO,IAAI,eAAe;AACvC,QAAI,MAAM;AACR,MAAO,mBAAmB,KAAK,IAAI;AAAA,IACrC,OAAO;AACL,MAAO,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB,2BAAY,MAAM;AAC1C,UAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,UAAU,IAAI,OAAO,MAAM;AAClE,UAAM,MAAM,MAAM,GAAG,IAAI,QAAQ,mBAAmB,GAAG,CAAC,KAAK;AAC7D,WAAO,OAAO,SAAS,QAAQ,GAAG;AAAA,EACpC,GAAG,CAAC,YAAY,GAAG,CAAC;AAEpB,QAAM,aAAS,2BAAY,MAAa,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC;AAEhE,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAgC;AACrC,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,YAAM,OAAO;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAc,iBAAiB,KAAK,IAAI;AAAA,IAC1C;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,oBAAgB;AAAA,IACpB,MAAa,oBAAoB,GAAG;AAAA,IACpC,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,YAAY,mBAAmB,QAAQ,YAAY,aAAa;AAAA,EACnE;AAEA,SACE,6CAAC,aAAa,UAAb,EAAsB,OAAO,cAC3B,UACH;AAEJ;AAEA,IAAM,mBAAe,6BAAc,yBAAiB;AAE7C,IAAM,WAAW,MAAM;AAC5B,QAAM,cAAU,0BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;","names":["import_react","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -529,6 +529,19 @@ function DauthProfileModal({ open, onClose }) {
529
529
  setDeleteText("");
530
530
  }
531
531
  }, [deleteAccount, onClose]);
532
+ const themeVars = useMemo(() => {
533
+ const t = domain.modalTheme;
534
+ if (!t) return {};
535
+ const vars = {};
536
+ if (t.accent) vars["--dauth-accent"] = t.accent;
537
+ if (t.accentHover) vars["--dauth-accent-hover"] = t.accentHover;
538
+ if (t.surface) vars["--dauth-surface"] = t.surface;
539
+ if (t.surfaceHover) vars["--dauth-surface-hover"] = t.surfaceHover;
540
+ if (t.textPrimary) vars["--dauth-text-primary"] = t.textPrimary;
541
+ if (t.textSecondary) vars["--dauth-text-secondary"] = t.textSecondary;
542
+ if (t.border) vars["--dauth-border"] = t.border;
543
+ return vars;
544
+ }, [domain.modalTheme]);
532
545
  if (phase === "exited") return null;
533
546
  const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;
534
547
  const easing = "cubic-bezier(0.16, 1, 0.3, 1)";
@@ -589,7 +602,7 @@ function DauthProfileModal({ open, onClose }) {
589
602
  /* @__PURE__ */ jsx(
590
603
  "div",
591
604
  {
592
- style: backdrop,
605
+ style: { ...backdrop, ...themeVars },
593
606
  onClick: isDesktop ? onClose : void 0,
594
607
  "data-testid": "dauth-profile-backdrop",
595
608
  children: /* @__PURE__ */ jsxs(
@@ -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/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 DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\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 memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n }),\n [dauthState, loginWithRedirect, logout, updateUser, deleteAccount]\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};\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} 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","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n} from '../api/dauth.api';\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 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 { DauthProfileModalProps } from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\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 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 () => typeof window !== 'undefined' && window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => 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(() => setPhase('exited'), MOBILE_TRANSITION_MS);\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 // Small delay to let the portal render\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 = 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 (!e.shiftKey && document.activeElement === last) {\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 - 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({ open, onClose }: DauthProfileModalProps) {\n const { user, domain, updateUser, deleteAccount } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // 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 // 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 }\n }, [open, user, populated]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(() => setStatus(null), SUCCESS_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [status]);\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) ?? false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)?.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 = 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: 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, onClose]);\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: '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: 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border: '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: phase === 'entered' ? 'translateY(0)' : '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: phase === 'entered' ? 'translateY(0)' : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: '@keyframes dauth-spin{to{transform:rotate(360deg)}}',\n }}\n />\n <div\n style={backdrop}\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 = '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 {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* Avatar */}\n <div style={avatarSection}>\n <div style={avatarCircle}>\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 </div>\n <div style={emailText}>{user.email}</div>\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 htmlFor=\"dauth-name\" style={label}>\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\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 htmlFor=\"dauth-lastname\" style={label}>\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) => setLastname(e.target.value)}\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 htmlFor=\"dauth-nickname\" style={label}>\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\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 htmlFor=\"dauth-country\" style={label}>\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Danger zone */}\n <hr style={separator} />\n <div>\n <div style={dangerTitle}>Delete account</div>\n <div style={dangerDesc}>\n Permanently delete your account and all 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 be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) => setDeleteText(e.target.value)}\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 = 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD || deleting ? 0.5 : 1,\n cursor:\n deleteText !== CONFIRM_WORD || deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={deleteText !== CONFIRM_WORD || deleting}\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\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 </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (isDesktop: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n borderBottom: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor: '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 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 emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (type: 'success' | 'error'): 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 = { marginBottom: 16 };\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: 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border: '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 = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor: 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\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: '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: '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 flex: 1,\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: '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 footerStyle = (isDesktop: boolean): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop: '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: 'var(--dauth-surface, #1a1a2e)',\n paddingBottom: '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/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 DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\n IModalTheme,\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 memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n }),\n [dauthState, loginWithRedirect, logout, updateUser, deleteAccount]\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};\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} 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","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n} from '../api/dauth.api';\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 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 { DauthProfileModalProps } from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\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 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 () => typeof window !== 'undefined' && window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => 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(() => setPhase('exited'), MOBILE_TRANSITION_MS);\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 // Small delay to let the portal render\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 = 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 (!e.shiftKey && document.activeElement === last) {\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 - 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({ open, onClose }: DauthProfileModalProps) {\n const { user, domain, updateUser, deleteAccount } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // 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 // 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 }\n }, [open, user, populated]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(() => setStatus(null), SUCCESS_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [status]);\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) ?? false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)?.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 = 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: 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, 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) vars['--dauth-accent-hover'] = t.accentHover;\n if (t.surface) vars['--dauth-surface'] = t.surface;\n if (t.surfaceHover) vars['--dauth-surface-hover'] = t.surfaceHover;\n if (t.textPrimary) vars['--dauth-text-primary'] = t.textPrimary;\n if (t.textSecondary) 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: '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: 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border: '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: phase === 'entered' ? 'translateY(0)' : '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: phase === 'entered' ? 'translateY(0)' : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: '@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 = '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 {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* Avatar */}\n <div style={avatarSection}>\n <div style={avatarCircle}>\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 </div>\n <div style={emailText}>{user.email}</div>\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 htmlFor=\"dauth-name\" style={label}>\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\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 htmlFor=\"dauth-lastname\" style={label}>\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) => setLastname(e.target.value)}\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 htmlFor=\"dauth-nickname\" style={label}>\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\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 htmlFor=\"dauth-country\" style={label}>\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Danger zone */}\n <hr style={separator} />\n <div>\n <div style={dangerTitle}>Delete account</div>\n <div style={dangerDesc}>\n Permanently delete your account and all 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 be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) => setDeleteText(e.target.value)}\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 = 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD || deleting ? 0.5 : 1,\n cursor:\n deleteText !== CONFIRM_WORD || deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={deleteText !== CONFIRM_WORD || deleting}\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\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 </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (isDesktop: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n borderBottom: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor: '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 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 emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (type: 'success' | 'error'): 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 = { marginBottom: 16 };\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: 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border: '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 = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor: 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\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: '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: '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 flex: 1,\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: '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 footerStyle = (isDesktop: boolean): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop: '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: 'var(--dauth-surface, #1a1a2e)',\n paddingBottom: '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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dauth-context-react",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "React provider and hook for passwordless authentication via the Dauth service (BFF pattern with httpOnly cookies)",
5
5
  "license": "MIT",
6
6
  "author": "David T. Pizarro Frick",
@@ -287,6 +287,21 @@ export function DauthProfileModal({ open, onClose }: DauthProfileModalProps) {
287
287
  }
288
288
  }, [deleteAccount, onClose]);
289
289
 
290
+ // Build CSS custom property overrides from domain.modalTheme
291
+ const themeVars = useMemo(() => {
292
+ const t = domain.modalTheme;
293
+ if (!t) return {};
294
+ const vars: Record<string, string> = {};
295
+ if (t.accent) vars['--dauth-accent'] = t.accent;
296
+ if (t.accentHover) vars['--dauth-accent-hover'] = t.accentHover;
297
+ if (t.surface) vars['--dauth-surface'] = t.surface;
298
+ if (t.surfaceHover) vars['--dauth-surface-hover'] = t.surfaceHover;
299
+ if (t.textPrimary) vars['--dauth-text-primary'] = t.textPrimary;
300
+ if (t.textSecondary) vars['--dauth-text-secondary'] = t.textSecondary;
301
+ if (t.border) vars['--dauth-border'] = t.border;
302
+ return vars;
303
+ }, [domain.modalTheme]);
304
+
290
305
  if (phase === 'exited') return null;
291
306
 
292
307
  const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;
@@ -352,7 +367,7 @@ export function DauthProfileModal({ open, onClose }: DauthProfileModalProps) {
352
367
  }}
353
368
  />
354
369
  <div
355
- style={backdrop}
370
+ style={{ ...backdrop, ...themeVars }}
356
371
  onClick={isDesktop ? onClose : undefined}
357
372
  data-testid="dauth-profile-backdrop"
358
373
  >
package/src/index.tsx CHANGED
@@ -17,6 +17,7 @@ import type {
17
17
  IDauthAuthMethods,
18
18
  IDauthUser,
19
19
  IFormField,
20
+ IModalTheme,
20
21
  DauthProfileModalProps,
21
22
  } from './interfaces';
22
23
 
@@ -25,6 +26,7 @@ export type {
25
26
  IDauthProviderProps,
26
27
  IDauthAuthMethods,
27
28
  IFormField,
29
+ IModalTheme,
28
30
  DauthProfileModalProps,
29
31
  };
30
32
 
package/src/interfaces.ts CHANGED
@@ -36,6 +36,16 @@ export interface IFormField {
36
36
  required: boolean;
37
37
  }
38
38
 
39
+ export interface IModalTheme {
40
+ accent?: string;
41
+ accentHover?: string;
42
+ surface?: string;
43
+ surfaceHover?: string;
44
+ textPrimary?: string;
45
+ textSecondary?: string;
46
+ border?: string;
47
+ }
48
+
39
49
  export interface IDauthDomainState {
40
50
  name: string;
41
51
  environments?: IDauthDomainEnvironment[];
@@ -43,6 +53,7 @@ export interface IDauthDomainState {
43
53
  allowedOrigins: string[];
44
54
  authMethods?: IDauthAuthMethods;
45
55
  formFields?: IFormField[];
56
+ modalTheme?: IModalTheme;
46
57
  }
47
58
 
48
59
  export interface IDauthState {