@samanhappy/mcphub 1.0.1 → 1.0.2
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/betterAuth.js +21 -0
- package/dist/betterAuth.js.map +1 -1
- package/dist/controllers/serverController.js +3 -0
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/dao/ActivityDao.js +2 -0
- package/dist/dao/ActivityDao.js.map +1 -1
- package/dist/db/entities/Activity.js +4 -0
- package/dist/db/entities/Activity.js.map +1 -1
- package/dist/services/activityLoggingService.js +1 -0
- package/dist/services/activityLoggingService.js.map +1 -1
- package/dist/services/betterAuthConfig.js +18 -1
- package/dist/services/betterAuthConfig.js.map +1 -1
- package/dist/services/mcpService.js +41 -12
- package/dist/services/mcpService.js.map +1 -1
- package/dist/utils/rateLimit.js +3 -3
- package/frontend/dist/assets/ActivityPage-B1B9ySGe.js +2 -0
- package/frontend/dist/assets/ActivityPage-B1B9ySGe.js.map +1 -0
- package/frontend/dist/assets/{Dashboard-BUCJcvk-.js → Dashboard-CYzpYZ1d.js} +2 -2
- package/frontend/dist/assets/{Dashboard-BUCJcvk-.js.map → Dashboard-CYzpYZ1d.js.map} +1 -1
- package/frontend/dist/assets/{EndpointCopy-D5NjDdYi.js → EndpointCopy-DVmlWW-s.js} +2 -2
- package/frontend/dist/assets/{EndpointCopy-D5NjDdYi.js.map → EndpointCopy-DVmlWW-s.js.map} +1 -1
- package/frontend/dist/assets/{GroupsPage-DfLlww4U.js → GroupsPage-CsyoUc8S.js} +2 -2
- package/frontend/dist/assets/{GroupsPage-DfLlww4U.js.map → GroupsPage-CsyoUc8S.js.map} +1 -1
- package/frontend/dist/assets/LoginPage-C3t8hbb2.js +2 -0
- package/frontend/dist/assets/LoginPage-C3t8hbb2.js.map +1 -0
- package/frontend/dist/assets/{LogsPage-CTa8kuDf.js → LogsPage-DOZeagVs.js} +2 -2
- package/frontend/dist/assets/{LogsPage-CTa8kuDf.js.map → LogsPage-DOZeagVs.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-C2Rh4WJB.js → MarketPage-kMEHUGfJ.js} +2 -2
- package/frontend/dist/assets/{MarketPage-C2Rh4WJB.js.map → MarketPage-kMEHUGfJ.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-Dh3qjX3x.js → PromptsPage-D7JYoTav.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-Dh3qjX3x.js.map → PromptsPage-D7JYoTav.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-Bc5ZpCIh.js → ResourcesPage-BlwePI9a.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-Bc5ZpCIh.js.map → ResourcesPage-BlwePI9a.js.map} +1 -1
- package/frontend/dist/assets/{ServersPage-hgCbCglG.js → ServersPage-DrkPpCgK.js} +4 -4
- package/frontend/dist/assets/{ServersPage-hgCbCglG.js.map → ServersPage-DrkPpCgK.js.map} +1 -1
- package/frontend/dist/assets/{SettingsPage-BzNX8mXv.js → SettingsPage-BWigWLml.js} +2 -2
- package/frontend/dist/assets/{SettingsPage-BzNX8mXv.js.map → SettingsPage-BWigWLml.js.map} +1 -1
- package/frontend/dist/assets/{StatusDot-CQzailBQ.js → StatusDot-BDBIaafQ.js} +2 -2
- package/frontend/dist/assets/{StatusDot-CQzailBQ.js.map → StatusDot-BDBIaafQ.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-CNBBvo3C.js → ToggleGroup-OOcsllhw.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-CNBBvo3C.js.map → ToggleGroup-OOcsllhw.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-C33b7LCM.js → UsersPage-DL8E7KtW.js} +2 -2
- package/frontend/dist/assets/{UsersPage-C33b7LCM.js.map → UsersPage-DL8E7KtW.js.map} +1 -1
- package/frontend/dist/assets/index-C7wNc_3N.js +3 -0
- package/frontend/dist/assets/index-C7wNc_3N.js.map +1 -0
- package/frontend/dist/assets/{resourceService-C6umWRgq.js → resourceService-B-U4FKGB.js} +2 -2
- package/frontend/dist/assets/{resourceService-C6umWRgq.js.map → resourceService-B-U4FKGB.js.map} +1 -1
- package/frontend/dist/assets/{useServerData-P5In98R4.js → useServerData-DYoDryJj.js} +2 -2
- package/frontend/dist/assets/{useServerData-P5In98R4.js.map → useServerData-DYoDryJj.js.map} +1 -1
- package/frontend/dist/assets/useSettingsData-6utb1Z46.js +2 -0
- package/frontend/dist/assets/{useSettingsData-Cz7vKGLE.js.map → useSettingsData-6utb1Z46.js.map} +1 -1
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/frontend/dist/assets/ActivityPage-DwzGiMh_.js +0 -2
- package/frontend/dist/assets/ActivityPage-DwzGiMh_.js.map +0 -1
- package/frontend/dist/assets/LoginPage-DCjqYw_8.js +0 -2
- package/frontend/dist/assets/LoginPage-DCjqYw_8.js.map +0 -1
- package/frontend/dist/assets/index-BGiKkKzj.js +0 -3
- package/frontend/dist/assets/index-BGiKkKzj.js.map +0 -1
- package/frontend/dist/assets/useSettingsData-Cz7vKGLE.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["getRuntimeConfig","getBasePath","basePath","getApiBaseUrl","getApiUrl","endpoint","baseUrl","normalizedEndpoint","loadRuntimeConfig","currentPath","possibleConfigPaths","configPath","response","data","error","interceptors","lastClickedButton","clickTimeoutId","activeRequests","target","btn","addInterceptor","interceptor","fetchWithInterceptors","input","init","url","config","count","result","processedError","apiRequest","responseObj","apiGet","apiPost","apiPut","apiDelete","TOKEN_KEY","getToken","setToken","token","removeToken","authInterceptor","headers","language","installAuthInterceptor","normalizePath","value","resolveBaseUrl","basePathOverride","authPath","createBetterAuthClient","createAuthClient","startOidcLogin","providerId","callbackURL","errorCallbackURL","authClient","login","credentials","register","getCurrentUser","getBetterAuthUser","changePassword","logout","getPublicConfig","_a","_b","_c","initialState","AuthContext","createContext","AuthProvider","children","auth","setAuth","useState","useEffect","skipAuth","permissions","authService.getToken","betterAuthResponse","authService.getBetterAuthUser","authService.getCurrentUser","authService.removeToken","username","password","authService.login","isAdmin","authService.register","authService.logout","jsx","useAuth","useContext","r","t","f","n","clsx","CLASS_PART_SEPARATOR","createClassGroupUtils","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","className","classParts","getGroupRecursive","getGroupIdForArbitraryProperty","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","classGroupFromNextClassPart","classRest","validator","arbitraryPropertyRegex","arbitraryPropertyClassName","property","theme","classGroups","processClassesRecursively","classGroup","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","key","path","currentClassPartObject","pathPart","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","MODIFIER_SEPARATOR_LENGTH","createParseClassName","prefix","experimentalParseClassName","parseClassName","modifiers","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","baseClassName","stripImportantModifier","hasImportantModifier","maybePostfixModifierPosition","fullPrefix","parseClassNameOriginal","createSortModifiers","orderSensitiveModifiers","modifier","sortedModifiers","unsortedModifiers","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","sortModifiers","classGroupsInConflict","classNames","originalClassName","isExternal","variantModifier","modifierId","classId","conflictGroups","i","group","twJoin","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isLabelFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleColor","scaleBgPosition","scaleBgRepeat","scaleBgSize","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","twMerge","cn","inputs","Toast","message","type","duration","onClose","visible","useTranslation","timer","icons","Check","X","bgColors","textColors","accentBorders","jsxs","ToastContext","useToast","context","ToastProvider","toast","setToast","showToast","useCallback","hideToast","prev","ThemeContext","useTheme","ThemeProvider","setTheme","resolvedTheme","setResolvedTheme","handleSetTheme","newTheme","updateTheme","root","systemTheme","themeToApply","mediaQuery","SERVERS_PER_PAGE_KEY","DEFAULT_SERVERS_PER_PAGE","VALID_PAGE_SIZES","getInitialServersPerPage","saved","parsed","CONFIG","ServerContext","ServerProvider","servers","setServers","allServers","setAllServers","setError","refreshKey","setRefreshKey","isInitialLoading","setIsInitialLoading","fetchAttempts","setFetchAttempts","pagination","setPagination","currentPage","setCurrentPage","serversPerPage","setServersPerPage","intervalRef","useRef","attemptsRef","lastFetchTimeRef","MIN_REFRESH_INTERVAL","clearTimer","applyServerResponse","serverData","startNormalPolling","options","immediate","fetchServers","params","err","prevKey","fetchInitialData","totalPages","triggerRefresh","refreshIfNeeded","timeSinceLastFetch","handleServerAdd","handleServerEdit","server","encodedServerName","handleServerRemove","serverName","handleServerToggle","enabled","handleServerReload","handlePageChange","page","handleServersPerPageChange","limit","normalizedLimit","useServerContext","getDefaultOAuthServerConfig","SettingsContext","useSettings","SettingsProvider","routingConfig","setRoutingConfig","tempRoutingConfig","setTempRoutingConfig","installConfig","setInstallConfig","smartRoutingConfig","setSmartRoutingConfig","mcpRouterConfig","setMCPRouterConfig","oauthServerConfig","setOAuthServerConfig","nameSeparator","setNameSeparator","enableSessionRebuild","setEnableSessionRebuild","bearerKeys","setBearerKeys","loading","setLoading","fetchSettings","_d","_f","_e","_h","_g","_j","_i","oauth","defaultOauthConfig","defaultDynamic","allowedScopes","dynamicAllowedGrantTypes","_k","_l","_m","_o","_n","_q","_p","_r","updateRoutingConfig","updateInstallConfig","updateSmartRoutingConfig","updateSmartRoutingConfigBatch","updates","updateRoutingConfigBatch","updateMCPRouterConfig","updateMCPRouterConfigBatch","updateOAuthServerConfig","updateOAuthServerConfigBatch","updateNameSeparator","updateSessionRebuild","exportMCPSettings","errorMessage","refreshBearerKeys","createBearerKey","payload","updateBearerKey","id","deleteBearerKey","ThemeSwitch","toggleTheme","Moon","Sun","LanguageIcon","props","LanguageSwitch","i18n","languageDropdownOpen","setLanguageDropdownOpen","currentLanguage","setCurrentLanguage","availableLanguages","handleClickOutside","event","handleLanguageChange","lang","handleLanguageToggle","GitHubIcon","fetchLogs","clearLogs","LogStreamManager","__publicField","callback","redactedUrl","parsedUrl","cb","delayMs","logStreamManager","useLogs","logs","setLogs","mounted","initialLogs","handleMessage","prevLogs","unsubscribe","COMPLETION_VISIBILITY_MS","EmbeddingSyncContext","isValidProgressState","progress","EmbeddingSyncProvider","activeSyncs","setActiveSyncs","hideTimersRef","clearHideTimer","clearAllHideTimers","upsertSync","nextState","currentSyncs","existingIndex","currentSync","updatedSyncs","removeSync","useMemo","useEmbeddingSync","useCrumbs","location","useLocation","useParams","crumbs","Header","onToggleSidebar","Menu","c","React","activeSync","BookOpen","useGroupData","groups","setGroups","fetchGroups","createGroup","name","description","updateGroup","updateGroupServers","groupId","deleteGroup","addServerToGroup","removeServerFromGroup","PermissionChecker","fallback","usePermissionCheck","Fragment","requiredPermissions","userPermissions","permission","NPM_REGISTRY","PACKAGE_NAME","checkLatestVersion","compareVersions","current","latest","currentParts","latestParts","currentPart","latestPart","AboutDialog","isOpen","version","hasNewVersion","setHasNewVersion","latestVersion","setLatestVersion","isChecking","setIsChecking","checkForUpdates","RefreshCw","SponsorDialog","open","onOpenChange","WeChatDialog","WeChatIcon","DiscordIcon","SponsorIcon","UserProfileMenu","collapsed","navigate","useNavigate","setIsOpen","showNewVersionInfo","setShowNewVersionInfo","showAboutDialog","setShowAboutDialog","sponsorDialogOpen","setSponsorDialogOpen","wechatDialogOpen","setWechatDialogOpen","menuRef","handleSettingsClick","handleLogoutClick","handleAboutClick","handleSponsorClick","handleWeChatClick","User","Settings","Info","LogOut","checkActivityAvailable","buildQueryString","filter","getActivities","queryString","getActivityById","getActivityStats","getActivityFilterOptions","deleteOldActivities","daysOld","Sidebar","activityAvailable","setActivityAvailable","appVersion","userCanManageUsers","workspaceItems","LayoutGrid","ServerIcon","RouteIcon","MessageSquare","FileText","Store","systemItems","UsersIcon","Activity","ScrollText","SettingsIcon","renderItem","item","NavLink","isActive","Content","PageFallback","MainLayout","sidebarCollapsed","setSidebarCollapsed","toggleSidebar","Suspense","Outlet","ProtectedRoute","redirectPath","Navigate","EMBED_SYNC_ERROR_MARKER","TOAST_DURATION_MS","TOAST_DEDUPE_WINDOW_MS","EmbeddingSyncAlertListener","recentToastRef","shouldSuppressToast","now","timestamp","existingKey","previousTimestamp","extractServerName","serverMatch","showEmbeddingErrorToast","handleEmbeddingSyncErrorLog","rawMessage","cleanedMessage","LoginPage","lazy","__vitePreload","DashboardPage","ServersPage","GroupsPage","UsersPage","SettingsPage","MarketPage","LogsPage","ActivityPage","PromptsPage","ResourcesPage","CloudRedirect","RouteFallback","App","basename","Router","Routes","Route","LanguageDetector","initReactI18next","enTranslation","zhTranslation","frTranslation","trTranslation","setupInterceptors","initializeApp","ReactDOM"],"ignoreList":[7,8],"sources":["../../src/utils/runtime.ts","../../src/utils/fetchInterceptor.ts","../../src/utils/interceptors.ts","../../src/services/betterAuthClient.ts","../../src/services/authService.ts","../../src/services/configService.ts","../../src/contexts/AuthContext.tsx","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/tailwind-merge@3.3.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../src/utils/cn.ts","../../src/components/ui/Toast.tsx","../../src/contexts/ToastContext.tsx","../../src/contexts/ThemeContext.tsx","../../src/contexts/ServerContext.tsx","../../src/contexts/SettingsContext.tsx","../../src/components/ui/ThemeSwitch.tsx","../../src/components/icons/LanguageIcon.tsx","../../src/components/ui/LanguageSwitch.tsx","../../src/components/icons/GitHubIcon.tsx","../../src/services/logService.ts","../../src/contexts/EmbeddingSyncContext.tsx","../../src/components/layout/Header.tsx","../../src/hooks/useGroupData.ts","../../src/components/PermissionChecker.tsx","../../src/utils/version.ts","../../src/components/ui/AboutDialog.tsx","../../src/components/ui/SponsorDialog.tsx","../../src/components/ui/WeChatDialog.tsx","../../src/components/icons/WeChatIcon.tsx","../../src/components/icons/DiscordIcon.tsx","../../src/components/icons/SponsorIcon.tsx","../../src/components/ui/UserProfileMenu.tsx","../../src/services/activityService.ts","../../src/components/layout/Sidebar.tsx","../../src/components/layout/Content.tsx","../../src/layouts/MainLayout.tsx","../../src/components/ProtectedRoute.tsx","../../src/components/EmbeddingSyncAlertListener.tsx","../../src/App.tsx","../../src/i18n.ts","../../src/utils/setupInterceptors.ts","../../src/main.tsx"],"sourcesContent":["import type { RuntimeConfig } from '../types/runtime';\n\n/**\n * Get runtime configuration from window object\n */\nexport const getRuntimeConfig = (): RuntimeConfig => {\n return (\n window.__MCPHUB_CONFIG__ || {\n basePath: '',\n version: 'dev',\n name: 'mcphub',\n }\n );\n};\n\n/**\n * Get the base path from runtime configuration\n */\nexport const getBasePath = (): string => {\n const config = getRuntimeConfig();\n const basePath = config.basePath || '';\n\n // Ensure the path starts with / if it's not empty and doesn't already start with /\n if (basePath && !basePath.startsWith('/')) {\n return '/' + basePath;\n }\n return basePath;\n};\n\n/**\n * Get the API base URL including base path and /api prefix\n */\nexport const getApiBaseUrl = (): string => {\n const basePath = getBasePath();\n // Always append /api to the base path for API endpoints\n return basePath + '/api';\n};\n\n/**\n * Construct a full API URL with the given endpoint\n */\nexport const getApiUrl = (endpoint: string): string => {\n const baseUrl = getApiBaseUrl();\n // Ensure endpoint starts with /\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : '/' + endpoint;\n return baseUrl + normalizedEndpoint;\n};\n\n/**\n * Load runtime configuration from server\n */\nexport const loadRuntimeConfig = async (): Promise<RuntimeConfig> => {\n try {\n // For initial config load, we need to determine the correct path\n // Try different possible paths based on current location\n const currentPath = window.location.pathname;\n const possibleConfigPaths = [\n // If we're already on a subpath, try to use it\n currentPath.replace(/\\/[^/]*$/, '') + '/config',\n // Try root config\n '/config',\n // Try with potential base paths\n ...(currentPath.includes('/')\n ? [currentPath.split('/')[1] ? `/${currentPath.split('/')[1]}/config` : '/config']\n : ['/config']),\n ];\n\n for (const configPath of possibleConfigPaths) {\n try {\n const response = await fetch(configPath, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'Cache-Control': 'no-cache',\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.data) {\n return data.data;\n }\n }\n } catch (error) {\n // Continue to next path\n console.debug(`Failed to load config from ${configPath}:`, error);\n }\n }\n\n // Fallback to default config\n console.warn('Could not load runtime config from server, using defaults');\n return {\n basePath: '',\n version: 'dev',\n name: 'mcphub',\n };\n } catch (error) {\n console.error('Error loading runtime config:', error);\n return {\n basePath: '',\n version: 'dev',\n name: 'mcphub',\n };\n }\n};\n","import { getApiUrl } from './runtime';\n\n// Define the interceptor interface\nexport interface FetchInterceptor {\n request?: (url: string, config: RequestInit) => Promise<{ url: string; config: RequestInit }>;\n response?: (response: Response) => Promise<Response>;\n error?: (error: Error) => Promise<Error>;\n}\n\n// Define the enhanced fetch response interface\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n message?: string;\n error?: string;\n}\n\n// Global interceptors store\nconst interceptors: FetchInterceptor[] = [];\n\n// --- Global UI Tracking for Network Requests ---\nlet lastClickedButton: HTMLButtonElement | null = null;\nlet clickTimeoutId: ReturnType<typeof setTimeout> | null = null;\nconst activeRequests = new WeakMap<HTMLButtonElement, number>();\n\nif (typeof document !== 'undefined') {\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const btn = target?.closest('button');\n if (btn) {\n lastClickedButton = btn as HTMLButtonElement;\n if (clickTimeoutId) clearTimeout(clickTimeoutId);\n // Give enough time for synchronous event handlers to initiate a fetch\n clickTimeoutId = setTimeout(() => {\n lastClickedButton = null;\n }, 100);\n }\n }, true);\n}\n// -----------------------------------------------\n\n// Add an interceptor\nexport const addInterceptor = (interceptor: FetchInterceptor): void => {\n interceptors.push(interceptor);\n};\n\n// Remove an interceptor\nexport const removeInterceptor = (interceptor: FetchInterceptor): void => {\n const index = interceptors.indexOf(interceptor);\n if (index > -1) {\n interceptors.splice(index, 1);\n }\n};\n\n// Clear all interceptors\nexport const clearInterceptors = (): void => {\n interceptors.length = 0;\n};\n\n// Enhanced fetch function with interceptors\nexport const fetchWithInterceptors = async (\n input: string | URL | Request,\n init: RequestInit = {},\n): Promise<Response> => {\n let url = input.toString();\n let config = { ...init };\n\n // Capture button for UI feedback before any await suspends execution\n const btn = lastClickedButton;\n if (btn) {\n const count = activeRequests.get(btn) || 0;\n activeRequests.set(btn, count + 1);\n btn.classList.add('is-loading');\n }\n\n try {\n // Apply request interceptors\n for (const interceptor of interceptors) {\n if (interceptor.request) {\n const result = await interceptor.request(url, config);\n url = result.url;\n config = result.config;\n }\n }\n\n // Make the actual fetch request\n let response = await fetch(url, config);\n\n // Apply response interceptors\n for (const interceptor of interceptors) {\n if (interceptor.response) {\n response = await interceptor.response(response);\n }\n }\n\n return response;\n } catch (error) {\n let processedError = error as Error;\n\n // Apply error interceptors\n for (const interceptor of interceptors) {\n if (interceptor.error) {\n processedError = await interceptor.error(processedError);\n }\n }\n\n throw processedError;\n } finally {\n // UI feedback cleanup\n if (btn) {\n const count = activeRequests.get(btn) || 0;\n if (count <= 1) {\n activeRequests.delete(btn);\n btn.classList.remove('is-loading');\n } else {\n activeRequests.set(btn, count - 1);\n }\n }\n }\n};\n\n// Convenience function for API calls with automatic URL construction\nexport const apiRequest = async <T = any>(endpoint: string, init: RequestInit = {}): Promise<T> => {\n try {\n const url = getApiUrl(endpoint);\n const response = await fetchWithInterceptors(url, init);\n\n // Try to parse JSON response\n let data: T;\n try {\n data = await response.json();\n } catch (parseError) {\n // If JSON parsing fails, create a generic response\n const genericResponse = {\n success: response.ok,\n message: response.ok\n ? 'Request successful'\n : `HTTP ${response.status}: ${response.statusText}`,\n };\n data = genericResponse as T;\n }\n\n // If response is not ok, but no explicit error in parsed data\n if (!response.ok && typeof data === 'object' && data !== null) {\n const responseObj = data as any;\n if (responseObj.success !== false) {\n responseObj.success = false;\n responseObj.message =\n responseObj.message || `HTTP ${response.status}: ${response.statusText}`;\n }\n }\n\n return data;\n } catch (error) {\n console.error('API request error:', error);\n const errorResponse = {\n success: false,\n message: error instanceof Error ? error.message : 'An unknown error occurred',\n };\n return errorResponse as T;\n }\n};\n\n// Convenience methods for common HTTP methods\nexport const apiGet = <T = any>(endpoint: string, init: Omit<RequestInit, 'method'> = {}) =>\n apiRequest<T>(endpoint, { ...init, method: 'GET' });\n\nexport const apiPost = <T = any>(\n endpoint: string,\n data?: any,\n init: Omit<RequestInit, 'method' | 'body'> = {},\n) =>\n apiRequest<T>(endpoint, {\n ...init,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...init.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n });\n\nexport const apiPut = <T = any>(\n endpoint: string,\n data?: any,\n init: Omit<RequestInit, 'method' | 'body'> = {},\n) =>\n apiRequest<T>(endpoint, {\n ...init,\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n ...init.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n });\n\nexport const apiDelete = <T = any>(endpoint: string, init: Omit<RequestInit, 'method'> = {}) =>\n apiRequest<T>(endpoint, { ...init, method: 'DELETE' });\n\nexport const apiPatch = <T = any>(\n endpoint: string,\n data?: any,\n init: Omit<RequestInit, 'method' | 'body'> = {},\n) =>\n apiRequest<T>(endpoint, {\n ...init,\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...init.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n });\n","import { addInterceptor, removeInterceptor, type FetchInterceptor } from './fetchInterceptor';\n\n// Token key in localStorage\nconst TOKEN_KEY = 'mcphub_token';\n\n// Get token from localStorage\nexport const getToken = (): string | null => {\n return localStorage.getItem(TOKEN_KEY);\n};\n\n// Set token in localStorage\nexport const setToken = (token: string): void => {\n localStorage.setItem(TOKEN_KEY, token);\n};\n\n// Remove token from localStorage\nexport const removeToken = (): void => {\n localStorage.removeItem(TOKEN_KEY);\n};\n\n// Auth interceptor for automatically adding authorization headers\nexport const authInterceptor: FetchInterceptor = {\n request: async (url: string, config: RequestInit) => {\n const headers = new Headers(config.headers);\n const language = localStorage.getItem('i18nextLng') || 'en';\n headers.set('Accept-Language', language);\n\n const token = getToken();\n if (token) {\n headers.set('x-auth-token', token);\n }\n\n return {\n url,\n config: {\n ...config,\n headers,\n credentials: config.credentials ?? 'include',\n },\n };\n },\n\n response: async (response: Response) => {\n // Handle unauthorized responses\n if (response.status === 401) {\n // Token might be expired or invalid, remove it\n removeToken();\n\n // You could also trigger a redirect to login page here\n // window.location.href = '/login';\n }\n\n return response;\n },\n\n error: async (error: Error) => {\n console.error('Auth interceptor error:', error);\n return error;\n },\n};\n\n// Install the auth interceptor\nexport const installAuthInterceptor = (): void => {\n addInterceptor(authInterceptor);\n};\n\n// Uninstall the auth interceptor\nexport const uninstallAuthInterceptor = (): void => {\n removeInterceptor(authInterceptor);\n};\n\n// Logging interceptor for development\nexport const loggingInterceptor: FetchInterceptor = {\n request: async (url: string, config: RequestInit) => {\n console.log('🚀 Request', { method: config.method || 'GET', url, config });\n return { url, config };\n },\n\n response: async (response: Response) => {\n console.log(`✅ [${response.status}] ${response.url}`);\n return response;\n },\n\n error: async (error: Error) => {\n console.error('❌ Fetch error', { error });\n return error;\n },\n};\n\n// Install the logging interceptor (only in development)\nexport const installLoggingInterceptor = (): void => {\n if (process.env.NODE_ENV === 'development') {\n addInterceptor(loggingInterceptor);\n }\n};\n\n// Uninstall the logging interceptor\nexport const uninstallLoggingInterceptor = (): void => {\n removeInterceptor(loggingInterceptor);\n};\n","import { createAuthClient } from 'better-auth/react';\nimport { getBasePath } from '../utils/runtime';\n\nconst normalizePath = (value: string): string => {\n if (!value) {\n return '/api/auth/better';\n }\n return value.startsWith('/') ? value : `/${value}`;\n};\n\nconst resolveBaseUrl = (basePathOverride?: string): string => {\n if (typeof window === 'undefined') {\n return '';\n }\n const basePath = getBasePath();\n const authPath = normalizePath(basePathOverride || '/api/auth/better');\n return `${window.location.origin}${basePath}${authPath}`;\n};\n\ninterface StartOidcLoginOptions {\n providerId: string;\n callbackURL: string;\n errorCallbackURL: string;\n basePathOverride?: string;\n}\n\nexport const createBetterAuthClient = (basePathOverride?: string) =>\n createAuthClient({\n baseURL: resolveBaseUrl(basePathOverride),\n fetchOptions: {\n credentials: 'include',\n },\n });\n\nexport const startOidcLogin = async ({\n providerId,\n callbackURL,\n errorCallbackURL,\n basePathOverride,\n}: StartOidcLoginOptions): Promise<void> => {\n const response = await fetch(`${resolveBaseUrl(basePathOverride)}/sign-in/oauth2`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n providerId,\n callbackURL,\n errorCallbackURL,\n }),\n });\n\n if (!response.ok) {\n throw new Error('OIDC sign-in request failed.');\n }\n\nconst data = await response.json().catch(() => ({})) as { url?: string; redirect?: boolean };\n if (!data.redirect || !data.url) {\n throw new Error('OIDC sign-in did not return a redirect URL.');\n }\n\n window.location.assign(data.url);\n};\n\nexport const authClient = createBetterAuthClient();\n","import {\n AuthResponse,\n LoginCredentials,\n RegisterCredentials,\n ChangePasswordCredentials,\n} from '../types';\nimport { apiPost, apiGet } from '../utils/fetchInterceptor';\nimport { getToken, setToken, removeToken } from '../utils/interceptors';\nimport { authClient } from './betterAuthClient';\n\n// Export token management functions\nexport { getToken, setToken, removeToken };\n\n// Login user\nexport const login = async (credentials: LoginCredentials): Promise<AuthResponse> => {\n try {\n const response = await apiPost<AuthResponse>('/auth/login', credentials);\n\n // The auth API returns data directly, not wrapped in a data field\n if (response.success && response.token) {\n setToken(response.token);\n return response;\n }\n\n return {\n success: false,\n message: response.message || 'Login failed',\n };\n } catch (error) {\n console.error('Login error', { error });\n return {\n success: false,\n message: error instanceof Error ? error.message : 'An error occurred during login',\n };\n }\n};\n\n// Register user\nexport const register = async (credentials: RegisterCredentials): Promise<AuthResponse> => {\n try {\n const response = await apiPost<AuthResponse>('/auth/register', credentials);\n\n if (response.success && response.token) {\n setToken(response.token);\n return response;\n }\n\n return {\n success: false,\n message: response.message || 'Registration failed',\n };\n } catch (error) {\n console.error('Register error', { error });\n return {\n success: false,\n message: 'An error occurred during registration',\n };\n }\n};\n\n// Get current user\nexport const getCurrentUser = async (): Promise<AuthResponse> => {\n const token = getToken();\n\n if (!token) {\n return {\n success: false,\n message: 'No authentication token',\n };\n }\n\n try {\n const response = await apiGet<AuthResponse>('/auth/user');\n return response;\n } catch (error) {\n console.error('Get current user error', { error });\n return {\n success: false,\n message: 'An error occurred while fetching user data',\n };\n }\n};\n\n// Get current user via Better Auth session\nexport const getBetterAuthUser = async (): Promise<AuthResponse> => {\n try {\n const response = await apiGet<AuthResponse>('/better-auth/user');\n return response;\n } catch (error) {\n console.error('Get Better Auth user error', { error });\n return {\n success: false,\n message: 'An error occurred while fetching user data',\n };\n }\n};\n\n// Change password\nexport const changePassword = async (\n credentials: ChangePasswordCredentials,\n): Promise<AuthResponse> => {\n const token = getToken();\n\n if (!token) {\n return {\n success: false,\n message: 'No authentication token',\n };\n }\n\n try {\n const response = await apiPost<AuthResponse>('/auth/change-password', credentials);\n return response;\n } catch (error) {\n console.error('Change password error', { error });\n return {\n success: false,\n message: 'An error occurred while changing password',\n };\n }\n};\n\n// Logout user\nexport const logout = (): void => {\n removeToken();\n authClient.signOut().catch((error) => {\n console.debug('Better Auth sign out failed', { error });\n });\n};\n","import { apiGet, fetchWithInterceptors } from '../utils/fetchInterceptor';\nimport { getBasePath } from '../utils/runtime';\n\nexport interface SystemConfig {\n routing?: {\n enableGlobalRoute?: boolean;\n enableGroupNameRoute?: boolean;\n enableBearerAuth?: boolean;\n bearerAuthKey?: string;\n bearerAuthHeaderName?: string;\n jsonBodyLimit?: string;\n skipAuth?: boolean;\n };\n install?: {\n pythonIndexUrl?: string;\n npmRegistry?: string;\n };\n smartRouting?: {\n enabled?: boolean;\n dbUrl?: string;\n basePacingDelayMs?: number;\n embeddingProvider?: 'openai' | 'azure_openai';\n embeddingEncodingFormat?: 'auto' | 'base64' | 'float';\n openaiApiBaseUrl?: string;\n openaiApiKey?: string;\n openaiApiEmbeddingModel?: string;\n azureOpenaiEndpoint?: string;\n azureOpenaiApiKey?: string;\n azureOpenaiApiVersion?: string;\n azureOpenaiEmbeddingDeployment?: string;\n embeddingMaxTokens?: number;\n };\n nameSeparator?: string;\n auth?: {\n betterAuth?: {\n enabled?: boolean;\n basePath?: string;\n providers?: {\n google?: {\n enabled?: boolean;\n };\n github?: {\n enabled?: boolean;\n };\n oidc?: {\n enabled?: boolean;\n providerId?: string;\n discoveryUrl?: string;\n scopes?: string[];\n pkce?: boolean;\n prompt?: string;\n };\n };\n };\n };\n}\n\ninterface BetterAuthConfig {\n enabled?: boolean;\n basePath?: string;\n providers?: {\n google?: {\n enabled?: boolean;\n };\n github?: {\n enabled?: boolean;\n };\n oidc?: {\n enabled?: boolean;\n providerId?: string;\n discoveryUrl?: string;\n scopes?: string[];\n pkce?: boolean;\n prompt?: string;\n };\n };\n}\n\nexport interface PublicConfigResponse {\n success: boolean;\n data?: {\n skipAuth?: boolean;\n permissions?: any;\n betterAuth?: BetterAuthConfig;\n };\n message?: string;\n}\n\nexport interface SystemConfigResponse {\n success: boolean;\n data?: {\n systemConfig?: SystemConfig;\n };\n message?: string;\n}\n\n/**\n * Get public configuration (skipAuth setting) without authentication\n */\nexport const getPublicConfig = async (): Promise<{\n skipAuth: boolean;\n permissions?: any;\n betterAuth?: BetterAuthConfig;\n}> => {\n try {\n const basePath = getBasePath();\n const response = await fetchWithInterceptors(`${basePath}/public-config`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.ok) {\n const data: PublicConfigResponse = await response.json();\n return {\n skipAuth: data.data?.skipAuth === true,\n permissions: data.data?.permissions || {},\n betterAuth: data.data?.betterAuth,\n };\n }\n\n return { skipAuth: false };\n } catch (error) {\n console.debug('Failed to get public config:', error);\n return { skipAuth: false };\n }\n};\n\n/**\n * Get system configuration without authentication\n * This function tries to get the system configuration first without auth,\n * and if that fails (likely due to auth requirements), it returns null\n */\nexport const getSystemConfigPublic = async (): Promise<SystemConfig | null> => {\n try {\n const response = await apiGet<SystemConfigResponse>('/settings');\n\n if (response.success) {\n return response.data?.systemConfig || null;\n }\n\n return null;\n } catch (error) {\n console.debug('Failed to get system config without auth:', error);\n return null;\n }\n};\n\n/**\n * Check if dashboard login should be skipped based on system configuration\n */\nexport const shouldSkipAuth = async (): Promise<boolean> => {\n try {\n const config = await getPublicConfig();\n return config.skipAuth;\n } catch (error) {\n console.debug('Failed to check skipAuth setting:', error);\n return false;\n }\n};\n","import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { AuthState } from '../types';\nimport * as authService from '../services/authService';\nimport { getPublicConfig } from '../services/configService';\n\n// Initial auth state\nconst initialState: AuthState = {\n isAuthenticated: false,\n loading: true,\n user: null,\n error: null,\n};\n\n// Create auth context\nconst AuthContext = createContext<{\n auth: AuthState;\n login: (\n username: string,\n password: string,\n ) => Promise<{ success: boolean; isUsingDefaultPassword?: boolean; message?: string }>;\n register: (username: string, password: string, isAdmin?: boolean) => Promise<boolean>;\n logout: () => void;\n}>({\n auth: initialState,\n login: async () => ({ success: false }),\n register: async () => false,\n logout: () => {},\n});\n\n// Auth provider component\nexport const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [auth, setAuth] = useState<AuthState>(initialState);\n\n // Load user if token exists\n useEffect(() => {\n const loadUser = async () => {\n // First check if authentication should be skipped\n const { skipAuth, permissions } = await getPublicConfig();\n\n if (skipAuth) {\n // If authentication is disabled, set user as authenticated with a dummy user\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: {\n username: 'guest',\n isAdmin: true,\n permissions,\n },\n error: null,\n });\n return;\n }\n\n // Normal authentication flow\n const token = authService.getToken();\n\n if (!token) {\n const betterAuthResponse = await authService.getBetterAuthUser();\n if (betterAuthResponse.success && betterAuthResponse.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: betterAuthResponse.user,\n error: null,\n });\n return;\n }\n\n setAuth({\n ...initialState,\n loading: false,\n });\n return;\n }\n\n try {\n const response = await authService.getCurrentUser();\n\n if (response.success && response.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: response.user,\n error: null,\n });\n } else {\n authService.removeToken();\n const betterAuthResponse = await authService.getBetterAuthUser();\n if (betterAuthResponse.success && betterAuthResponse.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: betterAuthResponse.user,\n error: null,\n });\n } else {\n setAuth({\n ...initialState,\n loading: false,\n });\n }\n }\n } catch (error) {\n authService.removeToken();\n const betterAuthResponse = await authService.getBetterAuthUser();\n if (betterAuthResponse.success && betterAuthResponse.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: betterAuthResponse.user,\n error: null,\n });\n } else {\n setAuth({\n ...initialState,\n loading: false,\n });\n }\n }\n };\n\n loadUser();\n }, []);\n\n // Login function\n const login = async (\n username: string,\n password: string,\n ): Promise<{ success: boolean; isUsingDefaultPassword?: boolean; message?: string }> => {\n try {\n const response = await authService.login({ username, password });\n\n if (response.success && response.token && response.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: response.user,\n error: null,\n });\n return {\n success: true,\n isUsingDefaultPassword: response.isUsingDefaultPassword,\n };\n } else {\n setAuth({\n ...initialState,\n loading: false,\n error: response.message || 'Authentication failed',\n });\n return { success: false, message: response.message };\n }\n } catch (error) {\n setAuth({\n ...initialState,\n loading: false,\n error: 'Authentication failed',\n });\n return { success: false, message: error instanceof Error ? error.message : undefined };\n }\n };\n\n // Register function\n const register = async (\n username: string,\n password: string,\n isAdmin = false,\n ): Promise<boolean> => {\n try {\n const response = await authService.register({ username, password, isAdmin });\n\n if (response.success && response.token && response.user) {\n setAuth({\n isAuthenticated: true,\n loading: false,\n user: response.user,\n error: null,\n });\n return true;\n } else {\n setAuth({\n ...initialState,\n loading: false,\n error: response.message || 'Registration failed',\n });\n return false;\n }\n } catch (error) {\n setAuth({\n ...initialState,\n loading: false,\n error: 'Registration failed',\n });\n return false;\n }\n };\n\n // Logout function\n const logout = (): void => {\n authService.logout();\n setAuth({\n ...initialState,\n loading: false,\n });\n };\n\n return (\n <AuthContext.Provider value={{ auth, login, register, logout }}>\n {children}\n </AuthContext.Provider>\n );\n};\n\n// Custom hook to use auth context\nexport const useAuth = () => useContext(AuthContext);\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n for (const classGroupId in classGroups) {\n processClassesRecursively(classGroups[classGroupId], classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst MODIFIER_SEPARATOR_LENGTH = MODIFIER_SEPARATOR.length;\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + MODIFIER_SEPARATOR_LENGTH;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n } else if (currentCharacter === '(') {\n parenDepth++;\n } else if (currentCharacter === ')') {\n parenDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const baseClassName = stripImportantModifier(baseClassNameWithImportantModifier);\n const hasImportantModifier = baseClassName !== baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.substring(fullPrefix.length)) : {\n isExternal: true,\n modifiers: [],\n hasImportantModifier: false,\n baseClassName: className,\n maybePostfixModifierPosition: undefined\n };\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\nconst stripImportantModifier = baseClassName => {\n if (baseClassName.endsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(0, baseClassName.length - 1);\n }\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n if (baseClassName.startsWith(IMPORTANT_MODIFIER)) {\n return baseClassName.substring(1);\n }\n return baseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n const orderSensitiveModifiers = Object.fromEntries(config.orderSensitiveModifiers.map(modifier => [modifier, true]));\n const sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isPositionSensitive = modifier[0] === '[' || orderSensitiveModifiers[modifier];\n if (isPositionSensitive) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n };\n return sortModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: scaleInset()\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Combines multiple class names and deduplicates Tailwind CSS classes\n * This is a utility function for conditionally joining class names together\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import React, { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Check, X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport interface ToastProps {\n message: string;\n type?: ToastType;\n duration?: number;\n onClose: () => void;\n visible: boolean;\n}\n\nconst Toast: React.FC<ToastProps> = ({\n message,\n type = 'info',\n duration = 3000,\n onClose,\n visible,\n}) => {\n const { t } = useTranslation();\n\n useEffect(() => {\n if (visible) {\n const timer = setTimeout(() => {\n onClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }\n }, [visible, duration, onClose]);\n\n const icons = {\n success: <Check className=\"w-5 h-5 text-green-500\" />,\n error: <X className=\"w-5 h-5 text-red-500\" />,\n info: (\n <svg className=\"w-5 h-5 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n ),\n warning: (\n <svg\n className=\"w-5 h-5 text-yellow-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n ),\n };\n\n const bgColors = {\n success: 'bg-green-50 border-green-200',\n error: 'bg-red-50 border-red-200',\n info: 'bg-blue-50 border-blue-200',\n warning: 'bg-yellow-50 border-yellow-200',\n };\n\n const textColors = {\n success: 'text-green-800',\n error: 'text-red-800',\n info: 'text-blue-800',\n warning: 'text-yellow-800',\n };\n\n const accentBorders = {\n success: 'border-l-4 border-l-green-500',\n error: 'border-l-4 border-l-red-600',\n info: 'border-l-4 border-l-blue-500',\n warning: 'border-l-4 border-l-yellow-500',\n };\n\n return (\n <div\n className={cn(\n 'fixed top-4 right-4 z-50 max-w-sm p-4 rounded-md shadow-lg border',\n bgColors[type],\n accentBorders[type],\n 'transform transition-all duration-300 ease-in-out',\n visible ? 'translate-x-0 opacity-100' : 'translate-x-full opacity-0',\n )}\n >\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">{icons[type]}</div>\n <div className=\"ml-3\">\n <p className={cn('text-sm font-medium', textColors[type])}>{message}</p>\n </div>\n <div className=\"ml-auto pl-3\">\n <div className=\"-mx-1.5 -my-1.5\">\n <button\n onClick={onClose}\n className={cn(\n 'inline-flex rounded-md p-1.5',\n `hover:bg-${type}-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-${type}-500`,\n )}\n >\n <span className=\"sr-only\">{t('common.dismiss')}</span>\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Toast;\n","import React, { createContext, useContext, useState, ReactNode, useCallback } from 'react';\nimport Toast, { ToastType } from '@/components/ui/Toast';\n\ninterface ToastContextProps {\n showToast: (message: string, type?: ToastType, duration?: number) => void;\n}\n\nconst ToastContext = createContext<ToastContextProps | undefined>(undefined);\n\nexport const useToast = () => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n\ninterface ToastProviderProps {\n children: ReactNode;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({ children }) => {\n const [toast, setToast] = useState<{\n message: string;\n type: ToastType;\n visible: boolean;\n duration: number;\n }>({\n message: '',\n type: 'info',\n visible: false,\n duration: 3000,\n });\n\n const showToast = useCallback((message: string, type: ToastType = 'info', duration: number = 3000) => {\n setToast({\n message,\n type,\n visible: true,\n duration,\n });\n }, []);\n\n const hideToast = useCallback(() => {\n setToast((prev) => ({ ...prev, visible: false }));\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast }}>\n {children}\n <Toast\n message={toast.message}\n type={toast.type}\n duration={toast.duration}\n onClose={hideToast}\n visible={toast.visible}\n />\n </ToastContext.Provider>\n );\n};","import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\n\ntype Theme = 'light' | 'dark' | 'system';\n\ninterface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: 'light' | 'dark'; // The actual theme used after resolving system preference\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const useTheme = () => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n\nexport const ThemeProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n // Get theme from localStorage or default to 'system'\n const [theme, setTheme] = useState<Theme>(() => {\n const savedTheme = localStorage.getItem('theme') as Theme;\n return savedTheme || 'system';\n });\n \n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light');\n\n // Function to set theme and save to localStorage\n const handleSetTheme = (newTheme: Theme) => {\n setTheme(newTheme);\n localStorage.setItem('theme', newTheme);\n };\n\n // Effect to handle system theme changes and apply theme to document\n useEffect(() => {\n const updateTheme = () => {\n const root = window.document.documentElement;\n const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n \n // Determine which theme to use\n const themeToApply = theme === 'system' ? systemTheme : theme;\n setResolvedTheme(themeToApply as 'light' | 'dark');\n \n // Apply or remove dark class based on theme\n if (themeToApply === 'dark') {\n console.log('Applying dark mode to HTML root element'); // 添加日志\n root.classList.add('dark');\n document.body.style.backgroundColor = '#111827'; // Force a dark background to ensure visible effect\n } else {\n console.log('Removing dark mode from HTML root element'); // 添加日志\n root.classList.remove('dark');\n document.body.style.backgroundColor = ''; // Reset background color\n }\n };\n\n // Set up listeners for system theme changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', updateTheme);\n \n // Initial theme setup\n updateTheme();\n\n // Cleanup\n return () => {\n mediaQuery.removeEventListener('change', updateTheme);\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme: handleSetTheme, resolvedTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};","import React, { createContext, useState, useEffect, useRef, useCallback, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Server, ApiResponse } from '@/types';\nimport { apiGet, apiPost, apiDelete } from '../utils/fetchInterceptor';\nimport { useAuth } from './AuthContext';\n\nconst SERVERS_PER_PAGE_KEY = 'mcphub_servers_per_page';\nconst DEFAULT_SERVERS_PER_PAGE = 5;\nconst VALID_PAGE_SIZES = new Set([5, 10, 20, 50]);\n\nconst getInitialServersPerPage = (): number => {\n if (typeof window === 'undefined') {\n return DEFAULT_SERVERS_PER_PAGE;\n }\n\n const saved = window.localStorage.getItem(SERVERS_PER_PAGE_KEY);\n if (!saved) {\n return DEFAULT_SERVERS_PER_PAGE;\n }\n\n const parsed = Number(saved);\n return VALID_PAGE_SIZES.has(parsed) ? parsed : DEFAULT_SERVERS_PER_PAGE;\n};\n\n// Configuration options\nconst CONFIG = {\n // Initialization phase configuration\n startup: {\n maxAttempts: 60, // Maximum number of attempts during initialization\n pollingInterval: 3000, // Polling interval during initialization (3 seconds)\n },\n // Normal operation phase configuration\n normal: {\n pollingInterval: 30000, // Polling interval during normal operation (30 seconds)\n },\n};\n\n// Pagination info type\ninterface PaginationInfo {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n}\n\ntype ServerListResponse = ApiResponse<Server[]> & {\n pagination?: PaginationInfo;\n allServers?: Server[];\n};\n\n// Context type definition\ninterface ServerContextType {\n servers: Server[];\n allServers: Server[]; // All servers without pagination, for Dashboard, Groups, Settings\n error: string | null;\n setError: (error: string | null) => void;\n isLoading: boolean;\n fetchAttempts: number;\n pagination: PaginationInfo | null;\n currentPage: number;\n serversPerPage: number;\n setCurrentPage: (page: number) => void;\n setServersPerPage: (limit: number) => void;\n triggerRefresh: () => void;\n refreshIfNeeded: () => void; // Smart refresh with debounce\n handleServerAdd: () => void;\n handleServerEdit: (server: Server) => Promise<any>;\n handleServerRemove: (serverName: string) => Promise<boolean>;\n handleServerToggle: (server: Server, enabled: boolean) => Promise<boolean>;\n handleServerReload: (server: Server) => Promise<boolean>;\n}\n\n// Create Context\nconst ServerContext = createContext<ServerContextType | undefined>(undefined);\n\n// Provider component\nexport const ServerProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { t } = useTranslation();\n const { auth } = useAuth();\n const [servers, setServers] = useState<Server[]>([]);\n const [allServers, setAllServers] = useState<Server[]>([]); // All servers without pagination\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n const [isInitialLoading, setIsInitialLoading] = useState(true);\n const [fetchAttempts, setFetchAttempts] = useState(0);\n const [pagination, setPagination] = useState<PaginationInfo | null>(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [serversPerPage, setServersPerPage] = useState(getInitialServersPerPage);\n\n // Timer reference for polling\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n // Track current attempt count to avoid dependency cycles\n const attemptsRef = useRef<number>(0);\n // Track last fetch time to implement smart refresh\n const lastFetchTimeRef = useRef<number>(0);\n // Minimum interval between manual refreshes (5 seconds in dev, 3 seconds in prod)\n const MIN_REFRESH_INTERVAL = process.env.NODE_ENV === 'development' ? 5000 : 3000;\n\n // Clear the timer\n const clearTimer = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n\n const applyServerResponse = useCallback((serverData: ServerListResponse | Server[]) => {\n if (serverData && !Array.isArray(serverData) && serverData.success && Array.isArray(serverData.data)) {\n setServers(serverData.data);\n setAllServers(Array.isArray(serverData.allServers) ? serverData.allServers : serverData.data);\n setPagination(serverData.pagination ?? null);\n return;\n }\n\n if (Array.isArray(serverData)) {\n setServers(serverData);\n setAllServers(serverData);\n setPagination(null);\n return;\n }\n\n console.error('Invalid server data format', { serverData });\n setServers([]);\n setAllServers([]);\n setPagination(null);\n }, []);\n\n // Start normal polling\n const startNormalPolling = useCallback(\n (options?: { immediate?: boolean }) => {\n const immediate = options?.immediate ?? true;\n // Ensure no other timers are running\n clearTimer();\n\n const fetchServers = async () => {\n try {\n console.log('[ServerContext] Fetching servers from API...');\n // Build query parameters for pagination\n const params = new URLSearchParams();\n params.append('page', currentPage.toString());\n params.append('limit', serversPerPage.toString());\n\n const serverData = (await apiGet(`/servers?${params.toString()}`)) as ServerListResponse;\n\n // Update last fetch time\n lastFetchTimeRef.current = Date.now();\n applyServerResponse(serverData);\n\n // Reset error state\n setError(null);\n } catch (err) {\n console.error('Error fetching servers during normal polling', { err });\n\n // Use friendly error message\n if (!navigator.onLine) {\n setError(t('errors.network'));\n } else if (\n err instanceof TypeError &&\n (err.message.includes('NetworkError') || err.message.includes('Failed to fetch'))\n ) {\n setError(t('errors.serverConnection'));\n } else {\n setError(t('errors.serverFetch'));\n }\n }\n };\n\n // Execute immediately unless explicitly skipped\n if (immediate) {\n fetchServers();\n }\n\n // Set up regular polling\n intervalRef.current = setInterval(fetchServers, CONFIG.normal.pollingInterval);\n },\n [applyServerResponse, t, currentPage, serversPerPage],\n );\n\n // Watch for authentication status changes\n useEffect(() => {\n if (auth.isAuthenticated) {\n console.log('[ServerContext] User authenticated, triggering refresh');\n // When user logs in, trigger a refresh to load servers\n setRefreshKey((prevKey) => prevKey + 1);\n } else {\n console.log('[ServerContext] User not authenticated, clearing data and stopping polling');\n // When user logs out, clear data and stop polling\n clearTimer();\n setServers([]);\n setAllServers([]);\n setIsInitialLoading(false);\n setError(null);\n }\n }, [auth.isAuthenticated]);\n\n useEffect(() => {\n // If not authenticated, don't poll\n if (!auth.isAuthenticated) {\n console.log('[ServerContext] User not authenticated, skipping polling setup');\n return;\n }\n\n // Reset attempt count\n if (refreshKey > 0) {\n attemptsRef.current = 0;\n setFetchAttempts(0);\n }\n\n // Initialization phase request function\n const fetchInitialData = async () => {\n try {\n console.log('[ServerContext] Initial fetch - attempt', attemptsRef.current + 1);\n // Build query parameters for pagination\n const params = new URLSearchParams();\n params.append('page', currentPage.toString());\n params.append('limit', serversPerPage.toString());\n\n const serverData = (await apiGet(`/servers?${params.toString()}`)) as ServerListResponse;\n\n // Update last fetch time\n lastFetchTimeRef.current = Date.now();\n applyServerResponse(serverData);\n\n setIsInitialLoading(false);\n // Initialization successful, start normal polling (skip immediate to avoid duplicate fetch)\n startNormalPolling({ immediate: false });\n return true;\n } catch (err) {\n // Increment attempt count, use ref to avoid triggering effect rerun\n attemptsRef.current += 1;\n console.error('Initial loading attempt failed', {\n attempt: attemptsRef.current,\n err,\n });\n\n // Update state for display\n setFetchAttempts(attemptsRef.current);\n\n // Set appropriate error message\n if (!navigator.onLine) {\n setError(t('errors.network'));\n } else {\n setError(t('errors.initialStartup'));\n }\n\n // If maximum attempt count is exceeded, give up initialization and switch to normal polling\n if (attemptsRef.current >= CONFIG.startup.maxAttempts) {\n console.log('Maximum startup attempts reached, switching to normal polling');\n setIsInitialLoading(false);\n // Clear initialization polling\n clearTimer();\n // Switch to normal polling mode\n startNormalPolling();\n }\n\n return false;\n }\n };\n\n // On component mount, set appropriate polling based on current state\n if (isInitialLoading) {\n // Ensure no other timers are running\n clearTimer();\n\n // Execute initial request immediately\n fetchInitialData();\n\n // Set polling interval for initialization phase\n intervalRef.current = setInterval(fetchInitialData, CONFIG.startup.pollingInterval);\n console.log(`Started initial polling with interval: ${CONFIG.startup.pollingInterval}ms`);\n } else {\n // Initialization completed, start normal polling\n startNormalPolling();\n }\n\n // Cleanup function\n return () => {\n clearTimer();\n };\n }, [applyServerResponse, refreshKey, t, isInitialLoading, startNormalPolling, currentPage, serversPerPage]);\n\n useEffect(() => {\n if (!pagination) {\n return;\n }\n\n const totalPages = Math.max(1, pagination.totalPages || 1);\n if (currentPage > totalPages) {\n setCurrentPage(totalPages);\n }\n }, [pagination, currentPage]);\n\n // Manually trigger refresh (always refreshes)\n const triggerRefresh = useCallback(() => {\n // Clear current timer\n clearTimer();\n\n // If in initialization phase, reset initialization state\n if (isInitialLoading) {\n setIsInitialLoading(true);\n attemptsRef.current = 0;\n setFetchAttempts(0);\n }\n\n // Change in refreshKey will trigger useEffect to run again\n setRefreshKey((prevKey) => prevKey + 1);\n }, [isInitialLoading]);\n\n // Smart refresh with debounce (only refresh if enough time has passed)\n const refreshIfNeeded = useCallback(() => {\n const now = Date.now();\n const timeSinceLastFetch = now - lastFetchTimeRef.current;\n\n // Log who is calling this\n console.log('[ServerContext] refreshIfNeeded called', { timeSinceLastFetch });\n\n // Only refresh if enough time has passed since last fetch\n if (timeSinceLastFetch >= MIN_REFRESH_INTERVAL) {\n console.log('[ServerContext] Triggering refresh after minimum interval', {\n minRefreshInterval: MIN_REFRESH_INTERVAL,\n });\n triggerRefresh();\n } else {\n console.log('[ServerContext] Skipping refresh because minimum interval not reached', {\n minRefreshInterval: MIN_REFRESH_INTERVAL,\n timeSinceLastFetch,\n });\n }\n }, [triggerRefresh]);\n\n // Server related operations\n const handleServerAdd = useCallback(() => {\n setRefreshKey((prevKey) => prevKey + 1);\n }, []);\n\n const handleServerEdit = useCallback(\n async (server: Server) => {\n try {\n // Fetch single server config instead of all settings\n const encodedServerName = encodeURIComponent(server.name);\n const serverData: ApiResponse<{\n name: string;\n status: string;\n tools: any[];\n config: Record<string, any>;\n }> = await apiGet(`/servers/${encodedServerName}`);\n\n if (serverData && serverData.success && serverData.data) {\n return {\n name: serverData.data.name,\n status: serverData.data.status,\n tools: serverData.data.tools || [],\n config: serverData.data.config,\n };\n } else {\n console.error('Failed to get server config', { serverName: server.name, serverData });\n setError(t('server.invalidConfig', { serverName: server.name }));\n return null;\n }\n } catch (err) {\n console.error('Error fetching server config', { serverName: server.name, err });\n setError(err instanceof Error ? err.message : String(err));\n return null;\n }\n },\n [t],\n );\n\n const handleServerRemove = useCallback(\n async (serverName: string) => {\n try {\n const encodedServerName = encodeURIComponent(serverName);\n const result = await apiDelete(`/servers/${encodedServerName}`);\n\n if (!result || !result.success) {\n setError(result?.message || t('server.deleteError', { serverName }));\n return false;\n }\n\n setRefreshKey((prevKey) => prevKey + 1);\n return true;\n } catch (err) {\n setError(t('errors.general') + ': ' + (err instanceof Error ? err.message : String(err)));\n return false;\n }\n },\n [t],\n );\n\n const handleServerToggle = useCallback(\n async (server: Server, enabled: boolean) => {\n try {\n const encodedServerName = encodeURIComponent(server.name);\n const result = await apiPost(`/servers/${encodedServerName}/toggle`, { enabled });\n\n if (!result || !result.success) {\n console.error('Failed to toggle server', { serverName: server.name, result });\n setError(result?.message || t('server.toggleError', { serverName: server.name }));\n return false;\n }\n\n // Update the UI immediately to reflect the change\n setRefreshKey((prevKey) => prevKey + 1);\n return true;\n } catch (err) {\n console.error('Error toggling server', { serverName: server.name, err });\n setError(err instanceof Error ? err.message : String(err));\n return false;\n }\n },\n [t],\n );\n\n const handleServerReload = useCallback(\n async (server: Server) => {\n try {\n const encodedServerName = encodeURIComponent(server.name);\n const result = await apiPost(`/servers/${encodedServerName}/reload`, {});\n\n if (!result || !result.success) {\n console.error('Failed to reload server', { serverName: server.name, result });\n setError(t('server.reloadError', { serverName: server.name }));\n return false;\n }\n\n // Refresh server list after successful reload\n triggerRefresh();\n return true;\n } catch (err) {\n console.error('Error reloading server', { serverName: server.name, err });\n setError(err instanceof Error ? err.message : String(err));\n return false;\n }\n },\n [t, triggerRefresh],\n );\n\n // Handle page change\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n // Handle servers per page change\n const handleServersPerPageChange = useCallback((limit: number) => {\n const normalizedLimit = VALID_PAGE_SIZES.has(limit) ? limit : DEFAULT_SERVERS_PER_PAGE;\n\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(SERVERS_PER_PAGE_KEY, String(normalizedLimit));\n }\n\n setServersPerPage(normalizedLimit);\n setCurrentPage(1); // Reset to first page when changing page size\n }, []);\n\n const value: ServerContextType = {\n servers,\n allServers,\n error,\n setError,\n isLoading: isInitialLoading,\n fetchAttempts,\n pagination,\n currentPage,\n serversPerPage,\n setCurrentPage: handlePageChange,\n setServersPerPage: handleServersPerPageChange,\n triggerRefresh,\n refreshIfNeeded,\n handleServerAdd,\n handleServerEdit,\n handleServerRemove,\n handleServerToggle,\n handleServerReload,\n };\n\n return <ServerContext.Provider value={value}>{children}</ServerContext.Provider>;\n};\n\n// Custom hook to use the Server context\nexport const useServerContext = () => {\n const context = useContext(ServerContext);\n if (context === undefined) {\n throw new Error('useServerContext must be used within a ServerProvider');\n }\n return context;\n};\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ApiResponse, BearerKey } from '@/types';\nimport { useToast } from '@/contexts/ToastContext';\nimport { useAuth } from '@/contexts/AuthContext';\nimport { apiGet, apiPut, apiPost, apiDelete } from '@/utils/fetchInterceptor';\n\n// Define types for the settings data\ninterface RoutingConfig {\n enableGlobalRoute: boolean;\n enableGroupNameRoute: boolean;\n enableBearerAuth: boolean;\n bearerAuthKey: string;\n bearerAuthHeaderName: string;\n jsonBodyLimit: string;\n skipAuth: boolean;\n}\n\ninterface InstallConfig {\n pythonIndexUrl: string;\n npmRegistry: string;\n baseUrl: string;\n}\n\ninterface SmartRoutingConfig {\n enabled: boolean;\n dbUrl: string;\n basePacingDelayMs?: number;\n embeddingProvider?: 'openai' | 'azure_openai';\n embeddingEncodingFormat?: 'auto' | 'base64' | 'float';\n openaiApiBaseUrl: string;\n openaiApiKey: string;\n openaiApiEmbeddingModel: string;\n azureOpenaiEndpoint?: string;\n azureOpenaiApiKey?: string;\n azureOpenaiApiVersion?: string;\n azureOpenaiEmbeddingDeployment?: string;\n azureOpenaiEmbeddingModel?: string;\n progressiveDisclosure: boolean;\n embeddingMaxTokens?: number;\n}\n\ninterface MCPRouterConfig {\n apiKey: string;\n referer: string;\n title: string;\n baseUrl: string;\n}\n\ninterface OAuthServerConfig {\n enabled: boolean;\n accessTokenLifetime: number;\n refreshTokenLifetime: number;\n authorizationCodeLifetime: number;\n requireClientSecret: boolean;\n allowedScopes: string[];\n requireState: boolean;\n dynamicRegistration: {\n enabled: boolean;\n allowedGrantTypes: string[];\n requiresAuthentication: boolean;\n };\n}\n\ninterface SystemSettings {\n systemConfig?: {\n routing?: RoutingConfig;\n install?: InstallConfig;\n smartRouting?: SmartRoutingConfig;\n mcpRouter?: MCPRouterConfig;\n nameSeparator?: string;\n oauthServer?: OAuthServerConfig;\n enableSessionRebuild?: boolean;\n };\n bearerKeys?: BearerKey[];\n}\n\ninterface TempRoutingConfig {\n bearerAuthKey: string;\n bearerAuthHeaderName: string;\n jsonBodyLimit: string;\n}\n\ninterface SettingsContextValue {\n routingConfig: RoutingConfig;\n tempRoutingConfig: TempRoutingConfig;\n setTempRoutingConfig: React.Dispatch<React.SetStateAction<TempRoutingConfig>>;\n installConfig: InstallConfig;\n smartRoutingConfig: SmartRoutingConfig;\n mcpRouterConfig: MCPRouterConfig;\n oauthServerConfig: OAuthServerConfig;\n nameSeparator: string;\n enableSessionRebuild: boolean;\n bearerKeys: BearerKey[];\n loading: boolean;\n error: string | null;\n setError: React.Dispatch<React.SetStateAction<string | null>>;\n triggerRefresh: () => void;\n fetchSettings: () => Promise<void>;\n updateRoutingConfig: (key: keyof RoutingConfig, value: any) => Promise<boolean | undefined>;\n updateInstallConfig: (key: keyof InstallConfig, value: any) => Promise<boolean | undefined>;\n updateSmartRoutingConfig: (\n key: keyof SmartRoutingConfig,\n value: any,\n ) => Promise<boolean | undefined>;\n updateSmartRoutingConfigBatch: (\n updates: Partial<SmartRoutingConfig>,\n ) => Promise<boolean | undefined>;\n updateRoutingConfigBatch: (updates: Partial<RoutingConfig>) => Promise<boolean | undefined>;\n updateMCPRouterConfig: (key: keyof MCPRouterConfig, value: any) => Promise<boolean | undefined>;\n updateMCPRouterConfigBatch: (updates: Partial<MCPRouterConfig>) => Promise<boolean | undefined>;\n updateOAuthServerConfig: (\n key: keyof OAuthServerConfig,\n value: any,\n ) => Promise<boolean | undefined>;\n updateOAuthServerConfigBatch: (\n updates: Partial<OAuthServerConfig>,\n ) => Promise<boolean | undefined>;\n updateNameSeparator: (value: string) => Promise<boolean | undefined>;\n updateSessionRebuild: (value: boolean) => Promise<boolean | undefined>;\n exportMCPSettings: (serverName?: string) => Promise<any>;\n // Bearer key management\n refreshBearerKeys: () => Promise<void>;\n createBearerKey: (payload: Omit<BearerKey, 'id'>) => Promise<BearerKey | null>;\n updateBearerKey: (\n id: string,\n updates: Partial<Omit<BearerKey, 'id'>>,\n ) => Promise<BearerKey | null>;\n deleteBearerKey: (id: string) => Promise<boolean>;\n}\n\nconst getDefaultOAuthServerConfig = (): OAuthServerConfig => ({\n enabled: true,\n accessTokenLifetime: 3600,\n refreshTokenLifetime: 1209600,\n authorizationCodeLifetime: 300,\n requireClientSecret: false,\n allowedScopes: ['read', 'write'],\n requireState: false,\n dynamicRegistration: {\n enabled: true,\n allowedGrantTypes: ['authorization_code', 'refresh_token'],\n requiresAuthentication: false,\n },\n});\n\nconst SettingsContext = createContext<SettingsContextValue | undefined>(undefined);\n\nexport const useSettings = () => {\n const context = useContext(SettingsContext);\n if (!context) {\n throw new Error('useSettings must be used within a SettingsProvider');\n }\n return context;\n};\n\ninterface SettingsProviderProps {\n children: ReactNode;\n}\n\nexport const SettingsProvider: React.FC<SettingsProviderProps> = ({ children }) => {\n const { t } = useTranslation();\n const { showToast } = useToast();\n const { auth } = useAuth();\n\n const [routingConfig, setRoutingConfig] = useState<RoutingConfig>({\n enableGlobalRoute: true,\n enableGroupNameRoute: true,\n enableBearerAuth: true,\n bearerAuthKey: '',\n bearerAuthHeaderName: 'Authorization',\n jsonBodyLimit: '1mb',\n skipAuth: false,\n });\n\n const [tempRoutingConfig, setTempRoutingConfig] = useState<TempRoutingConfig>({\n bearerAuthKey: '',\n bearerAuthHeaderName: 'Authorization',\n jsonBodyLimit: '1mb',\n });\n\n const [installConfig, setInstallConfig] = useState<InstallConfig>({\n pythonIndexUrl: '',\n npmRegistry: '',\n baseUrl: 'http://localhost:3000',\n });\n\n const [smartRoutingConfig, setSmartRoutingConfig] = useState<SmartRoutingConfig>({\n enabled: false,\n dbUrl: '',\n basePacingDelayMs: undefined,\n embeddingProvider: 'openai',\n embeddingEncodingFormat: 'auto',\n openaiApiBaseUrl: '',\n openaiApiKey: '',\n openaiApiEmbeddingModel: '',\n azureOpenaiEndpoint: '',\n azureOpenaiApiKey: '',\n azureOpenaiApiVersion: '',\n azureOpenaiEmbeddingDeployment: '',\n azureOpenaiEmbeddingModel: '',\n progressiveDisclosure: false,\n embeddingMaxTokens: undefined,\n });\n\n const [mcpRouterConfig, setMCPRouterConfig] = useState<MCPRouterConfig>({\n apiKey: '',\n referer: 'https://www.mcphub.app',\n title: 'MCPHub',\n baseUrl: 'https://api.mcprouter.to/v1',\n });\n\n const [oauthServerConfig, setOAuthServerConfig] = useState<OAuthServerConfig>(\n getDefaultOAuthServerConfig(),\n );\n\n const [nameSeparator, setNameSeparator] = useState<string>('-');\n const [enableSessionRebuild, setEnableSessionRebuild] = useState<boolean>(false);\n const [bearerKeys, setBearerKeys] = useState<BearerKey[]>([]);\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n\n // Trigger a refresh of the settings data\n const triggerRefresh = useCallback(() => {\n setRefreshKey((prev) => prev + 1);\n }, []);\n\n // Fetch current settings\n const fetchSettings = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const data: ApiResponse<SystemSettings> = await apiGet('/settings');\n\n if (data.success && data.data?.systemConfig?.routing) {\n setRoutingConfig({\n enableGlobalRoute: data.data.systemConfig.routing.enableGlobalRoute ?? true,\n enableGroupNameRoute: data.data.systemConfig.routing.enableGroupNameRoute ?? true,\n enableBearerAuth: data.data.systemConfig.routing.enableBearerAuth ?? true,\n bearerAuthKey: data.data.systemConfig.routing.bearerAuthKey || '',\n bearerAuthHeaderName:\n data.data.systemConfig.routing.bearerAuthHeaderName || 'Authorization',\n jsonBodyLimit: data.data.systemConfig.routing.jsonBodyLimit || '1mb',\n skipAuth: data.data.systemConfig.routing.skipAuth ?? false,\n });\n }\n if (data.success && data.data?.systemConfig?.install) {\n setInstallConfig({\n pythonIndexUrl: data.data.systemConfig.install.pythonIndexUrl || '',\n npmRegistry: data.data.systemConfig.install.npmRegistry || '',\n baseUrl: data.data.systemConfig.install.baseUrl || 'http://localhost:3000',\n });\n }\n if (data.success && data.data?.systemConfig?.smartRouting) {\n setSmartRoutingConfig({\n enabled: data.data.systemConfig.smartRouting.enabled ?? false,\n dbUrl: data.data.systemConfig.smartRouting.dbUrl || '',\n basePacingDelayMs: data.data.systemConfig.smartRouting.basePacingDelayMs,\n embeddingProvider:\n data.data.systemConfig.smartRouting.embeddingProvider === 'azure_openai'\n ? 'azure_openai'\n : 'openai',\n embeddingEncodingFormat:\n data.data.systemConfig.smartRouting.embeddingEncodingFormat === 'base64'\n ? 'base64'\n : data.data.systemConfig.smartRouting.embeddingEncodingFormat === 'float'\n ? 'float'\n : 'auto',\n openaiApiBaseUrl: data.data.systemConfig.smartRouting.openaiApiBaseUrl || '',\n openaiApiKey: data.data.systemConfig.smartRouting.openaiApiKey || '',\n openaiApiEmbeddingModel:\n data.data.systemConfig.smartRouting.openaiApiEmbeddingModel || '',\n azureOpenaiEndpoint: data.data.systemConfig.smartRouting.azureOpenaiEndpoint || '',\n azureOpenaiApiKey: data.data.systemConfig.smartRouting.azureOpenaiApiKey || '',\n azureOpenaiApiVersion: data.data.systemConfig.smartRouting.azureOpenaiApiVersion || '',\n azureOpenaiEmbeddingDeployment:\n data.data.systemConfig.smartRouting.azureOpenaiEmbeddingDeployment || '',\n azureOpenaiEmbeddingModel:\n data.data.systemConfig.smartRouting.azureOpenaiEmbeddingModel || '',\n progressiveDisclosure: data.data.systemConfig.smartRouting.progressiveDisclosure ?? false,\n embeddingMaxTokens: data.data.systemConfig.smartRouting.embeddingMaxTokens,\n });\n }\n if (data.success && data.data?.systemConfig?.mcpRouter) {\n setMCPRouterConfig({\n apiKey: data.data.systemConfig.mcpRouter.apiKey || '',\n referer: data.data.systemConfig.mcpRouter.referer || 'https://www.mcphub.app',\n title: data.data.systemConfig.mcpRouter.title || 'MCPHub',\n baseUrl: data.data.systemConfig.mcpRouter.baseUrl || 'https://api.mcprouter.to/v1',\n });\n }\n if (data.success) {\n if (data.data?.systemConfig?.oauthServer) {\n const oauth = data.data.systemConfig.oauthServer;\n const defaultOauthConfig = getDefaultOAuthServerConfig();\n const defaultDynamic = defaultOauthConfig.dynamicRegistration;\n const allowedScopes = Array.isArray(oauth.allowedScopes)\n ? [...oauth.allowedScopes]\n : [...defaultOauthConfig.allowedScopes];\n const dynamicAllowedGrantTypes = Array.isArray(\n oauth.dynamicRegistration?.allowedGrantTypes,\n )\n ? [...oauth.dynamicRegistration!.allowedGrantTypes!]\n : [...defaultDynamic.allowedGrantTypes];\n\n setOAuthServerConfig({\n enabled: oauth.enabled ?? defaultOauthConfig.enabled,\n accessTokenLifetime:\n oauth.accessTokenLifetime ?? defaultOauthConfig.accessTokenLifetime,\n refreshTokenLifetime:\n oauth.refreshTokenLifetime ?? defaultOauthConfig.refreshTokenLifetime,\n authorizationCodeLifetime:\n oauth.authorizationCodeLifetime ?? defaultOauthConfig.authorizationCodeLifetime,\n requireClientSecret:\n oauth.requireClientSecret ?? defaultOauthConfig.requireClientSecret,\n requireState: oauth.requireState ?? defaultOauthConfig.requireState,\n allowedScopes,\n dynamicRegistration: {\n enabled: oauth.dynamicRegistration?.enabled ?? defaultDynamic.enabled,\n allowedGrantTypes: dynamicAllowedGrantTypes,\n requiresAuthentication:\n oauth.dynamicRegistration?.requiresAuthentication ??\n defaultDynamic.requiresAuthentication,\n },\n });\n } else {\n setOAuthServerConfig(getDefaultOAuthServerConfig());\n }\n }\n if (data.success && data.data?.systemConfig?.nameSeparator !== undefined) {\n setNameSeparator(data.data.systemConfig.nameSeparator);\n }\n if (data.success && data.data?.systemConfig?.enableSessionRebuild !== undefined) {\n setEnableSessionRebuild(data.data.systemConfig.enableSessionRebuild);\n }\n\n if (data.success && Array.isArray(data.data?.bearerKeys)) {\n setBearerKeys(data.data.bearerKeys);\n }\n } catch (error) {\n console.error('Failed to fetch settings', { error });\n setError(error instanceof Error ? error.message : 'Failed to fetch settings');\n showToast(t('errors.failedToFetchSettings'));\n } finally {\n setLoading(false);\n }\n }, [t, showToast]);\n\n // Update routing configuration\n const updateRoutingConfig = async (key: keyof RoutingConfig, value: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n routing: {\n [key]: value,\n },\n });\n\n if (data.success) {\n setRoutingConfig({\n ...routingConfig,\n [key]: value,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update routing config');\n showToast(data.error || t('errors.failedToUpdateRoutingConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update routing config', { key, value, error });\n setError(error instanceof Error ? error.message : 'Failed to update routing config');\n showToast(t('errors.failedToUpdateRoutingConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update install configuration\n const updateInstallConfig = async (key: keyof InstallConfig, value: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n install: {\n [key]: value,\n },\n });\n\n if (data.success) {\n setInstallConfig({\n ...installConfig,\n [key]: value,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update install config');\n showToast(data.error || t('errors.failedToUpdateInstallConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update install config', { key, value, error });\n setError(error instanceof Error ? error.message : 'Failed to update install config');\n showToast(t('errors.failedToUpdateInstallConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update smart routing configuration\n const updateSmartRoutingConfig = async (key: keyof SmartRoutingConfig, value: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n smartRouting: {\n [key]: value,\n },\n });\n\n if (data.success) {\n setSmartRoutingConfig({\n ...smartRoutingConfig,\n [key]: value,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update smart routing config');\n showToast(data.error || t('errors.failedToUpdateSmartRoutingConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update smart routing config', { key, value, error });\n setError(error instanceof Error ? error.message : 'Failed to update smart routing config');\n showToast(t('errors.failedToUpdateSmartRoutingConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Batch update smart routing configuration\n const updateSmartRoutingConfigBatch = async (updates: Partial<SmartRoutingConfig>) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n smartRouting: updates,\n });\n\n if (data.success) {\n setSmartRoutingConfig({\n ...smartRoutingConfig,\n ...updates,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update smart routing config');\n showToast(data.error || t('errors.failedToUpdateSmartRoutingConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to batch update smart routing config', { updates, error });\n setError(error instanceof Error ? error.message : 'Failed to update smart routing config');\n showToast(t('errors.failedToUpdateSmartRoutingConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Batch update routing configuration\n const updateRoutingConfigBatch = async (updates: Partial<RoutingConfig>) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n routing: updates,\n });\n\n if (data.success) {\n setRoutingConfig({\n ...routingConfig,\n ...updates,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update routing config');\n showToast(data.error || t('errors.failedToUpdateRoutingConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to batch update routing config', { updates, error });\n setError(error instanceof Error ? error.message : 'Failed to update routing config');\n showToast(t('errors.failedToUpdateRoutingConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update MCP Router configuration\n const updateMCPRouterConfig = async (key: keyof MCPRouterConfig, value: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n mcpRouter: {\n [key]: value,\n },\n });\n\n if (data.success) {\n setMCPRouterConfig({\n ...mcpRouterConfig,\n [key]: value,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update MCP Router config');\n showToast(data.error || t('errors.failedToUpdateMCPRouterConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update MCP Router config', { key, value, error });\n setError(error instanceof Error ? error.message : 'Failed to update MCP Router config');\n showToast(t('errors.failedToUpdateMCPRouterConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Batch update MCP Router configuration\n const updateMCPRouterConfigBatch = async (updates: Partial<MCPRouterConfig>) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n mcpRouter: updates,\n });\n\n if (data.success) {\n setMCPRouterConfig({\n ...mcpRouterConfig,\n ...updates,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update MCP Router config');\n showToast(data.error || t('errors.failedToUpdateMCPRouterConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to batch update MCP Router config', { updates, error });\n setError(error instanceof Error ? error.message : 'Failed to update MCP Router config');\n showToast(t('errors.failedToUpdateMCPRouterConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update OAuth server configuration\n const updateOAuthServerConfig = async (key: keyof OAuthServerConfig, value: any) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n oauthServer: {\n [key]: value,\n },\n });\n\n if (data.success) {\n setOAuthServerConfig({\n ...oauthServerConfig,\n [key]: value,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update OAuth server config');\n showToast(data.error || t('errors.failedToUpdateOAuthServerConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update OAuth server config', { key, value, error });\n setError(error instanceof Error ? error.message : 'Failed to update OAuth server config');\n showToast(t('errors.failedToUpdateOAuthServerConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Batch update OAuth server configuration\n const updateOAuthServerConfigBatch = async (updates: Partial<OAuthServerConfig>) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n oauthServer: updates,\n });\n\n if (data.success) {\n setOAuthServerConfig({\n ...oauthServerConfig,\n ...updates,\n });\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update OAuth server config');\n showToast(data.error || t('errors.failedToUpdateOAuthServerConfig'));\n return false;\n }\n } catch (error) {\n console.error('Failed to batch update OAuth server config', { updates, error });\n setError(error instanceof Error ? error.message : 'Failed to update OAuth server config');\n showToast(t('errors.failedToUpdateOAuthServerConfig'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update name separator\n const updateNameSeparator = async (value: string) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n nameSeparator: value,\n });\n\n if (data.success) {\n setNameSeparator(value);\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update name separator');\n showToast(data.error || t('errors.failedToUpdateNameSeparator'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update name separator', { value, error });\n setError(error instanceof Error ? error.message : 'Failed to update name separator');\n showToast(t('errors.failedToUpdateNameSeparator'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n // Update session rebuild flag\n const updateSessionRebuild = async (value: boolean) => {\n setLoading(true);\n setError(null);\n\n try {\n const data = await apiPut('/system-config', {\n enableSessionRebuild: value,\n });\n\n if (data.success) {\n setEnableSessionRebuild(value);\n showToast(t('settings.systemConfigUpdated'));\n return true;\n } else {\n setError(data.error || 'Failed to update session rebuild setting');\n showToast(data.error || t('errors.failedToUpdateSessionRebuild'));\n return false;\n }\n } catch (error) {\n console.error('Failed to update session rebuild setting', { value, error });\n setError(error instanceof Error ? error.message : 'Failed to update session rebuild setting');\n showToast(t('errors.failedToUpdateSessionRebuild'));\n return false;\n } finally {\n setLoading(false);\n }\n };\n\n const exportMCPSettings = async (serverName?: string) => {\n setLoading(true);\n setError(null);\n try {\n return await apiGet(`/mcp-settings/export?serverName=${serverName ? serverName : ''}`);\n } catch (error) {\n console.error('Failed to export MCP settings', { serverName, error });\n const errorMessage = error instanceof Error ? error.message : 'Failed to export MCP settings';\n setError(errorMessage);\n showToast(errorMessage);\n } finally {\n setLoading(false);\n }\n };\n\n // Bearer key management helpers\n const refreshBearerKeys = async () => {\n try {\n const data: ApiResponse<BearerKey[]> = await apiGet('/auth/keys');\n if (data.success && Array.isArray(data.data)) {\n setBearerKeys(data.data);\n }\n } catch (error) {\n console.error('Failed to refresh bearer keys', { error });\n showToast(t('errors.failedToFetchSettings'));\n }\n };\n\n const createBearerKey = async (payload: Omit<BearerKey, 'id'>): Promise<BearerKey | null> => {\n try {\n const data: ApiResponse<BearerKey> = await apiPost('/auth/keys', payload as any);\n if (data.success && data.data) {\n await refreshBearerKeys();\n showToast(t('settings.systemConfigUpdated'));\n return data.data;\n }\n showToast(data.message || t('errors.failedToUpdateRoutingConfig'));\n return null;\n } catch (error) {\n console.error('Failed to create bearer key', { error });\n showToast(t('errors.failedToUpdateRoutingConfig'));\n return null;\n }\n };\n\n const updateBearerKey = async (\n id: string,\n updates: Partial<Omit<BearerKey, 'id'>>,\n ): Promise<BearerKey | null> => {\n try {\n const data: ApiResponse<BearerKey> = await apiPut(`/auth/keys/${id}`, updates as any);\n if (data.success && data.data) {\n await refreshBearerKeys();\n showToast(t('settings.systemConfigUpdated'));\n return data.data;\n }\n showToast(data.message || t('errors.failedToUpdateRoutingConfig'));\n return null;\n } catch (error) {\n console.error('Failed to update bearer key', { id, error });\n showToast(t('errors.failedToUpdateRoutingConfig'));\n return null;\n }\n };\n\n const deleteBearerKey = async (id: string): Promise<boolean> => {\n try {\n const data: ApiResponse = await apiDelete(`/auth/keys/${id}`);\n if (data.success) {\n await refreshBearerKeys();\n showToast(t('settings.systemConfigUpdated'));\n return true;\n }\n showToast(data.message || t('errors.failedToUpdateRoutingConfig'));\n return false;\n } catch (error) {\n console.error('Failed to delete bearer key', { id, error });\n showToast(t('errors.failedToUpdateRoutingConfig'));\n return false;\n }\n };\n\n // Fetch settings when the component mounts or refreshKey changes\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings, refreshKey]);\n\n // Watch for authentication status changes - refetch settings after login\n useEffect(() => {\n if (auth.isAuthenticated) {\n console.log('[SettingsContext] User authenticated, triggering settings refresh');\n // When user logs in, trigger a refresh to load settings\n triggerRefresh();\n }\n }, [auth.isAuthenticated, triggerRefresh]);\n\n useEffect(() => {\n if (routingConfig) {\n setTempRoutingConfig({\n bearerAuthKey: routingConfig.bearerAuthKey,\n bearerAuthHeaderName: routingConfig.bearerAuthHeaderName,\n jsonBodyLimit: routingConfig.jsonBodyLimit,\n });\n }\n }, [routingConfig]);\n\n const value: SettingsContextValue = {\n routingConfig,\n tempRoutingConfig,\n setTempRoutingConfig,\n installConfig,\n smartRoutingConfig,\n mcpRouterConfig,\n oauthServerConfig,\n nameSeparator,\n enableSessionRebuild,\n bearerKeys,\n loading,\n error,\n setError,\n triggerRefresh,\n fetchSettings,\n updateRoutingConfig,\n updateInstallConfig,\n updateSmartRoutingConfig,\n updateSmartRoutingConfigBatch,\n updateRoutingConfigBatch,\n updateMCPRouterConfig,\n updateMCPRouterConfigBatch,\n updateOAuthServerConfig,\n updateOAuthServerConfigBatch,\n updateNameSeparator,\n updateSessionRebuild,\n exportMCPSettings,\n refreshBearerKeys,\n createBearerKey,\n updateBearerKey,\n deleteBearerKey,\n };\n\n return <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;\n};\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useTheme } from '@/contexts/ThemeContext';\nimport { Sun, Moon } from 'lucide-react';\n\nconst ThemeSwitch: React.FC = () => {\n const { t } = useTranslation();\n const { theme, setTheme } = useTheme();\n\n const toggleTheme = () => {\n setTheme(theme === 'light' ? 'dark' : 'light');\n };\n\n return (\n <button\n onClick={toggleTheme}\n className=\"p-2 rounded-md text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 focus:outline-none\"\n title={theme === 'light' ? t('theme.dark') : t('theme.light')}\n aria-label={theme === 'light' ? t('theme.dark') : t('theme.light')}\n >\n {theme === 'light' ? <Moon className=\"h-5 w-5\" /> : <Sun className=\"h-5 w-5\" />}\n </button>\n );\n};\n\nexport default ThemeSwitch;","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const LanguageIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n const { t } = useTranslation();\n\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n {...props}\n >\n <title>{t('common.language')}</title>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2 12h20\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z\" />\n </svg>\n );\n};\n\nexport default LanguageIcon;\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport LanguageIcon from '@/components/icons/LanguageIcon';\n\nconst LanguageSwitch: React.FC = () => {\n const { i18n } = useTranslation();\n const [languageDropdownOpen, setLanguageDropdownOpen] = useState(false);\n const [currentLanguage, setCurrentLanguage] = useState(i18n.language);\n\n // Available languages\n const availableLanguages = [\n { code: 'en', label: 'English' },\n { code: 'zh', label: '中文' },\n { code: 'fr', label: 'Français' },\n { code: 'tr', label: 'Türkçe' }\n ];\n\n // Update current language when it changes\n useEffect(() => {\n setCurrentLanguage(i18n.language);\n }, [i18n.language]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!target.closest('.language-dropdown')) {\n setLanguageDropdownOpen(false);\n }\n };\n\n if (languageDropdownOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [languageDropdownOpen]);\n\n const handleLanguageChange = (lang: string) => {\n localStorage.setItem('i18nextLng', lang);\n setLanguageDropdownOpen(false);\n window.location.reload();\n };\n\n // Always show dropdown for language selection\n const handleLanguageToggle = () => {\n setLanguageDropdownOpen(!languageDropdownOpen);\n };\n\n return (\n <div className=\"relative language-dropdown\">\n <button\n onClick={handleLanguageToggle}\n className=\"p-2 rounded-md text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 focus:outline-none\"\n aria-label=\"Language Switcher\"\n >\n <LanguageIcon className=\"h-5 w-5\" />\n </button>\n\n {/* Show dropdown when opened */}\n {languageDropdownOpen && (\n <div className=\"absolute right-0 mt-2 w-24 bg-white dark:bg-gray-800 rounded-md shadow-lg border border-gray-200 dark:border-gray-700 z-50\">\n <div>\n {availableLanguages.map((lang) => (\n <button\n key={lang.code}\n onClick={() => handleLanguageChange(lang.code)}\n className={`flex items-center w-full px-4 py-2 text-sm hover:bg-gray-100 dark:hover:bg-gray-700 ${currentLanguage.startsWith(lang.code)\n ? 'bg-blue-50 text-blue-700'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-100'\n }`}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default LanguageSwitch;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const GitHubIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n const { t } = useTranslation();\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n {...props}\n >\n <title>{t('common.github')}</title>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n );\n};\n\n\nexport default GitHubIcon;\n","import { useEffect, useState } from 'react';\nimport { apiGet, apiDelete } from '../utils/fetchInterceptor';\nimport { getApiUrl } from '../utils/runtime';\nimport { getToken } from '../utils/interceptors';\n\nexport interface LogEntry {\n timestamp: number;\n type: 'info' | 'error' | 'warn' | 'debug';\n source: string;\n message: string;\n processId?: string;\n}\n\n// Fetch all logs\nexport const fetchLogs = async (): Promise<LogEntry[]> => {\n try {\n const response = await apiGet<{ success: boolean; data: LogEntry[]; error?: string }>('/logs');\n\n if (!response.success) {\n throw new Error(response.error || 'Failed to fetch logs');\n }\n\n return response.data;\n } catch (error) {\n console.error('Error fetching logs', { error });\n throw error;\n }\n};\n\n// Clear all logs\nexport const clearLogs = async (): Promise<void> => {\n try {\n const response = await apiDelete<{ success: boolean; error?: string }>('/logs');\n\n if (!response.success) {\n throw new Error(response.error || 'Failed to clear logs');\n }\n } catch (error) {\n console.error('Error clearing logs', { error });\n throw error;\n }\n};\n\n/**\n * Singleton SSE connection manager. Maintains a single EventSource shared\n * across all subscribers so that multiple components (e.g. the Logs page and\n * the embedding-sync alert listener) reuse one HTTP connection.\n */\nclass LogStreamManager {\n private eventSource: EventSource | null = null;\n private subscribers = new Set<(event: MessageEvent) => void>();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private openAttempts = 0;\n\n /** Subscribe to incoming SSE messages. Returns an unsubscribe callback. */\n subscribe(callback: (event: MessageEvent) => void): () => void {\n this.subscribers.add(callback);\n if (this.subscribers.size === 1) {\n // Reset attempts when first subscriber added\n this.openAttempts = 0;\n this.openEventSource();\n }\n return () => {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n this.close();\n }\n };\n }\n\n private openEventSource() {\n this.closeEventSource();\n const token = getToken();\n\n if (!token) {\n console.warn('[LogStreamManager] No token available, scheduling reconnect...');\n this.scheduleReconnect();\n return;\n }\n\n try {\n const url = getApiUrl(`/logs/stream?token=${token}`);\n\n let redactedUrl = url;\n try {\n const parsedUrl = new URL(url);\n parsedUrl.search = '';\n redactedUrl = parsedUrl.toString();\n } catch {\n redactedUrl = url.split('?')[0] || url;\n }\n\n console.log('[LogStreamManager] Opening EventSource:', redactedUrl);\n this.eventSource = new EventSource(url);\n\n this.eventSource.onmessage = (event) => {\n this.subscribers.forEach((cb) => cb(event));\n };\n\n this.eventSource.onerror = () => {\n console.warn('[LogStreamManager] EventSource error, attempting reconnect...');\n this.closeEventSource();\n if (this.subscribers.size > 0) {\n this.scheduleReconnect();\n }\n };\n\n // Reset attempts on successful connection\n this.openAttempts = 0;\n console.log('[LogStreamManager] EventSource opened successfully');\n } catch (error) {\n console.error('[LogStreamManager] Failed to open EventSource:', error);\n this.closeEventSource();\n if (this.subscribers.size > 0) {\n this.scheduleReconnect();\n }\n }\n }\n\n private closeEventSource() {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n private scheduleReconnect() {\n if (this.reconnectTimer !== null) return;\n\n // Exponential backoff: 1s, 2s, 4s, 8s max\n const delayMs = Math.min(1000 * Math.pow(2, this.openAttempts), 8000);\n this.openAttempts++;\n\n console.log(\n `[LogStreamManager] Scheduling reconnect in ${delayMs}ms (attempt ${this.openAttempts})`,\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (this.subscribers.size > 0) {\n this.openEventSource();\n }\n }, delayMs);\n }\n\n private close() {\n this.closeEventSource();\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n\nexport const logStreamManager = new LogStreamManager();\n\n// Hook to use logs with SSE streaming\nexport const useLogs = () => {\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n // Fetch initial logs\n const loadInitialLogs = async () => {\n try {\n const initialLogs = await fetchLogs();\n if (mounted) {\n setLogs(initialLogs);\n setLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error('Failed to fetch logs'));\n setLoading(false);\n }\n }\n };\n\n loadInitialLogs();\n\n // Subscribe to SSE stream for new logs\n const handleMessage = (event: MessageEvent) => {\n if (!mounted) return;\n try {\n const data = JSON.parse(event.data);\n if (data.type === 'initial') {\n // Skip initial event, we already have logs from fetchLogs()\n return;\n }\n if (data.type === 'log') {\n setLogs((prevLogs) => [...prevLogs, data.log]);\n }\n } catch (err) {\n console.error('Error parsing SSE message', { err });\n }\n };\n\n const unsubscribe = logStreamManager.subscribe(handleMessage);\n\n return () => {\n mounted = false;\n unsubscribe();\n };\n }, []);\n\n const clearAllLogs = async () => {\n try {\n await clearLogs();\n setLogs([]);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to clear logs'));\n }\n };\n\n return { logs, loading, error, clearLogs: clearAllLogs };\n};\n","import React, { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { logStreamManager } from '@/services/logService';\n\ninterface EmbeddingSyncProgressState {\n serverName: string;\n current: number;\n total: number;\n status: 'started' | 'in_progress' | 'completed';\n}\n\ninterface EmbeddingSyncContextValue {\n activeSyncs: EmbeddingSyncProgressState[];\n}\n\ninterface EmbeddingSyncStreamEvent {\n type: 'embedding-sync-progress';\n progress?: {\n serverName?: unknown;\n current?: unknown;\n total?: unknown;\n status?: unknown;\n };\n}\n\nconst COMPLETION_VISIBILITY_MS = 5000;\n\nconst EmbeddingSyncContext = createContext<EmbeddingSyncContextValue | undefined>(undefined);\n\nconst isValidProgressState = (\n progress: EmbeddingSyncStreamEvent['progress'],\n): progress is {\n serverName: string;\n current: number;\n total: number;\n status: 'started' | 'in_progress' | 'completed' | 'error';\n} => {\n return (\n !!progress &&\n typeof progress.serverName === 'string' &&\n typeof progress.current === 'number' &&\n typeof progress.total === 'number' &&\n progress.total > 0 &&\n progress.current >= 0 &&\n progress.current <= progress.total &&\n ['started', 'in_progress', 'completed', 'error'].includes(String(progress.status))\n );\n};\n\nexport const EmbeddingSyncProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [activeSyncs, setActiveSyncs] = useState<EmbeddingSyncProgressState[]>([]);\n const hideTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n const clearHideTimer = (serverName: string) => {\n const timer = hideTimersRef.current.get(serverName);\n if (timer) {\n clearTimeout(timer);\n hideTimersRef.current.delete(serverName);\n }\n };\n\n const clearAllHideTimers = () => {\n hideTimersRef.current.forEach((timer) => clearTimeout(timer));\n hideTimersRef.current.clear();\n };\n\n const upsertSync = (nextState: EmbeddingSyncProgressState) => {\n setActiveSyncs((currentSyncs) => {\n const existingIndex = currentSyncs.findIndex(\n (currentSync) => currentSync.serverName === nextState.serverName,\n );\n\n if (existingIndex === -1) {\n return [...currentSyncs, nextState];\n }\n\n const updatedSyncs = [...currentSyncs];\n updatedSyncs[existingIndex] = nextState;\n return updatedSyncs;\n });\n };\n\n const removeSync = (serverName: string) => {\n setActiveSyncs((currentSyncs) =>\n currentSyncs.filter((currentSync) => currentSync.serverName !== serverName),\n );\n };\n\n const handleMessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as EmbeddingSyncStreamEvent;\n if (data?.type !== 'embedding-sync-progress' || !isValidProgressState(data.progress)) {\n return;\n }\n\n clearHideTimer(data.progress.serverName);\n\n if (data.progress.status === 'error') {\n removeSync(data.progress.serverName);\n return;\n }\n\n const nextState: EmbeddingSyncProgressState = {\n serverName: data.progress.serverName,\n current: data.progress.current,\n total: data.progress.total,\n status: data.progress.status,\n };\n\n upsertSync(nextState);\n\n if (data.progress.status === 'completed') {\n const timer = setTimeout(() => {\n removeSync(data.progress.serverName);\n hideTimersRef.current.delete(data.progress.serverName);\n }, COMPLETION_VISIBILITY_MS);\n\n hideTimersRef.current.set(data.progress.serverName, timer);\n }\n } catch {\n // Ignore malformed stream messages.\n }\n };\n\n const unsubscribe = logStreamManager.subscribe(handleMessage);\n\n return () => {\n clearAllHideTimers();\n unsubscribe();\n };\n }, []);\n\n const value = useMemo(\n () => ({\n activeSyncs,\n }),\n [activeSyncs],\n );\n\n return <EmbeddingSyncContext.Provider value={value}>{children}</EmbeddingSyncContext.Provider>;\n};\n\nexport const useEmbeddingSync = (): EmbeddingSyncContextValue => {\n const context = useContext(EmbeddingSyncContext);\n if (!context) {\n throw new Error('useEmbeddingSync must be used within an EmbeddingSyncProvider');\n }\n\n return context;\n};","import React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useParams } from 'react-router-dom';\nimport { BookOpen, Menu } from 'lucide-react';\nimport ThemeSwitch from '@/components/ui/ThemeSwitch';\nimport LanguageSwitch from '@/components/ui/LanguageSwitch';\nimport GitHubIcon from '@/components/icons/GitHubIcon';\nimport { useEmbeddingSync } from '@/contexts/EmbeddingSyncContext';\n\ninterface HeaderProps {\n onToggleSidebar: () => void;\n}\n\nconst useCrumbs = (): string[] => {\n const { t } = useTranslation();\n const location = useLocation();\n const params = useParams();\n\n return useMemo(() => {\n const path = location.pathname;\n const root = t('app.title');\n if (path === '/') return [root, t('nav.dashboard')];\n if (path.startsWith('/servers')) return [root, t('nav.servers')];\n if (path.startsWith('/groups')) return [root, t('nav.groups')];\n if (path.startsWith('/prompts')) return [root, t('nav.prompts')];\n if (path.startsWith('/resources')) return [root, t('nav.resources')];\n if (path.startsWith('/users')) return [root, t('nav.users')];\n if (path.startsWith('/market')) {\n const serverName = (params as { serverName?: string }).serverName;\n const crumbs = [root, t('nav.market')];\n if (serverName) crumbs.push(serverName);\n return crumbs;\n }\n if (path.startsWith('/logs')) return [root, t('nav.logs')];\n if (path.startsWith('/activity')) return [root, t('nav.activity')];\n if (path.startsWith('/settings')) return [root, t('nav.settings')];\n return [root];\n }, [location.pathname, params, t]);\n};\n\nconst Header: React.FC<HeaderProps> = ({ onToggleSidebar }) => {\n const { t } = useTranslation();\n const { activeSyncs } = useEmbeddingSync();\n const crumbs = useCrumbs();\n\n return (\n <header className=\"hub-topbar shrink-0\">\n <button\n onClick={onToggleSidebar}\n className=\"hub-icon-btn\"\n aria-label={t('app.toggleSidebar')}\n >\n <Menu size={16} />\n </button>\n\n <div className=\"hub-crumb flex items-center min-w-0\">\n {crumbs.map((c, i) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"sep\">/</span>}\n {i === crumbs.length - 1 ? <b className=\"truncate\">{c}</b> : <span className=\"truncate\">{c}</span>}\n </React.Fragment>\n ))}\n </div>\n\n <div className=\"flex-1 flex justify-center px-2 min-w-0\">\n {activeSyncs.length > 0 && (\n <div className=\"flex max-w-full flex-wrap justify-center gap-2\">\n {activeSyncs.map((activeSync) => (\n <div\n key={activeSync.serverName}\n className=\"hub-card flex min-w-0 w-56 max-w-full flex-col px-3 py-1.5 text-xs\"\n style={{ borderRadius: 7 }}\n title={t('app.embeddingSyncProgressAriaLabel', {\n serverName: activeSync.serverName,\n current: activeSync.current,\n total: activeSync.total,\n })}\n >\n <span className=\"truncate hub-mono text-[var(--hub-ink-2)]\">\n {t('app.embeddingSyncProgress', { serverName: activeSync.serverName })}\n </span>\n <div className=\"mt-1 flex items-center gap-2\">\n <progress\n className=\"h-1.5 flex-1\"\n value={activeSync.current}\n max={activeSync.total}\n aria-label={t('app.embeddingSyncProgressAriaLabel', {\n serverName: activeSync.serverName,\n current: activeSync.current,\n total: activeSync.total,\n })}\n />\n <span className=\"shrink-0 hub-mono hub-num text-[var(--hub-ink-3)]\">\n {activeSync.current}/{activeSync.total}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"ml-auto flex items-center gap-1 shrink-0\">\n <a\n href=\"https://github.com/samanhappy/mcphub\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hub-icon-btn\"\n aria-label=\"GitHub Repository\"\n >\n <GitHubIcon className=\"h-4 w-4\" />\n </a>\n <a\n href=\"https://docs.mcphub.app\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hub-icon-btn\"\n aria-label=\"Documentation\"\n >\n <BookOpen className=\"h-4 w-4\" />\n </a>\n <ThemeSwitch />\n <LanguageSwitch />\n </div>\n </header>\n );\n};\n\nexport default Header;\n","import { useState, useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Group, ApiResponse, IGroupServerConfig } from '@/types';\nimport { apiGet, apiPost, apiPut, apiDelete } from '../utils/fetchInterceptor';\n\nexport const useGroupData = () => {\n const { t } = useTranslation();\n const [groups, setGroups] = useState<Group[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const fetchGroups = useCallback(async () => {\n try {\n setLoading(true);\n const data: ApiResponse<Group[]> = await apiGet('/groups');\n\n if (data && data.success && Array.isArray(data.data)) {\n setGroups(data.data);\n } else {\n console.error('Invalid group data format:', data);\n setGroups([]);\n }\n\n setError(null);\n } catch (err) {\n console.error('Error fetching groups:', err);\n setError(err instanceof Error ? err.message : 'Failed to fetch groups');\n setGroups([]);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Trigger a refresh of the groups data\n const triggerRefresh = useCallback(() => {\n setRefreshKey((prev) => prev + 1);\n }, []);\n\n // Create a new group with server associations\n const createGroup = async (\n name: string,\n description?: string,\n servers: string[] | IGroupServerConfig[] = [],\n ) => {\n try {\n const result: ApiResponse<Group> = await apiPost('/groups', { name, description, servers });\n console.log('Group created successfully:', result);\n\n if (!result || !result.success) {\n setError(result?.message || t('groups.createError'));\n return result;\n }\n\n triggerRefresh();\n return result || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create group');\n return null;\n }\n };\n\n // Update an existing group with server associations\n const updateGroup = async (\n id: string,\n data: { name?: string; description?: string; servers?: string[] | IGroupServerConfig[] },\n ) => {\n try {\n const result: ApiResponse<Group> = await apiPut(`/groups/${id}`, data);\n if (!result || !result.success) {\n setError(result?.message || t('groups.updateError'));\n return result;\n }\n\n triggerRefresh();\n return result || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update group');\n return null;\n }\n };\n\n // Update servers in a group (for batch updates)\n const updateGroupServers = async (groupId: string, servers: string[] | IGroupServerConfig[]) => {\n try {\n const result: ApiResponse<Group> = await apiPut(`/groups/${groupId}/servers/batch`, {\n servers,\n });\n\n if (!result || !result.success) {\n setError(result?.message || t('groups.updateError'));\n return null;\n }\n\n triggerRefresh();\n return result.data || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update group servers');\n return null;\n }\n };\n\n // Delete a group\n const deleteGroup = async (id: string) => {\n try {\n const result = await apiDelete(`/groups/${id}`);\n if (!result || !result.success) {\n setError(result?.message || t('groups.deleteError'));\n return result;\n }\n\n triggerRefresh();\n return result;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete group');\n return null;\n }\n };\n\n // Add server to a group\n const addServerToGroup = async (groupId: string, serverName: string) => {\n try {\n const result: ApiResponse<Group> = await apiPost(`/groups/${groupId}/servers`, {\n serverName,\n });\n\n if (!result || !result.success) {\n setError(result?.message || t('groups.serverAddError'));\n return null;\n }\n\n triggerRefresh();\n return result.data || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add server to group');\n return null;\n }\n };\n\n // Remove server from group\n const removeServerFromGroup = async (groupId: string, serverName: string) => {\n try {\n const result: ApiResponse<Group> = await apiDelete(\n `/groups/${groupId}/servers/${serverName}`,\n );\n\n if (!result || !result.success) {\n setError(result?.message || t('groups.serverRemoveError'));\n return null;\n }\n\n triggerRefresh();\n return result.data || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove server from group');\n return null;\n }\n };\n\n // Fetch groups when the component mounts or refreshKey changes\n useEffect(() => {\n fetchGroups();\n }, [fetchGroups, refreshKey]);\n\n return {\n groups,\n loading,\n error,\n setError,\n triggerRefresh,\n createGroup,\n updateGroup,\n updateGroupServers,\n deleteGroup,\n addServerToGroup,\n removeServerFromGroup,\n };\n};\n","import React from 'react';\nimport { useAuth } from '../contexts/AuthContext';\n\ninterface PermissionCheckerProps {\n permissions: string | string[];\n fallback?: React.ReactNode;\n children: React.ReactNode;\n}\n\n/**\n * Permission checker component for conditional rendering\n * @param permissions Required permissions, supports single permission string or permission array\n * @param fallback Content to show when permission is denied, defaults to null\n * @param children Content to show when permission is granted\n */\nexport const PermissionChecker: React.FC<PermissionCheckerProps> = ({\n permissions,\n fallback = null,\n children,\n}) => {\n const hasPermission = usePermissionCheck(permissions);\n\n return hasPermission ? <>{children}</> : <>{fallback}</>;\n};\n\n/**\n * Permission check hook\n * @param requiredPermissions Permissions to check\n * @returns Whether user has permission\n */\nexport const usePermissionCheck = (requiredPermissions: string | string[]): boolean => {\n const { auth } = useAuth();\n\n if (!auth.isAuthenticated || !auth.user) {\n return false;\n }\n\n const userPermissions = auth.user.permissions || [];\n\n if (requiredPermissions === 'x' && !userPermissions.includes('x')) {\n return false;\n }\n\n // If user has '*' permission, they have all permissions\n if (userPermissions.includes('*')) {\n return true;\n }\n\n // If user is admin, they have all permissions by default\n if (auth.user.isAdmin) {\n return true;\n }\n\n // Normalize required permissions to array\n const permissionsToCheck = Array.isArray(requiredPermissions)\n ? requiredPermissions\n : [requiredPermissions];\n\n // Check if user has any of the required permissions\n return permissionsToCheck.some(permission =>\n userPermissions.includes(permission)\n );\n};\n\n/**\n * Permission check hook - requires all permissions\n * @param requiredPermissions Array of permissions to check\n * @returns Whether user has all permissions\n */\nexport const usePermissionCheckAll = (requiredPermissions: string[]): boolean => {\n const { auth } = useAuth();\n\n if (!auth.isAuthenticated || !auth.user) {\n return false;\n }\n\n const userPermissions = auth.user.permissions || [];\n\n // If user has '*' permission, they have all permissions\n if (userPermissions.includes('*')) {\n return true;\n }\n\n // If user is admin, they have all permissions by default\n if (auth.user.isAdmin) {\n return true;\n }\n\n // Check if user has all required permissions\n return requiredPermissions.every(permission =>\n userPermissions.includes(permission)\n );\n};\n\nexport default PermissionChecker;\n","const NPM_REGISTRY = 'https://registry.npmjs.org';\nconst PACKAGE_NAME = '@samanhappy/mcphub';\n\nexport const checkLatestVersion = async (): Promise<string | null> => {\n try {\n const response = await fetch(`${NPM_REGISTRY}/${PACKAGE_NAME}/latest`);\n if (!response.ok) {\n throw new Error(`Failed to fetch latest version: ${response.status}`);\n }\n const data = await response.json();\n return data.version || null;\n } catch (error) {\n console.error('Error checking for latest version:', error);\n return null;\n }\n};\n\nexport const compareVersions = (current: string, latest: string): number => {\n if (current === 'dev') return -1;\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const currentPart = currentParts[i] || 0;\n const latestPart = latestParts[i] || 0;\n\n if (currentPart > latestPart) return -1;\n if (currentPart < latestPart) return 1;\n }\n\n return 0;\n};\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X, RefreshCw } from 'lucide-react';\nimport { checkLatestVersion, compareVersions } from '@/utils/version';\n\ninterface AboutDialogProps {\n isOpen: boolean;\n onClose: () => void;\n version: string;\n}\n\nconst AboutDialog: React.FC<AboutDialogProps> = ({ isOpen, onClose, version }) => {\n const { t } = useTranslation();\n const [hasNewVersion, setHasNewVersion] = useState(false);\n const [latestVersion, setLatestVersion] = useState(\"\");\n const [isChecking, setIsChecking] = useState(false);\n\n const checkForUpdates = async () => {\n setIsChecking(true);\n try {\n const latest = await checkLatestVersion();\n if (latest) {\n setLatestVersion(latest);\n setHasNewVersion(compareVersions(version, latest) > 0);\n }\n } catch (error) {\n console.error('Failed to check for updates:', error);\n } finally {\n setIsChecking(false);\n }\n };\n\n useEffect(() => {\n if (isOpen) {\n checkForUpdates();\n }\n }, [isOpen, version]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 bg-black/50 bg-opacity-30 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-lg max-w-md w-full\">\n <div className=\"p-6 relative\">\n {/* Close button (X) in the top-right corner */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400\"\n aria-label={t('common.close')}\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-gray-100 mb-4\">\n {t('about.title')}\n </h3>\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-700 dark:text-gray-300\">\n {t('about.currentVersion')}:\n </span>\n <span className=\"font-medium text-gray-900 dark:text-gray-100\">\n {version}\n </span>\n </div>\n\n {hasNewVersion && latestVersion && (\n <div className=\"bg-blue-50 dark:bg-blue-900 p-3 rounded\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-blue-600 dark:text-blue-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </div>\n <div className=\"ml-3 flex-1 text-sm text-blue-700 dark:text-blue-300\">\n <p>{t('about.newVersionAvailable', { version: latestVersion })}</p>\n <p className=\"mt-1\">\n <a\n href=\"https://github.com/samanhappy/mcphub\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:underline\"\n >\n {t('about.viewOnGitHub')}\n </a>\n </p>\n </div>\n </div>\n </div>\n )}\n\n <button\n onClick={checkForUpdates}\n disabled={isChecking}\n className={`hub-btn mt-4 ${isChecking ? 'opacity-50 cursor-not-allowed' : ''}`}\n >\n <RefreshCw className={`h-4 w-4 mr-2 ${isChecking ? 'animate-spin' : ''}`} />\n {isChecking ? t('about.checking') : t('about.checkForUpdates')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AboutDialog;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\n\ninterface SponsorDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst SponsorDialog: React.FC<SponsorDialogProps> = ({ open, onOpenChange }) => {\n const { i18n, t } = useTranslation();\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-lg max-w-md w-full\">\n <div className=\"p-6 relative\">\n {/* Close button (X) in the top-right corner */}\n <button\n onClick={() => onOpenChange(false)}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400\"\n aria-label={t('common.close')}\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-gray-100 mb-4\">\n {t('sponsor.title')}\n </h3>\n\n <div className=\"flex flex-col items-center justify-center py-4\">\n {i18n.language === 'zh' ? (\n <img\n src=\"./assets/reward.png\"\n alt={t('sponsor.rewardAlt')}\n className=\"max-w-full h-auto\"\n style={{ maxHeight: '400px' }}\n />\n ) : (\n <div className=\"text-center\">\n <p className=\"mb-4 text-gray-700 dark:text-gray-300\">{t('sponsor.supportMessage')}</p>\n <a\n href=\"https://ko-fi.com/samanhappy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center justify-center bg-[#13C3FF] text-white px-4 py-2 rounded-md hover:bg-[#00A5E5] transition-colors\"\n >\n {t('sponsor.supportButton')}\n </a>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SponsorDialog;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\n\ninterface WeChatDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst WeChatDialog: React.FC<WeChatDialogProps> = ({ open, onOpenChange }) => {\n const { t } = useTranslation();\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-lg max-w-md w-full\">\n <div className=\"p-6 relative\">\n {/* Close button (X) in the top-right corner */}\n <button\n onClick={() => onOpenChange(false)}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400\"\n aria-label={t('common.close')}\n >\n <X className=\"h-5 w-5\" />\n </button>\n\n <h3 className=\"text-lg font-medium text-gray-900 dark:text-gray-100 mb-4\">\n {t('wechat.title')}\n </h3>\n\n <div className=\"flex flex-col items-center justify-center py-4\">\n <img\n src=\"./assets/wexin.png\"\n alt={t('wechat.qrCodeAlt')}\n className=\"max-w-full h-auto\"\n style={{ maxHeight: '400px' }}\n />\n <p className=\"mt-4 text-center text-gray-700 dark:text-gray-300\">\n {t('wechat.scanMessage')}\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default WeChatDialog;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const WeChatIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n const { t } = useTranslation();\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n {...props}\n >\n <title>{t('common.wechat')}</title>\n <path d=\"M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z\" />\n </svg>\n );\n};\n\nexport default WeChatIcon;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const DiscordIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n const { t } = useTranslation();\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n {...props}\n >\n <title>{t('common.discord')}</title>\n <path d=\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\" />\n </svg>\n );\n};\n\nexport default DiscordIcon;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const SponsorIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {\n const { t } = useTranslation();\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n {...props}\n >\n <title>{t('sponsor.label')}</title>\n <path d=\"M17.625 1.499c-2.32 0-4.354 1.203-5.625 3.03-1.271-1.827-3.305-3.03-5.625-3.03C3.129 1.499 0 4.253 0 8.249c0 4.275 3.068 7.847 5.828 10.227a33.14 33.14 0 0 0 5.616 3.876l.028.017.008.003-.001.003c.163.085.342.126.521.125.179.001.358-.041.521-.125l-.001-.003.008-.003.028-.017a33.14 33.14 0 0 0 5.616-3.876C20.932 16.096 24 12.524 24 8.249c0-3.996-3.129-6.75-6.375-6.75zm-.919 15.275a30.766 30.766 0 0 1-4.703 3.316l-.004-.002-.004.002a30.955 30.955 0 0 1-4.703-3.316c-2.677-2.307-5.047-5.298-5.047-8.523 0-2.754 2.121-4.5 4.125-4.5 2.06 0 3.914 1.479 4.544 3.684.143.495.596.797 1.086.796.49.001.943-.302 1.085-.796.63-2.205 2.484-3.684 4.544-3.684 2.004 0 4.125 1.746 4.125 4.5 0 3.225-2.37 6.216-5.048 8.523z\" />\n </svg>\n );\n};\n\nexport default SponsorIcon;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\nimport { useAuth } from '@/contexts/AuthContext';\nimport { User, Settings, LogOut, Info } from 'lucide-react';\nimport AboutDialog from './AboutDialog';\nimport SponsorDialog from './SponsorDialog';\nimport WeChatDialog from './WeChatDialog';\nimport WeChatIcon from '@/components/icons/WeChatIcon';\nimport DiscordIcon from '@/components/icons/DiscordIcon';\nimport SponsorIcon from '@/components/icons/SponsorIcon';\nimport { checkLatestVersion, compareVersions } from '@/utils/version';\n\ninterface UserProfileMenuProps {\n collapsed: boolean;\n version: string;\n}\n\nconst UserProfileMenu: React.FC<UserProfileMenuProps> = ({ collapsed, version }) => {\n const { t, i18n } = useTranslation();\n const navigate = useNavigate();\n const { auth, logout } = useAuth();\n const [isOpen, setIsOpen] = useState(false);\n const [showNewVersionInfo, setShowNewVersionInfo] = useState(false);\n const [showAboutDialog, setShowAboutDialog] = useState(false);\n const [sponsorDialogOpen, setSponsorDialogOpen] = useState(false);\n const [wechatDialogOpen, setWechatDialogOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Check for new version on login and component mount\n useEffect(() => {\n const checkForNewVersion = async () => {\n try {\n const latestVersion = await checkLatestVersion();\n if (latestVersion) {\n setShowNewVersionInfo(compareVersions(version, latestVersion) > 0);\n }\n } catch (error) {\n console.error('Error checking for new version:', error);\n }\n };\n\n checkForNewVersion();\n }, [version]);\n\n // Close the menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, []);\n\n const handleSettingsClick = () => {\n navigate('/settings');\n setIsOpen(false);\n };\n\n const handleLogoutClick = () => {\n logout();\n navigate('/login');\n };\n\n const handleAboutClick = () => {\n setShowAboutDialog(true);\n setIsOpen(false);\n };\n\n const handleSponsorClick = () => {\n setSponsorDialogOpen(true);\n setIsOpen(false);\n };\n\n const handleWeChatClick = () => {\n setWechatDialogOpen(true);\n setIsOpen(false);\n };\n\n return (\n <div ref={menuRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={`flex ${collapsed ? 'justify-center' : 'items-center'} w-full p-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors rounded-md ${isOpen ? 'bg-gray-100 dark:bg-gray-700' : ''\n }`}\n >\n <div className=\"flex-shrink-0 relative\">\n <div className=\"w-5 h-5 flex items-center justify-center rounded-full border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-700\">\n <User className=\"h-4 w-4 text-gray-700 dark:text-gray-300\" />\n </div>\n {showNewVersionInfo && (\n <span className=\"absolute -top-1 -right-1 block w-2 h-2 bg-red-500 rounded-full\"></span>\n )}\n </div>\n {!collapsed && (\n <div className=\"ml-3 flex flex-col items-start\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {auth.user?.username || t('auth.user')}\n </span>\n </div>\n )}\n </button>\n\n {isOpen && (\n <div className=\"absolute top-0 transform -translate-y-full left-0 w-full min-w-max bg-white border border-gray-200 dark:border-gray-700 dark:bg-gray-800 z-50\">\n <button\n onClick={handleSponsorClick}\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n <SponsorIcon className=\"h-4 w-4 mr-2\" />\n {t('sponsor.label')}\n </button>\n\n {i18n.language === 'zh' ? (\n <button\n onClick={handleWeChatClick}\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n <WeChatIcon className=\"h-4 w-4 mr-2\" />\n {t('wechat.label')}\n </button>\n ) : (\n <a\n href=\"https://discord.gg/qMKNsn5Q\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n <DiscordIcon className=\"h-4 w-4 mr-2\" />\n {t('discord.label')}\n </a>\n )}\n\n <button\n onClick={handleSettingsClick}\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n <Settings className=\"h-4 w-4 mr-2\" />\n {t('nav.settings')}\n </button>\n <button\n onClick={handleAboutClick}\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 relative\"\n >\n <Info className=\"h-4 w-4 mr-2\" />\n {t('about.title')}\n {showNewVersionInfo && (\n <span className=\"absolute top-2 right-4 block w-2 h-2 bg-red-500 rounded-full\"></span>\n )}\n </button>\n\n <div className=\"border-t border-gray-200 dark:border-gray-600\"></div>\n\n <button\n onClick={handleLogoutClick}\n className=\"flex items-center w-full px-4 py-2 text-left text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700\"\n >\n <LogOut className=\"h-4 w-4 mr-2\" />\n {t('app.logout')}\n </button>\n </div>\n )}\n\n {/* About dialog */}\n <AboutDialog\n isOpen={showAboutDialog}\n onClose={() => setShowAboutDialog(false)}\n version={version}\n />\n\n {/* Sponsor dialog */}\n <SponsorDialog open={sponsorDialogOpen} onOpenChange={setSponsorDialogOpen} />\n\n {/* WeChat dialog */}\n <WeChatDialog open={wechatDialogOpen} onOpenChange={setWechatDialogOpen} />\n </div>\n );\n};\n\nexport default UserProfileMenu;\n","import { apiGet, apiDelete } from '@/utils/fetchInterceptor';\nimport {\n Activity,\n ActivityStats,\n ActivityFilter,\n ActivityFilterOptions,\n ApiResponse,\n} from '@/types';\n\n/**\n * Check if activity feature is available (database mode only)\n */\nexport const checkActivityAvailable = async (): Promise<boolean> => {\n try {\n const response = await apiGet('/activities/available');\n return response?.data?.available || false;\n } catch (error) {\n console.error('Error checking activity availability:', error);\n return false;\n }\n};\n\n/**\n * Build query string from filter object\n */\nconst buildQueryString = (page: number, limit: number, filter?: ActivityFilter): string => {\n const params = new URLSearchParams();\n params.append('page', page.toString());\n params.append('limit', limit.toString());\n\n if (filter?.server) {\n params.append('server', filter.server);\n }\n if (filter?.tool) {\n params.append('tool', filter.tool);\n }\n if (filter?.status) {\n params.append('status', filter.status);\n }\n if (filter?.group) {\n params.append('group', filter.group);\n }\n if (filter?.keyId) {\n params.append('keyId', filter.keyId);\n }\n if (filter?.keyName) {\n params.append('keyName', filter.keyName);\n }\n if (filter?.startDate) {\n params.append('startDate', filter.startDate);\n }\n if (filter?.endDate) {\n params.append('endDate', filter.endDate);\n }\n\n return params.toString();\n};\n\n/**\n * Get paginated list of activities\n */\nexport const getActivities = async (\n page: number,\n limit: number,\n filter?: ActivityFilter,\n): Promise<ApiResponse<Activity[]> & { pagination?: any }> => {\n const queryString = buildQueryString(page, limit, filter);\n return await apiGet(`/activities?${queryString}`);\n};\n\n/**\n * Get activity by ID\n */\nexport const getActivityById = async (id: string): Promise<ApiResponse<Activity>> => {\n return await apiGet(`/activities/${id}`);\n};\n\n/**\n * Get activity statistics\n */\nexport const getActivityStats = async (\n filter?: ActivityFilter,\n): Promise<ApiResponse<ActivityStats>> => {\n const params = new URLSearchParams();\n\n if (filter?.server) {\n params.append('server', filter.server);\n }\n if (filter?.tool) {\n params.append('tool', filter.tool);\n }\n if (filter?.status) {\n params.append('status', filter.status);\n }\n if (filter?.group) {\n params.append('group', filter.group);\n }\n if (filter?.keyId) {\n params.append('keyId', filter.keyId);\n }\n if (filter?.keyName) {\n params.append('keyName', filter.keyName);\n }\n if (filter?.startDate) {\n params.append('startDate', filter.startDate);\n }\n if (filter?.endDate) {\n params.append('endDate', filter.endDate);\n }\n\n const queryString = params.toString();\n return await apiGet(`/activities/stats${queryString ? `?${queryString}` : ''}`);\n};\n\n/**\n * Get filter options (distinct servers, tools, groups)\n */\nexport const getActivityFilterOptions = async (): Promise<ApiResponse<ActivityFilterOptions>> => {\n return await apiGet('/activities/filters');\n};\n\n/**\n * Delete old activities\n */\nexport const deleteOldActivities = async (\n daysOld: number = 30,\n): Promise<ApiResponse<{ deletedCount: number; cutoffDate: string }>> => {\n return await apiDelete(`/activities/cleanup?daysOld=${daysOld}`);\n};\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { NavLink } from 'react-router-dom';\nimport {\n LayoutGrid,\n Server as ServerIcon,\n Users as UsersIcon,\n Store,\n Route as RouteIcon,\n Settings as SettingsIcon,\n FileText,\n MessageSquare,\n Activity,\n ScrollText,\n} from 'lucide-react';\nimport { useAuth } from '@/contexts/AuthContext';\nimport { useServerContext } from '@/contexts/ServerContext';\nimport { useGroupData } from '@/hooks/useGroupData';\nimport { usePermissionCheck } from '../PermissionChecker';\nimport UserProfileMenu from '@/components/ui/UserProfileMenu';\nimport { checkActivityAvailable } from '@/services/activityService';\n\ninterface SidebarProps {\n collapsed: boolean;\n}\n\ninterface MenuItem {\n path: string;\n label: string;\n icon: React.ReactNode;\n badge?: string | number;\n end?: boolean;\n}\n\nconst Sidebar: React.FC<SidebarProps> = ({ collapsed }) => {\n const { t } = useTranslation();\n const { auth } = useAuth();\n const { allServers } = useServerContext();\n const { groups } = useGroupData();\n const [activityAvailable, setActivityAvailable] = useState(false);\n\n const appVersion = import.meta.env.PACKAGE_VERSION as string;\n\n useEffect(() => {\n checkActivityAvailable()\n .then(setActivityAvailable)\n .catch(() => setActivityAvailable(false));\n }, []);\n\n const userCanManageUsers = auth.user?.isAdmin && usePermissionCheck('x');\n\n const workspaceItems: MenuItem[] = [\n { path: '/', label: t('nav.dashboard'), icon: <LayoutGrid className=\"h-4 w-4\" />, end: true },\n {\n path: '/servers',\n label: t('nav.servers'),\n icon: <ServerIcon className=\"h-4 w-4\" />,\n badge: allServers.length || undefined,\n },\n {\n path: '/groups',\n label: t('nav.groups'),\n icon: <RouteIcon className=\"h-4 w-4\" />,\n badge: groups.length || undefined,\n },\n { path: '/prompts', label: t('nav.prompts'), icon: <MessageSquare className=\"h-4 w-4\" /> },\n { path: '/resources', label: t('nav.resources'), icon: <FileText className=\"h-4 w-4\" /> },\n { path: '/market', label: t('nav.market'), icon: <Store className=\"h-4 w-4\" /> },\n ];\n\n const systemItems: MenuItem[] = [\n ...(userCanManageUsers\n ? [{ path: '/users', label: t('nav.users'), icon: <UsersIcon className=\"h-4 w-4\" /> }]\n : []),\n ...(activityAvailable && auth.user?.isAdmin\n ? [{ path: '/activity', label: t('nav.activity'), icon: <Activity className=\"h-4 w-4\" /> }]\n : []),\n { path: '/logs', label: t('nav.logs'), icon: <ScrollText className=\"h-4 w-4\" /> },\n { path: '/settings', label: t('nav.settings'), icon: <SettingsIcon className=\"h-4 w-4\" /> },\n ];\n\n const renderItem = (item: MenuItem) => (\n <NavLink\n key={item.path}\n to={item.path}\n end={item.end}\n className={({ isActive }) =>\n [\n 'group flex items-center gap-2.5 rounded-md text-[13.5px] transition-colors',\n collapsed ? 'justify-center px-2 py-2' : 'px-2.5 py-1.5',\n isActive\n ? 'bg-[var(--hub-surface)] text-[var(--hub-ink)] ring-1 ring-inset ring-[var(--hub-line)]'\n : 'text-[var(--hub-ink-2)] hover:bg-[var(--hub-surface-hover)] hover:text-[var(--hub-ink)]',\n ].join(' ')\n }\n >\n {({ isActive }) => (\n <>\n <span\n className={\n isActive\n ? 'text-[var(--hub-ink)] flex-shrink-0'\n : 'text-[var(--hub-ink-3)] group-hover:text-[var(--hub-ink-2)] flex-shrink-0'\n }\n >\n {item.icon}\n </span>\n {!collapsed && (\n <>\n <span className=\"truncate\">{item.label}</span>\n {item.badge != null && (\n <span className=\"ml-auto hub-mono hub-num text-[11px] text-[var(--hub-ink-3)]\">\n {item.badge}\n </span>\n )}\n </>\n )}\n </>\n )}\n </NavLink>\n );\n\n return (\n <aside\n className={\n 'flex flex-col h-full relative shrink-0 transition-[width] duration-200 ease-out ' +\n 'bg-[var(--hub-bg-2)] border-r border-[var(--hub-line)] ' +\n (collapsed ? 'w-14' : 'w-[232px]')\n }\n >\n {/* Brand */}\n <div className={'flex items-center gap-2.5 ' + (collapsed ? 'px-2 py-3 justify-center' : 'px-4 py-3')}>\n <div\n className=\"relative grid h-7 w-7 place-items-center rounded-md text-white hub-mono text-[12px] font-semibold\"\n style={{\n background:\n 'linear-gradient(135deg, var(--hub-accent), oklch(0.62 0.18 285))',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.14)',\n }}\n >\n <span>M</span>\n <span\n className=\"absolute -right-0.5 -bottom-0.5 w-[6px] h-[6px] rounded-full\"\n style={{\n background: 'var(--hub-ok)',\n boxShadow: '0 0 0 2px oklch(0.66 0.15 145 / 0.18)',\n }}\n />\n </div>\n {!collapsed && (\n <div className=\"flex items-baseline gap-1.5 min-w-0\">\n <span className=\"font-semibold tracking-tight text-[var(--hub-ink)] truncate\">\n {t('app.title')}\n </span>\n {appVersion && (\n <span className=\"hub-mono text-[10.5px] text-[var(--hub-ink-3)] flex-shrink-0\">\n {appVersion === 'dev' ? appVersion : `v${appVersion}`}\n </span>\n )}\n </div>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto pb-2\">\n {!collapsed && <div className=\"hub-sect px-3 pt-2 pb-1.5\">{t('nav.workspace')}</div>}\n <nav className={'flex flex-col gap-px ' + (collapsed ? 'px-1.5' : 'px-2')}>\n {workspaceItems.map(renderItem)}\n </nav>\n\n {!collapsed && <div className=\"hub-sect px-3 pt-3 pb-1.5\">{t('nav.system')}</div>}\n <nav className={'flex flex-col gap-px ' + (collapsed ? 'px-1.5 mt-1' : 'px-2')}>\n {systemItems.map(renderItem)}\n </nav>\n </div>\n\n <div className=\"p-2.5 border-t border-[var(--hub-line)]\">\n <UserProfileMenu collapsed={collapsed} version={appVersion} />\n </div>\n </aside>\n );\n};\n\nexport default Sidebar;\n","import React, { ReactNode } from 'react';\n\ninterface ContentProps {\n children: ReactNode;\n}\n\nconst Content: React.FC<ContentProps> = ({ children }) => {\n return (\n <main className=\"flex-1 overflow-auto\" style={{ background: 'var(--hub-bg)' }}>\n <div className=\"mx-auto w-full max-w-[1680px] px-6 pt-6 pb-16 lg:px-8 xl:px-10\">{children}</div>\n </main>\n );\n};\n\nexport default Content;\n","import React, { Suspense } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport Header from '@/components/layout/Header';\nimport Sidebar from '@/components/layout/Sidebar';\nimport Content from '@/components/layout/Content';\nimport { EmbeddingSyncProvider } from '@/contexts/EmbeddingSyncContext';\n\nconst PageFallback: React.FC = () => (\n <div\n className=\"flex h-full min-h-[240px] items-center justify-center text-sm\"\n style={{ color: 'var(--hub-ink-3)' }}\n >\n Loading...\n </div>\n);\n\nconst MainLayout: React.FC = () => {\n const [sidebarCollapsed, setSidebarCollapsed] = React.useState(false);\n\n const toggleSidebar = () => {\n setSidebarCollapsed(!sidebarCollapsed);\n };\n\n return (\n <EmbeddingSyncProvider>\n <div className=\"flex h-screen\" style={{ background: 'var(--hub-bg)', color: 'var(--hub-ink)' }}>\n <Sidebar collapsed={sidebarCollapsed} />\n <div className=\"flex flex-1 flex-col min-w-0 min-h-0\">\n <Header onToggleSidebar={toggleSidebar} />\n <Content>\n <Suspense fallback={<PageFallback />}>\n <Outlet />\n </Suspense>\n </Content>\n </div>\n </div>\n </EmbeddingSyncProvider>\n );\n};\n\nexport default MainLayout;\n","import React from 'react';\nimport { Navigate, Outlet } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { useAuth } from '../contexts/AuthContext';\n\ninterface ProtectedRouteProps {\n redirectPath?: string;\n}\n\nconst ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n redirectPath = '/login'\n}) => {\n const { t } = useTranslation();\n const { auth } = useAuth();\n\n if (auth.loading) {\n return <div className=\"flex items-center justify-center h-screen\">{t('app.loading')}</div>;\n }\n\n if (!auth.isAuthenticated) {\n return <Navigate to={redirectPath} replace />;\n }\n\n return <Outlet />;\n};\n\nexport default ProtectedRoute;","import { useEffect, useRef } from 'react';\nimport { useToast } from '@/contexts/ToastContext';\nimport { logStreamManager } from '@/services/logService';\n\nconst EMBED_SYNC_ERROR_MARKER = '[EMBED_SYNC_ERROR]';\nconst TOAST_DURATION_MS = 8000;\nconst TOAST_DEDUPE_WINDOW_MS = 30000;\n\ntype EmbeddingSyncStreamPayload = {\n type?: unknown;\n log?: {\n message?: unknown;\n };\n progress?: {\n serverName?: unknown;\n status?: unknown;\n };\n};\n\nconst EmbeddingSyncAlertListener = () => {\n const { showToast } = useToast();\n const recentToastRef = useRef<Map<string, number>>(new Map());\n\n useEffect(() => {\n const shouldSuppressToast = (key: string): boolean => {\n const now = Date.now();\n\n recentToastRef.current.forEach((timestamp, existingKey) => {\n if (now - timestamp >= TOAST_DEDUPE_WINDOW_MS) {\n recentToastRef.current.delete(existingKey);\n }\n });\n\n const previousTimestamp = recentToastRef.current.get(key);\n if (previousTimestamp && now - previousTimestamp < TOAST_DEDUPE_WINDOW_MS) {\n return true;\n }\n\n recentToastRef.current.set(key, now);\n return false;\n };\n\n const extractServerName = (message: string): string | null => {\n const serverMatch = message.match(/server\\s+\"([^\"]+)\"/i);\n return serverMatch?.[1] || null;\n };\n\n const showEmbeddingErrorToast = (key: string, message: string) => {\n if (shouldSuppressToast(key)) {\n return;\n }\n\n showToast(message, 'error', TOAST_DURATION_MS);\n };\n\n const handleEmbeddingSyncErrorLog = (rawMessage: string) => {\n const cleanedMessage = rawMessage.replace(EMBED_SYNC_ERROR_MARKER, '').trim();\n const serverName = extractServerName(cleanedMessage);\n\n if (cleanedMessage.includes('Full embeddings resync failed')) {\n showEmbeddingErrorToast(\n 'embedding-resync-failed',\n 'Embedding resynchronization failed. Check smart routing logs and provider limits.',\n );\n return;\n }\n\n if (serverName) {\n showEmbeddingErrorToast(\n `embedding-sync-error:${serverName}`,\n `Embedding synchronization failed for server \"${serverName}\". Check logs for details.`,\n );\n return;\n }\n\n showEmbeddingErrorToast(\n `embedding-sync-error:${cleanedMessage}`,\n cleanedMessage ||\n 'Embedding synchronization failed. Check smart routing logs and provider rate limits.',\n );\n };\n\n const handleMessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as EmbeddingSyncStreamPayload;\n\n if (data?.type === 'embedding-sync-progress') {\n const serverName =\n typeof data.progress?.serverName === 'string' ? data.progress.serverName : '';\n const status = typeof data.progress?.status === 'string' ? data.progress.status : '';\n\n if (status === 'error' && serverName) {\n showEmbeddingErrorToast(\n `embedding-sync-error:${serverName}`,\n `Embedding synchronization failed for server \"${serverName}\". Check logs for details.`,\n );\n }\n\n return;\n }\n\n if (data?.type !== 'log') return;\n\n const message = String(data?.log?.message || '');\n if (!message.includes(EMBED_SYNC_ERROR_MARKER)) return;\n\n handleEmbeddingSyncErrorLog(message);\n } catch {\n // Ignore malformed stream messages.\n }\n };\n\n return logStreamManager.subscribe(handleMessage);\n }, [showToast]);\n\n return null;\n};\n\nexport default EmbeddingSyncAlertListener;\n","import React, { Suspense, lazy } from 'react';\nimport { BrowserRouter as Router, Route, Routes, Navigate, useParams } from 'react-router-dom';\nimport { AuthProvider } from './contexts/AuthContext';\nimport { ToastProvider } from './contexts/ToastContext';\nimport { ThemeProvider } from './contexts/ThemeContext';\nimport { ServerProvider } from './contexts/ServerContext';\nimport { SettingsProvider } from './contexts/SettingsContext';\nimport MainLayout from './layouts/MainLayout';\nimport ProtectedRoute from './components/ProtectedRoute';\nimport EmbeddingSyncAlertListener from './components/EmbeddingSyncAlertListener';\nimport { getBasePath } from './utils/runtime';\n\nconst LoginPage = lazy(() => import('./pages/LoginPage'));\nconst DashboardPage = lazy(() => import('./pages/Dashboard'));\nconst ServersPage = lazy(() => import('./pages/ServersPage'));\nconst GroupsPage = lazy(() => import('./pages/GroupsPage'));\nconst UsersPage = lazy(() => import('./pages/UsersPage'));\nconst SettingsPage = lazy(() => import('./pages/SettingsPage'));\nconst MarketPage = lazy(() => import('./pages/MarketPage'));\nconst LogsPage = lazy(() => import('./pages/LogsPage'));\nconst ActivityPage = lazy(() => import('./pages/ActivityPage'));\nconst PromptsPage = lazy(() => import('./pages/PromptsPage'));\nconst ResourcesPage = lazy(() => import('./pages/ResourcesPage'));\n\n// Helper component to redirect cloud server routes to market\nconst CloudRedirect: React.FC = () => {\n const { serverName } = useParams<{ serverName: string }>();\n return <Navigate to={`/market/${serverName}?tab=cloud`} replace />;\n};\n\nconst RouteFallback: React.FC = () => (\n <div className=\"flex min-h-screen items-center justify-center text-sm text-gray-500\">\n Loading...\n </div>\n);\n\nfunction App() {\n const basename = getBasePath();\n return (\n <ThemeProvider>\n <AuthProvider>\n <ServerProvider>\n <ToastProvider>\n <SettingsProvider>\n <Router basename={basename}>\n <EmbeddingSyncAlertListener />\n <Routes>\n {/* 公共路由 */}\n <Route\n path=\"/login\"\n element={\n <Suspense fallback={<RouteFallback />}>\n <LoginPage />\n </Suspense>\n }\n />\n\n {/* 受保护的路由,使用 MainLayout 作为布局容器 */}\n <Route element={<ProtectedRoute />}>\n <Route element={<MainLayout />}>\n <Route path=\"/\" element={<DashboardPage />} />\n <Route path=\"/servers\" element={<ServersPage />} />\n <Route path=\"/groups\" element={<GroupsPage />} />\n <Route path=\"/prompts\" element={<PromptsPage />} />\n <Route path=\"/resources\" element={<ResourcesPage />} />\n <Route path=\"/users\" element={<UsersPage />} />\n <Route path=\"/market\" element={<MarketPage />} />\n <Route path=\"/market/:serverName\" element={<MarketPage />} />\n {/* Legacy cloud routes redirect to market with cloud tab */}\n <Route path=\"/cloud\" element={<Navigate to=\"/market?tab=cloud\" replace />} />\n <Route path=\"/cloud/:serverName\" element={<CloudRedirect />} />\n <Route path=\"/logs\" element={<LogsPage />} />\n <Route path=\"/activity\" element={<ActivityPage />} />\n <Route path=\"/settings\" element={<SettingsPage />} />\n </Route>\n </Route>\n\n {/* 未匹配的路由重定向到首页 */}\n <Route path=\"*\" element={<Navigate to=\"/\" />} />\n </Routes>\n </Router>\n </SettingsProvider>\n </ToastProvider>\n </ServerProvider>\n </AuthProvider>\n </ThemeProvider>\n );\n}\n\nexport default App;\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\n\n// Import shared translations from root locales directory\nimport enTranslation from '../../locales/en.json';\nimport zhTranslation from '../../locales/zh.json';\nimport frTranslation from '../../locales/fr.json';\nimport trTranslation from '../../locales/tr.json';\n\ni18n\n // Detect user language\n .use(LanguageDetector)\n // Pass the i18n instance to react-i18next\n .use(initReactI18next)\n // Initialize i18next\n .init({\n resources: {\n en: {\n translation: enTranslation,\n },\n zh: {\n translation: zhTranslation,\n },\n fr: {\n translation: frTranslation,\n },\n tr: {\n translation: trTranslation,\n },\n },\n fallbackLng: 'en',\n debug: process.env.NODE_ENV === 'development',\n\n // Common namespace used for all translations\n defaultNS: 'translation',\n\n interpolation: {\n escapeValue: false, // React already safe from XSS\n },\n\n detection: {\n // Order of detection; prioritize localStorage to respect user language choice\n order: ['localStorage', 'cookie', 'htmlTag', 'navigator'],\n // Cache the language in localStorage\n caches: ['localStorage', 'cookie'],\n },\n });\n\nexport default i18n;\n","import { installAuthInterceptor, installLoggingInterceptor } from './interceptors';\n\n/**\n * Setup all default interceptors for the application\n * This should be called once when the app initializes\n */\nexport const setupInterceptors = (): void => {\n // Install auth interceptor for automatic token handling\n installAuthInterceptor();\n\n // Install logging interceptor in development mode\n installLoggingInterceptor();\n};\n\n/**\n * Initialize interceptors automatically when this module is imported\n * This ensures interceptors are set up as early as possible\n */\nsetupInterceptors();\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n// Import the i18n configuration\nimport './i18n';\n// Setup fetch interceptors\nimport './utils/setupInterceptors';\nimport { loadRuntimeConfig } from './utils/runtime';\n\n// Load runtime configuration before starting the app\nasync function initializeApp() {\n try {\n console.log('Loading runtime configuration...');\n const config = await loadRuntimeConfig();\n console.log('Runtime configuration loaded:', config);\n\n // Store config in window object\n window.__MCPHUB_CONFIG__ = config;\n\n // Start React app\n ReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n );\n } catch (error) {\n console.error('Failed to initialize app:', error);\n\n // Fallback: start app with default config\n console.log('Starting app with default configuration...');\n window.__MCPHUB_CONFIG__ = {\n basePath: '',\n version: 'dev',\n name: 'mcphub',\n };\n\n ReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n );\n }\n}\n\n// Initialize the app\ninitializeApp();"],"file":"assets/index-C7wNc_3N.js"}
|