dauth-context-react 5.0.0 → 6.0.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/README.md +101 -228
- package/dist/index.d.mts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +789 -96
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +794 -96
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -1
- package/src/DauthProfileModal.tsx +875 -0
- package/src/api/dauth.api.ts +6 -17
- package/src/api/interfaces/dauth.api.responses.ts +0 -7
- package/src/api/utils/config.ts +8 -5
- package/src/index.tsx +13 -26
- package/src/initialDauthState.ts +0 -1
- package/src/interfaces.ts +12 -6
- package/src/reducer/dauth.actions.ts +9 -61
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"],"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} from './interfaces';\n\nexport type { IDauthProviderProps, IDauthAuthMethods };\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(\n userReducer,\n initialDauthState\n );\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\n ? `${base}?env=${encodeURIComponent(env)}`\n : base;\n return window.location.replace(url);\n }, [domainName, env]);\n\n const logout = useCallback(\n () => action.logoutAction(ctx),\n [ctx]\n );\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 updateUserWithRedirect = useCallback(\n () => action.updateUserWithRedirectAction(ctx),\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 updateUserWithRedirect,\n deleteAccount,\n }),\n [\n dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n updateUserWithRedirect,\n deleteAccount,\n ]\n );\n\n return (\n <DauthContext.Provider value={memoProvider}>\n {children}\n </DauthContext.Provider>\n );\n};\n\nconst DauthContext = createContext(initialDauthState);\n\nexport const useDauth = () => {\n const context = useContext(DauthContext);\n if (!context) {\n throw new Error('useDauth must be used inside DauthProvider');\n }\n return context;\n};\n","import { IDauthDomainState, IDauthState, IDauthUser } from './interfaces';\n\nconst initialDauthState: IDauthState = {\n user: {\n language:\n (typeof window !== 'undefined'\n ? window.document.documentElement.getAttribute('lang')\n : null) || 'es',\n } as IDauthUser,\n domain: {} as IDauthDomainState,\n isLoading: true,\n isAuthenticated: false,\n loginWithRedirect: () => {},\n logout: () => {},\n updateUser: () => Promise.resolve(false),\n updateUserWithRedirect: () => {},\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 IProfileRedirectResponse,\n} from './interfaces/dauth.api.responses';\n\nfunction getCsrfToken(): string {\n const match = document.cookie.match(\n /(?:^|;\\s*)(?:__Host-csrf|csrf-token)=([^;]*)/\n );\n return match?.[1] ?? '';\n}\n\nexport async function exchangeCodeAPI(\n basePath: string,\n code: string\n): Promise<IExchangeCodeResponse> {\n const response = await fetch(`${basePath}/exchange-code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getSessionAPI(\n basePath: string\n): Promise<ISessionResponse> {\n const response = await fetch(`${basePath}/session`, {\n method: 'GET',\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function logoutAPI(\n basePath: string\n): Promise<{ response: Response }> {\n const response = await fetch(`${basePath}/logout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n });\n return { response };\n}\n\nexport async function updateUserAPI(\n basePath: string,\n user: Partial<IDauthUser>\n): Promise<IUpdateUserResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(user),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deleteAccountAPI(\n basePath: string\n): Promise<IDeleteAccountResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function profileRedirectAPI(\n basePath: string\n): Promise<IProfileRedirectResponse> {\n const response = await fetch(\n `${basePath}/profile-redirect`,\n {\n method: 'GET',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n }\n );\n const data = await response.json();\n return { response, data };\n}\n","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n profileRedirectAPI,\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(\n ctx: ActionContext,\n code: string\n) {\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(\n {},\n document.title,\n window.location.pathname\n );\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(\n error instanceof Error ? error : new Error(String(error))\n );\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(\n error instanceof Error ? error : new Error(String(error))\n );\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:\n window.document.documentElement.getAttribute('lang') ||\n '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(\n 'lang',\n user.language\n );\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(\n new Error('Update user error: ' + result.data.message)\n );\n return false;\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Update user error')\n );\n return false;\n }\n}\n\nexport async function updateUserWithRedirectAction(\n ctx: ActionContext\n) {\n const { authProxyPath, onError } = ctx;\n try {\n const result = await profileRedirectAPI(authProxyPath);\n if (\n result.response.status === 200 &&\n result.data.redirectUrl\n ) {\n window.location.replace(result.data.redirectUrl);\n return;\n }\n onError(\n new Error('Could not generate profile redirect')\n );\n } catch (error) {\n onError(\n error instanceof Error\n ? error\n : new Error('Profile redirect error')\n );\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(\n error instanceof Error\n ? error\n : new Error('Delete account error')\n );\n return false;\n }\n}\n\nexport const resetUser = (dispatch: React.Dispatch<any>) => {\n return dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {} as IDauthUser,\n domain: {} as IDauthDomainState,\n isAuthenticated: false,\n },\n });\n};\n","export const serverDomain = 'dauth.ovh';\n\nlet _dauthUrl: string | undefined;\n\nexport function setDauthUrl(url: string | undefined) {\n _dauthUrl = url?.replace(/\\/+$/, '');\n}\n\nfunction checkIsLocalhost(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n return Boolean(\n hostname === 'localhost' ||\n hostname === '[::1]' ||\n hostname.match(\n /(192)\\.(168)\\.(1)\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gm\n ) ||\n hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\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"],"mappings":"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","names":[]}
|
|
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"]}
|