@trieoh/identityx-sdk-ts 0.12.10 → 0.12.12
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/cjs/index.js.map +1 -1
- package/dist/cjs/react.js +2 -2
- package/dist/cjs/react.js.map +1 -1
- package/dist/esm/{api-BjzcDj0c.d.ts → api-D556EMVw.d.ts} +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react.d.ts +3 -3
- package/dist/esm/react.js +2 -2
- package/dist/esm/react.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts","../../src/utils/env-validator.ts","../../src/core/services.ts","../../src/react/AuthProvider.tsx","#style-inject:#style-inject","../../src/react/components/tailwind.css","../../src/react/components/Form/BasicInputField.tsx","../../src/react/components/Form/BasicSubmitButton.tsx","../../src/react/components/Form/CardAvatar.tsx","../../src/utils/field-validator.ts","../../src/react/components/SignIn/SignIn.tsx","../../src/react/components/SignUp/SignUp.tsx","../../src/react/components/Extra/Copyright.tsx","../../src/react/components/Logout/BasicLogoutButton.tsx","../../src/utils/icons/device-icon-map.tsx","../../src/utils/ua/parse-user-agent.ts","../../src/utils/ua/get-device-info.ts","../../src/utils/date-utils.ts","../../src/react/components/Session/SessionCard.tsx","../../src/react/components/Session/Sessions.tsx","../../src/react/components/ForgotPassword/ForgotPassword.tsx","../../src/react/components/ResetPassword/ResetPassword.tsx","../../src/react/components/VerifyEmail/VerifyEmail.tsx","../../src/react/components/VerifyEmail/ResendVerifyEmail.tsx","../../src/utils/cn.ts","../../src/react/components/Modern/Shared/FormInput.tsx","../../src/react/components/Modern/Shared/FormError.tsx","../../src/react/components/Modern/Shared/Button.tsx","../../src/react/components/Modern/Shared/OAuthDivider.tsx","../../src/react/components/Modern/Shared/OAuthProviderButton.tsx","../../src/react/components/Modern/ModernSignIn.tsx","../../src/react/components/Modern/ModernSignUp.tsx","../../src/react/components/Modern/ModernForgotPassword.tsx","../../src/react/components/Modern/ModernResetPassword.tsx","../../src/react/components/Modern/ModernVerifyEmail.tsx","../../src/react/components/Modern/Shared/AuthLayout.tsx","../../src/react/components/Modern/ModernSetup.tsx","../../src/react/components/Modern/ModernAuth.tsx","../../src/react/components/Modern/ModernIntrospect.tsx"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","ACCESS_TOKEN_KEY","tokenStore","token","_cachedClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","REFRESH_TOKEN_KEY","decodeJwt","payload","base64","jsonPayload","c","error","logger","saveAuthSession","tokens","access_token","refresh_token","access_expires_at","refresh_expires_at","claims","refreshExpiry","accessExpiry","getStoredRefreshToken","getTokenClaims","refreshExpiryStr","sessionData","isExpiringSoon","thresholdSeconds","stored","e","isTokenExpiringSoon","t","isRefreshSessionExpired","clearAuthTokens","getUserInfo","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","shouldClear","refreshToken","res","simpleFetch","url","options","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","hasRefreshToken","isExpiring","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","validateProjectKey","createAuthService","apiInstance","callbacks","email","password","provider","code","id","revokeAll","new_password","apiKey","AuthContext","createContext","AuthProvider","children","projectId","isProjectMode","fallback","waitSession","onLogin","onSetup","onResetPassword","onRegister","onVerify","onRefresh","isRestoring","useRef","isInitializing","useSyncExternalStore","useEffect","useCallback","useMemo","auth","contextValue","jsx","useAuth","ctx","useContext","styleInject","css","insertAt","head","style","BasicInputField","name","label","placeholder","type","onValueChange","onBlur","autoComplete","rulesStatus","submitted","inputRef","isSecretVisible","setIsSecretVisible","useState","hasAnyFailing","r","jsxs","EyeOff","Eye","i","classes","BasicSubmitButton","onSubmit","loading","CardAvatar","mainText","subText","User","evaluateRules","rules","SignIn","onSuccess","onFailed","signUpRedirect","forgotPasswordRedirect","emailRules","setEmail","setPassword","setSubmitted","loadingSubmit","setLoadingSubmit","emailRef","passwordRef","v","emailValidation","passwordValidation","emailInvalid","passwordInvalid","Fragment","SignUp","loginRedirect","passwordRules","confirmPassword","setConfirmPassword","confirmPasswordRef","confirmPasswordValidation","confirmPasswordInvalid","sizeMap","Copyright","size","sizeClass","BasicLogoutButton","forceLogout","setLoading","LogOut","deviceIconMap","Smartphone","Tablet","Monitor","parseUserAgent","userAgent","device","os","browser","UAParser","getDeviceInfo","parsed","normalizeDevice","timeAgo","isoDate","diff","sec","min","hour","day","week","SessionCard","is_current","session_id","user_agent","issued_at","user_ip","onClick","deviceI","DeviceIcon","Trash2","Sessions","sessions","setSessions","fetchSessions","currentSessionId","a","b","handleRevokeASession","sessionToRemove","s","prev","ForgotPassword","ResetPassword","useVerifyEmailLogic","status","setStatus","message","setMessage","hasAttempted","handleVerify","VerifyEmail","onRetry","Check","Info","ResendVerifyEmail","sent","setSent","cn","inputs","twMerge","clsx","FormInput","forwardRef","propId","className","onChange","onFocus","props","ref","showPassword","setShowPassword","generatedId","useId","isPassword","FormInput_default","FormError","AnimatePresence","motion","FormError_default","buttonVariants","cva","Button","variant","OAuthDivider","providerConfig","OAuthProviderButton","isLoading","loginSchema","z","ModernSignIn","providers","setIsLoading","oauthLoading","setOauthLoading","handleOAuthLogin","toast","register","handleSubmit","errors","useForm","zodResolver","data","Loader2","ArrowRight","signUpSchema","ModernSignUp","signInRedirect","forgotPasswordSchema","ModernForgotPassword","resetPasswordSchema","ModernResetPassword","ModernVerifyEmail","CheckCircle2","XCircle","AuthLayout","backLink","setupSchema","ModernSetup","Sparkles","viewConfig","ModernAuth","initialView","onLoginSuccess","onSignUpSuccess","view","setView","handleSignUpSuccess","ACTOR_THEME","CopyIconButton","copied","setCopied","Copy","FieldRow","Icon","display","ModernIntrospect","sub","cred","actorType","theme","caps","capLabels","FolderOpen","Key","Mail","cap"],"mappings":"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","file":"react.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = Number(event.newValue);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const isLocalhost = window.location.hostname === \"localhost\";\n\n const cookieParts = [\n `${name}=${value}`,\n domain && !isLocalhost ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain: domain || undefined,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@trieoh/envoy-fetch-ts\";\nimport { browserStorage } from \"./storage-adapter\";\nimport type { AuthTokenClaims, AuthTokens, TokenClaims } from \"../types//token-types\";\n\n\n// Stored only in memory\nlet _cachedClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\nconst REFRESH_TOKEN_KEY = \"trieoh_refresh_token\";\n\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return null;\n\n let base64 = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n\n return JSON.parse(jsonPayload);\n } catch (error) {\n logger.error(\"Error decoding JWT:\", error);\n return null;\n }\n}\n\nexport function saveAuthSession(tokens: AuthTokens): void {\n const {\n access_token,\n refresh_token,\n access_expires_at,\n refresh_expires_at,\n } = tokens;\n\n const claims = decodeJwt<TokenClaims>(access_token);\n\n if (!claims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(access_token);\n\n const refreshExpiry = new Date(refresh_expires_at).getTime();\n const accessExpiry = new Date(access_expires_at).getTime();\n\n browserStorage.setItem(REFRESH_TOKEN_KEY, refresh_token);\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n\n const sessionData: AuthTokenClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getStoredRefreshToken(): string | null {\n return browserStorage.getItem(REFRESH_TOKEN_KEY);\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (_cachedClaims) return _cachedClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n const refreshExpiry = Number(refreshExpiryStr);\n if (isNaN(refreshExpiry)) return null;\n\n const sessionData = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n return sessionData;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const stored = browserStorage.getItem(key);\n if (!stored) return true;\n const expiry = Number(stored);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const stored = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!stored) return false;\n const accessExpiryTimestamp = Number(stored);\n if (isNaN(accessExpiryTimestamp)) return false;\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n _cachedClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_TOKEN_KEY);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.sub\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n getStoredRefreshToken,\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@trieoh/envoy-fetch-ts\";\nimport { tokenStore } from \"../store/token-store\";\nimport type { AuthTokenClaims, AuthTokens } from \"../types/token-types\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n let shouldClear = true;\n try {\n const refreshToken = getStoredRefreshToken();\n if (!refreshToken) {\n shouldClear = true;\n throw new Error(\"No refresh token available\");\n }\n\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n {\n method: \"POST\",\n credentials: \"omit\",\n headers: { \"refresh_token\": refreshToken },\n }\n );\n\n if (res.code !== 200 || !res.data) {\n shouldClear = res.code !== 503;\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n saveAuthSession(res.data);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n if (shouldClear) clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n\n if (!hasAccessToken || isTokenExpiringSoon(30)) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"omit\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n const hasRefreshToken = !!getStoredRefreshToken();\n const isExpiring = isTokenExpiringSoon(30);\n\n if (hasRefreshToken && isExpiring) {\n logger.log(\"401 detected and token is expiring/expired, attempting refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../types/token-types\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@trieoh/envoy-fetch-ts\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n","import { env } from \"../core/env\";\n\nexport const validateProjectKey = () => {\n if (!env.PROJECT_ID || env.PROJECT_ID.trim() === \"\") {\n throw new Error(\n \"[TRIEOH SDK] Project ID is missing. Please set PUBLIC_TRIEOH_AUTH_PROJECT_ID, NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID or VITE_TRIEOH_AUTH_PROJECT_ID.\"\n );\n }\n};\n\nexport const validateApiKey = () => {\n if (!env.API_KEY || env.API_KEY.trim() === \"\") {\n throw new Error(\n \"[TRIEOH SDK] Private API Key is missing. This operation requires TRIEOH_AUTH_API_KEY to be set in a server-side environment.\"\n );\n }\n};\n","import type { CurrentSessionI, SessionI } from \"../types/sessions-types\";\nimport { clearAuthTokens, getUserInfo, saveAuthSession } from \"../utils/token-utils\";\nimport { validateProjectKey } from \"../utils/env-validator\";\nimport type { Api, ApiResponse } from \"./api\";\nimport { env } from \"./env\";\nimport type { IntrospectResponse } from \"../types/instropect-types\";\nimport { AuthTokens } from \"../types/token-types\";\nimport type { OAuthProviderI } from \"../types/common-types\";\n\nexport interface AuthCallbacks {\n onLogin?: (res: ApiResponse<AuthTokens>) => void;\n onSetup?: (res: ApiResponse<AuthTokens>) => void;\n onRegister?: (res: ApiResponse<void>) => void;\n onVerify?: (res: ApiResponse<void>) => void;\n onResetPassword?: (res: ApiResponse<void>) => void;\n onRefresh?: (res?: ApiResponse<AuthTokens>) => void;\n}\n\nexport const createAuthService = (apiInstance: Api, callbacks?: AuthCallbacks) => ({\n isSetupDone: async () => apiInstance.get<void>(\"/auth/setup\", { requiresAuth: false }),\n\n setup: async (email: string, password: string) => {\n if (env.PROJECT_ID) validateProjectKey();\n const url = `/auth/setup${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<AuthTokens>(\n url,\n { email, password },\n { requiresAuth: false }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onSetup?.(res);\n }\n\n return res;\n },\n\n login: async (email: string, password: string) => {\n if (env.PROJECT_ID) validateProjectKey();\n const url = `/auth/login${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<AuthTokens>(\n url,\n { email, password },\n { requiresAuth: false }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onLogin?.(res);\n }\n\n return res;\n },\n\n loginWithProvider: async (provider: OAuthProviderI) => {\n const url = `/auth/${provider}/connect`;\n const res = await apiInstance.get<{ url: string }>(url, { requiresAuth: false });\n return res;\n },\n\n completeProviderLogin: async (provider: OAuthProviderI, code: string) => {\n const url = `/auth/${provider}/callback?code=${code}`;\n const res = await apiInstance.get<AuthTokens>(url, { requiresAuth: false });\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onLogin?.(res);\n }\n return res;\n },\n\n register: async (email: string, password: string) => {\n const options = { requiresAuth: false };\n const url = `/auth/register${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n if (env.PROJECT_ID) validateProjectKey();\n\n const res = await apiInstance.post<void>(url, { email, password }, options);\n if (res.success) callbacks?.onRegister?.(res);\n return res;\n },\n\n logout: async (options?: { forceLogout?: boolean }) => {\n const url = `/auth/logout${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<void>(url);\n if (res.success || options?.forceLogout) clearAuthTokens();\n return res;\n },\n\n refresh: async () => {\n const res = await apiInstance.post<AuthTokens>(\n \"/auth/refresh\",\n undefined,\n { skipRefresh: true }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onRefresh?.(res);\n }\n\n return res;\n },\n\n // FIXME: This is not being used for now\n sessions: async () => apiInstance.get<SessionI[]>(\"/sessions\"),\n\n currentSession: async () => apiInstance.get<CurrentSessionI>(\"/sessions/me\"),\n\n revokeASession: async (id: string) => apiInstance.delete<void>(`/sessions/${id}`),\n\n revokeSessions: async (revokeAll: boolean = false) => {\n const path = revokeAll ? \"/sessions\" : \"/sessions/others\"\n return apiInstance.delete<void>(path);\n },\n\n profile: () => getUserInfo(),\n\n sendForgotPassword: async (email: string) => {\n const options = { requiresAuth: false };\n if (env.PROJECT_ID) {\n validateProjectKey();\n return apiInstance.post<void>(\n \"/account/forgot-password\",\n { email, project_id: env.PROJECT_ID },\n options\n );\n }\n return apiInstance.post<void>(\"/account/forgot-password\", { email }, options);\n },\n\n resetPassword: async (token: string, new_password: string) => {\n const res = await apiInstance.post<void>(\n `/account/reset-password?token=${token}`,\n { new_password },\n { requiresAuth: false }\n );\n if (res.success) callbacks?.onResetPassword?.(res);\n return res;\n },\n\n verifyEmail: async (token: string) => {\n const url = `/account/verify?token=${token}`;\n const res = await apiInstance.post<void>(url);\n if (res.success) callbacks?.onVerify?.(res);\n return res;\n },\n\n resendVerifyEmail: async () => apiInstance.post<void>(\"/account/verify/resend\"),\n\n introspect: async (apiKey?: string) => {\n return apiInstance.get<IntrospectResponse>(\"/auth/introspect\", {\n requiresAuth: !apiKey,\n headers: apiKey ? { \"X-API-KEY\": apiKey } : undefined,\n });\n },\n\n health: async () => {\n return apiInstance.get<{ service: string; status: string }>(\"/health\", {\n requiresAuth: false,\n });\n },\n\n authHealth: async () => {\n return apiInstance.get<{ service: string; status: string; user_id: string }>(\"/protected/health\");\n }\n});\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore\n} from \"react\";\nimport { Api } from \"../core/api\";\nimport { createAuthService, type AuthCallbacks } from \"../core/services\";\nimport { getTokenClaims, isRefreshSessionExpired } from \"../utils/token-utils\";\nimport { validateProjectKey } from \"../utils/env-validator\";\nimport { configure } from \"../core/env\";\nimport { authStore } from \"../store/auth-store\";\nimport { logger, type DefaultFetchClientConfig } from \"@trieoh/envoy-fetch-ts\";\nimport type { AuthTokenClaims } from \"../types/token-types\";\n\ntype AuthContextType = {\n auth: ReturnType<typeof createAuthService>;\n isAuthenticated: boolean;\n isInitializing: boolean;\n isProjectMode?: boolean;\n};\n\nconst AuthContext = createContext<AuthContextType | null>(null);\n\nexport function AuthProvider({\n children,\n baseURL,\n projectId,\n isProjectMode = true,\n fallback,\n waitSession = true,\n clientConfig,\n onLogin,\n onSetup,\n onResetPassword,\n onRegister,\n onVerify,\n onRefresh,\n}: {\n children: React.ReactNode;\n baseURL?: string;\n projectId?: string;\n isProjectMode?: boolean;\n /** Component to show while initial auth check is in progress */\n fallback?: React.ReactNode;\n /** Whether to wait for the session restoration before rendering children. Defaults to true. */\n waitSession?: boolean;\n /** Extra config forwarded to the API client (e.g. timeout) */\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n} & AuthCallbacks) {\n const isRestoring = useRef(false);\n\n const { isAuthenticated, isInitializing } = useSyncExternalStore(\n authStore.subscribe,\n authStore.getSnapshot,\n authStore.getServerSnapshot,\n );\n\n useEffect(() => {\n configure({\n ...(projectId ? { PROJECT_ID: projectId } : {}),\n ...(baseURL ? { BASE_URL: baseURL } : {}),\n });\n }, [projectId, baseURL]);\n\n const onTokenRefreshed = useCallback((claims: AuthTokenClaims) => {\n authStore.set({\n isAuthenticated: !!claims.access_data,\n isInitializing: false,\n });\n onRefresh?.();\n }, [onRefresh]);\n\n const apiInstance = useMemo(() => new Api(\n baseURL,\n undefined,\n onTokenRefreshed,\n clientConfig,\n ), [baseURL, onTokenRefreshed, clientConfig]);\n\n const auth = useMemo(\n () => createAuthService(apiInstance, {\n onLogin,\n onSetup,\n onResetPassword,\n onRegister,\n onVerify,\n onRefresh,\n }),\n [apiInstance, onLogin, onSetup, onResetPassword, onRegister, onVerify, onRefresh],\n );\n\n useEffect(() => {\n if (isProjectMode) validateProjectKey();\n\n const restoreSession = async () => {\n if (isRestoring.current) return;\n isRestoring.current = true;\n\n if (getTokenClaims()) {\n authStore.set({ isAuthenticated: true, isInitializing: false });\n return;\n }\n\n if (isRefreshSessionExpired()) {\n authStore.reset();\n authStore.set({ isInitializing: false });\n return;\n }\n\n logger.log(\"No cached claims, attempting silent refresh...\");\n try {\n await apiInstance.interceptor.refreshToken();\n logger.log(\"Session restored.\");\n } catch {\n authStore.reset();\n logger.warn(\"Could not restore session (offline?).\");\n } finally {\n authStore.set({ isInitializing: false });\n }\n };\n\n restoreSession();\n }, [auth, isProjectMode]);\n\n const contextValue = useMemo(() => ({\n auth,\n isAuthenticated,\n isInitializing,\n isProjectMode\n }), [auth, isAuthenticated, isInitializing, isProjectMode]);\n\n if (waitSession && isInitializing) return fallback ?? null;\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth() {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error(\"useAuth must be used inside <AuthProvider>\");\n return ctx;\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: var(--font-sans, \\\"Inter\\\", sans-serif);--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-green-500: oklch(72.3% .219 149.579);--color-green-600: oklch(62.7% .194 149.214);--spacing: .25rem;--container-md: 28rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-base--line-height: 1.5 ;--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--text-xl: 1.25rem;--text-xl--line-height: calc(1.75 / 1.25);--text-2xl: 1.5rem;--text-2xl--line-height: calc(2 / 1.5);--text-3xl: 1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl: 2.25rem;--text-4xl--line-height: calc(2.5 / 2.25);--font-weight-extralight: 200;--font-weight-light: 300;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--tracking-tighter: -.05em;--tracking-tight: -.025em;--tracking-normal: 0em;--tracking-wide: .025em;--tracking-wider: .05em;--tracking-widest: .1em;--radius-sm: calc(var(--radius, .625rem) - 4px);--radius-md: calc(var(--radius, .625rem) - 2px);--radius-lg: var(--radius, .625rem);--radius-2xl: 1rem;--ease-out: cubic-bezier(0, 0, .2, 1);--ease-in-out: cubic-bezier(.4, 0, .2, 1);--animate-spin: spin 1s linear infinite;--blur-sm: 8px;--blur-3xl: 64px;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono);--color-background: var(--background, oklch(.9702 0 0));--color-foreground: var(--foreground, oklch(.1944 .0051 248.09));--color-primary: var(--primary, oklch(.7975 .1018 262.7));--color-primary-foreground: var(--primary-foreground, oklch(.9702 0 0));--color-secondary: var(--secondary, oklch(.1139 .0789 264.05));--color-secondary-foreground: var(--secondary-foreground, oklch(.9702 0 0));--color-muted: var(--muted, oklch(.9569 .0026 248.09));--color-muted-foreground: var(--muted-foreground, oklch(.5278 0 0));--color-border: var(--border, oklch(.869 .0093 248.09));--color-input: var(--input, oklch(.9145 .0062 248.09));--color-destructive: var(--destructive, oklch(.6373 .1718 28.92));--color-destructive-foreground: var(--destructive-foreground, oklch(.9851 0 0));--color-ring: var(--ring, oklch(.7975 .1018 262.7));--color-accent: var(--accent, oklch(.9326 .0313 262.7));--color-accent-foreground: var(--accent-foreground, oklch(.1944 .0051 248.09));--radius-full: 9999px}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.\\\\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.button-loading{&:after{content:\\\"\\\";position:absolute;top:0;left:-150%;width:150%;height:100%;background:linear-gradient(120deg,transparent 0%,var(--color-foreground) 40%,transparent 80%);@supports (color: color-mix(in lab,red,red)){background:linear-gradient(120deg,transparent 0%,color-mix(in oklab,var(--color-foreground) 40%,white 15%) 40%,transparent 80%)}animation:shine 1.5s infinite}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\\\.5{top:calc(var(--spacing) * 1.5)}.top-1\\\\/2{top:50%}.top-\\\\[-10\\\\%\\\\]{top:-10%}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.right-\\\\[-10\\\\%\\\\]{right:-10%}.bottom-\\\\[-10\\\\%\\\\]{bottom:-10%}.left-3\\\\.5{left:calc(var(--spacing) * 3.5)}.left-\\\\[-10\\\\%\\\\]{left:-10%}.z-10{z-index:10}.m-0{margin:calc(var(--spacing) * 0)}.m-2{margin:calc(var(--spacing) * 2)}.m-\\\\[0\\\\.125rem\\\\]{margin:.125rem}.mx-1\\\\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mb-0\\\\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-3\\\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-13{height:calc(var(--spacing) * 13)}.h-16{height:calc(var(--spacing) * 16)}.h-\\\\[40\\\\%\\\\]{height:40%}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\\\\[max\\\\(75dvh\\\\,32rem\\\\)\\\\]{max-height:max(75dvh,32rem)}.min-h-80{min-height:calc(var(--spacing) * 80)}.min-h-112{min-height:calc(var(--spacing) * 112)}.min-h-screen{min-height:100vh}.w-3\\\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-\\\\[40\\\\%\\\\]{width:40%}.w-full{width:100%}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-120{max-width:calc(var(--spacing) * 120)}.max-w-\\\\[320px\\\\]{max-width:320px}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-60{min-width:calc(var(--spacing) * 60)}.min-w-\\\\[20rem\\\\]{min-width:20rem}.flex-1{flex:1}.flex-\\\\[0_1_auto\\\\]{flex:0 1 auto}.flex-\\\\[1_1_auto\\\\]{flex:1 1 auto}.shrink-0{flex-shrink:0}.-translate-y-1\\\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}}.space-y-5{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}}.divide-x{:where(&>:not(:last-child)){--tw-divide-x-reverse: 0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}}.divide-border\\\\/60{:where(&>:not(:last-child)){border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\\\[14px\\\\]{border-radius:14px}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-none{--tw-border-style: none;border-style:none}.border-border{border-color:var(--color-border)}.border-border\\\\/40{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 40%,transparent)}}.border-border\\\\/50{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-border\\\\/60{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}.border-destructive\\\\!{border-color:var(--color-destructive)!important}.border-destructive\\\\/50{border-color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-destructive) 50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-input{border-color:var(--color-input)}.border-primary{border-color:var(--color-primary)}.border-secondary\\\\/20{border-color:var(--color-secondary);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-secondary) 20%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-destructive\\\\/5{background-color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-destructive) 5%,transparent)}}.bg-foreground\\\\/10{background-color:var(--color-foreground);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted\\\\/30{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.bg-muted\\\\/40{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.bg-muted\\\\/50{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-primary\\\\/10{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\\\\/20{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.bg-primary\\\\/40{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:transparent}.p-1{padding:calc(var(--spacing) * 1)}.p-1\\\\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\\\.5{padding:calc(var(--spacing) * 2.5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\\\\[1\\\\.5rem_0\\\\.5rem\\\\]{padding:1.5rem .5rem}.p-\\\\[1\\\\.25rem_0\\\\.75rem\\\\]{padding:1.25rem .75rem}.p-\\\\[1\\\\.25rem_1\\\\.5rem\\\\]{padding:1.25rem 1.5rem}.p-\\\\[1rem_0\\\\]{padding:1rem 0}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\\\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-px{padding-block:1px}.pt-2\\\\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-3\\\\.5{padding-bottom:calc(var(--spacing) * 3.5)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading, var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading, var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading, var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading, var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.text-\\\\[10px\\\\]{font-size:10px}.text-\\\\[11px\\\\]{font-size:11px}.text-\\\\[12px\\\\]{font-size:12px}.leading-none{--tw-leading: 1;line-height:1}.font-bold{--tw-font-weight: var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extralight{--tw-font-weight: var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight: var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking: var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking: var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking: var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking: var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-destructive\\\\/80{color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 80%,transparent)}}.text-foreground{color:var(--color-foreground)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary\\\\/70{color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.text-secondary-foreground{color:var(--color-secondary-foreground)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-95{opacity:95%}.opacity-100{opacity:100%}.shadow-\\\\[0_0\\\\.25rem_0\\\\.25rem_0_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow: 0 .25rem .25rem 0 var(--tw-shadow-color, rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_0\\\\.25rem_1rem_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow: 0 .25rem 1rem var(--tw-shadow-color, rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none\\\\!{--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-primary\\\\/10{--tw-shadow-color: var(--color-primary);@supports (color: color-mix(in lab,red,red)){--tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-primary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-destructive\\\\/20{--tw-ring-color: var(--color-destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-3xl{--tw-blur: blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur: blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\\\\[color\\\\,text-decoration\\\\,opacity\\\\]{transition-property:color,text-decoration,opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\\\\[opacity\\\\,transform\\\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-150{--tw-duration: .15s;transition-duration:.15s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-500{--tw-duration: .5s;transition-duration:.5s}.duration-\\\\[120ms\\\\]{--tw-duration: .12s;transition-duration:.12s}.ease-in-out{--tw-ease: var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease: var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style: none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-hover\\\\:translate-x-1{&:is(:where(.group):hover *){@media(hover:hover){--tw-translate-x: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}}.group-hover\\\\:opacity-100{&:is(:where(.group):hover *){@media(hover:hover){opacity:100%}}}.peer-placeholder-shown\\\\:top-3\\\\.5{&:is(:where(.peer):placeholder-shown~*){top:calc(var(--spacing) * 3.5)}}.peer-placeholder-shown\\\\:text-\\\\[15px\\\\]{&:is(:where(.peer):placeholder-shown~*){font-size:15px}}.peer-placeholder-shown\\\\:font-normal{&:is(:where(.peer):placeholder-shown~*){--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}}.peer-placeholder-shown\\\\:tracking-normal{&:is(:where(.peer):placeholder-shown~*){--tw-tracking: var(--tracking-normal);letter-spacing:var(--tracking-normal)}}.peer-placeholder-shown\\\\:text-destructive\\\\/60{&:is(:where(.peer):placeholder-shown~*){color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 60%,transparent)}}}.peer-placeholder-shown\\\\:text-muted-foreground{&:is(:where(.peer):placeholder-shown~*){color:var(--color-muted-foreground)}}.peer-focus\\\\:top-1\\\\.5{&:is(:where(.peer):focus~*){top:calc(var(--spacing) * 1.5)}}.peer-focus\\\\:text-\\\\[10px\\\\]{&:is(:where(.peer):focus~*){font-size:10px}}.peer-focus\\\\:font-semibold{&:is(:where(.peer):focus~*){--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}.peer-focus\\\\:tracking-wider{&:is(:where(.peer):focus~*){--tw-tracking: var(--tracking-wider);letter-spacing:var(--tracking-wider)}}.peer-focus\\\\:text-destructive\\\\/80{&:is(:where(.peer):focus~*){color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 80%,transparent)}}}.peer-focus\\\\:text-primary\\\\/70{&:is(:where(.peer):focus~*){color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}}.selection\\\\:bg-primary\\\\/10{& *::selection{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}&::selection{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}}.selection\\\\:text-primary{& *::selection{color:var(--color-primary)}&::selection{color:var(--color-primary)}}.placeholder\\\\:text-transparent{&::placeholder{color:transparent}}.hover\\\\:scale-\\\\[1\\\\.02\\\\]{&:hover{@media(hover:hover){scale:1.02}}}.hover\\\\:scale-\\\\[1\\\\.05\\\\]{&:hover{@media(hover:hover){scale:1.05}}}.hover\\\\:bg-accent{&:hover{@media(hover:hover){background-color:var(--color-accent)}}}.hover\\\\:bg-muted{&:hover{@media(hover:hover){background-color:var(--color-muted)}}}.hover\\\\:bg-muted\\\\/50{&:hover{@media(hover:hover){background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}}}.hover\\\\:bg-muted\\\\/60{&:hover{@media(hover:hover){background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}}}.hover\\\\:text-accent-foreground{&:hover{@media(hover:hover){color:var(--color-accent-foreground)}}}.hover\\\\:text-foreground{&:hover{@media(hover:hover){color:var(--color-foreground)}}}.hover\\\\:text-primary\\\\/70{&:hover{@media(hover:hover){color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}}}.hover\\\\:underline{&:hover{@media(hover:hover){text-decoration-line:underline}}}.hover\\\\:opacity-80{&:hover{@media(hover:hover){opacity:80%}}}.hover\\\\:opacity-90{&:hover{@media(hover:hover){opacity:90%}}}.hover\\\\:opacity-100{&:hover{@media(hover:hover){opacity:100%}}}.focus\\\\:bg-muted\\\\/60{&:focus{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.focus-visible\\\\:ring-0{&:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\\\\:ring-1{&:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\\\\:ring-ring{&:focus-visible{--tw-ring-color: var(--color-ring)}}.focus-visible\\\\:outline-none{&:focus-visible{--tw-outline-style: none;outline-style:none}}.active\\\\:scale-\\\\[0\\\\.95\\\\]{&:active{scale:.95}}.active\\\\:scale-\\\\[0\\\\.98\\\\]{&:active{scale:.98}}.active\\\\:scale-\\\\[0\\\\.99\\\\]{&:active{scale:.99}}.disabled\\\\:pointer-events-none{&:disabled{pointer-events:none}}.disabled\\\\:transform-none\\\\!{&:disabled{transform:none!important}}.disabled\\\\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\\\\:opacity-50{&:disabled{opacity:50%}}.disabled\\\\:opacity-60{&:disabled{opacity:60%}}.\\\\@\\\\[640px\\\\]\\\\:flex-row{@container (width >= 640px){flex-direction:row}}.\\\\@\\\\[640px\\\\]\\\\:items-center{@container (width >= 640px){align-items:center}}.\\\\@\\\\[640px\\\\]\\\\:justify-between{@container (width >= 640px){justify-content:space-between}}.\\\\@\\\\[640px\\\\]\\\\:gap-2{@container (width >= 640px){gap:calc(var(--spacing) * 2)}}.\\\\@\\\\[640px\\\\]\\\\:gap-4{@container (width >= 640px){gap:calc(var(--spacing) * 4)}}.\\\\@\\\\[640px\\\\]\\\\:gap-8{@container (width >= 640px){gap:calc(var(--spacing) * 8)}}.\\\\@\\\\[640px\\\\]\\\\:text-left{@container (width >= 640px){text-align:left}}}@import url(https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap);@layer base{button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}}@property --tw-translate-x{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-divide-x-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \\\"*\\\"; inherits: false;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-outline-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shine{0%{left:-150%}to{left:150%}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-space-y-reverse: 0;--tw-divide-x-reverse: 0;--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-outline-style: solid;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial;--tw-duration: initial;--tw-ease: initial}}}\\n\")","import { useState } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport type { RuleStatus } from \"../../../utils/field-validator\";\n\ninterface BasicInputFieldProps {\n /** The Input ID/Name */\n name: string;\n /** The label text (name of the field) */\n label: string;\n /** The placeholder text (a default text to help the user) */\n placeholder: string;\n /** Input Type */\n type?: \"text\" | \"email\" | \"number\" | \"password\";\n /** Current Input Value */\n value?: string;\n /** Current Input Value On Change */\n onValueChange?: (value: string) => void;\n /** OnBlur event handler */\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n /** AutoComplete */\n autoComplete?: string;\n /** Validations and their results */\n rulesStatus?: RuleStatus[];\n /** Form submission status */\n submitted?: boolean;\n /** Ref to the input element */\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport default function BasicInputField({\n name,\n label,\n placeholder,\n type = \"text\",\n value,\n onValueChange,\n onBlur,\n autoComplete,\n rulesStatus = [],\n submitted = false,\n inputRef,\n}: BasicInputFieldProps) {\n const [isSecretVisible, setIsSecretVisible] = useState(false);\n const hasAnyFailing = rulesStatus.some(r => !r.passed);\n\n return (\n <div className=\"font-sans relative w-full flex flex-col gap-1 text-foreground\">\n <label htmlFor={name} className=\"text-base font-semibold\">\n {label}\n </label>\n <div\n className={`flex justify-between items-center px-2.5 py-px gap-2.5 border-b-2 border-foreground ${(hasAnyFailing && submitted) ? \"border-destructive!\" : \"\"\n }`}\n >\n <input\n type={isSecretVisible ? \"text\" : type}\n name={name}\n id={name}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onValueChange && onValueChange(e.target.value)}\n onBlur={onBlur}\n autoComplete={autoComplete}\n aria-invalid={hasAnyFailing && submitted}\n ref={inputRef}\n className=\"min-w-40 flex-1 text-base font-light text-foreground appearance-none bg-transparent outline-none border-none shadow-none! py-0.5\"\n />\n {type === \"password\" && (\n isSecretVisible ?\n <EyeOff\n className=\"cursor-pointer shrink-0 select-none\"\n size={24}\n onClick={() => setIsSecretVisible(false)}\n />\n :\n <Eye\n className=\"cursor-pointer shrink-0 select-none\"\n size={24}\n onClick={() => setIsSecretVisible(true)}\n />\n )\n }\n </div>\n\n <div className=\"text-xs text-muted-foreground transition-opacity duration-200 ease-in-out\">\n {rulesStatus.map((r, i) => {\n const classes = [\n \"transition-[color,text-decoration,opacity] duration-[120ms] ease opacity-95 m-[0.125rem]\",\n r.passed ? \"line-through opacity-60 text-green-500\" : \"\",\n !r.passed && submitted ? \"text-destructive font-semibold opacity-100\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <p key={r.id ?? i} className={classes}>\n {r.message}\n </p>\n );\n })}\n </div>\n\n </div>\n )\n}","import type { MouseEvent } from \"react\";\n\ninterface BasicSubmitButtonProps {\n /** The label text (Submit Text) */\n label: string;\n /** What will happen when the user click on the button */\n onSubmit: (e: MouseEvent<HTMLButtonElement>) => void;\n /** Is performing the submit */\n loading: boolean;\n}\n\nexport default function BasicSubmitButton({\n label,\n onSubmit,\n loading\n}: BasicSubmitButtonProps) {\n return (\n <button\n type=\"submit\"\n onClick={onSubmit}\n disabled={loading}\n className={`font-sans w-full h-13 text-xl font-semibold outline-none bg-transparent relative overflow-hidden min-w-40 shrink-0 border-2 border-foreground text-foreground cursor-pointer px-6 transition-transform duration-500 rounded-lg hover:scale-[1.02] active:scale-[0.99] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none! ${loading ? \"button-loading\" : \"\"\n }`}\n >\n {label}\n </button>\n )\n}","import { User } from \"lucide-react\";\n\n\ninterface CardAvatarProps {\n /** The main text */\n mainText: string;\n /** Sub Text that will appear below the main text */\n subText: string;\n}\n\nexport default function CardAvatar({\n mainText,\n subText,\n}: CardAvatarProps) {\n return (\n <div className=\"font-sans flex flex-col items-center\">\n <div className=\"flex justify-center items-center p-2 bg-foreground/10 rounded-full mb-2.5\">\n <User className=\"w-16 h-16 p-2.5 bg-background rounded-full shadow-[0_0.25rem_1rem_rgba(0,0,0,0.25)]\" size={70} />\n </div>\n <h3 className=\"text-center text-xl font-medium m-0\">{mainText}</h3>\n <span className=\"text-center text-sm font-light opacity-60\">{subText}</span>\n </div>\n )\n}","export type Rule = {\n id?: string;\n message: string;\n test: (value: string) => boolean;\n};\n\nexport type RuleStatus = {\n id?: string;\n message: string;\n passed: boolean;\n};\n\nexport function evaluateRules(rules: Rule[], value: string): RuleStatus[] {\n return rules.map(r => ({ \n id: r.id,\n message: r.message,\n passed: !!r.test(value) \n }));\n}\n","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface SignInProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signUpRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n forgotPasswordRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n}\n\nexport function SignIn({\n onSuccess,\n onFailed,\n signUpRedirect,\n forgotPasswordRedirect,\n emailRules,\n}: SignInProps) {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n password: [],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n const passwordValidation = evaluateRules(rules.password, password);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.login(email, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Faça login na sua conta\" subText=\"Insira seus dados para fazer login\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"current-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Entrar\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {forgotPasswordRedirect && (\n <span className=\"text-sm font-semibold text-center cursor-pointer\">\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={forgotPasswordRedirect}>\n Esqueceu sua senha?\n </span>\n </span>\n )}\n {signUpRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n <span className=\"text-sm font-semibold\">\n {\"Ainda não possui uma conta? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={signUpRedirect}>Cadastra-se</span>\n </span>\n </>}\n </form>\n );\n}\n","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface SignUpProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n passwordRules?: Rule[];\n}\n\nexport function SignUp({\n onSuccess,\n onFailed,\n loginRedirect,\n emailRules,\n passwordRules,\n}: SignUpProps) {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const confirmPasswordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n password: passwordRules || [\n { message: \"Mínimo de 8 caracteres.\", test: v => v.length >= 8 },\n { message: \"Deve conter uma letra maiúscula.\", test: v => /[A-Z]/.test(v) },\n {\n message: \"Inclua pelo menos um caractere especial, ex: ! @ # $ % & * . ,\",\n test: v => /[!@#$%^&*(),.?\":{}|<>_\\-+=~`;/\\\\[\\]]/.test(v)\n },\n { message: \"Deve conter um número.\", test: v => /\\d/.test(v) },\n ],\n confirmPassword: [\n { message: \"Senhas não conferem.\", test: v => v === password },\n ],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n const passwordValidation = evaluateRules(rules.password, password);\n const confirmPasswordValidation = evaluateRules(rules.confirmPassword, confirmPassword);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n const confirmPasswordInvalid = confirmPasswordValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n if (confirmPasswordInvalid) {\n confirmPasswordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.register(email, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Crie sua conta\" subText=\"Insira seus dados para começar\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Confirme a Senha\"\n name=\"confirm-password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={confirmPassword}\n onValueChange={setConfirmPassword}\n inputRef={confirmPasswordRef}\n rulesStatus={confirmPasswordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Criar Conta\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {loginRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n <span className=\"text-sm font-semibold\">\n {\"Já possui uma conta? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>Entre</span>\n </span>\n </>}\n </form>\n );\n}\n","export interface CopyrightProps {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n}\n\nconst sizeMap = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n}\n\nexport function Copyright({ size }: CopyrightProps) {\n const sizeClass = size ? sizeMap[size] : 'text-base'\n\n return (\n <span className={`font-sans font-medium ${sizeClass}`}>\n © {new Date().getFullYear()} TrieOH\n </span>\n )\n}","import { useState, type MouseEvent } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport { LogOut } from \"lucide-react\";\n\nexport interface LogoutProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n forceLogout?: boolean;\n}\n\nexport function BasicLogoutButton({\n onSuccess,\n onFailed,\n forceLogout\n}: LogoutProps) {\n const { auth } = useAuth();\n const [loading, setLoading] = useState(false);\n\n const handleLogout = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (loading) return;\n\n setLoading(true);\n\n const res = await auth.logout({ forceLogout });\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n setLoading(false);\n }\n return (\n <button\n onClick={handleLogout}\n type=\"button\"\n disabled={loading}\n className=\"font-sans border-none bg-transparent cursor-pointer flex items-end gap-1 text-base font-medium text-destructive transition-transform duration-200 hover:scale-[1.05] active:scale-[0.98] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none!\"\n >\n <LogOut size={24} /> <span>Log out</span>\n </button>\n )\n}","import {\n Smartphone,\n Tablet,\n Monitor,\n type LucideIcon\n} from \"lucide-react\";\n\nexport const deviceIconMap: Record<string, LucideIcon> = {\n mobile: Smartphone,\n tablet: Tablet,\n desktop: Monitor,\n};","import { UAParser } from \"ua-parser-js\";\n\nexport function parseUserAgent(userAgent: string) {\n const { device, os, browser } = UAParser(userAgent);\n\n return {\n deviceType: device.type ?? \"desktop\",\n os: os.name,\n browser: browser.name,\n };\n}\n","import { parseUserAgent } from \"./parse-user-agent\";\nimport type { DeviceType } from \"./device-types\";\n\nexport interface DeviceInfo {\n device: DeviceType;\n os?: string;\n browser?: string;\n}\n\nexport function getDeviceInfo(userAgent: string): DeviceInfo {\n const parsed = parseUserAgent(userAgent);\n\n return {\n device: normalizeDevice(parsed.deviceType),\n os: parsed.os,\n browser: parsed.browser,\n };\n}\n\nfunction normalizeDevice(type?: string): DeviceType {\n if (!type) return \"desktop\";\n\n switch (type) {\n case \"mobile\":\n return \"mobile\";\n case \"tablet\":\n return \"tablet\";\n default:\n return \"desktop\";\n }\n}","export function timeAgo(isoDate: string): string {\n const diff = Date.now() - new Date(isoDate).getTime();\n const sec = Math.floor(diff / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const week = Math.floor(day / 7);\n\n if (sec < 60) return \"agora mesmo\";\n if (min < 60) return `${min} minutos atrás`;\n if (hour < 24) return `${hour} horas atrás`;\n if (day < 7) return `${day} dias atrás`;\n return `${week} semanas atrás`;\n}\n","import { Trash2 } from \"lucide-react\";\nimport { deviceIconMap } from \"../../../utils/icons/device-icon-map\";\nimport type { SessionI } from \"../../../types/sessions-types\";\nimport { getDeviceInfo } from \"../../../utils/ua/get-device-info\";\nimport type { MouseEvent } from \"react\";\nimport { timeAgo } from \"../../../utils/date-utils\";\n\ninterface SessionProps extends SessionI {\n is_current: boolean;\n onClick: (e: MouseEvent<SVGElement>, id: string) => void;\n}\n\nexport default function SessionCard({\n is_current,\n session_id,\n user_agent,\n issued_at,\n user_ip,\n onClick\n}: SessionProps) {\n const deviceI = getDeviceInfo(user_agent)\n const DeviceIcon = deviceIconMap[deviceI.device];\n return (\n <div className=\"border-t border-border p-[1.25rem_0.75rem] text-foreground\">\n <div className=\"relative flex flex-col items-center gap-2 flex-1 text-center @[640px]:flex-row @[640px]:items-center @[640px]:gap-4 @[640px]:text-left\">\n <DeviceIcon size={40} />\n <div className=\"flex flex-col min-w-0\">\n <h3 className=\"text-base font-semibold m-0\">{deviceI.browser} - {deviceI.os}</h3>\n <span className=\"inline-flex flex-col text-sm font-extralight @[640px]:flex-row @[640px]:gap-2 @[640px]:items-center\">\n {is_current && <strong className=\"text-primary font-normal\">• Sessão Atual •</strong>}\n <span>{ `${user_ip} - ${timeAgo(issued_at)}` }</span>\n </span>\n </div>\n {!is_current && (\n <Trash2 \n size={20} \n className=\"absolute top-0 right-0 cursor-pointer text-destructive opacity-60 transition-[opacity,transform] duration-200 hover:opacity-100 hover:scale-[1.05] active:scale-[0.95]\"\n onClick={(e) => onClick(e, session_id)}\n />\n )}\n </div>\n </div>\n )\n}","import { type MouseEvent, useEffect, useState } from \"react\";\nimport SessionCard from \"./SessionCard\";\nimport { useAuth } from \"../../AuthProvider\";\nimport type { SessionI } from \"../../../types/sessions-types\";\n\nexport interface SessionsProps {\n /** If true will revoke even the current session */\n revokeAll?: boolean;\n /** What will happen when sessions are revoked */\n onSuccess?: (message?: string) => Promise<void>;\n}\n\nexport function Sessions({\n revokeAll = false,\n onSuccess,\n}: SessionsProps) {\n const { auth } = useAuth();\n const [loading, setLoading] = useState(false);\n const [sessions, setSessions] = useState<SessionI[]>([]);\n\n const fetchSessions = async () => {\n const res = await auth.sessions();\n if (res.success) {\n const currentSessionId = auth.profile()?.session_id;\n\n const sessions = (res.data).sort((a, b) => {\n if (a.session_id === currentSessionId) return -1;\n if (b.session_id === currentSessionId) return 1;\n return 0;\n });\n setSessions(sessions);\n }\n }\n\n useEffect(() => {\n fetchSessions();\n }, []);\n\n const handleRevokeASession = async (e: MouseEvent<SVGElement>, id: string) => {\n e.preventDefault();\n const sessionToRemove = sessions.find(s => s.session_id === id);\n if (!sessionToRemove) return;\n setSessions(sessions.filter(s => s.session_id !== id))\n try {\n const res = await auth.revokeASession(id);\n if (!res.success) setSessions(prev => [...prev, sessionToRemove]);\n } catch {\n setSessions(prev => [...prev, sessionToRemove]);\n }\n }\n\n const handleRevokeSessions = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (loading) return;\n setLoading(true);\n\n const res = await auth.revokeSessions(revokeAll);\n const id = auth.profile()?.session_id;\n if (res.success) {\n setSessions(revokeAll ? [] : sessions.filter(s => s.session_id === id));\n if (onSuccess) onSuccess(res.message);\n }\n setLoading(false);\n }\n\n return (\n <div className=\"font-sans w-full min-w-[20rem] m-2 @container bg-background text-foreground p-[1.5rem_0.5rem] rounded-lg\">\n <div className=\"w-full flex flex-wrap items-center justify-center text-center gap-4 box-border px-3 @[640px]:justify-between @[640px]:text-left @[640px]:gap-8\">\n <div className=\"flex-[0_1_auto] max-w-100\">\n <h3 className=\"font-semibold text-2xl m-0 mb-1\">Navegadores e Dispositivos</h3>\n <p className=\"font-extralight text-base m-0\">Esses navegadores e dispositivos estão atualmente conectados à sua conta. Remova quaisquer dispositivos não autorizados.</p>\n </div>\n <button\n type=\"submit\"\n onClick={handleRevokeSessions}\n disabled={loading}\n className={`font-sans w-full max-w-56 p-[1rem_0] h-auto text-base font-semibold outline-none bg-transparent relative overflow-hidden shrink-0 border-2 border-foreground text-foreground cursor-pointer transition-transform duration-500 rounded-lg hover:scale-[1.02] active:scale-[0.99] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none! ${loading ? \"button-loading\" : \"\"\n }`}\n >\n Revogar todas as sessões\n </button>\n </div>\n <div className=\"mt-4\">\n {sessions.length > 0 ? sessions.map(s => (\n <SessionCard\n key={s.session_id}\n {...s}\n is_current={auth.profile()?.session_id === s.session_id}\n onClick={handleRevokeASession}\n />\n )) : <span className=\"block border-t border-border p-[1.25rem_0.75rem] text-center font-semibold\">Nenhuma Sessão Disponível</span>}\n </div>\n </div>\n )\n}","import { type MouseEvent, useRef, useState } from \"react\";\nimport { evaluateRules, type Rule } from \"../../../utils/field-validator\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\n\nexport interface ForgotPasswordProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n}\n\nexport default function ForgotPassword({\n onSuccess,\n onFailed,\n loginRedirect,\n emailRules,\n}: ForgotPasswordProps) {\n const [email, setEmail] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.sendForgotPassword(email);\n\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar\n mainText=\"Esqueci a senha\"\n subText=\"Insira seu e-mail para receber um link de redefinição.\"\n />\n\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n </div>\n\n <BasicSubmitButton\n label={loadingSubmit ? \"Enviando...\" : \"Enviar link de redefinição\"}\n onSubmit={handleSubmit} loading={loadingSubmit}\n />\n {loginRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n\n <span className=\"text-sm font-semibold\">\n {\"Lembrou-se da sua senha? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>\n Login\n </span>\n </span>\n </>}\n </form>\n );\n}","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface ResetPasswordProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n passwordRules?: Rule[];\n}\n\nexport function ResetPassword({\n token,\n onSuccess,\n onFailed,\n loginRedirect,\n passwordRules,\n}: ResetPasswordProps) {\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const confirmPasswordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n password: passwordRules || [\n { message: \"Mínimo de 8 caracteres.\", test: v => v.length >= 8 },\n { message: \"Deve conter uma letra maiúscula.\", test: v => /[A-Z]/.test(v) },\n {\n message: \"Inclua pelo menos um caractere especial, ex: ! @ # $ % & * . ,\",\n test: v => /[!@#$%^&*(),.?\":{}|<>_\\-+=~`;/\\\\[\\]]/.test(v)\n },\n { message: \"Deve conter um número.\", test: v => /\\d/.test(v) },\n ],\n confirmPassword: [\n { message: \"Senhas não conferem.\", test: v => v === password },\n ],\n };\n\n const passwordValidation = evaluateRules(rules.password, password);\n const confirmPasswordValidation = evaluateRules(rules.confirmPassword, confirmPassword);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n const confirmPasswordInvalid = confirmPasswordValidation.some(r => !r.passed);\n\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n if (confirmPasswordInvalid) {\n confirmPasswordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.resetPassword(token, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Redefinir Senha\" subText=\"Crie uma nova senha para sua conta\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Nova Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Confirme a Nova Senha\"\n name=\"confirm-password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={confirmPassword}\n onValueChange={setConfirmPassword}\n inputRef={confirmPasswordRef}\n rulesStatus={confirmPasswordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Redefinir Senha\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {loginRedirect && (\n <span className=\"text-sm font-semibold\">\n {\"Lembrou-se da sua senha? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>\n Login\n </span>\n </span>\n )}\n </form>\n );\n}\n","import { useEffect, useState, useRef, type MouseEvent } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport { Check, Info } from \"lucide-react\";\n\nexport interface VerifyEmailProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n}\n\ntype VerifyStatus = \"verifying\" | \"success\" | \"error\" | \"already_verified\";\n\n/**\n * Hook to manage verification logic and allow mocking for Storybook\n * without exposing internal props in the public VerifyEmail component.\n */\nexport function useVerifyEmailLogic(token: string, onSuccess?: (m?: string) => void, onFailed?: (m: string, t?: string[]) => void) {\n const [loading, setLoading] = useState(true);\n const [status, setStatus] = useState<VerifyStatus>(\"verifying\");\n const [message, setMessage] = useState(\"Verificando seu e-mail...\");\n const { auth } = useAuth();\n const hasAttempted = useRef(false);\n\n const handleVerify = async () => {\n if (hasAttempted.current) return;\n hasAttempted.current = true;\n\n setLoading(true);\n setStatus(\"verifying\");\n\n try {\n const profile = auth.profile();\n if (profile?.is_verified) {\n setStatus(\"already_verified\");\n setMessage(\"Seu e-mail já está verificado.\");\n setLoading(false);\n return;\n }\n\n const res = await auth.verifyEmail(token);\n\n if (res.success) {\n await auth.refresh();\n setStatus(\"success\");\n setMessage(res.message || \"E-mail verificado com sucesso!\");\n if (onSuccess) await onSuccess(res.message);\n } else {\n setStatus(\"error\");\n setMessage(res.message || \"Falha na verificação do e-mail.\");\n if (onFailed) await onFailed(res.message, res.trace);\n }\n } catch (error) {\n setStatus(\"error\");\n setMessage(\"Ocorreu um erro inesperado durante a verificação.\");\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (token && !hasAttempted.current) handleVerify();\n }, [token]);\n\n const onRetry = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n hasAttempted.current = false;\n handleVerify();\n };\n\n return {\n loading,\n status,\n message,\n onRetry,\n setStatus,\n setLoading,\n setMessage\n };\n}\n\nexport function VerifyEmail({\n token,\n onSuccess,\n onFailed,\n}: VerifyEmailProps) {\n const { loading, status, message, onRetry } = useVerifyEmailLogic(token, onSuccess, onFailed);\n\n const mainText = status === \"verifying\" ? \"Verificando...\" :\n status === \"error\" ? \"Ops! Falha na verificação\" : \"Tudo pronto!\";\n\n return (\n <div className=\"font-sans flex flex-col w-full h-full min-h-screen items-center justify-center bg-background text-foreground p-6\">\n <div className=\"w-full max-w-120 flex flex-col gap-8 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] rounded-lg\">\n <CardAvatar\n mainText={mainText}\n subText={message}\n />\n\n {status === \"verifying\" && (\n <div className=\"w-full flex justify-center py-4\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-primary\"></div>\n </div>\n )}\n\n {status === \"error\" && (\n <div className=\"w-full flex flex-col gap-6 items-center\">\n <div className=\"w-full mt-2\">\n <BasicSubmitButton\n label=\"Tentar novamente\"\n onSubmit={onRetry}\n loading={loading}\n />\n </div>\n </div>\n )}\n\n {(status === \"success\" || status === \"already_verified\") && (\n <div className=\"w-full flex flex-col gap-4 items-center\">\n <div className=\"w-16 h-16 flex items-center justify-center rounded-full bg-primary/10 text-primary\">\n {status === \"success\" ? <Check size={40} /> : <Info size={40} />}\n </div>\n <p className=\"text-sm font-semibold opacity-50 text-center\">\n Você já pode fechar esta janela ou continuar navegando em sua conta.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\n\nexport interface ResendVerifyEmailProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n}\n\nexport function ResendVerifyEmail({\n onSuccess,\n onFailed,\n}: ResendVerifyEmailProps) {\n const [loading, setLoading] = useState(false);\n const [sent, setSent] = useState(false);\n const { auth } = useAuth();\n\n const handleResend = async () => {\n setLoading(true);\n const res = await auth.resendVerifyEmail();\n if (res.success) {\n setSent(true);\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) {\n await onFailed(res.message, res.trace);\n }\n setLoading(false);\n };\n\n return (\n <div className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar\n mainText=\"Reenviar Verificação\"\n subText=\"Não recebeu o e-mail de verificação? Clique no botão abaixo para reenviar.\"\n />\n\n <BasicSubmitButton\n label={sent ? \"E-mail Reenviado\" : \"Reenviar E-mail de Verificação\"}\n onSubmit={handleResend}\n loading={loading}\n />\n\n {sent && (\n <p className=\"text-sm font-semibold text-primary\">\n Um novo link de verificação foi enviado para seu e-mail.\n </p>\n )}\n </div>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useState, useId, forwardRef } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface PropsI extends React.InputHTMLAttributes<HTMLInputElement> {\n label: string;\n error?: boolean;\n}\n\nconst FormInput = forwardRef<HTMLInputElement, PropsI>(({\n label,\n id: propId,\n type = \"text\",\n error,\n className,\n value,\n onChange,\n onFocus,\n onBlur,\n ...props\n}, ref) => {\n const [showPassword, setShowPassword] = useState(false);\n const generatedId = useId();\n const id = propId ?? generatedId;\n\n const isPassword = type === \"password\";\n const inputType = isPassword ? (showPassword ? \"text\" : \"password\") : type;\n\n return (\n <div className=\"w-full font-body group relative\">\n <input\n ref={ref}\n id={id}\n type={inputType}\n value={value}\n placeholder=\" \"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n className={cn(\n \"peer h-13 w-full rounded-sm text-sm text-foreground outline-none\",\n \"border border-secondary/20 bg-muted/40 transition-all duration-200\",\n \"placeholder:text-transparent focus-visible:ring-0 focus:bg-muted/60\",\n \"px-3.5 pt-4 pb-1\",\n isPassword && \"pr-10\",\n error && \"bg-destructive/5 ring-1 ring-destructive/20 border-destructive/50\",\n className\n )}\n {...props}\n />\n\n <label\n htmlFor={id}\n className={cn(\n \"pointer-events-none absolute transition-all duration-200 ease-out left-3.5\",\n\n // Float state (Default)\n \"top-1.5 text-[10px] font-semibold tracking-wider text-primary/70\",\n\n // Default (Float 'disabled')\n \"peer-placeholder-shown:top-3.5 peer-placeholder-shown:text-[15px] peer-placeholder-shown:font-normal peer-placeholder-shown:tracking-normal peer-placeholder-shown:text-muted-foreground\",\n\n // Float state on focus\n \"peer-focus:top-1.5 peer-focus:text-[10px] peer-focus:font-semibold peer-focus:tracking-wider peer-focus:text-primary/70\",\n\n // Float error\n error && \"text-destructive/80\",\n error && \"peer-placeholder-shown:text-destructive/60\",\n error && \"peer-focus:text-destructive/80\"\n )}\n >\n {label}\n </label>\n\n {isPassword && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => { setShowPassword((prev) => !prev); }}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-primary/70 focus:outline-none\"\n aria-label={showPassword ? \"Ocultar senha\" : \"Mostrar senha\"}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n )}\n </div>\n );\n});\n\nFormInput.displayName = \"FormInput\";\n\nexport default FormInput;\n","import { motion, AnimatePresence } from \"motion/react\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface PropsI {\n message?: string;\n className?: string;\n}\n\nconst FormError = ({ message, className }: PropsI) => {\n return (\n <AnimatePresence>\n {message && (\n <motion.p\n initial={{ opacity: 0, height: 0, marginTop: 0 }}\n animate={{ opacity: 1, height: \"auto\", marginTop: 6 }}\n exit={{ opacity: 0, height: 0, marginTop: 0 }}\n transition={{ duration: 0.2, ease: \"easeOut\" }}\n className={cn(\n \"text-[11px] font-medium text-destructive tracking-tight leading-none px-1 overflow-hidden\",\n className\n )}\n >\n {message}\n </motion.p>\n )}\n </AnimatePresence>\n );\n};\n\nexport default FormError;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../../../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm text-sm font-semibold transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98]\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:opacity-90\",\n destructive: \"bg-destructive text-destructive-foreground hover:opacity-90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:opacity-80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-12 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\nconst Button = ({ className, variant, size, ...props }: ButtonProps) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n};\n\nexport { Button, buttonVariants };\n","export function OAuthDivider() {\n return (\n <div className=\"flex items-center gap-3 py-1\">\n <div className=\"flex-1 h-px bg-border\" />\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-widest select-none\">\n ou\n </span>\n <div className=\"flex-1 h-px bg-border\" />\n </div>\n );\n}\n","import { OAuthProviderI } from \"../../../../types/common-types\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface OAuthProviderButtonProps {\n provider: OAuthProviderI;\n onClick: () => void;\n isLoading?: boolean;\n}\n\nconst providerConfig: Record<OAuthProviderI, { label: string; icon: React.ReactNode }> = {\n google: {\n label: \"Google\",\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"w-5 h-5\" aria-hidden=\"true\">\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n </svg>\n ),\n },\n github: {\n label: \"GitHub\",\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"w-5 h-5\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z\" />\n </svg>\n ),\n },\n};\n\nexport function OAuthProviderButton({ provider, onClick, isLoading }: OAuthProviderButtonProps) {\n const config = providerConfig[provider];\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isLoading}\n className={cn(\n \"w-full flex items-center justify-center gap-2.5 h-12 px-4 rounded-sm text-sm font-semibold\",\n \"border border-input bg-background hover:bg-muted/60 transition-all\",\n \"disabled:opacity-50 disabled:pointer-events-none active:scale-[0.98]\",\n )}\n >\n {config.icon}\n <span>Continuar com {config.label}</span>\n </button>\n );\n}\n","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\nimport { OAuthDivider } from './Shared/OAuthDivider';\nimport { OAuthProviderButton } from './Shared/OAuthProviderButton';\nimport { OAuthProviderI } from '../../../types/common-types';\n\nconst loginSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n password: z.string().min(1, \"A senha é obrigatória\"),\n});\n\ntype LoginFormValues = z.infer<typeof loginSchema>;\n\nexport interface ModernSignInProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signUpRedirect?: () => void;\n forgotPasswordRedirect?: () => void;\n providers?: OAuthProviderI[];\n}\n\nexport function ModernSignIn({\n onSuccess,\n onFailed,\n signUpRedirect,\n forgotPasswordRedirect,\n providers,\n}: ModernSignInProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [oauthLoading, setOauthLoading] = useState<OAuthProviderI | null>(null);\n const { auth } = useAuth();\n\n const handleOAuthLogin = async (provider: OAuthProviderI) => {\n setOauthLoading(provider);\n try {\n const res = await auth.loginWithProvider(provider);\n if (res.success && res.data?.url) {\n window.location.href = res.data.url;\n } else {\n if (onFailed) await onFailed(res.message || \"Falha na autenticação\");\n else toast.error(\"Falha ao conectar com provedor\");\n }\n } catch {\n toast.error(\"Ocorreu um erro inesperado\");\n } finally {\n setOauthLoading(null);\n }\n };\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<LoginFormValues>({\n resolver: zodResolver(loginSchema),\n defaultValues: { email: '', password: '' },\n });\n\n const onSubmit = async (data: LoginFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.login(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Login realizado com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao entrar');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"current-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n {forgotPasswordRedirect && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={forgotPasswordRedirect}\n className=\"text-xs text-primary hover:underline font-medium\"\n >\n Esqueceu a senha?\n </button>\n </div>\n )}\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Entrar\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n\n {providers && providers.length > 0 && (\n <>\n <OAuthDivider />\n <div className=\"flex flex-col gap-2\">\n {providers.map((provider) => (\n <OAuthProviderButton\n key={provider}\n provider={provider}\n onClick={() => handleOAuthLogin(provider)}\n isLoading={oauthLoading === provider}\n />\n ))}\n </div>\n </>\n )}\n </form>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst signUpSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n password: z.string().min(6, \"A senha deve ter pelo menos 6 caracteres\"),\n confirmPassword: z.string(),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype SignUpFormValues = z.infer<typeof signUpSchema>;\n\nexport interface ModernSignUpProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernSignUp({\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernSignUpProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<SignUpFormValues>({\n resolver: zodResolver(signUpSchema),\n defaultValues: { email: '', password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: SignUpFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.register(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else {\n toast.success(\"Conta criada com sucesso!\");\n if (signInRedirect) signInRedirect();\n }\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao criar conta');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Criar Conta\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n </form>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst forgotPasswordSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n});\n\ntype ForgotPasswordFormValues = z.infer<typeof forgotPasswordSchema>;\n\nexport interface ModernForgotPasswordProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernForgotPassword({\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernForgotPasswordProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema),\n defaultValues: { email: '' },\n });\n\n const onSubmit = async (data: ForgotPasswordFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.sendForgotPassword(data.email);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Link de redefinição enviado com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao enviar link');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Enviar link\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n </form>\n );\n}","import { useState } from 'react';\nimport { motion } from \"motion/react\";\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst resetPasswordSchema = z.object({\n password: z.string().min(6, \"A senha deve ter pelo menos 6 caracteres\"),\n confirmPassword: z.string(),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype ResetPasswordFormValues = z.infer<typeof resetPasswordSchema>;\n\nexport interface ModernResetPasswordProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernResetPassword({\n token,\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernResetPasswordProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema),\n defaultValues: { password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: ResetPasswordFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.resetPassword(token, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Senha redefinida com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao redefinir senha');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"w-full max-w-md z-10 flex flex-col antialiased selection:bg-primary/10 selection:text-primary\">\n <div className=\"text-center mb-6\">\n <motion.h1\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n Redefinir Senha\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-4\">\n Crie uma nova senha para sua conta\n </p>\n </div>\n\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"Nova Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Nova Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Redefinir Senha\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n\n {signInRedirect && (\n <div className=\"text-center mt-4\">\n <button\n type=\"button\"\n onClick={signInRedirect}\n className=\"text-xs text-primary font-semibold hover:underline\"\n >\n Voltar para o login\n </button>\n </div>\n )}\n </form>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { motion } from \"motion/react\";\nimport { Loader2, CheckCircle2, XCircle, ArrowRight } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport { Button } from './Shared/Button';\n\nexport interface ModernVerifyEmailProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\ntype VerifyStatus = \"verifying\" | \"success\" | \"error\" | \"already_verified\";\n\nexport function ModernVerifyEmail({\n token,\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernVerifyEmailProps) {\n const [status, setStatus] = useState<VerifyStatus>(\"verifying\");\n const [message, setMessage] = useState(\"Verificando seu e-mail...\");\n const [isLoading, setIsLoading] = useState(true);\n const { auth } = useAuth();\n const hasAttempted = useRef(false);\n\n const handleVerify = async () => {\n if (hasAttempted.current) return;\n hasAttempted.current = true;\n\n setIsLoading(true);\n setStatus(\"verifying\");\n\n try {\n const profile = auth.profile();\n if (profile?.is_verified) {\n setStatus(\"already_verified\");\n setMessage(\"Seu e-mail já está verificado.\");\n setIsLoading(false);\n return;\n }\n\n const res = await auth.verifyEmail(token);\n\n if (res.success) {\n await auth.refresh();\n setStatus(\"success\");\n setMessage(res.message || \"E-mail verificado com sucesso!\");\n if (onSuccess) await onSuccess(res.message);\n } else {\n setStatus(\"error\");\n setMessage(res.message || \"Falha na verificação do e-mail.\");\n if (onFailed) await onFailed(res.message, res.trace);\n }\n } catch (error) {\n setStatus(\"error\");\n setMessage(\"Ocorreu um erro inesperado durante a verificação.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n if (token && !hasAttempted.current) {\n void handleVerify();\n }\n }, [token]);\n\n return (\n <div className=\"w-full max-w-md z-10 flex flex-col antialiased selection:bg-primary/10 selection:text-primary\">\n <div className=\"text-center mb-6\">\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n className=\"flex justify-center mb-4\"\n >\n {status === \"verifying\" && <Loader2 className=\"w-12 h-12 text-primary animate-spin\" />}\n {(status === \"success\" || status === \"already_verified\") && <CheckCircle2 className=\"w-12 h-12 text-green-500\" />}\n {status === \"error\" && <XCircle className=\"w-12 h-12 text-destructive\" />}\n </motion.div>\n\n <motion.h1\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n {status === \"verifying\" ? \"Verificando...\" :\n status === \"error\" ? \"Falha na verificação\" : \"E-mail Verificado!\"}\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-6\">\n {message}\n </p>\n\n {status === \"error\" && (\n <Button\n onClick={() => {\n hasAttempted.current = false;\n void handleVerify();\n }}\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n Tentar novamente\n </Button>\n )}\n\n {(status === \"success\" || status === \"already_verified\") && (\n <div className=\"space-y-4\">\n <p className=\"text-xs text-muted-foreground\">\n Você já pode continuar navegando em sua conta.\n </p>\n {signInRedirect && (\n <Button\n onClick={signInRedirect}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n Ir para o login\n <ArrowRight className=\"w-4 h-4\" />\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { cn } from \"../../../../utils/cn\";\n\ninterface AuthLayoutProps {\n children: React.ReactNode;\n className?: string;\n backLink?: React.ReactNode;\n}\n\nexport function AuthLayout({ children, className, backLink }: AuthLayoutProps) {\n return (\n <main className={cn(\n \"bg-background h-full text-foreground min-h-screen relative overflow-hidden\",\n \"flex flex-col px-4\",\n \"antialiased selection:bg-primary/10 selection:text-primary\",\n className\n )}>\n {/* Decorative background elements */}\n <div className=\"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] bg-primary/20 rounded-full blur-3xl pointer-events-none\" />\n <div className=\"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] bg-primary/20 rounded-full blur-3xl pointer-events-none\" />\n\n {/* Back link at the top, before centered content */}\n {backLink && (\n <div className=\"relative z-10 pt-4\">\n {backLink}\n </div>\n )}\n\n {/* Centered content — takes remaining space */}\n <div className=\"relative z-10 flex-1 flex justify-center items-center\">\n {children}\n </div>\n </main>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2, Sparkles } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\nimport { AuthLayout } from './Shared/AuthLayout';\nimport { motion } from \"motion/react\";\n\nconst setupSchema = z.object({\n email: z.string().email(\"E-mail inválido\"),\n password: z.string().min(8, \"A senha deve ter pelo menos 8 caracteres\"),\n confirmPassword: z.string().min(1, \"A confirmação de senha é obrigatória\"),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype SetupFormValues = z.infer<typeof setupSchema>;\n\nexport interface ModernSetupProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n backLink?: React.ReactNode;\n}\n\nexport function ModernSetup({\n onSuccess,\n onFailed,\n backLink,\n}: ModernSetupProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<SetupFormValues>({\n resolver: zodResolver(setupSchema),\n defaultValues: { email: '', password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: SetupFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.setup(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Configuração inicial realizada com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao realizar setup');\n }\n } catch (error) {\n console.error(error);\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <AuthLayout backLink={backLink}>\n <div className=\"w-full max-w-md z-10 flex flex-col\">\n <div className=\"mb-10 text-center\">\n <motion.div\n initial={{ opacity: 0, y: -20 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-xs font-bold uppercase tracking-widest mb-4\"\n >\n <Sparkles size={14} />\n Setup Inicial\n </motion.div>\n \n <h1 className=\"font-heading text-4xl font-bold tracking-tight mb-3\">\n Bem-vindo ao IdentityX\n </h1>\n <p className=\"text-muted-foreground text-base max-w-[320px] mx-auto\">\n Vamos começar criando sua conta de administrador mestre.\n </p>\n </div>\n\n <motion.div\n initial={{ opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ delay: 0.1 }}\n className=\"bg-card/50 backdrop-blur-sm border border-border/40 p-1 rounded-2xl\"\n >\n <div className=\"bg-background rounded-[14px] p-6 shadow-sm\">\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-5\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail do Administrador\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2 h-13 mt-4 text-base font-bold shadow-lg shadow-primary/10 group\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Finalizar Configuração\n <ArrowRight className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" />\n </>\n )}\n </Button>\n </form>\n </div>\n </motion.div>\n\n <div className=\"mt-8 text-center\">\n <div className=\"h-1 w-full bg-muted/30 rounded-full overflow-hidden\">\n <motion.div \n initial={{ width: 0 }}\n animate={{ width: \"100%\" }}\n transition={{ duration: 1.5, ease: \"easeInOut\" }}\n className=\"h-full bg-primary/40\"\n />\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-2 font-medium uppercase tracking-tighter\">\n Passo 1 de 1 • Configurando ambiente\n </p>\n </div>\n </div>\n </AuthLayout>\n );\n}","import { useState } from 'react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ModernSignIn } from './ModernSignIn';\nimport { ModernSignUp } from './ModernSignUp';\nimport { ModernForgotPassword } from './ModernForgotPassword';\nimport { AuthLayout } from './Shared/AuthLayout';\nimport { OAuthProviderI } from '../../../types/common-types';\n\nexport type AuthView = \"signin\" | \"signup\" | \"forgot-password\";\n\nexport interface ModernAuthProps {\n initialView?: AuthView;\n onLoginSuccess?: (message?: string) => Promise<void>;\n onSignUpSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n backLink?: React.ReactNode;\n /** OAuth providers to show as login buttons (e.g. [\"google\", \"github\"]) */\n providers?: OAuthProviderI[];\n}\n\nconst viewConfig: Record<AuthView, { title: string; subtitle: string; toggleLabel: string; toggleAction: string; toggleTo: AuthView }> = {\n signin: {\n title: \"Bem-vindo de volta\",\n subtitle: \"Entre com suas credenciais para acessar a plataforma\",\n toggleLabel: \"Ainda não tem uma conta?\",\n toggleAction: \"Cadastre-se\",\n toggleTo: \"signup\",\n },\n signup: {\n title: \"Criar sua conta\",\n subtitle: \"Preencha os dados abaixo para se cadastrar\",\n toggleLabel: \"Já possui uma conta?\",\n toggleAction: \"Faça login\",\n toggleTo: \"signin\",\n },\n \"forgot-password\": {\n title: \"Recuperar senha\",\n subtitle: \"Digite seu e-mail para receber instruções\",\n toggleLabel: \"Lembrou da senha?\",\n toggleAction: \"Voltar ao login\",\n toggleTo: \"signin\",\n },\n};\n\nexport function ModernAuth({\n initialView = \"signin\",\n onLoginSuccess,\n onSignUpSuccess,\n onFailed,\n backLink,\n providers,\n}: ModernAuthProps) {\n const [view, setView] = useState<AuthView>(initialView);\n\n const handleSignUpSuccess = async (message?: string) => {\n setView(\"signin\");\n if (onSignUpSuccess) await onSignUpSuccess(message);\n };\n\n const config = viewConfig[view];\n\n return (\n <AuthLayout backLink={backLink}>\n <div className=\"w-full max-w-md z-10 flex flex-col\">\n <div className=\"text-center mb-6\">\n <motion.h1\n key={view + \"-h1\"}\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n {config.title}\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-4\">\n {config.subtitle}\n </p>\n\n <div className=\"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-muted/50 border border-border/50 text-xs font-medium text-muted-foreground\">\n {config.toggleLabel}\n <button\n type=\"button\"\n onClick={() => setView(config.toggleTo)}\n className=\"text-primary font-semibold hover:underline\"\n >\n {config.toggleAction}\n </button>\n </div>\n </div>\n\n {/* Animated form area with fixed min-height to prevent layout shift */}\n <div className={`relative ${providers && providers.length > 0 ? \"min-h-112\" : \"min-h-80\"}`}>\n <AnimatePresence mode=\"wait\">\n {view === \"signin\" && (\n <motion.div\n key=\"signin\"\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 10 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernSignIn\n onSuccess={onLoginSuccess}\n onFailed={onFailed}\n signUpRedirect={() => setView(\"signup\")}\n forgotPasswordRedirect={() => setView(\"forgot-password\")}\n providers={providers}\n />\n </motion.div>\n )}\n\n {view === \"signup\" && (\n <motion.div\n key=\"signup\"\n initial={{ opacity: 0, x: 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -10 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernSignUp\n onSuccess={handleSignUpSuccess}\n onFailed={onFailed}\n signInRedirect={() => setView(\"signin\")}\n />\n </motion.div>\n )}\n\n {view === \"forgot-password\" && (\n <motion.div\n key=\"forgot-password\"\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernForgotPassword\n onFailed={onFailed}\n signInRedirect={() => setView(\"signin\")}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </AuthLayout>\n );\n}","import { useState } from \"react\";\nimport { motion, AnimatePresence } from \"motion/react\";\nimport { Copy, Check, User, FolderOpen, Key, Mail } from \"lucide-react\";\n\ntype ActorType = \"human\" | \"service\" | \"machine\";\ntype CredentialType = \"token\" | \"api_key\";\n\nexport interface IntrospectData {\n cred: {\n id?: string;\n type?: CredentialType;\n };\n sub: {\n capabilities?: string[];\n email?: string;\n id?: string;\n metadata?: string[];\n project_id?: string;\n type?: ActorType;\n };\n}\n\nexport interface IdentityCardProps {\n data: IntrospectData;\n}\n\nconst ACTOR_THEME: Record<ActorType, {\n gradient: string;\n orbBg: string;\n orbText: string;\n pillBg: string;\n pillText: string;\n pillBorder: string;\n capBg: string;\n capText: string;\n capBorder: string;\n}> = {\n human: {\n gradient: \"linear-gradient(135deg, #7F77DD, #AFA9EC)\",\n orbBg: \"#EEEDFE\", orbText: \"#534AB7\",\n pillBg: \"#EEEDFE\", pillText: \"#3C3489\", pillBorder: \"#AFA9EC\",\n capBg: \"#EEEDFE\", capText: \"#534AB7\", capBorder: \"#AFA9EC\",\n },\n service: {\n gradient: \"linear-gradient(135deg, #1D9E75, #5DCAA5)\",\n orbBg: \"#E1F5EE\", orbText: \"#0F6E56\",\n pillBg: \"#E1F5EE\", pillText: \"#085041\", pillBorder: \"#5DCAA5\",\n capBg: \"#E1F5EE\", capText: \"#0F6E56\", capBorder: \"#5DCAA5\",\n },\n machine: {\n gradient: \"linear-gradient(135deg, #BA7517, #EF9F27)\",\n orbBg: \"#FAEEDA\", orbText: \"#854F0B\",\n pillBg: \"#FAEEDA\", pillText: \"#412402\", pillBorder: \"#EF9F27\",\n capBg: \"#FAEEDA\", capText: \"#854F0B\", capBorder: \"#EF9F27\",\n },\n};\n\nfunction CopyIconButton({ value }: { value: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n if (!value || value === \"—\") return;\n navigator.clipboard.writeText(value).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <button\n onClick={handleCopy}\n aria-label=\"Copiar valor\"\n className=\"opacity-0 group-hover:opacity-100 transition-all duration-150 p-1.5 rounded-md hover:bg-muted text-muted-foreground hover:text-foreground\"\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n {copied ? (\n <motion.span\n key=\"check\"\n initial={{ scale: 0.7, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.7, opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <Check className=\"w-3.5 h-3.5 text-green-600\" />\n </motion.span>\n ) : (\n <motion.span\n key=\"copy\"\n initial={{ scale: 0.7, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.7, opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <Copy className=\"w-3.5 h-3.5\" />\n </motion.span>\n )}\n </AnimatePresence>\n </button>\n );\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ElementType;\n label: string;\n value?: string;\n}) {\n const display = value || \"—\";\n return (\n <div className=\"group flex items-center justify-between px-5 py-2.5 gap-3 rounded-md mx-1.5 hover:bg-muted/50 transition-colors\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n <Icon className=\"w-3.5 h-3.5 text-muted-foreground shrink-0\" />\n <span className=\"text-[11px] text-muted-foreground w-12 shrink-0\">{label}</span>\n <span\n className=\"text-[12px] font-mono text-foreground truncate\"\n title={display}\n >\n {display}\n </span>\n </div>\n <CopyIconButton value={display} />\n </div>\n );\n}\n\nexport function ModernIntrospect({ data }: IdentityCardProps) {\n const { sub, cred } = data;\n const actorType: ActorType = sub.type ?? \"human\";\n const theme = ACTOR_THEME[actorType];\n const caps = sub.capabilities ?? [];\n const capLabels = caps.map((c) => String(c));\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: \"easeOut\" }}\n className=\"w-full rounded-2xl border border-border/60 overflow-hidden bg-card shadow-sm\"\n >\n {/* Header */}\n <div className=\"px-5 pt-2.5 pb-3.5 border-b border-border/60\">\n <p className=\"text-base font-semibold text-foreground truncate\">\n {sub.id ?? \"unknown_actor\"}\n </p>\n <p className=\"text-[12px] text-muted-foreground mb-2 truncate\">\n {sub.email ?? \"—\"}\n </p>\n <div className=\"flex gap-1.5 flex-wrap\">\n <span\n className=\"text-[10px] font-medium uppercase tracking-wide px-2 py-0.5 rounded-full border\"\n style={{\n background: theme.pillBg,\n color: theme.pillText,\n borderColor: theme.pillBorder,\n }}\n >\n {actorType}\n </span>\n <span className=\"text-[10px] font-medium uppercase tracking-wide px-2 py-0.5 rounded-full border border-border bg-muted text-muted-foreground\">\n {cred.type ?? \"token\"}\n </span>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-3 border-b border-border/60 divide-x divide-border/60\">\n {[\n { label: \"Capabilities\", value: caps.length },\n { label: \"Metadata\", value: (sub.metadata ?? []).length },\n { label: \"Project\", value: sub.project_id?.split(\"_\")[1]?.slice(0, 4) ?? \"—\" },\n ].map((s) => (\n <div key={s.label} className=\"py-3 text-center\">\n <p className=\"text-[10px] text-muted-foreground uppercase tracking-wide mb-0.5\">{s.label}</p>\n <p className=\"text-sm font-medium font-mono text-foreground\">{s.value}</p>\n </div>\n ))}\n </div>\n\n {/* Fields */}\n <div className=\"py-1.5 border-b border-border/60\">\n <FieldRow icon={User} label=\"sub id\" value={sub.id} />\n <FieldRow icon={FolderOpen} label=\"project\" value={sub.project_id} />\n <FieldRow icon={Key} label=\"cred id\" value={cred.id} />\n <FieldRow icon={Mail} label=\"email\" value={sub.email} />\n </div>\n\n {/* Capabilities */}\n {capLabels.length > 0 && (\n <div className=\"px-5 py-3 border-b border-border/60\">\n <p className=\"text-[10px] text-muted-foreground uppercase tracking-wide mb-2\">Capabilities</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {capLabels.map((cap) => (\n <span\n key={cap}\n className=\"text-[11px] font-mono px-2.5 py-1 rounded-full border\"\n style={{\n background: theme.capBg,\n color: theme.capText,\n borderColor: theme.capBorder,\n }}\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n </motion.div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/url-utils.ts","../../src/store/auth-store.ts","../../src/utils/storage-adapter.ts","../../src/store/token-store.ts","../../src/utils/token-utils.ts","../../src/core/env.ts","../../src/core/interceptor.ts","../../src/core/api.ts","../../src/utils/env-validator.ts","../../src/core/services.ts","../../src/react/AuthProvider.tsx","#style-inject:#style-inject","../../src/react/components/tailwind.css","../../src/react/components/Form/BasicInputField.tsx","../../src/react/components/Form/BasicSubmitButton.tsx","../../src/react/components/Form/CardAvatar.tsx","../../src/utils/field-validator.ts","../../src/react/components/SignIn/SignIn.tsx","../../src/react/components/SignUp/SignUp.tsx","../../src/react/components/Extra/Copyright.tsx","../../src/react/components/Logout/BasicLogoutButton.tsx","../../src/utils/icons/device-icon-map.tsx","../../src/utils/ua/parse-user-agent.ts","../../src/utils/ua/get-device-info.ts","../../src/utils/date-utils.ts","../../src/react/components/Session/SessionCard.tsx","../../src/react/components/Session/Sessions.tsx","../../src/react/components/ForgotPassword/ForgotPassword.tsx","../../src/react/components/ResetPassword/ResetPassword.tsx","../../src/react/components/VerifyEmail/VerifyEmail.tsx","../../src/react/components/VerifyEmail/ResendVerifyEmail.tsx","../../src/utils/cn.ts","../../src/react/components/Modern/Shared/FormInput.tsx","../../src/react/components/Modern/Shared/FormError.tsx","../../src/react/components/Modern/Shared/Button.tsx","../../src/react/components/Modern/Shared/OAuthDivider.tsx","../../src/react/components/Modern/Shared/OAuthProviderButton.tsx","../../src/react/components/Modern/ModernSignIn.tsx","../../src/react/components/Modern/ModernSignUp.tsx","../../src/react/components/Modern/ModernForgotPassword.tsx","../../src/react/components/Modern/ModernResetPassword.tsx","../../src/react/components/Modern/ModernVerifyEmail.tsx","../../src/react/components/Modern/Shared/AuthLayout.tsx","../../src/react/components/Modern/ModernSetup.tsx","../../src/react/components/Modern/ModernAuth.tsx","../../src/react/components/Modern/ModernIntrospect.tsx"],"names":["joinUrl","base","path","cleanBase","cleanPath","_state","_listeners","notify","l","authStore","cb","partial","event","expiry","isAuthenticated","browserStorage","key","value","sessionBrowserStorage","ACCESS_TOKEN_KEY","tokenStore","token","_cachedClaims","ACCESS_EXPIRY_KEY","REFRESH_EXPIRY_KEY","REFRESH_TOKEN_KEY","decodeJwt","payload","base64","jsonPayload","c","error","logger","saveAuthSession","tokens","access_token","refresh_token","access_expires_at","refresh_expires_at","claims","refreshExpiry","accessExpiry","getStoredRefreshToken","getTokenClaims","refreshExpiryStr","sessionData","isExpiringSoon","thresholdSeconds","stored","e","isTokenExpiringSoon","t","isRefreshSessionExpired","clearAuthTokens","getUserInfo","resolveEnv","isServer","viteEnv","safeProcessEnv","resolvedProjectId","resolvedApiKey","memoizedEnv","overrides","configure","config","getEnv","env","AuthInterceptor","shouldClear","refreshToken","res","simpleFetch","url","options","shouldAuth","isRefreshReq","finalUrl","executeFetch","accessToken","headers","response","hasRefreshToken","isExpiring","toFetchOptions","requiresAuth","skipRefresh","rest","interceptorFields","Api","baseURL","authBaseURL","onTokenRefreshed","clientConfig","createDefaultFetchClient","body","validateProjectKey","createAuthService","apiInstance","callbacks","email","password","provider","code","id","revokeAll","new_password","apiKey","AuthContext","createContext","AuthProvider","children","projectId","isProjectMode","fallback","waitSession","onLogin","onSetup","onResetPassword","onRegister","onVerify","onRefresh","isRestoring","useRef","isInitializing","useSyncExternalStore","useEffect","useCallback","useMemo","auth","contextValue","jsx","useAuth","ctx","useContext","styleInject","css","insertAt","head","style","BasicInputField","name","label","placeholder","type","onValueChange","onBlur","autoComplete","rulesStatus","submitted","inputRef","isSecretVisible","setIsSecretVisible","useState","hasAnyFailing","r","jsxs","EyeOff","Eye","i","classes","BasicSubmitButton","onSubmit","loading","CardAvatar","mainText","subText","User","evaluateRules","rules","SignIn","onSuccess","onFailed","signUpRedirect","forgotPasswordRedirect","emailRules","setEmail","setPassword","setSubmitted","loadingSubmit","setLoadingSubmit","emailRef","passwordRef","v","emailValidation","passwordValidation","emailInvalid","passwordInvalid","Fragment","SignUp","loginRedirect","passwordRules","confirmPassword","setConfirmPassword","confirmPasswordRef","confirmPasswordValidation","confirmPasswordInvalid","sizeMap","Copyright","size","sizeClass","BasicLogoutButton","forceLogout","setLoading","LogOut","deviceIconMap","Smartphone","Tablet","Monitor","parseUserAgent","userAgent","device","os","browser","UAParser","getDeviceInfo","parsed","normalizeDevice","timeAgo","isoDate","diff","sec","min","hour","day","week","SessionCard","is_current","session_id","user_agent","issued_at","user_ip","onClick","deviceI","DeviceIcon","Trash2","Sessions","sessions","setSessions","fetchSessions","currentSessionId","a","b","handleRevokeASession","sessionToRemove","s","prev","ForgotPassword","ResetPassword","useVerifyEmailLogic","status","setStatus","message","setMessage","hasAttempted","handleVerify","VerifyEmail","onRetry","Check","Info","ResendVerifyEmail","sent","setSent","cn","inputs","twMerge","clsx","FormInput","forwardRef","propId","className","onChange","onFocus","props","ref","showPassword","setShowPassword","generatedId","useId","isPassword","FormInput_default","FormError","AnimatePresence","motion","FormError_default","buttonVariants","cva","Button","variant","OAuthDivider","providerConfig","OAuthProviderButton","isLoading","loginSchema","z","ModernSignIn","providers","setIsLoading","oauthLoading","setOauthLoading","handleOAuthLogin","toast","register","handleSubmit","errors","useForm","zodResolver","data","Loader2","ArrowRight","signUpSchema","ModernSignUp","signInRedirect","forgotPasswordSchema","ModernForgotPassword","resetPasswordSchema","ModernResetPassword","ModernVerifyEmail","CheckCircle2","XCircle","AuthLayout","backLink","setupSchema","ModernSetup","Sparkles","viewConfig","ModernAuth","initialView","onLoginSuccess","onSignUpSuccess","view","setView","handleSignUpSuccess","ACTOR_THEME","CopyIconButton","copied","setCopied","Copy","FieldRow","Icon","display","ModernIntrospect","subject","cred","actorType","theme","caps","capLabels","FolderOpen","Key","Mail","cap"],"mappings":"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","file":"react.js","sourcesContent":["export function joinUrl(base: string, path: string): string {\n if (path.startsWith(\"http\")) return path;\n \n const cleanBase = base.replace(/\\/$/, \"\");\n const cleanPath = path.replace(/^\\//, \"\");\n \n return `${cleanBase}/${cleanPath}`;\n}\n","type AuthState = {\n isAuthenticated: boolean;\n isInitializing: boolean;\n};\n\nlet _state: AuthState = {\n isAuthenticated: false,\n isInitializing: true,\n};\nconst _listeners = new Set<() => void>();\n\nconst notify = () => _listeners.forEach((l) => l());\n\nexport const authStore = {\n subscribe: (cb: () => void) => {\n _listeners.add(cb);\n return () => _listeners.delete(cb);\n },\n getSnapshot: () => _state,\n getServerSnapshot: () => _state,\n set: (partial: Partial<AuthState>) => {\n _state = { ..._state, ...partial };\n notify();\n },\n reset: () => {\n _state = {\n isAuthenticated: false,\n isInitializing: false,\n };\n notify();\n },\n};\n\n// Sync between tabs\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", (event) => {\n if (event.key === \"trieoh_access_expiry\") {\n if (!event.newValue) authStore.reset();\n else {\n const expiry = Number(event.newValue);\n const isAuthenticated = !isNaN(expiry) && expiry > Date.now();\n authStore.set({ isAuthenticated, isInitializing: false });\n }\n }\n });\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport const browserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? localStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") localStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") localStorage.removeItem(key);\n },\n};\n\nexport const sessionBrowserStorage: StorageAdapter = {\n getItem: (key) => (typeof window !== \"undefined\" ? sessionStorage.getItem(key) : null),\n setItem: (key, value) => {\n if (typeof window !== \"undefined\") sessionStorage.setItem(key, value);\n },\n removeItem: (key) => {\n if (typeof window !== \"undefined\") sessionStorage.removeItem(key);\n },\n};\n\nexport interface CookieOptions {\n expires?: string;\n path?: string;\n domain?: string | null;\n secure?: boolean;\n sameSite?: \"Lax\" | \"None\" | \"Strict\";\n}\n\nexport const cookieStorage = {\n get: (name: string): string | null => {\n if (typeof window === \"undefined\") return null;\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n },\n\n set: (name: string, value: string, options: CookieOptions = {}) => {\n if (typeof window === \"undefined\") return;\n\n const {\n expires,\n path = \"/\",\n domain,\n secure = window.location.protocol === \"https:\",\n sameSite = secure ? \"None\" : \"Lax\",\n } = options;\n\n const isLocalhost = window.location.hostname === \"localhost\";\n\n const cookieParts = [\n `${name}=${value}`,\n domain && !isLocalhost ? `Domain=${domain}` : \"\",\n `Path=${path}`,\n `SameSite=${sameSite}`,\n secure ? \"Secure\" : \"\",\n expires ? `expires=${expires}` : \"\",\n ];\n\n document.cookie = cookieParts.filter(Boolean).join(\"; \");\n },\n\n remove: (name: string, domain?: string | null) => {\n cookieStorage.set(name, \"\", {\n expires: \"Thu, 01 Jan 1970 00:00:00 GMT\",\n domain: domain || undefined,\n });\n },\n};\n","import { sessionBrowserStorage } from \"../utils/storage-adapter\";\n\nconst ACCESS_TOKEN_KEY = \"trieoh_access_token\";\n\nexport const tokenStore = {\n getAccessToken: () => sessionBrowserStorage.getItem(ACCESS_TOKEN_KEY),\n setAccessToken: (token: string | null) => {\n if (token) sessionBrowserStorage.setItem(ACCESS_TOKEN_KEY, token);\n else sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n },\n clear: () => {\n sessionBrowserStorage.removeItem(ACCESS_TOKEN_KEY);\n }\n};\n","import { authStore } from \"../store/auth-store\";\nimport { tokenStore } from \"../store/token-store\";\nimport { logger } from \"@trieoh/envoy-fetch-ts\";\nimport { browserStorage } from \"./storage-adapter\";\nimport type { AuthTokenClaims, AuthTokens, TokenClaims } from \"../types//token-types\";\n\n\n// Stored only in memory\nlet _cachedClaims: AuthTokenClaims | null = null;\nconst ACCESS_EXPIRY_KEY = \"trieoh_access_expiry\";\nconst REFRESH_EXPIRY_KEY = \"trieoh_refresh_expiry\";\nconst REFRESH_TOKEN_KEY = \"trieoh_refresh_token\";\n\nexport function decodeJwt<T>(token: string): T | null {\n try {\n const payload = token.split(\".\")[1];\n if (!payload) return null;\n\n let base64 = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4) {\n base64 += \"=\";\n }\n\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\")\n );\n\n return JSON.parse(jsonPayload);\n } catch (error) {\n logger.error(\"Error decoding JWT:\", error);\n return null;\n }\n}\n\nexport function saveAuthSession(tokens: AuthTokens): void {\n const {\n access_token,\n refresh_token,\n access_expires_at,\n refresh_expires_at,\n } = tokens;\n\n const claims = decodeJwt<TokenClaims>(access_token);\n\n if (!claims) {\n logger.error(\"Failed to decode tokens\");\n return;\n }\n\n tokenStore.setAccessToken(access_token);\n\n const refreshExpiry = new Date(refresh_expires_at).getTime();\n const accessExpiry = new Date(access_expires_at).getTime();\n\n browserStorage.setItem(REFRESH_TOKEN_KEY, refresh_token);\n browserStorage.setItem(ACCESS_EXPIRY_KEY, String(accessExpiry));\n browserStorage.setItem(REFRESH_EXPIRY_KEY, String(refreshExpiry));\n\n const sessionData: AuthTokenClaims = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n authStore.set({\n isAuthenticated: true,\n isInitializing: false,\n });\n\n logger.log(\"Auth session saved\");\n}\n\nexport function getStoredRefreshToken(): string | null {\n return browserStorage.getItem(REFRESH_TOKEN_KEY);\n}\n\nexport function getTokenClaims(): AuthTokenClaims | null {\n if (_cachedClaims) return _cachedClaims;\n\n const token = tokenStore.getAccessToken();\n if (!token) return null;\n\n const claims = decodeJwt<TokenClaims>(token);\n if (!claims) return null;\n\n // Check if token is expired\n if (claims.exp * 1000 <= Date.now()) return null;\n\n const refreshExpiryStr = browserStorage.getItem(REFRESH_EXPIRY_KEY);\n if (!refreshExpiryStr) return null;\n\n const refreshExpiry = Number(refreshExpiryStr);\n if (isNaN(refreshExpiry)) return null;\n\n const sessionData = {\n access_data: claims,\n refresh_expiry_date: refreshExpiry,\n };\n\n _cachedClaims = sessionData;\n\n return sessionData;\n}\n\nfunction isExpiringSoon(key: string, thresholdSeconds: number): boolean {\n try {\n const stored = browserStorage.getItem(key);\n if (!stored) return true;\n const expiry = Number(stored);\n if (isNaN(expiry)) return true;\n return (expiry - Date.now()) <= thresholdSeconds * 1000;\n } catch (e) {\n logger.warn(\"Error reading expiry:\", e);\n return true;\n }\n}\n\nexport const isTokenExpiringSoon = (t = 30) => isExpiringSoon(ACCESS_EXPIRY_KEY, t);\nexport const isRefreshSessionExpired = (t = 10) => isExpiringSoon(REFRESH_EXPIRY_KEY, t);\n\nexport function isAuthenticated(): boolean {\n if (!tokenStore.getAccessToken()) return false;\n const stored = browserStorage.getItem(ACCESS_EXPIRY_KEY);\n if (!stored) return false;\n const accessExpiryTimestamp = Number(stored);\n if (isNaN(accessExpiryTimestamp)) return false;\n return accessExpiryTimestamp > Date.now();\n}\n\nexport function clearAuthTokens(): void {\n _cachedClaims = null;\n tokenStore.clear();\n browserStorage.removeItem(ACCESS_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_EXPIRY_KEY);\n browserStorage.removeItem(REFRESH_TOKEN_KEY);\n\n authStore.reset();\n\n logger.log(\"Auth tokens and claims cleared\");\n}\n\nexport function getUserInfo() {\n const claims = getTokenClaims();\n if (!claims) return null;\n\n return claims.access_data.subject\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const decoded = decodeJwt<{ exp: number }>(token);\n return decoded?.exp ?? null;\n}\n","export interface TrieOHEnv {\n PROJECT_ID: string;\n API_KEY: string;\n BASE_URL: string;\n}\n\nexport function resolveEnv(): TrieOHEnv {\n const isServer = typeof window === \"undefined\";\n\n const viteEnv = (\n typeof import.meta !== \"undefined\" && import.meta.env\n ? import.meta.env\n : {}\n ) as Partial<ImportMetaEnv>;\n\n const safeProcessEnv: NodeJS.ProcessEnv =\n typeof process !== \"undefined\" ? process.env : {};\n\n const resolvedProjectId =\n viteEnv.VITE_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n safeProcessEnv.PUBLIC_TRIEOH_AUTH_PROJECT_ID ||\n \"\";\n\n const resolvedApiKey = isServer\n ? (safeProcessEnv.TRIEOH_AUTH_API_KEY || \"\")\n : \"\";\n\n return {\n PROJECT_ID: resolvedProjectId,\n API_KEY: resolvedApiKey,\n BASE_URL: \"https://api.trieauth.trieoh.com\",\n };\n}\nlet memoizedEnv: TrieOHEnv | null = null;\nlet overrides: Partial<TrieOHEnv> = {};\n\n/**\n * Configure the SDK manually. This will override any environment variables.\n */\nexport function configure(config: Partial<TrieOHEnv>) {\n overrides = { ...overrides, ...config };\n memoizedEnv = null; // Reset memoization to apply new config\n}\n\nfunction getEnv(): TrieOHEnv {\n if (!memoizedEnv) {\n const resolved = resolveEnv();\n memoizedEnv = {\n ...resolved,\n ...overrides,\n };\n }\n return memoizedEnv;\n}\nexport const env: TrieOHEnv = {\n get PROJECT_ID() {\n return getEnv().PROJECT_ID;\n },\n get API_KEY() {\n return getEnv().API_KEY;\n },\n get BASE_URL() {\n return getEnv().BASE_URL;\n },\n};\n","import { joinUrl } from \"../utils/url-utils\";\nimport {\n clearAuthTokens,\n isRefreshSessionExpired,\n isTokenExpiringSoon,\n saveAuthSession,\n getTokenClaims,\n getStoredRefreshToken,\n} from \"../utils/token-utils\";\nimport { env } from \"./env\";\nimport { logger, simpleFetch } from \"@trieoh/envoy-fetch-ts\";\nimport { tokenStore } from \"../store/token-store\";\nimport type { AuthTokenClaims, AuthTokens } from \"../types/token-types\";\n\nexport interface RequestOptions extends RequestInit {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\ninterface InterceptorConfig {\n baseURL?: string;\n authBaseURL?: string;\n onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n onRefreshFailed?: (error: Error) => void;\n}\n\nexport class AuthInterceptor {\n private baseURL: string;\n private authBaseURL: string;\n private isRefreshing = false;\n private refreshPromise: Promise<void> | null = null;\n private onTokenRefreshed?: (claims: AuthTokenClaims) => void;\n private onRefreshFailed?: (error: Error) => void;\n\n constructor(config?: InterceptorConfig) {\n this.baseURL = config?.baseURL || env.BASE_URL;\n this.authBaseURL = config?.authBaseURL || this.baseURL;\n this.onTokenRefreshed = config?.onTokenRefreshed;\n this.onRefreshFailed = config?.onRefreshFailed;\n }\n\n async refreshToken(): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) return this.refreshPromise;\n\n this.isRefreshing = true;\n this.refreshPromise = (async () => {\n let shouldClear = true;\n try {\n const refreshToken = getStoredRefreshToken();\n if (!refreshToken) {\n shouldClear = true;\n throw new Error(\"No refresh token available\");\n }\n\n const res = await simpleFetch<{ code: number; data?: AuthTokens; message?: string }>(\n joinUrl(this.authBaseURL, \"/auth/refresh\"),\n {\n method: \"POST\",\n credentials: \"omit\",\n headers: { \"refresh_token\": refreshToken },\n }\n );\n\n if (res.code !== 200 || !res.data) {\n shouldClear = res.code !== 503;\n throw new Error(res.message || \"Failed to refresh token\");\n }\n\n saveAuthSession(res.data);\n\n const claims = getTokenClaims();\n if (claims) this.onTokenRefreshed?.(claims);\n\n logger.log(\"Token refreshed successfully\");\n } catch (error) {\n logger.warn(\"Failed to refresh token:\", error);\n if (shouldClear) clearAuthTokens();\n this.onRefreshFailed?.(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n async beforeRequest(): Promise<void> {\n if (isRefreshSessionExpired()) {\n clearAuthTokens();\n return;\n }\n\n const hasAccessToken = !!tokenStore.getAccessToken();\n\n if (!hasAccessToken || isTokenExpiringSoon(30)) {\n try {\n await this.refreshToken();\n } catch (error) {\n logger.warn(\"Proactive refresh failed:\", error);\n }\n }\n }\n\n async fetch(url: string, options?: RequestOptions): Promise<Response> {\n const shouldAuth = options?.requiresAuth !== false;\n const isRefreshReq = url.includes(\"/auth/refresh\");\n\n if (shouldAuth && !isRefreshReq && !options?.skipRefresh) {\n await this.beforeRequest();\n }\n\n const finalUrl = joinUrl(this.baseURL, url);\n\n const executeFetch = async (): Promise<Response> => {\n const accessToken = tokenStore.getAccessToken();\n const headers = new Headers(options?.headers);\n\n if (shouldAuth && accessToken) {\n headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n return fetch(finalUrl, {\n ...options,\n headers,\n credentials: \"omit\",\n });\n };\n\n let response = await executeFetch();\n\n if (response.status === 401 && shouldAuth && !isRefreshReq) {\n const hasRefreshToken = !!getStoredRefreshToken();\n const isExpiring = isTokenExpiringSoon(30);\n\n if (hasRefreshToken && isExpiring) {\n logger.log(\"401 detected and token is expiring/expired, attempting refresh...\");\n try {\n await this.refreshToken();\n response = await executeFetch();\n } catch (e) {\n logger.error(\"Retry failed after refresh error\");\n }\n }\n }\n\n return response;\n }\n}\n\nexport const createAuthInterceptor = (config?: InterceptorConfig) => new AuthInterceptor(config);\n\nexport const createAuthenticatedFetch = (config?: InterceptorConfig) => {\n const interceptor = new AuthInterceptor(config);\n return (url: string, options?: RequestOptions) => interceptor.fetch(url, options);\n};\n","import { AuthInterceptor, type RequestOptions as InterceptorOptions } from \"./interceptor\";\nimport type { AuthTokenClaims } from \"../types/token-types\";\nimport {\n createDefaultFetchClient,\n type DefaultFetchClientConfig,\n type DefaultFetchResult,\n type DefaultSuccessEnvelope,\n type DefaultFailureEnvelope,\n type FetchClient,\n type FetchClientOptions\n} from \"@trieoh/envoy-fetch-ts\";\n\nexport type { DefaultFetchResult as ApiResponse };\n\nexport interface ApiRequestOptions extends FetchClientOptions {\n requiresAuth?: boolean;\n skipRefresh?: boolean;\n}\n\nfunction toFetchOptions(options?: ApiRequestOptions): FetchClientOptions | undefined {\n if (!options) return undefined;\n\n const { requiresAuth, skipRefresh, ...rest } = options;\n\n const interceptorFields: Partial<InterceptorOptions> = {};\n if (requiresAuth !== undefined) interceptorFields.requiresAuth = requiresAuth;\n if (skipRefresh !== undefined) interceptorFields.skipRefresh = skipRefresh;\n\n return {\n ...rest,\n adapterInit: {\n ...rest.adapterInit,\n ...interceptorFields,\n },\n };\n}\n\nexport class Api {\n readonly interceptor: AuthInterceptor;\n private readonly client: FetchClient<DefaultSuccessEnvelope, DefaultFailureEnvelope>;\n\n constructor(\n baseURL?: string,\n authBaseURL?: string,\n onTokenRefreshed?: (claims: AuthTokenClaims) => void,\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">,\n ) {\n this.interceptor = new AuthInterceptor({\n baseURL,\n authBaseURL,\n onTokenRefreshed,\n });\n\n this.client = createDefaultFetchClient({\n ...clientConfig,\n adapter: this.interceptor.fetch.bind(this.interceptor),\n });\n }\n\n request<T>(path: string, options?: ApiRequestOptions) {\n return this.client.request<T>(path, toFetchOptions(options));\n }\n\n get<T>(path: string, options?: ApiRequestOptions) {\n return this.client.get<T>(path, toFetchOptions(options));\n }\n\n post<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.post<T>(path, body, toFetchOptions(options));\n }\n\n put<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.put<T>(path, body, toFetchOptions(options));\n }\n\n patch<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.patch<T>(path, body, toFetchOptions(options));\n }\n\n delete<T>(path: string, body?: unknown, options?: ApiRequestOptions) {\n return this.client.delete<T>(path, body, toFetchOptions(options));\n }\n\n query<T>(path: string, options?: ApiRequestOptions) {\n return this.client.query<T>(path, toFetchOptions(options));\n }\n}\n\nexport function createFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return {\n request: api.request.bind(api),\n get: api.get.bind(api),\n post: api.post.bind(api),\n put: api.put.bind(api),\n patch: api.patch.bind(api),\n delete: api.delete.bind(api),\n query: api.query.bind(api),\n };\n}\n\nexport function createQueryFetcher(config?: {\n baseURL?: string;\n authBaseURL?: string;\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n}) {\n const api = new Api(\n config?.baseURL,\n config?.authBaseURL,\n undefined,\n config?.clientConfig,\n );\n\n return <TData>(path: string, options?: ApiRequestOptions): Promise<TData> =>\n api.query<TData>(path, options);\n}\n","import { env } from \"../core/env\";\n\nexport const validateProjectKey = () => {\n if (!env.PROJECT_ID || env.PROJECT_ID.trim() === \"\") {\n throw new Error(\n \"[TRIEOH SDK] Project ID is missing. Please set PUBLIC_TRIEOH_AUTH_PROJECT_ID, NEXT_PUBLIC_TRIEOH_AUTH_PROJECT_ID or VITE_TRIEOH_AUTH_PROJECT_ID.\"\n );\n }\n};\n\nexport const validateApiKey = () => {\n if (!env.API_KEY || env.API_KEY.trim() === \"\") {\n throw new Error(\n \"[TRIEOH SDK] Private API Key is missing. This operation requires TRIEOH_AUTH_API_KEY to be set in a server-side environment.\"\n );\n }\n};\n","import type { CurrentSessionI, SessionI } from \"../types/sessions-types\";\nimport { clearAuthTokens, getUserInfo, saveAuthSession } from \"../utils/token-utils\";\nimport { validateProjectKey } from \"../utils/env-validator\";\nimport type { Api, ApiResponse } from \"./api\";\nimport { env } from \"./env\";\nimport type { IntrospectResponse } from \"../types/instropect-types\";\nimport { AuthTokens } from \"../types/token-types\";\nimport type { OAuthProviderI } from \"../types/common-types\";\n\nexport interface AuthCallbacks {\n onLogin?: (res: ApiResponse<AuthTokens>) => void;\n onSetup?: (res: ApiResponse<AuthTokens>) => void;\n onRegister?: (res: ApiResponse<void>) => void;\n onVerify?: (res: ApiResponse<void>) => void;\n onResetPassword?: (res: ApiResponse<void>) => void;\n onRefresh?: (res?: ApiResponse<AuthTokens>) => void;\n}\n\nexport const createAuthService = (apiInstance: Api, callbacks?: AuthCallbacks) => ({\n isSetupDone: async () => apiInstance.get<void>(\"/auth/setup\", { requiresAuth: false }),\n\n setup: async (email: string, password: string) => {\n if (env.PROJECT_ID) validateProjectKey();\n const url = `/auth/setup${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<AuthTokens>(\n url,\n { email, password },\n { requiresAuth: false }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onSetup?.(res);\n }\n\n return res;\n },\n\n login: async (email: string, password: string) => {\n if (env.PROJECT_ID) validateProjectKey();\n const url = `/auth/login${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<AuthTokens>(\n url,\n { email, password },\n { requiresAuth: false }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onLogin?.(res);\n }\n\n return res;\n },\n\n loginWithProvider: async (provider: OAuthProviderI) => {\n const url = `/auth/${provider}/connect`;\n const res = await apiInstance.get<{ url: string }>(url, { requiresAuth: false });\n return res;\n },\n\n completeProviderLogin: async (provider: OAuthProviderI, code: string) => {\n const url = `/auth/${provider}/callback?code=${code}`;\n const res = await apiInstance.get<AuthTokens>(url, { requiresAuth: false });\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onLogin?.(res);\n }\n return res;\n },\n\n register: async (email: string, password: string) => {\n const options = { requiresAuth: false };\n const url = `/auth/register${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n if (env.PROJECT_ID) validateProjectKey();\n\n const res = await apiInstance.post<void>(url, { email, password }, options);\n if (res.success) callbacks?.onRegister?.(res);\n return res;\n },\n\n logout: async (options?: { forceLogout?: boolean }) => {\n const url = `/auth/logout${env.PROJECT_ID ? `?project_id=${env.PROJECT_ID}` : \"\"}`;\n const res = await apiInstance.post<void>(url);\n if (res.success || options?.forceLogout) clearAuthTokens();\n return res;\n },\n\n refresh: async () => {\n const res = await apiInstance.post<AuthTokens>(\n \"/auth/refresh\",\n undefined,\n { skipRefresh: true }\n );\n\n if (res.success) {\n saveAuthSession(res.data);\n callbacks?.onRefresh?.(res);\n }\n\n return res;\n },\n\n // FIXME: This is not being used for now\n sessions: async () => apiInstance.get<SessionI[]>(\"/sessions\"),\n\n currentSession: async () => apiInstance.get<CurrentSessionI>(\"/sessions/me\"),\n\n revokeASession: async (id: string) => apiInstance.delete<void>(`/sessions/${id}`),\n\n revokeSessions: async (revokeAll: boolean = false) => {\n const path = revokeAll ? \"/sessions\" : \"/sessions/others\"\n return apiInstance.delete<void>(path);\n },\n\n profile: () => getUserInfo(),\n\n sendForgotPassword: async (email: string) => {\n const options = { requiresAuth: false };\n if (env.PROJECT_ID) {\n validateProjectKey();\n return apiInstance.post<void>(\n \"/account/forgot-password\",\n { email, project_id: env.PROJECT_ID },\n options\n );\n }\n return apiInstance.post<void>(\"/account/forgot-password\", { email }, options);\n },\n\n resetPassword: async (token: string, new_password: string) => {\n const res = await apiInstance.post<void>(\n `/account/reset-password?token=${token}`,\n { new_password },\n { requiresAuth: false }\n );\n if (res.success) callbacks?.onResetPassword?.(res);\n return res;\n },\n\n verifyEmail: async (token: string) => {\n const url = `/account/verify?token=${token}`;\n const res = await apiInstance.post<void>(url);\n if (res.success) callbacks?.onVerify?.(res);\n return res;\n },\n\n resendVerifyEmail: async () => apiInstance.post<void>(\"/account/verify/resend\"),\n\n introspect: async (apiKey?: string) => {\n return apiInstance.get<IntrospectResponse>(\"/auth/introspect\", {\n requiresAuth: !apiKey,\n headers: apiKey ? { \"X-API-KEY\": apiKey } : undefined,\n });\n },\n\n health: async () => {\n return apiInstance.get<{ service: string; status: string }>(\"/health\", {\n requiresAuth: false,\n });\n },\n\n authHealth: async () => {\n return apiInstance.get<{ service: string; status: string; user_id: string }>(\"/protected/health\");\n }\n});\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore\n} from \"react\";\nimport { Api } from \"../core/api\";\nimport { createAuthService, type AuthCallbacks } from \"../core/services\";\nimport { getTokenClaims, isRefreshSessionExpired } from \"../utils/token-utils\";\nimport { validateProjectKey } from \"../utils/env-validator\";\nimport { configure } from \"../core/env\";\nimport { authStore } from \"../store/auth-store\";\nimport { logger, type DefaultFetchClientConfig } from \"@trieoh/envoy-fetch-ts\";\nimport type { AuthTokenClaims } from \"../types/token-types\";\n\ntype AuthContextType = {\n auth: ReturnType<typeof createAuthService>;\n isAuthenticated: boolean;\n isInitializing: boolean;\n isProjectMode?: boolean;\n};\n\nconst AuthContext = createContext<AuthContextType | null>(null);\n\nexport function AuthProvider({\n children,\n baseURL,\n projectId,\n isProjectMode = true,\n fallback,\n waitSession = true,\n clientConfig,\n onLogin,\n onSetup,\n onResetPassword,\n onRegister,\n onVerify,\n onRefresh,\n}: {\n children: React.ReactNode;\n baseURL?: string;\n projectId?: string;\n isProjectMode?: boolean;\n /** Component to show while initial auth check is in progress */\n fallback?: React.ReactNode;\n /** Whether to wait for the session restoration before rendering children. Defaults to true. */\n waitSession?: boolean;\n /** Extra config forwarded to the API client (e.g. timeout) */\n clientConfig?: Omit<DefaultFetchClientConfig, \"adapter\">;\n} & AuthCallbacks) {\n const isRestoring = useRef(false);\n\n const { isAuthenticated, isInitializing } = useSyncExternalStore(\n authStore.subscribe,\n authStore.getSnapshot,\n authStore.getServerSnapshot,\n );\n\n useEffect(() => {\n configure({\n ...(projectId ? { PROJECT_ID: projectId } : {}),\n ...(baseURL ? { BASE_URL: baseURL } : {}),\n });\n }, [projectId, baseURL]);\n\n const onTokenRefreshed = useCallback((claims: AuthTokenClaims) => {\n authStore.set({\n isAuthenticated: !!claims.access_data,\n isInitializing: false,\n });\n onRefresh?.();\n }, [onRefresh]);\n\n const apiInstance = useMemo(() => new Api(\n baseURL,\n undefined,\n onTokenRefreshed,\n clientConfig,\n ), [baseURL, onTokenRefreshed, clientConfig]);\n\n const auth = useMemo(\n () => createAuthService(apiInstance, {\n onLogin,\n onSetup,\n onResetPassword,\n onRegister,\n onVerify,\n onRefresh,\n }),\n [apiInstance, onLogin, onSetup, onResetPassword, onRegister, onVerify, onRefresh],\n );\n\n useEffect(() => {\n if (isProjectMode) validateProjectKey();\n\n const restoreSession = async () => {\n if (isRestoring.current) return;\n isRestoring.current = true;\n\n if (getTokenClaims()) {\n authStore.set({ isAuthenticated: true, isInitializing: false });\n return;\n }\n\n if (isRefreshSessionExpired()) {\n authStore.reset();\n authStore.set({ isInitializing: false });\n return;\n }\n\n logger.log(\"No cached claims, attempting silent refresh...\");\n try {\n await apiInstance.interceptor.refreshToken();\n logger.log(\"Session restored.\");\n } catch {\n authStore.reset();\n logger.warn(\"Could not restore session (offline?).\");\n } finally {\n authStore.set({ isInitializing: false });\n }\n };\n\n restoreSession();\n }, [auth, isProjectMode]);\n\n const contextValue = useMemo(() => ({\n auth,\n isAuthenticated,\n isInitializing,\n isProjectMode\n }), [auth, isAuthenticated, isInitializing, isProjectMode]);\n\n if (waitSession && isInitializing) return fallback ?? null;\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth() {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error(\"useAuth must be used inside <AuthProvider>\");\n return ctx;\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: var(--font-sans, \\\"Inter\\\", sans-serif);--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-green-500: oklch(72.3% .219 149.579);--color-green-600: oklch(62.7% .194 149.214);--spacing: .25rem;--container-md: 28rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-base--line-height: 1.5 ;--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--text-xl: 1.25rem;--text-xl--line-height: calc(1.75 / 1.25);--text-2xl: 1.5rem;--text-2xl--line-height: calc(2 / 1.5);--text-3xl: 1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl: 2.25rem;--text-4xl--line-height: calc(2.5 / 2.25);--font-weight-extralight: 200;--font-weight-light: 300;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--tracking-tighter: -.05em;--tracking-tight: -.025em;--tracking-normal: 0em;--tracking-wide: .025em;--tracking-wider: .05em;--tracking-widest: .1em;--radius-sm: calc(var(--radius, .625rem) - 4px);--radius-md: calc(var(--radius, .625rem) - 2px);--radius-lg: var(--radius, .625rem);--radius-2xl: 1rem;--ease-out: cubic-bezier(0, 0, .2, 1);--ease-in-out: cubic-bezier(.4, 0, .2, 1);--animate-spin: spin 1s linear infinite;--blur-sm: 8px;--blur-3xl: 64px;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono);--color-background: var(--background, oklch(.9702 0 0));--color-foreground: var(--foreground, oklch(.1944 .0051 248.09));--color-primary: var(--primary, oklch(.7975 .1018 262.7));--color-primary-foreground: var(--primary-foreground, oklch(.9702 0 0));--color-secondary: var(--secondary, oklch(.1139 .0789 264.05));--color-secondary-foreground: var(--secondary-foreground, oklch(.9702 0 0));--color-muted: var(--muted, oklch(.9569 .0026 248.09));--color-muted-foreground: var(--muted-foreground, oklch(.5278 0 0));--color-border: var(--border, oklch(.869 .0093 248.09));--color-input: var(--input, oklch(.9145 .0062 248.09));--color-destructive: var(--destructive, oklch(.6373 .1718 28.92));--color-destructive-foreground: var(--destructive-foreground, oklch(.9851 0 0));--color-ring: var(--ring, oklch(.7975 .1018 262.7));--color-accent: var(--accent, oklch(.9326 .0313 262.7));--color-accent-foreground: var(--accent-foreground, oklch(.1944 .0051 248.09));--radius-full: 9999px}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.\\\\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.button-loading{&:after{content:\\\"\\\";position:absolute;top:0;left:-150%;width:150%;height:100%;background:linear-gradient(120deg,transparent 0%,var(--color-foreground) 40%,transparent 80%);@supports (color: color-mix(in lab,red,red)){background:linear-gradient(120deg,transparent 0%,color-mix(in oklab,var(--color-foreground) 40%,white 15%) 40%,transparent 80%)}animation:shine 1.5s infinite}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\\\.5{top:calc(var(--spacing) * 1.5)}.top-1\\\\/2{top:50%}.top-\\\\[-10\\\\%\\\\]{top:-10%}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.right-\\\\[-10\\\\%\\\\]{right:-10%}.bottom-\\\\[-10\\\\%\\\\]{bottom:-10%}.left-3\\\\.5{left:calc(var(--spacing) * 3.5)}.left-\\\\[-10\\\\%\\\\]{left:-10%}.z-10{z-index:10}.m-0{margin:calc(var(--spacing) * 0)}.m-2{margin:calc(var(--spacing) * 2)}.m-\\\\[0\\\\.125rem\\\\]{margin:.125rem}.mx-1\\\\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mb-0\\\\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-3\\\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-13{height:calc(var(--spacing) * 13)}.h-16{height:calc(var(--spacing) * 16)}.h-\\\\[40\\\\%\\\\]{height:40%}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\\\\[max\\\\(75dvh\\\\,32rem\\\\)\\\\]{max-height:max(75dvh,32rem)}.min-h-80{min-height:calc(var(--spacing) * 80)}.min-h-112{min-height:calc(var(--spacing) * 112)}.min-h-screen{min-height:100vh}.w-3\\\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-\\\\[40\\\\%\\\\]{width:40%}.w-full{width:100%}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-120{max-width:calc(var(--spacing) * 120)}.max-w-\\\\[320px\\\\]{max-width:320px}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-60{min-width:calc(var(--spacing) * 60)}.min-w-\\\\[20rem\\\\]{min-width:20rem}.flex-1{flex:1}.flex-\\\\[0_1_auto\\\\]{flex:0 1 auto}.flex-\\\\[1_1_auto\\\\]{flex:1 1 auto}.shrink-0{flex-shrink:0}.-translate-y-1\\\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}}.space-y-4{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}}.space-y-5{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}}.divide-x{:where(&>:not(:last-child)){--tw-divide-x-reverse: 0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}}.divide-border\\\\/60{:where(&>:not(:last-child)){border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\\\\[14px\\\\]{border-radius:14px}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-none{--tw-border-style: none;border-style:none}.border-border{border-color:var(--color-border)}.border-border\\\\/40{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 40%,transparent)}}.border-border\\\\/50{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-border\\\\/60{border-color:var(--color-border);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-border) 60%,transparent)}}.border-destructive\\\\!{border-color:var(--color-destructive)!important}.border-destructive\\\\/50{border-color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-destructive) 50%,transparent)}}.border-foreground{border-color:var(--color-foreground)}.border-input{border-color:var(--color-input)}.border-primary{border-color:var(--color-primary)}.border-secondary\\\\/20{border-color:var(--color-secondary);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-secondary) 20%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-destructive\\\\/5{background-color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-destructive) 5%,transparent)}}.bg-foreground\\\\/10{background-color:var(--color-foreground);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-foreground) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted\\\\/30{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.bg-muted\\\\/40{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.bg-muted\\\\/50{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-primary\\\\/10{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\\\\/20{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.bg-primary\\\\/40{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:transparent}.p-1{padding:calc(var(--spacing) * 1)}.p-1\\\\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\\\.5{padding:calc(var(--spacing) * 2.5)}.p-6{padding:calc(var(--spacing) * 6)}.p-\\\\[1\\\\.5rem_0\\\\.5rem\\\\]{padding:1.5rem .5rem}.p-\\\\[1\\\\.25rem_0\\\\.75rem\\\\]{padding:1.25rem .75rem}.p-\\\\[1\\\\.25rem_1\\\\.5rem\\\\]{padding:1.25rem 1.5rem}.p-\\\\[1rem_0\\\\]{padding:1rem 0}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\\\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-px{padding-block:1px}.pt-2\\\\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-3\\\\.5{padding-bottom:calc(var(--spacing) * 3.5)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading, var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading, var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading, var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading, var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.text-\\\\[10px\\\\]{font-size:10px}.text-\\\\[11px\\\\]{font-size:11px}.text-\\\\[12px\\\\]{font-size:12px}.leading-none{--tw-leading: 1;line-height:1}.font-bold{--tw-font-weight: var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extralight{--tw-font-weight: var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight: var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking: var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking: var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking: var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking: var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-destructive\\\\/80{color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 80%,transparent)}}.text-foreground{color:var(--color-foreground)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary\\\\/70{color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.text-secondary-foreground{color:var(--color-secondary-foreground)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-95{opacity:95%}.opacity-100{opacity:100%}.shadow-\\\\[0_0\\\\.25rem_0\\\\.25rem_0_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow: 0 .25rem .25rem 0 var(--tw-shadow-color, rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\\\\[0_0\\\\.25rem_1rem_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow: 0 .25rem 1rem var(--tw-shadow-color, rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none\\\\!{--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-primary\\\\/10{--tw-shadow-color: var(--color-primary);@supports (color: color-mix(in lab,red,red)){--tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-primary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-destructive\\\\/20{--tw-ring-color: var(--color-destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-3xl{--tw-blur: blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur: blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\\\\[color\\\\,text-decoration\\\\,opacity\\\\]{transition-property:color,text-decoration,opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\\\\[opacity\\\\,transform\\\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-150{--tw-duration: .15s;transition-duration:.15s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-500{--tw-duration: .5s;transition-duration:.5s}.duration-\\\\[120ms\\\\]{--tw-duration: .12s;transition-duration:.12s}.ease-in-out{--tw-ease: var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease: var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style: none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-hover\\\\:translate-x-1{&:is(:where(.group):hover *){@media(hover:hover){--tw-translate-x: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}}.group-hover\\\\:opacity-100{&:is(:where(.group):hover *){@media(hover:hover){opacity:100%}}}.peer-placeholder-shown\\\\:top-3\\\\.5{&:is(:where(.peer):placeholder-shown~*){top:calc(var(--spacing) * 3.5)}}.peer-placeholder-shown\\\\:text-\\\\[15px\\\\]{&:is(:where(.peer):placeholder-shown~*){font-size:15px}}.peer-placeholder-shown\\\\:font-normal{&:is(:where(.peer):placeholder-shown~*){--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}}.peer-placeholder-shown\\\\:tracking-normal{&:is(:where(.peer):placeholder-shown~*){--tw-tracking: var(--tracking-normal);letter-spacing:var(--tracking-normal)}}.peer-placeholder-shown\\\\:text-destructive\\\\/60{&:is(:where(.peer):placeholder-shown~*){color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 60%,transparent)}}}.peer-placeholder-shown\\\\:text-muted-foreground{&:is(:where(.peer):placeholder-shown~*){color:var(--color-muted-foreground)}}.peer-focus\\\\:top-1\\\\.5{&:is(:where(.peer):focus~*){top:calc(var(--spacing) * 1.5)}}.peer-focus\\\\:text-\\\\[10px\\\\]{&:is(:where(.peer):focus~*){font-size:10px}}.peer-focus\\\\:font-semibold{&:is(:where(.peer):focus~*){--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}}.peer-focus\\\\:tracking-wider{&:is(:where(.peer):focus~*){--tw-tracking: var(--tracking-wider);letter-spacing:var(--tracking-wider)}}.peer-focus\\\\:text-destructive\\\\/80{&:is(:where(.peer):focus~*){color:var(--color-destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-destructive) 80%,transparent)}}}.peer-focus\\\\:text-primary\\\\/70{&:is(:where(.peer):focus~*){color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}}.selection\\\\:bg-primary\\\\/10{& *::selection{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}&::selection{background-color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}}.selection\\\\:text-primary{& *::selection{color:var(--color-primary)}&::selection{color:var(--color-primary)}}.placeholder\\\\:text-transparent{&::placeholder{color:transparent}}.hover\\\\:scale-\\\\[1\\\\.02\\\\]{&:hover{@media(hover:hover){scale:1.02}}}.hover\\\\:scale-\\\\[1\\\\.05\\\\]{&:hover{@media(hover:hover){scale:1.05}}}.hover\\\\:bg-accent{&:hover{@media(hover:hover){background-color:var(--color-accent)}}}.hover\\\\:bg-muted{&:hover{@media(hover:hover){background-color:var(--color-muted)}}}.hover\\\\:bg-muted\\\\/50{&:hover{@media(hover:hover){background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}}}.hover\\\\:bg-muted\\\\/60{&:hover{@media(hover:hover){background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}}}.hover\\\\:text-accent-foreground{&:hover{@media(hover:hover){color:var(--color-accent-foreground)}}}.hover\\\\:text-foreground{&:hover{@media(hover:hover){color:var(--color-foreground)}}}.hover\\\\:text-primary\\\\/70{&:hover{@media(hover:hover){color:var(--color-primary);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}}}.hover\\\\:underline{&:hover{@media(hover:hover){text-decoration-line:underline}}}.hover\\\\:opacity-80{&:hover{@media(hover:hover){opacity:80%}}}.hover\\\\:opacity-90{&:hover{@media(hover:hover){opacity:90%}}}.hover\\\\:opacity-100{&:hover{@media(hover:hover){opacity:100%}}}.focus\\\\:bg-muted\\\\/60{&:focus{background-color:var(--color-muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.focus-visible\\\\:ring-0{&:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\\\\:ring-1{&:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\\\\:ring-ring{&:focus-visible{--tw-ring-color: var(--color-ring)}}.focus-visible\\\\:outline-none{&:focus-visible{--tw-outline-style: none;outline-style:none}}.active\\\\:scale-\\\\[0\\\\.95\\\\]{&:active{scale:.95}}.active\\\\:scale-\\\\[0\\\\.98\\\\]{&:active{scale:.98}}.active\\\\:scale-\\\\[0\\\\.99\\\\]{&:active{scale:.99}}.disabled\\\\:pointer-events-none{&:disabled{pointer-events:none}}.disabled\\\\:transform-none\\\\!{&:disabled{transform:none!important}}.disabled\\\\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.disabled\\\\:opacity-50{&:disabled{opacity:50%}}.disabled\\\\:opacity-60{&:disabled{opacity:60%}}.\\\\@\\\\[640px\\\\]\\\\:flex-row{@container (width >= 640px){flex-direction:row}}.\\\\@\\\\[640px\\\\]\\\\:items-center{@container (width >= 640px){align-items:center}}.\\\\@\\\\[640px\\\\]\\\\:justify-between{@container (width >= 640px){justify-content:space-between}}.\\\\@\\\\[640px\\\\]\\\\:gap-2{@container (width >= 640px){gap:calc(var(--spacing) * 2)}}.\\\\@\\\\[640px\\\\]\\\\:gap-4{@container (width >= 640px){gap:calc(var(--spacing) * 4)}}.\\\\@\\\\[640px\\\\]\\\\:gap-8{@container (width >= 640px){gap:calc(var(--spacing) * 8)}}.\\\\@\\\\[640px\\\\]\\\\:text-left{@container (width >= 640px){text-align:left}}}@import url(https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap);@layer base{button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}}@property --tw-translate-x{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-divide-x-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \\\"*\\\"; inherits: false;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-outline-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shine{0%{left:-150%}to{left:150%}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-space-y-reverse: 0;--tw-divide-x-reverse: 0;--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-outline-style: solid;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial;--tw-duration: initial;--tw-ease: initial}}}\\n\")","import { useState } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport type { RuleStatus } from \"../../../utils/field-validator\";\n\ninterface BasicInputFieldProps {\n /** The Input ID/Name */\n name: string;\n /** The label text (name of the field) */\n label: string;\n /** The placeholder text (a default text to help the user) */\n placeholder: string;\n /** Input Type */\n type?: \"text\" | \"email\" | \"number\" | \"password\";\n /** Current Input Value */\n value?: string;\n /** Current Input Value On Change */\n onValueChange?: (value: string) => void;\n /** OnBlur event handler */\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n /** AutoComplete */\n autoComplete?: string;\n /** Validations and their results */\n rulesStatus?: RuleStatus[];\n /** Form submission status */\n submitted?: boolean;\n /** Ref to the input element */\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport default function BasicInputField({\n name,\n label,\n placeholder,\n type = \"text\",\n value,\n onValueChange,\n onBlur,\n autoComplete,\n rulesStatus = [],\n submitted = false,\n inputRef,\n}: BasicInputFieldProps) {\n const [isSecretVisible, setIsSecretVisible] = useState(false);\n const hasAnyFailing = rulesStatus.some(r => !r.passed);\n\n return (\n <div className=\"font-sans relative w-full flex flex-col gap-1 text-foreground\">\n <label htmlFor={name} className=\"text-base font-semibold\">\n {label}\n </label>\n <div\n className={`flex justify-between items-center px-2.5 py-px gap-2.5 border-b-2 border-foreground ${(hasAnyFailing && submitted) ? \"border-destructive!\" : \"\"\n }`}\n >\n <input\n type={isSecretVisible ? \"text\" : type}\n name={name}\n id={name}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onValueChange && onValueChange(e.target.value)}\n onBlur={onBlur}\n autoComplete={autoComplete}\n aria-invalid={hasAnyFailing && submitted}\n ref={inputRef}\n className=\"min-w-40 flex-1 text-base font-light text-foreground appearance-none bg-transparent outline-none border-none shadow-none! py-0.5\"\n />\n {type === \"password\" && (\n isSecretVisible ?\n <EyeOff\n className=\"cursor-pointer shrink-0 select-none\"\n size={24}\n onClick={() => setIsSecretVisible(false)}\n />\n :\n <Eye\n className=\"cursor-pointer shrink-0 select-none\"\n size={24}\n onClick={() => setIsSecretVisible(true)}\n />\n )\n }\n </div>\n\n <div className=\"text-xs text-muted-foreground transition-opacity duration-200 ease-in-out\">\n {rulesStatus.map((r, i) => {\n const classes = [\n \"transition-[color,text-decoration,opacity] duration-[120ms] ease opacity-95 m-[0.125rem]\",\n r.passed ? \"line-through opacity-60 text-green-500\" : \"\",\n !r.passed && submitted ? \"text-destructive font-semibold opacity-100\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <p key={r.id ?? i} className={classes}>\n {r.message}\n </p>\n );\n })}\n </div>\n\n </div>\n )\n}","import type { MouseEvent } from \"react\";\n\ninterface BasicSubmitButtonProps {\n /** The label text (Submit Text) */\n label: string;\n /** What will happen when the user click on the button */\n onSubmit: (e: MouseEvent<HTMLButtonElement>) => void;\n /** Is performing the submit */\n loading: boolean;\n}\n\nexport default function BasicSubmitButton({\n label,\n onSubmit,\n loading\n}: BasicSubmitButtonProps) {\n return (\n <button\n type=\"submit\"\n onClick={onSubmit}\n disabled={loading}\n className={`font-sans w-full h-13 text-xl font-semibold outline-none bg-transparent relative overflow-hidden min-w-40 shrink-0 border-2 border-foreground text-foreground cursor-pointer px-6 transition-transform duration-500 rounded-lg hover:scale-[1.02] active:scale-[0.99] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none! ${loading ? \"button-loading\" : \"\"\n }`}\n >\n {label}\n </button>\n )\n}","import { User } from \"lucide-react\";\n\n\ninterface CardAvatarProps {\n /** The main text */\n mainText: string;\n /** Sub Text that will appear below the main text */\n subText: string;\n}\n\nexport default function CardAvatar({\n mainText,\n subText,\n}: CardAvatarProps) {\n return (\n <div className=\"font-sans flex flex-col items-center\">\n <div className=\"flex justify-center items-center p-2 bg-foreground/10 rounded-full mb-2.5\">\n <User className=\"w-16 h-16 p-2.5 bg-background rounded-full shadow-[0_0.25rem_1rem_rgba(0,0,0,0.25)]\" size={70} />\n </div>\n <h3 className=\"text-center text-xl font-medium m-0\">{mainText}</h3>\n <span className=\"text-center text-sm font-light opacity-60\">{subText}</span>\n </div>\n )\n}","export type Rule = {\n id?: string;\n message: string;\n test: (value: string) => boolean;\n};\n\nexport type RuleStatus = {\n id?: string;\n message: string;\n passed: boolean;\n};\n\nexport function evaluateRules(rules: Rule[], value: string): RuleStatus[] {\n return rules.map(r => ({ \n id: r.id,\n message: r.message,\n passed: !!r.test(value) \n }));\n}\n","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface SignInProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signUpRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n forgotPasswordRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n}\n\nexport function SignIn({\n onSuccess,\n onFailed,\n signUpRedirect,\n forgotPasswordRedirect,\n emailRules,\n}: SignInProps) {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n password: [],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n const passwordValidation = evaluateRules(rules.password, password);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.login(email, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Faça login na sua conta\" subText=\"Insira seus dados para fazer login\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"current-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Entrar\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {forgotPasswordRedirect && (\n <span className=\"text-sm font-semibold text-center cursor-pointer\">\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={forgotPasswordRedirect}>\n Esqueceu sua senha?\n </span>\n </span>\n )}\n {signUpRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n <span className=\"text-sm font-semibold\">\n {\"Ainda não possui uma conta? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={signUpRedirect}>Cadastra-se</span>\n </span>\n </>}\n </form>\n );\n}\n","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface SignUpProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n passwordRules?: Rule[];\n}\n\nexport function SignUp({\n onSuccess,\n onFailed,\n loginRedirect,\n emailRules,\n passwordRules,\n}: SignUpProps) {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const confirmPasswordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n password: passwordRules || [\n { message: \"Mínimo de 8 caracteres.\", test: v => v.length >= 8 },\n { message: \"Deve conter uma letra maiúscula.\", test: v => /[A-Z]/.test(v) },\n {\n message: \"Inclua pelo menos um caractere especial, ex: ! @ # $ % & * . ,\",\n test: v => /[!@#$%^&*(),.?\":{}|<>_\\-+=~`;/\\\\[\\]]/.test(v)\n },\n { message: \"Deve conter um número.\", test: v => /\\d/.test(v) },\n ],\n confirmPassword: [\n { message: \"Senhas não conferem.\", test: v => v === password },\n ],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n const passwordValidation = evaluateRules(rules.password, password);\n const confirmPasswordValidation = evaluateRules(rules.confirmPassword, confirmPassword);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n const confirmPasswordInvalid = confirmPasswordValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n if (confirmPasswordInvalid) {\n confirmPasswordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.register(email, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Crie sua conta\" subText=\"Insira seus dados para começar\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Confirme a Senha\"\n name=\"confirm-password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={confirmPassword}\n onValueChange={setConfirmPassword}\n inputRef={confirmPasswordRef}\n rulesStatus={confirmPasswordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Criar Conta\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {loginRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n <span className=\"text-sm font-semibold\">\n {\"Já possui uma conta? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>Entre</span>\n </span>\n </>}\n </form>\n );\n}\n","export interface CopyrightProps {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n}\n\nconst sizeMap = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n}\n\nexport function Copyright({ size }: CopyrightProps) {\n const sizeClass = size ? sizeMap[size] : 'text-base'\n\n return (\n <span className={`font-sans font-medium ${sizeClass}`}>\n © {new Date().getFullYear()} TrieOH\n </span>\n )\n}","import { useState, type MouseEvent } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport { LogOut } from \"lucide-react\";\n\nexport interface LogoutProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n forceLogout?: boolean;\n}\n\nexport function BasicLogoutButton({\n onSuccess,\n onFailed,\n forceLogout\n}: LogoutProps) {\n const { auth } = useAuth();\n const [loading, setLoading] = useState(false);\n\n const handleLogout = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (loading) return;\n\n setLoading(true);\n\n const res = await auth.logout({ forceLogout });\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n setLoading(false);\n }\n return (\n <button\n onClick={handleLogout}\n type=\"button\"\n disabled={loading}\n className=\"font-sans border-none bg-transparent cursor-pointer flex items-end gap-1 text-base font-medium text-destructive transition-transform duration-200 hover:scale-[1.05] active:scale-[0.98] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none!\"\n >\n <LogOut size={24} /> <span>Log out</span>\n </button>\n )\n}","import {\n Smartphone,\n Tablet,\n Monitor,\n type LucideIcon\n} from \"lucide-react\";\n\nexport const deviceIconMap: Record<string, LucideIcon> = {\n mobile: Smartphone,\n tablet: Tablet,\n desktop: Monitor,\n};","import { UAParser } from \"ua-parser-js\";\n\nexport function parseUserAgent(userAgent: string) {\n const { device, os, browser } = UAParser(userAgent);\n\n return {\n deviceType: device.type ?? \"desktop\",\n os: os.name,\n browser: browser.name,\n };\n}\n","import { parseUserAgent } from \"./parse-user-agent\";\nimport type { DeviceType } from \"./device-types\";\n\nexport interface DeviceInfo {\n device: DeviceType;\n os?: string;\n browser?: string;\n}\n\nexport function getDeviceInfo(userAgent: string): DeviceInfo {\n const parsed = parseUserAgent(userAgent);\n\n return {\n device: normalizeDevice(parsed.deviceType),\n os: parsed.os,\n browser: parsed.browser,\n };\n}\n\nfunction normalizeDevice(type?: string): DeviceType {\n if (!type) return \"desktop\";\n\n switch (type) {\n case \"mobile\":\n return \"mobile\";\n case \"tablet\":\n return \"tablet\";\n default:\n return \"desktop\";\n }\n}","export function timeAgo(isoDate: string): string {\n const diff = Date.now() - new Date(isoDate).getTime();\n const sec = Math.floor(diff / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const week = Math.floor(day / 7);\n\n if (sec < 60) return \"agora mesmo\";\n if (min < 60) return `${min} minutos atrás`;\n if (hour < 24) return `${hour} horas atrás`;\n if (day < 7) return `${day} dias atrás`;\n return `${week} semanas atrás`;\n}\n","import { Trash2 } from \"lucide-react\";\nimport { deviceIconMap } from \"../../../utils/icons/device-icon-map\";\nimport type { SessionI } from \"../../../types/sessions-types\";\nimport { getDeviceInfo } from \"../../../utils/ua/get-device-info\";\nimport type { MouseEvent } from \"react\";\nimport { timeAgo } from \"../../../utils/date-utils\";\n\ninterface SessionProps extends SessionI {\n is_current: boolean;\n onClick: (e: MouseEvent<SVGElement>, id: string) => void;\n}\n\nexport default function SessionCard({\n is_current,\n session_id,\n user_agent,\n issued_at,\n user_ip,\n onClick\n}: SessionProps) {\n const deviceI = getDeviceInfo(user_agent)\n const DeviceIcon = deviceIconMap[deviceI.device];\n return (\n <div className=\"border-t border-border p-[1.25rem_0.75rem] text-foreground\">\n <div className=\"relative flex flex-col items-center gap-2 flex-1 text-center @[640px]:flex-row @[640px]:items-center @[640px]:gap-4 @[640px]:text-left\">\n <DeviceIcon size={40} />\n <div className=\"flex flex-col min-w-0\">\n <h3 className=\"text-base font-semibold m-0\">{deviceI.browser} - {deviceI.os}</h3>\n <span className=\"inline-flex flex-col text-sm font-extralight @[640px]:flex-row @[640px]:gap-2 @[640px]:items-center\">\n {is_current && <strong className=\"text-primary font-normal\">• Sessão Atual •</strong>}\n <span>{ `${user_ip} - ${timeAgo(issued_at)}` }</span>\n </span>\n </div>\n {!is_current && (\n <Trash2 \n size={20} \n className=\"absolute top-0 right-0 cursor-pointer text-destructive opacity-60 transition-[opacity,transform] duration-200 hover:opacity-100 hover:scale-[1.05] active:scale-[0.95]\"\n onClick={(e) => onClick(e, session_id)}\n />\n )}\n </div>\n </div>\n )\n}","import { type MouseEvent, useEffect, useState } from \"react\";\nimport SessionCard from \"./SessionCard\";\nimport { useAuth } from \"../../AuthProvider\";\nimport type { SessionI } from \"../../../types/sessions-types\";\n\nexport interface SessionsProps {\n /** If true will revoke even the current session */\n revokeAll?: boolean;\n /** What will happen when sessions are revoked */\n onSuccess?: (message?: string) => Promise<void>;\n}\n\nexport function Sessions({\n revokeAll = false,\n onSuccess,\n}: SessionsProps) {\n const { auth } = useAuth();\n const [loading, setLoading] = useState(false);\n const [sessions, setSessions] = useState<SessionI[]>([]);\n\n const fetchSessions = async () => {\n const res = await auth.sessions();\n if (res.success) {\n const currentSessionId = auth.profile()?.session_id;\n\n const sessions = (res.data).sort((a, b) => {\n if (a.session_id === currentSessionId) return -1;\n if (b.session_id === currentSessionId) return 1;\n return 0;\n });\n setSessions(sessions);\n }\n }\n\n useEffect(() => {\n fetchSessions();\n }, []);\n\n const handleRevokeASession = async (e: MouseEvent<SVGElement>, id: string) => {\n e.preventDefault();\n const sessionToRemove = sessions.find(s => s.session_id === id);\n if (!sessionToRemove) return;\n setSessions(sessions.filter(s => s.session_id !== id))\n try {\n const res = await auth.revokeASession(id);\n if (!res.success) setSessions(prev => [...prev, sessionToRemove]);\n } catch {\n setSessions(prev => [...prev, sessionToRemove]);\n }\n }\n\n const handleRevokeSessions = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (loading) return;\n setLoading(true);\n\n const res = await auth.revokeSessions(revokeAll);\n const id = auth.profile()?.session_id;\n if (res.success) {\n setSessions(revokeAll ? [] : sessions.filter(s => s.session_id === id));\n if (onSuccess) onSuccess(res.message);\n }\n setLoading(false);\n }\n\n return (\n <div className=\"font-sans w-full min-w-[20rem] m-2 @container bg-background text-foreground p-[1.5rem_0.5rem] rounded-lg\">\n <div className=\"w-full flex flex-wrap items-center justify-center text-center gap-4 box-border px-3 @[640px]:justify-between @[640px]:text-left @[640px]:gap-8\">\n <div className=\"flex-[0_1_auto] max-w-100\">\n <h3 className=\"font-semibold text-2xl m-0 mb-1\">Navegadores e Dispositivos</h3>\n <p className=\"font-extralight text-base m-0\">Esses navegadores e dispositivos estão atualmente conectados à sua conta. Remova quaisquer dispositivos não autorizados.</p>\n </div>\n <button\n type=\"submit\"\n onClick={handleRevokeSessions}\n disabled={loading}\n className={`font-sans w-full max-w-56 p-[1rem_0] h-auto text-base font-semibold outline-none bg-transparent relative overflow-hidden shrink-0 border-2 border-foreground text-foreground cursor-pointer transition-transform duration-500 rounded-lg hover:scale-[1.02] active:scale-[0.99] disabled:opacity-60 disabled:cursor-not-allowed disabled:transform-none! ${loading ? \"button-loading\" : \"\"\n }`}\n >\n Revogar todas as sessões\n </button>\n </div>\n <div className=\"mt-4\">\n {sessions.length > 0 ? sessions.map(s => (\n <SessionCard\n key={s.session_id}\n {...s}\n is_current={auth.profile()?.session_id === s.session_id}\n onClick={handleRevokeASession}\n />\n )) : <span className=\"block border-t border-border p-[1.25rem_0.75rem] text-center font-semibold\">Nenhuma Sessão Disponível</span>}\n </div>\n </div>\n )\n}","import { type MouseEvent, useRef, useState } from \"react\";\nimport { evaluateRules, type Rule } from \"../../../utils/field-validator\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\n\nexport interface ForgotPasswordProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n emailRules?: Rule[];\n}\n\nexport default function ForgotPassword({\n onSuccess,\n onFailed,\n loginRedirect,\n emailRules,\n}: ForgotPasswordProps) {\n const [email, setEmail] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const emailRef = useRef<HTMLInputElement | null>(null);\n\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n email: emailRules || [\n { message: \"Digite um e-mail válido, ex: exemplo@dominio.com\", test: v => /\\S+@\\S+\\.\\S+/.test(v) },\n ],\n };\n\n const emailValidation = evaluateRules(rules.email, email);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const emailInvalid = emailValidation.some(r => !r.passed);\n\n if (emailInvalid) {\n emailRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.sendForgotPassword(email);\n\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar\n mainText=\"Esqueci a senha\"\n subText=\"Insira seu e-mail para receber um link de redefinição.\"\n />\n\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Email\"\n name=\"email\"\n placeholder=\"teste@gmail.com\"\n autoComplete=\"email\"\n type=\"email\"\n value={email}\n onValueChange={setEmail}\n inputRef={emailRef}\n rulesStatus={emailValidation}\n submitted={submitted}\n />\n </div>\n\n <BasicSubmitButton\n label={loadingSubmit ? \"Enviando...\" : \"Enviar link de redefinição\"}\n onSubmit={handleSubmit} loading={loadingSubmit}\n />\n {loginRedirect && <>\n <div className=\"flex items-center gap-2.5 w-full text-base font-semibold opacity-60\">\n <hr className=\"flex-1\" />\n OU\n <hr className=\"flex-1\" />\n </div>\n\n <span className=\"text-sm font-semibold\">\n {\"Lembrou-se da sua senha? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>\n Login\n </span>\n </span>\n </>}\n </form>\n );\n}","import { type MouseEvent, useRef, useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicInputField from \"../Form/BasicInputField\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport {\n evaluateRules,\n type Rule,\n} from \"../../../utils/field-validator\";\n\nexport interface ResetPasswordProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n loginRedirect?: (e: MouseEvent<HTMLSpanElement>) => void;\n passwordRules?: Rule[];\n}\n\nexport function ResetPassword({\n token,\n onSuccess,\n onFailed,\n loginRedirect,\n passwordRules,\n}: ResetPasswordProps) {\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [submitted, setSubmitted] = useState(false);\n const [loadingSubmit, setLoadingSubmit] = useState(false);\n const passwordRef = useRef<HTMLInputElement | null>(null);\n const confirmPasswordRef = useRef<HTMLInputElement | null>(null);\n const { auth } = useAuth();\n\n const rules: Record<string, Rule[]> = {\n password: passwordRules || [\n { message: \"Mínimo de 8 caracteres.\", test: v => v.length >= 8 },\n { message: \"Deve conter uma letra maiúscula.\", test: v => /[A-Z]/.test(v) },\n {\n message: \"Inclua pelo menos um caractere especial, ex: ! @ # $ % & * . ,\",\n test: v => /[!@#$%^&*(),.?\":{}|<>_\\-+=~`;/\\\\[\\]]/.test(v)\n },\n { message: \"Deve conter um número.\", test: v => /\\d/.test(v) },\n ],\n confirmPassword: [\n { message: \"Senhas não conferem.\", test: v => v === password },\n ],\n };\n\n const passwordValidation = evaluateRules(rules.password, password);\n const confirmPasswordValidation = evaluateRules(rules.confirmPassword, confirmPassword);\n\n const handleSubmit = async (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n setSubmitted(true);\n\n const passwordInvalid = passwordValidation.some(r => !r.passed);\n const confirmPasswordInvalid = confirmPasswordValidation.some(r => !r.passed);\n\n if (passwordInvalid) {\n passwordRef.current?.focus();\n return;\n }\n if (confirmPasswordInvalid) {\n confirmPasswordRef.current?.focus();\n return;\n }\n\n setLoadingSubmit(true);\n\n const res = await auth.resetPassword(token, password);\n if (res.success) {\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) await onFailed(res.message, res.trace);\n\n setLoadingSubmit(false);\n }\n\n return (\n <form className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar mainText=\"Redefinir Senha\" subText=\"Crie uma nova senha para sua conta\" />\n <div className=\"w-full flex flex-col gap-2.5 flex-[1_1_auto] overflow-y-auto mb-2\">\n <BasicInputField\n label=\"Nova Senha\"\n name=\"password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={password}\n onValueChange={setPassword}\n inputRef={passwordRef}\n rulesStatus={passwordValidation}\n submitted={submitted}\n />\n <BasicInputField\n label=\"Confirme a Nova Senha\"\n name=\"confirm-password\"\n placeholder=\"**********\"\n autoComplete=\"new-password\"\n type=\"password\"\n value={confirmPassword}\n onValueChange={setConfirmPassword}\n inputRef={confirmPasswordRef}\n rulesStatus={confirmPasswordValidation}\n submitted={submitted}\n />\n </div>\n <BasicSubmitButton label=\"Redefinir Senha\" onSubmit={handleSubmit} loading={loadingSubmit} />\n {loginRedirect && (\n <span className=\"text-sm font-semibold\">\n {\"Lembrou-se da sua senha? \"}\n <span className=\"cursor-pointer text-primary transition-colors duration-200 hover:opacity-80\" onClick={loginRedirect}>\n Login\n </span>\n </span>\n )}\n </form>\n );\n}\n","import { useEffect, useState, useRef, type MouseEvent } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\nimport { Check, Info } from \"lucide-react\";\n\nexport interface VerifyEmailProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n}\n\ntype VerifyStatus = \"verifying\" | \"success\" | \"error\" | \"already_verified\";\n\n/**\n * Hook to manage verification logic and allow mocking for Storybook\n * without exposing internal props in the public VerifyEmail component.\n */\nexport function useVerifyEmailLogic(token: string, onSuccess?: (m?: string) => void, onFailed?: (m: string, t?: string[]) => void) {\n const [loading, setLoading] = useState(true);\n const [status, setStatus] = useState<VerifyStatus>(\"verifying\");\n const [message, setMessage] = useState(\"Verificando seu e-mail...\");\n const { auth } = useAuth();\n const hasAttempted = useRef(false);\n\n const handleVerify = async () => {\n if (hasAttempted.current) return;\n hasAttempted.current = true;\n\n setLoading(true);\n setStatus(\"verifying\");\n\n try {\n const profile = auth.profile();\n if (profile?.is_verified) {\n setStatus(\"already_verified\");\n setMessage(\"Seu e-mail já está verificado.\");\n setLoading(false);\n return;\n }\n\n const res = await auth.verifyEmail(token);\n\n if (res.success) {\n await auth.refresh();\n setStatus(\"success\");\n setMessage(res.message || \"E-mail verificado com sucesso!\");\n if (onSuccess) await onSuccess(res.message);\n } else {\n setStatus(\"error\");\n setMessage(res.message || \"Falha na verificação do e-mail.\");\n if (onFailed) await onFailed(res.message, res.trace);\n }\n } catch (error) {\n setStatus(\"error\");\n setMessage(\"Ocorreu um erro inesperado durante a verificação.\");\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n if (token && !hasAttempted.current) handleVerify();\n }, [token]);\n\n const onRetry = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n hasAttempted.current = false;\n handleVerify();\n };\n\n return {\n loading,\n status,\n message,\n onRetry,\n setStatus,\n setLoading,\n setMessage\n };\n}\n\nexport function VerifyEmail({\n token,\n onSuccess,\n onFailed,\n}: VerifyEmailProps) {\n const { loading, status, message, onRetry } = useVerifyEmailLogic(token, onSuccess, onFailed);\n\n const mainText = status === \"verifying\" ? \"Verificando...\" :\n status === \"error\" ? \"Ops! Falha na verificação\" : \"Tudo pronto!\";\n\n return (\n <div className=\"font-sans flex flex-col w-full h-full min-h-screen items-center justify-center bg-background text-foreground p-6\">\n <div className=\"w-full max-w-120 flex flex-col gap-8 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] rounded-lg\">\n <CardAvatar\n mainText={mainText}\n subText={message}\n />\n\n {status === \"verifying\" && (\n <div className=\"w-full flex justify-center py-4\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-primary\"></div>\n </div>\n )}\n\n {status === \"error\" && (\n <div className=\"w-full flex flex-col gap-6 items-center\">\n <div className=\"w-full mt-2\">\n <BasicSubmitButton\n label=\"Tentar novamente\"\n onSubmit={onRetry}\n loading={loading}\n />\n </div>\n </div>\n )}\n\n {(status === \"success\" || status === \"already_verified\") && (\n <div className=\"w-full flex flex-col gap-4 items-center\">\n <div className=\"w-16 h-16 flex items-center justify-center rounded-full bg-primary/10 text-primary\">\n {status === \"success\" ? <Check size={40} /> : <Info size={40} />}\n </div>\n <p className=\"text-sm font-semibold opacity-50 text-center\">\n Você já pode fechar esta janela ou continuar navegando em sua conta.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useAuth } from \"../../AuthProvider\";\nimport BasicSubmitButton from \"../Form/BasicSubmitButton\";\nimport CardAvatar from \"../Form/CardAvatar\";\n\nexport interface ResendVerifyEmailProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n}\n\nexport function ResendVerifyEmail({\n onSuccess,\n onFailed,\n}: ResendVerifyEmailProps) {\n const [loading, setLoading] = useState(false);\n const [sent, setSent] = useState(false);\n const { auth } = useAuth();\n\n const handleResend = async () => {\n setLoading(true);\n const res = await auth.resendVerifyEmail();\n if (res.success) {\n setSent(true);\n if (onSuccess) await onSuccess(res.message);\n } else if (onFailed) {\n await onFailed(res.message, res.trace);\n }\n setLoading(false);\n };\n\n return (\n <div className=\"font-sans flex flex-col w-full max-w-120 min-w-60 max-h-[max(75dvh,32rem)] overflow-hidden gap-5 items-center bg-background text-foreground p-[1.25rem_1.5rem] shadow-[0_0.25rem_0.25rem_0_rgba(0,0,0,0.25)] transition-transform duration-150 ease-in-out rounded-lg\">\n <CardAvatar\n mainText=\"Reenviar Verificação\"\n subText=\"Não recebeu o e-mail de verificação? Clique no botão abaixo para reenviar.\"\n />\n\n <BasicSubmitButton\n label={sent ? \"E-mail Reenviado\" : \"Reenviar E-mail de Verificação\"}\n onSubmit={handleResend}\n loading={loading}\n />\n\n {sent && (\n <p className=\"text-sm font-semibold text-primary\">\n Um novo link de verificação foi enviado para seu e-mail.\n </p>\n )}\n </div>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useState, useId, forwardRef } from \"react\";\nimport { Eye, EyeOff } from \"lucide-react\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface PropsI extends React.InputHTMLAttributes<HTMLInputElement> {\n label: string;\n error?: boolean;\n}\n\nconst FormInput = forwardRef<HTMLInputElement, PropsI>(({\n label,\n id: propId,\n type = \"text\",\n error,\n className,\n value,\n onChange,\n onFocus,\n onBlur,\n ...props\n}, ref) => {\n const [showPassword, setShowPassword] = useState(false);\n const generatedId = useId();\n const id = propId ?? generatedId;\n\n const isPassword = type === \"password\";\n const inputType = isPassword ? (showPassword ? \"text\" : \"password\") : type;\n\n return (\n <div className=\"w-full font-body group relative\">\n <input\n ref={ref}\n id={id}\n type={inputType}\n value={value}\n placeholder=\" \"\n onChange={onChange}\n onFocus={onFocus}\n onBlur={onBlur}\n className={cn(\n \"peer h-13 w-full rounded-sm text-sm text-foreground outline-none\",\n \"border border-secondary/20 bg-muted/40 transition-all duration-200\",\n \"placeholder:text-transparent focus-visible:ring-0 focus:bg-muted/60\",\n \"px-3.5 pt-4 pb-1\",\n isPassword && \"pr-10\",\n error && \"bg-destructive/5 ring-1 ring-destructive/20 border-destructive/50\",\n className\n )}\n {...props}\n />\n\n <label\n htmlFor={id}\n className={cn(\n \"pointer-events-none absolute transition-all duration-200 ease-out left-3.5\",\n\n // Float state (Default)\n \"top-1.5 text-[10px] font-semibold tracking-wider text-primary/70\",\n\n // Default (Float 'disabled')\n \"peer-placeholder-shown:top-3.5 peer-placeholder-shown:text-[15px] peer-placeholder-shown:font-normal peer-placeholder-shown:tracking-normal peer-placeholder-shown:text-muted-foreground\",\n\n // Float state on focus\n \"peer-focus:top-1.5 peer-focus:text-[10px] peer-focus:font-semibold peer-focus:tracking-wider peer-focus:text-primary/70\",\n\n // Float error\n error && \"text-destructive/80\",\n error && \"peer-placeholder-shown:text-destructive/60\",\n error && \"peer-focus:text-destructive/80\"\n )}\n >\n {label}\n </label>\n\n {isPassword && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => { setShowPassword((prev) => !prev); }}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-primary/70 focus:outline-none\"\n aria-label={showPassword ? \"Ocultar senha\" : \"Mostrar senha\"}\n >\n {showPassword ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n )}\n </div>\n );\n});\n\nFormInput.displayName = \"FormInput\";\n\nexport default FormInput;\n","import { motion, AnimatePresence } from \"motion/react\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface PropsI {\n message?: string;\n className?: string;\n}\n\nconst FormError = ({ message, className }: PropsI) => {\n return (\n <AnimatePresence>\n {message && (\n <motion.p\n initial={{ opacity: 0, height: 0, marginTop: 0 }}\n animate={{ opacity: 1, height: \"auto\", marginTop: 6 }}\n exit={{ opacity: 0, height: 0, marginTop: 0 }}\n transition={{ duration: 0.2, ease: \"easeOut\" }}\n className={cn(\n \"text-[11px] font-medium text-destructive tracking-tight leading-none px-1 overflow-hidden\",\n className\n )}\n >\n {message}\n </motion.p>\n )}\n </AnimatePresence>\n );\n};\n\nexport default FormError;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../../../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm text-sm font-semibold transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98]\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:opacity-90\",\n destructive: \"bg-destructive text-destructive-foreground hover:opacity-90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:opacity-80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-12 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\nconst Button = ({ className, variant, size, ...props }: ButtonProps) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n};\n\nexport { Button, buttonVariants };\n","export function OAuthDivider() {\n return (\n <div className=\"flex items-center gap-3 py-1\">\n <div className=\"flex-1 h-px bg-border\" />\n <span className=\"text-xs font-medium text-muted-foreground uppercase tracking-widest select-none\">\n ou\n </span>\n <div className=\"flex-1 h-px bg-border\" />\n </div>\n );\n}\n","import { OAuthProviderI } from \"../../../../types/common-types\";\nimport { cn } from \"../../../../utils/cn\";\n\ninterface OAuthProviderButtonProps {\n provider: OAuthProviderI;\n onClick: () => void;\n isLoading?: boolean;\n}\n\nconst providerConfig: Record<OAuthProviderI, { label: string; icon: React.ReactNode }> = {\n google: {\n label: \"Google\",\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"w-5 h-5\" aria-hidden=\"true\">\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n </svg>\n ),\n },\n github: {\n label: \"GitHub\",\n icon: (\n <svg viewBox=\"0 0 24 24\" className=\"w-5 h-5\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z\" />\n </svg>\n ),\n },\n};\n\nexport function OAuthProviderButton({ provider, onClick, isLoading }: OAuthProviderButtonProps) {\n const config = providerConfig[provider];\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isLoading}\n className={cn(\n \"w-full flex items-center justify-center gap-2.5 h-12 px-4 rounded-sm text-sm font-semibold\",\n \"border border-input bg-background hover:bg-muted/60 transition-all\",\n \"disabled:opacity-50 disabled:pointer-events-none active:scale-[0.98]\",\n )}\n >\n {config.icon}\n <span>Continuar com {config.label}</span>\n </button>\n );\n}\n","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\nimport { OAuthDivider } from './Shared/OAuthDivider';\nimport { OAuthProviderButton } from './Shared/OAuthProviderButton';\nimport { OAuthProviderI } from '../../../types/common-types';\n\nconst loginSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n password: z.string().min(1, \"A senha é obrigatória\"),\n});\n\ntype LoginFormValues = z.infer<typeof loginSchema>;\n\nexport interface ModernSignInProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signUpRedirect?: () => void;\n forgotPasswordRedirect?: () => void;\n providers?: OAuthProviderI[];\n}\n\nexport function ModernSignIn({\n onSuccess,\n onFailed,\n signUpRedirect,\n forgotPasswordRedirect,\n providers,\n}: ModernSignInProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [oauthLoading, setOauthLoading] = useState<OAuthProviderI | null>(null);\n const { auth } = useAuth();\n\n const handleOAuthLogin = async (provider: OAuthProviderI) => {\n setOauthLoading(provider);\n try {\n const res = await auth.loginWithProvider(provider);\n if (res.success && res.data?.url) {\n window.location.href = res.data.url;\n } else {\n if (onFailed) await onFailed(res.message || \"Falha na autenticação\");\n else toast.error(\"Falha ao conectar com provedor\");\n }\n } catch {\n toast.error(\"Ocorreu um erro inesperado\");\n } finally {\n setOauthLoading(null);\n }\n };\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<LoginFormValues>({\n resolver: zodResolver(loginSchema),\n defaultValues: { email: '', password: '' },\n });\n\n const onSubmit = async (data: LoginFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.login(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Login realizado com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao entrar');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"current-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n {forgotPasswordRedirect && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={forgotPasswordRedirect}\n className=\"text-xs text-primary hover:underline font-medium\"\n >\n Esqueceu a senha?\n </button>\n </div>\n )}\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Entrar\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n\n {providers && providers.length > 0 && (\n <>\n <OAuthDivider />\n <div className=\"flex flex-col gap-2\">\n {providers.map((provider) => (\n <OAuthProviderButton\n key={provider}\n provider={provider}\n onClick={() => handleOAuthLogin(provider)}\n isLoading={oauthLoading === provider}\n />\n ))}\n </div>\n </>\n )}\n </form>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst signUpSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n password: z.string().min(6, \"A senha deve ter pelo menos 6 caracteres\"),\n confirmPassword: z.string(),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype SignUpFormValues = z.infer<typeof signUpSchema>;\n\nexport interface ModernSignUpProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernSignUp({\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernSignUpProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<SignUpFormValues>({\n resolver: zodResolver(signUpSchema),\n defaultValues: { email: '', password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: SignUpFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.register(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else {\n toast.success(\"Conta criada com sucesso!\");\n if (signInRedirect) signInRedirect();\n }\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao criar conta');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Criar Conta\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n </form>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst forgotPasswordSchema = z.object({\n email: z.email(\"E-mail inválido\"),\n});\n\ntype ForgotPasswordFormValues = z.infer<typeof forgotPasswordSchema>;\n\nexport interface ModernForgotPasswordProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernForgotPassword({\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernForgotPasswordProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema),\n defaultValues: { email: '' },\n });\n\n const onSubmit = async (data: ForgotPasswordFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.sendForgotPassword(data.email);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Link de redefinição enviado com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao enviar link');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Enviar link\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n </form>\n );\n}","import { useState } from 'react';\nimport { motion } from \"motion/react\";\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2 } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\n\nconst resetPasswordSchema = z.object({\n password: z.string().min(6, \"A senha deve ter pelo menos 6 caracteres\"),\n confirmPassword: z.string(),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype ResetPasswordFormValues = z.infer<typeof resetPasswordSchema>;\n\nexport interface ModernResetPasswordProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\nexport function ModernResetPassword({\n token,\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernResetPasswordProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema),\n defaultValues: { password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: ResetPasswordFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.resetPassword(token, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Senha redefinida com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao redefinir senha');\n }\n } catch {\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <div className=\"w-full max-w-md z-10 flex flex-col antialiased selection:bg-primary/10 selection:text-primary\">\n <div className=\"text-center mb-6\">\n <motion.h1\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n Redefinir Senha\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-4\">\n Crie uma nova senha para sua conta\n </p>\n </div>\n\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-4\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"Nova Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Nova Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Redefinir Senha\n <ArrowRight className=\"w-4 h-4\" />\n </>\n )}\n </Button>\n\n {signInRedirect && (\n <div className=\"text-center mt-4\">\n <button\n type=\"button\"\n onClick={signInRedirect}\n className=\"text-xs text-primary font-semibold hover:underline\"\n >\n Voltar para o login\n </button>\n </div>\n )}\n </form>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { motion } from \"motion/react\";\nimport { Loader2, CheckCircle2, XCircle, ArrowRight } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport { Button } from './Shared/Button';\n\nexport interface ModernVerifyEmailProps {\n token: string;\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n signInRedirect?: () => void;\n}\n\ntype VerifyStatus = \"verifying\" | \"success\" | \"error\" | \"already_verified\";\n\nexport function ModernVerifyEmail({\n token,\n onSuccess,\n onFailed,\n signInRedirect,\n}: ModernVerifyEmailProps) {\n const [status, setStatus] = useState<VerifyStatus>(\"verifying\");\n const [message, setMessage] = useState(\"Verificando seu e-mail...\");\n const [isLoading, setIsLoading] = useState(true);\n const { auth } = useAuth();\n const hasAttempted = useRef(false);\n\n const handleVerify = async () => {\n if (hasAttempted.current) return;\n hasAttempted.current = true;\n\n setIsLoading(true);\n setStatus(\"verifying\");\n\n try {\n const profile = auth.profile();\n if (profile?.is_verified) {\n setStatus(\"already_verified\");\n setMessage(\"Seu e-mail já está verificado.\");\n setIsLoading(false);\n return;\n }\n\n const res = await auth.verifyEmail(token);\n\n if (res.success) {\n await auth.refresh();\n setStatus(\"success\");\n setMessage(res.message || \"E-mail verificado com sucesso!\");\n if (onSuccess) await onSuccess(res.message);\n } else {\n setStatus(\"error\");\n setMessage(res.message || \"Falha na verificação do e-mail.\");\n if (onFailed) await onFailed(res.message, res.trace);\n }\n } catch (error) {\n setStatus(\"error\");\n setMessage(\"Ocorreu um erro inesperado durante a verificação.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n if (token && !hasAttempted.current) {\n void handleVerify();\n }\n }, [token]);\n\n return (\n <div className=\"w-full max-w-md z-10 flex flex-col antialiased selection:bg-primary/10 selection:text-primary\">\n <div className=\"text-center mb-6\">\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n className=\"flex justify-center mb-4\"\n >\n {status === \"verifying\" && <Loader2 className=\"w-12 h-12 text-primary animate-spin\" />}\n {(status === \"success\" || status === \"already_verified\") && <CheckCircle2 className=\"w-12 h-12 text-green-500\" />}\n {status === \"error\" && <XCircle className=\"w-12 h-12 text-destructive\" />}\n </motion.div>\n\n <motion.h1\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n {status === \"verifying\" ? \"Verificando...\" :\n status === \"error\" ? \"Falha na verificação\" : \"E-mail Verificado!\"}\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-6\">\n {message}\n </p>\n\n {status === \"error\" && (\n <Button\n onClick={() => {\n hasAttempted.current = false;\n void handleVerify();\n }}\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n Tentar novamente\n </Button>\n )}\n\n {(status === \"success\" || status === \"already_verified\") && (\n <div className=\"space-y-4\">\n <p className=\"text-xs text-muted-foreground\">\n Você já pode continuar navegando em sua conta.\n </p>\n {signInRedirect && (\n <Button\n onClick={signInRedirect}\n className=\"w-full flex items-center justify-center gap-2\"\n >\n Ir para o login\n <ArrowRight className=\"w-4 h-4\" />\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { cn } from \"../../../../utils/cn\";\n\ninterface AuthLayoutProps {\n children: React.ReactNode;\n className?: string;\n backLink?: React.ReactNode;\n}\n\nexport function AuthLayout({ children, className, backLink }: AuthLayoutProps) {\n return (\n <main className={cn(\n \"bg-background h-full text-foreground min-h-screen relative overflow-hidden\",\n \"flex flex-col px-4\",\n \"antialiased selection:bg-primary/10 selection:text-primary\",\n className\n )}>\n {/* Decorative background elements */}\n <div className=\"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] bg-primary/20 rounded-full blur-3xl pointer-events-none\" />\n <div className=\"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] bg-primary/20 rounded-full blur-3xl pointer-events-none\" />\n\n {/* Back link at the top, before centered content */}\n {backLink && (\n <div className=\"relative z-10 pt-4\">\n {backLink}\n </div>\n )}\n\n {/* Centered content — takes remaining space */}\n <div className=\"relative z-10 flex-1 flex justify-center items-center\">\n {children}\n </div>\n </main>\n );\n}","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { ArrowRight, Loader2, Sparkles } from 'lucide-react';\nimport { useAuth } from \"../../AuthProvider\";\nimport FormInput from './Shared/FormInput';\nimport FormError from './Shared/FormError';\nimport { Button } from './Shared/Button';\nimport { AuthLayout } from './Shared/AuthLayout';\nimport { motion } from \"motion/react\";\n\nconst setupSchema = z.object({\n email: z.string().email(\"E-mail inválido\"),\n password: z.string().min(8, \"A senha deve ter pelo menos 8 caracteres\"),\n confirmPassword: z.string().min(1, \"A confirmação de senha é obrigatória\"),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"As senhas não coincidem\",\n path: [\"confirmPassword\"],\n});\n\ntype SetupFormValues = z.infer<typeof setupSchema>;\n\nexport interface ModernSetupProps {\n onSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n backLink?: React.ReactNode;\n}\n\nexport function ModernSetup({\n onSuccess,\n onFailed,\n backLink,\n}: ModernSetupProps) {\n const [isLoading, setIsLoading] = useState(false);\n const { auth } = useAuth();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<SetupFormValues>({\n resolver: zodResolver(setupSchema),\n defaultValues: { email: '', password: '', confirmPassword: '' },\n });\n\n const onSubmit = async (data: SetupFormValues) => {\n setIsLoading(true);\n try {\n const response = await auth.setup(data.email, data.password);\n if (response.success) {\n if (onSuccess) await onSuccess(response.message);\n else toast.success(\"Configuração inicial realizada com sucesso!\");\n } else {\n if (onFailed) await onFailed(response.message, response.trace);\n else toast.error(response.message || 'Erro ao realizar setup');\n }\n } catch (error) {\n console.error(error);\n toast.error('Ocorreu um erro inesperado');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <AuthLayout backLink={backLink}>\n <div className=\"w-full max-w-md z-10 flex flex-col\">\n <div className=\"mb-10 text-center\">\n <motion.div\n initial={{ opacity: 0, y: -20 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-xs font-bold uppercase tracking-widest mb-4\"\n >\n <Sparkles size={14} />\n Setup Inicial\n </motion.div>\n \n <h1 className=\"font-heading text-4xl font-bold tracking-tight mb-3\">\n Bem-vindo ao IdentityX\n </h1>\n <p className=\"text-muted-foreground text-base max-w-[320px] mx-auto\">\n Vamos começar criando sua conta de administrador mestre.\n </p>\n </div>\n\n <motion.div\n initial={{ opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ delay: 0.1 }}\n className=\"bg-card/50 backdrop-blur-sm border border-border/40 p-1 rounded-2xl\"\n >\n <div className=\"bg-background rounded-[14px] p-6 shadow-sm\">\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"space-y-5\"\n >\n <div className=\"space-y-1\">\n <FormInput\n label=\"E-mail do Administrador\"\n type=\"email\"\n autoComplete=\"email\"\n error={!!errors.email}\n {...register('email')}\n />\n <FormError message={errors.email?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.password}\n {...register('password')}\n />\n <FormError message={errors.password?.message} />\n </div>\n\n <div className=\"space-y-1\">\n <FormInput\n label=\"Confirmar Senha\"\n type=\"password\"\n autoComplete=\"new-password\"\n error={!!errors.confirmPassword}\n {...register('confirmPassword')}\n />\n <FormError message={errors.confirmPassword?.message} />\n </div>\n\n <Button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2 h-13 mt-4 text-base font-bold shadow-lg shadow-primary/10 group\"\n >\n {isLoading ? <Loader2 className=\"w-5 h-5 animate-spin\" /> : (\n <>\n Finalizar Configuração\n <ArrowRight className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" />\n </>\n )}\n </Button>\n </form>\n </div>\n </motion.div>\n\n <div className=\"mt-8 text-center\">\n <div className=\"h-1 w-full bg-muted/30 rounded-full overflow-hidden\">\n <motion.div \n initial={{ width: 0 }}\n animate={{ width: \"100%\" }}\n transition={{ duration: 1.5, ease: \"easeInOut\" }}\n className=\"h-full bg-primary/40\"\n />\n </div>\n <p className=\"text-[10px] text-muted-foreground mt-2 font-medium uppercase tracking-tighter\">\n Passo 1 de 1 • Configurando ambiente\n </p>\n </div>\n </div>\n </AuthLayout>\n );\n}","import { useState } from 'react';\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { ModernSignIn } from './ModernSignIn';\nimport { ModernSignUp } from './ModernSignUp';\nimport { ModernForgotPassword } from './ModernForgotPassword';\nimport { AuthLayout } from './Shared/AuthLayout';\nimport { OAuthProviderI } from '../../../types/common-types';\n\nexport type AuthView = \"signin\" | \"signup\" | \"forgot-password\";\n\nexport interface ModernAuthProps {\n initialView?: AuthView;\n onLoginSuccess?: (message?: string) => Promise<void>;\n onSignUpSuccess?: (message?: string) => Promise<void>;\n onFailed?: (message: string, trace?: string[]) => Promise<void>;\n backLink?: React.ReactNode;\n /** OAuth providers to show as login buttons (e.g. [\"google\", \"github\"]) */\n providers?: OAuthProviderI[];\n}\n\nconst viewConfig: Record<AuthView, { title: string; subtitle: string; toggleLabel: string; toggleAction: string; toggleTo: AuthView }> = {\n signin: {\n title: \"Bem-vindo de volta\",\n subtitle: \"Entre com suas credenciais para acessar a plataforma\",\n toggleLabel: \"Ainda não tem uma conta?\",\n toggleAction: \"Cadastre-se\",\n toggleTo: \"signup\",\n },\n signup: {\n title: \"Criar sua conta\",\n subtitle: \"Preencha os dados abaixo para se cadastrar\",\n toggleLabel: \"Já possui uma conta?\",\n toggleAction: \"Faça login\",\n toggleTo: \"signin\",\n },\n \"forgot-password\": {\n title: \"Recuperar senha\",\n subtitle: \"Digite seu e-mail para receber instruções\",\n toggleLabel: \"Lembrou da senha?\",\n toggleAction: \"Voltar ao login\",\n toggleTo: \"signin\",\n },\n};\n\nexport function ModernAuth({\n initialView = \"signin\",\n onLoginSuccess,\n onSignUpSuccess,\n onFailed,\n backLink,\n providers,\n}: ModernAuthProps) {\n const [view, setView] = useState<AuthView>(initialView);\n\n const handleSignUpSuccess = async (message?: string) => {\n setView(\"signin\");\n if (onSignUpSuccess) await onSignUpSuccess(message);\n };\n\n const config = viewConfig[view];\n\n return (\n <AuthLayout backLink={backLink}>\n <div className=\"w-full max-w-md z-10 flex flex-col\">\n <div className=\"text-center mb-6\">\n <motion.h1\n key={view + \"-h1\"}\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n className=\"font-heading text-3xl font-bold tracking-tight mb-2\"\n >\n {config.title}\n </motion.h1>\n <p className=\"text-muted-foreground text-sm mb-4\">\n {config.subtitle}\n </p>\n\n <div className=\"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-muted/50 border border-border/50 text-xs font-medium text-muted-foreground\">\n {config.toggleLabel}\n <button\n type=\"button\"\n onClick={() => setView(config.toggleTo)}\n className=\"text-primary font-semibold hover:underline\"\n >\n {config.toggleAction}\n </button>\n </div>\n </div>\n\n {/* Animated form area with fixed min-height to prevent layout shift */}\n <div className={`relative ${providers && providers.length > 0 ? \"min-h-112\" : \"min-h-80\"}`}>\n <AnimatePresence mode=\"wait\">\n {view === \"signin\" && (\n <motion.div\n key=\"signin\"\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 10 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernSignIn\n onSuccess={onLoginSuccess}\n onFailed={onFailed}\n signUpRedirect={() => setView(\"signup\")}\n forgotPasswordRedirect={() => setView(\"forgot-password\")}\n providers={providers}\n />\n </motion.div>\n )}\n\n {view === \"signup\" && (\n <motion.div\n key=\"signup\"\n initial={{ opacity: 0, x: 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: -10 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernSignUp\n onSuccess={handleSignUpSuccess}\n onFailed={onFailed}\n signInRedirect={() => setView(\"signin\")}\n />\n </motion.div>\n )}\n\n {view === \"forgot-password\" && (\n <motion.div\n key=\"forgot-password\"\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.2 }}\n className=\"absolute inset-0\"\n >\n <ModernForgotPassword\n onFailed={onFailed}\n signInRedirect={() => setView(\"signin\")}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </AuthLayout>\n );\n}","import { useState } from \"react\";\nimport { motion, AnimatePresence } from \"motion/react\";\nimport { Copy, Check, User, FolderOpen, Key, Mail } from \"lucide-react\";\n\ntype ActorType = \"human\" | \"service\" | \"machine\";\ntype CredentialType = \"token\" | \"api_key\";\n\nexport interface IntrospectData {\n cred: {\n id?: string;\n type?: CredentialType;\n };\n subject: {\n capabilities?: string[];\n email?: string;\n id?: string;\n metadata?: string[];\n project_id?: string;\n type?: ActorType;\n };\n}\n\nexport interface IdentityCardProps {\n data: IntrospectData;\n}\n\nconst ACTOR_THEME: Record<ActorType, {\n gradient: string;\n orbBg: string;\n orbText: string;\n pillBg: string;\n pillText: string;\n pillBorder: string;\n capBg: string;\n capText: string;\n capBorder: string;\n}> = {\n human: {\n gradient: \"linear-gradient(135deg, #7F77DD, #AFA9EC)\",\n orbBg: \"#EEEDFE\", orbText: \"#534AB7\",\n pillBg: \"#EEEDFE\", pillText: \"#3C3489\", pillBorder: \"#AFA9EC\",\n capBg: \"#EEEDFE\", capText: \"#534AB7\", capBorder: \"#AFA9EC\",\n },\n service: {\n gradient: \"linear-gradient(135deg, #1D9E75, #5DCAA5)\",\n orbBg: \"#E1F5EE\", orbText: \"#0F6E56\",\n pillBg: \"#E1F5EE\", pillText: \"#085041\", pillBorder: \"#5DCAA5\",\n capBg: \"#E1F5EE\", capText: \"#0F6E56\", capBorder: \"#5DCAA5\",\n },\n machine: {\n gradient: \"linear-gradient(135deg, #BA7517, #EF9F27)\",\n orbBg: \"#FAEEDA\", orbText: \"#854F0B\",\n pillBg: \"#FAEEDA\", pillText: \"#412402\", pillBorder: \"#EF9F27\",\n capBg: \"#FAEEDA\", capText: \"#854F0B\", capBorder: \"#EF9F27\",\n },\n};\n\nfunction CopyIconButton({ value }: { value: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n if (!value || value === \"—\") return;\n navigator.clipboard.writeText(value).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <button\n onClick={handleCopy}\n aria-label=\"Copiar valor\"\n className=\"opacity-0 group-hover:opacity-100 transition-all duration-150 p-1.5 rounded-md hover:bg-muted text-muted-foreground hover:text-foreground\"\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n {copied ? (\n <motion.span\n key=\"check\"\n initial={{ scale: 0.7, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.7, opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <Check className=\"w-3.5 h-3.5 text-green-600\" />\n </motion.span>\n ) : (\n <motion.span\n key=\"copy\"\n initial={{ scale: 0.7, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.7, opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <Copy className=\"w-3.5 h-3.5\" />\n </motion.span>\n )}\n </AnimatePresence>\n </button>\n );\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n}: {\n icon: React.ElementType;\n label: string;\n value?: string;\n}) {\n const display = value || \"—\";\n return (\n <div className=\"group flex items-center justify-between px-5 py-2.5 gap-3 rounded-md mx-1.5 hover:bg-muted/50 transition-colors\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n <Icon className=\"w-3.5 h-3.5 text-muted-foreground shrink-0\" />\n <span className=\"text-[11px] text-muted-foreground w-12 shrink-0\">{label}</span>\n <span\n className=\"text-[12px] font-mono text-foreground truncate\"\n title={display}\n >\n {display}\n </span>\n </div>\n <CopyIconButton value={display} />\n </div>\n );\n}\n\nexport function ModernIntrospect({ data }: IdentityCardProps) {\n const { subject, cred } = data;\n const actorType: ActorType = subject.type ?? \"human\";\n const theme = ACTOR_THEME[actorType];\n const caps = subject.capabilities ?? [];\n const capLabels = caps.map((c) => String(c));\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: \"easeOut\" }}\n className=\"w-full rounded-2xl border border-border/60 overflow-hidden bg-card shadow-sm\"\n >\n {/* Header */}\n <div className=\"px-5 pt-2.5 pb-3.5 border-b border-border/60\">\n <p className=\"text-base font-semibold text-foreground truncate\">\n {subject.id ?? \"unknown_actor\"}\n </p>\n <p className=\"text-[12px] text-muted-foreground mb-2 truncate\">\n {subject.email ?? \"—\"}\n </p>\n <div className=\"flex gap-1.5 flex-wrap\">\n <span\n className=\"text-[10px] font-medium uppercase tracking-wide px-2 py-0.5 rounded-full border\"\n style={{\n background: theme.pillBg,\n color: theme.pillText,\n borderColor: theme.pillBorder,\n }}\n >\n {actorType}\n </span>\n <span className=\"text-[10px] font-medium uppercase tracking-wide px-2 py-0.5 rounded-full border border-border bg-muted text-muted-foreground\">\n {cred.type ?? \"token\"}\n </span>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-3 border-b border-border/60 divide-x divide-border/60\">\n {[\n { label: \"Capabilities\", value: caps.length },\n { label: \"Metadata\", value: (subject.metadata ?? []).length },\n { label: \"Project\", value: subject.project_id?.split(\"_\")[1]?.slice(0, 4) ?? \"—\" },\n ].map((s) => (\n <div key={s.label} className=\"py-3 text-center\">\n <p className=\"text-[10px] text-muted-foreground uppercase tracking-wide mb-0.5\">{s.label}</p>\n <p className=\"text-sm font-medium font-mono text-foreground\">{s.value}</p>\n </div>\n ))}\n </div>\n\n {/* Fields */}\n <div className=\"py-1.5 border-b border-border/60\">\n <FieldRow icon={User} label=\"sub id\" value={subject.id} />\n <FieldRow icon={FolderOpen} label=\"project\" value={subject.project_id} />\n <FieldRow icon={Key} label=\"cred id\" value={cred.id} />\n <FieldRow icon={Mail} label=\"email\" value={subject.email} />\n </div>\n\n {/* Capabilities */}\n {capLabels.length > 0 && (\n <div className=\"px-5 py-3 border-b border-border/60\">\n <p className=\"text-[10px] text-muted-foreground uppercase tracking-wide mb-2\">Capabilities</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {capLabels.map((cap) => (\n <span\n key={cap}\n className=\"text-[11px] font-mono px-2.5 py-1 rounded-full border\"\n style={{\n background: theme.capBg,\n color: theme.capText,\n borderColor: theme.capBorder,\n }}\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n </motion.div>\n );\n}\n"]}
|