@emblemvault/emblem-auth-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -0
- package/dist/components/index.cjs +909 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +49 -0
- package/dist/components/index.d.ts +49 -0
- package/dist/components/index.js +906 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.cjs +204 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +135 -0
- package/dist/hooks/index.d.ts +135 -0
- package/dist/hooks/index.js +199 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +1146 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +1134 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.cjs +199 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +3 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.js +195 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/EmblemAuthProvider.tsx","../../src/styles/tokens.ts","../../src/components/ConnectButton.tsx","../../src/components/AuthStatus.tsx"],"names":["createContext","useContext","useState","useCallback","jsxs","Fragment","jsx","copyToClipboard"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n} from 'react';\nimport { EmblemAuthSDK } from 'emblem-auth-sdk';\nimport type {\n AuthSession,\n VaultInfo,\n EmblemAuthContextValue,\n EmblemAuthProviderProps,\n} from '../types';\n\n/**\n * Global SDK instance to prevent multiple initializations\n * This is important for React strict mode and hot reloading\n */\nlet globalSDKInstance: EmblemAuthSDK | null = null;\nlet isSDKInitializing = false;\n\n/**\n * Auth context - undefined when not within provider\n */\nconst EmblemAuthContext = createContext<EmblemAuthContextValue | undefined>(undefined);\n\n/**\n * EmblemAuthProvider - Provides authentication state and actions to the app\n *\n * This is a first-class citizen - it has no dependency on Hustle SDK.\n * The Hustle SDK depends on this provider for authentication.\n *\n * @example\n * ```tsx\n * <EmblemAuthProvider\n * appId=\"your-app-id\"\n * apiUrl=\"https://api.emblemvault.ai\"\n * modalUrl=\"https://auth.emblemvault.ai/connect\"\n * >\n * <App />\n * </EmblemAuthProvider>\n * ```\n */\nexport function EmblemAuthProvider({\n children,\n appId,\n apiUrl,\n modalUrl,\n debug = false,\n}: EmblemAuthProviderProps) {\n // State\n const [session, setSession] = useState<AuthSession | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [vaultInfo, setVaultInfo] = useState<VaultInfo | null>(null);\n const [authSDK, setAuthSDK] = useState<EmblemAuthSDK | null>(globalSDKInstance);\n\n // Track if we've initialized\n const initialized = useRef(false);\n\n // Debug logger\n const log = useCallback(\n (message: string, ...args: unknown[]) => {\n if (debug) {\n console.log(`[EmblemAuth] ${message}`, ...args);\n }\n },\n [debug]\n );\n\n /**\n * Fetch vault info after authentication\n */\n const fetchVaultInfo = useCallback(\n async (sdk: EmblemAuthSDK) => {\n try {\n const info = await sdk.getVaultInfo();\n if (info) {\n setVaultInfo(info);\n log('Vault info loaded:', info);\n }\n } catch (err) {\n log('Failed to fetch vault info:', err);\n }\n },\n [log]\n );\n\n /**\n * Handle successful authentication\n */\n const handleAuthSuccess = useCallback(\n (newSession: AuthSession, sdk: EmblemAuthSDK) => {\n log('Auth success - session:', newSession);\n setSession(newSession);\n setIsAuthenticated(true);\n setIsLoading(false);\n setError(null);\n fetchVaultInfo(sdk);\n },\n [log, fetchVaultInfo]\n );\n\n /**\n * Handle authentication error\n */\n const handleAuthError = useCallback(\n (err: Error) => {\n log('Auth error:', err);\n setError(err);\n setIsLoading(false);\n setIsAuthenticated(false);\n setSession(null);\n },\n [log]\n );\n\n /**\n * Handle session expiration\n */\n const handleSessionExpired = useCallback(() => {\n log('Session expired');\n setSession(null);\n setIsAuthenticated(false);\n setVaultInfo(null);\n }, [log]);\n\n /**\n * Initialize the SDK\n */\n useEffect(() => {\n // Prevent double initialization\n if (initialized.current || globalSDKInstance || isSDKInitializing) {\n if (globalSDKInstance && !authSDK) {\n setAuthSDK(globalSDKInstance);\n // Check for existing session\n const existingSession = globalSDKInstance.getSession();\n if (existingSession) {\n handleAuthSuccess(existingSession, globalSDKInstance);\n }\n }\n return;\n }\n\n initialized.current = true;\n isSDKInitializing = true;\n log('Initializing SDK with appId:', appId);\n\n // Create SDK instance\n const sdk = new EmblemAuthSDK({\n appId,\n apiUrl,\n modalUrl,\n onSuccess: (newSession) => {\n handleAuthSuccess(newSession as AuthSession, sdk);\n },\n onError: (err) => {\n handleAuthError(err);\n },\n });\n\n // Store globally and locally\n globalSDKInstance = sdk;\n isSDKInitializing = false;\n setAuthSDK(sdk);\n\n // Check for existing session\n const existingSession = sdk.getSession();\n if (existingSession) {\n log('Found existing session');\n handleAuthSuccess(existingSession as AuthSession, sdk);\n }\n\n // Subscribe to session events\n const handleSessionUpdate = (updatedSession: AuthSession | null) => {\n if (updatedSession) {\n setSession(updatedSession);\n setIsAuthenticated(true);\n } else {\n handleSessionExpired();\n }\n };\n\n sdk.on('session', handleSessionUpdate);\n sdk.on('sessionExpired', handleSessionExpired);\n\n // Cleanup\n return () => {\n sdk.off('session', handleSessionUpdate);\n sdk.off('sessionExpired', handleSessionExpired);\n };\n }, [appId, apiUrl, modalUrl, log, handleAuthSuccess, handleAuthError, handleSessionExpired, authSDK]);\n\n /**\n * Open the auth modal\n */\n const openAuthModal = useCallback(async () => {\n if (!authSDK) {\n setError(new Error('Auth SDK not initialized'));\n return;\n }\n\n log('Opening auth modal');\n setIsLoading(true);\n setError(null);\n\n try {\n await authSDK.openAuthModal();\n // Success is handled by onSuccess callback\n } catch (err) {\n setIsLoading(false);\n setError(err instanceof Error ? err : new Error('Failed to open auth modal'));\n }\n }, [authSDK, log]);\n\n /**\n * Logout and clear session\n */\n const logout = useCallback(() => {\n if (!authSDK) return;\n\n log('Logging out');\n authSDK.logout();\n setSession(null);\n setIsAuthenticated(false);\n setVaultInfo(null);\n setError(null);\n }, [authSDK, log]);\n\n /**\n * Refresh the current session\n */\n const refreshSession = useCallback(async (): Promise<AuthSession | null> => {\n if (!authSDK) return null;\n\n log('Refreshing session');\n try {\n const refreshedSession = await authSDK.refreshSession();\n if (refreshedSession) {\n setSession(refreshedSession as AuthSession);\n setIsAuthenticated(true);\n return refreshedSession as AuthSession;\n }\n return null;\n } catch (err) {\n log('Failed to refresh session:', err);\n setError(err instanceof Error ? err : new Error('Failed to refresh session'));\n return null;\n }\n }, [authSDK, log]);\n\n // Derived values\n const vaultId = session?.user?.vaultId ?? null;\n const walletAddress = session?.user?.evmAddress ?? null;\n\n // Context value\n const value: EmblemAuthContextValue = {\n // State\n session,\n isAuthenticated,\n isLoading,\n error,\n vaultInfo,\n\n // Derived\n vaultId,\n walletAddress,\n\n // Actions\n openAuthModal,\n logout,\n refreshSession,\n\n // For Hustle integration\n authSDK,\n };\n\n return (\n <EmblemAuthContext.Provider value={value}>\n {children}\n </EmblemAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access auth context\n * Must be used within EmblemAuthProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isAuthenticated, openAuthModal, logout } = useEmblemAuth();\n *\n * return isAuthenticated\n * ? <button onClick={logout}>Logout</button>\n * : <button onClick={openAuthModal}>Connect</button>;\n * }\n * ```\n */\nexport function useEmblemAuth(): EmblemAuthContextValue {\n const context = useContext(EmblemAuthContext);\n if (context === undefined) {\n throw new Error('useEmblemAuth must be used within an EmblemAuthProvider');\n }\n return context;\n}\n\n/**\n * Optional version of useEmblemAuth that returns null when used outside EmblemAuthProvider\n *\n * Use this when authentication is optional, such as when using HustleProvider\n * with direct API key authentication.\n *\n * @example\n * ```tsx\n * function OptionalAuthComponent() {\n * const auth = useEmblemAuthOptional();\n *\n * if (!auth) {\n * return <p>Auth not available</p>;\n * }\n *\n * return <p>Logged in as {auth.walletAddress}</p>;\n * }\n * ```\n */\nexport function useEmblemAuthOptional(): EmblemAuthContextValue | null {\n const context = useContext(EmblemAuthContext);\n return context ?? null;\n}\n\n/**\n * Reset the global SDK instance (useful for testing)\n */\nexport function resetAuthSDK(): void {\n globalSDKInstance = null;\n isSDKInitializing = false;\n}\n","/**\n * Design Tokens for Hustle React Components\n *\n * These tokens use CSS Custom Properties (CSS Variables) for easy theming.\n * Override any variable in your CSS to customize the theme:\n *\n * @example\n * ```css\n * :root {\n * --hustle-color-bg-primary: #ffffff;\n * --hustle-color-text-primary: #1a1a1a;\n * }\n * ```\n */\n\n// ============================================================================\n// Default Token Values\n// ============================================================================\nconst defaults = {\n colors: {\n // Backgrounds\n bgPrimary: '#0b0d10',\n bgSecondary: '#12161b',\n bgTertiary: '#1a1f25',\n bgHover: '#252b33',\n bgOverlay: 'rgba(0, 0, 0, 0.7)',\n\n // Borders\n borderPrimary: '#222b35',\n borderSecondary: '#333',\n borderHover: '#444',\n\n // Text\n textPrimary: '#e6eef8',\n textSecondary: '#8892a4',\n textTertiary: '#6b7280',\n textInverse: '#fff',\n\n // Accent - Primary (blue)\n accentPrimary: '#4c9aff',\n accentPrimaryHover: '#7bb6ff',\n accentPrimaryBg: 'rgba(76, 154, 255, 0.1)',\n\n // Accent - Success (green)\n accentSuccess: '#10b981',\n accentSuccessHover: '#34d399',\n accentSuccessBg: 'rgba(16, 185, 129, 0.1)',\n\n // Accent - Warning (yellow/orange)\n accentWarning: '#f59e0b',\n accentWarningBg: 'rgba(245, 158, 11, 0.1)',\n\n // Accent - Error (red)\n accentError: '#dc2626',\n accentErrorHover: '#ef4444',\n accentErrorBg: 'rgba(239, 68, 68, 0.1)',\n\n // Messages\n msgUser: '#1e3a5f',\n msgAssistant: '#1a2633',\n },\n\n typography: {\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontFamilyMono: '\"SF Mono\", Monaco, monospace',\n fontSizeXs: '11px',\n fontSizeSm: '13px',\n fontSizeMd: '14px',\n fontSizeLg: '16px',\n fontSizeXl: '18px',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n lineHeightTight: '1.3',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.7',\n },\n\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '20px',\n xxl: '24px',\n },\n\n radius: {\n sm: '4px',\n md: '6px',\n lg: '8px',\n xl: '12px',\n pill: '20px',\n full: '50%',\n },\n\n shadows: {\n sm: '0 2px 8px rgba(0,0,0,0.2)',\n md: '0 4px 16px rgba(0,0,0,0.3)',\n lg: '0 8px 32px rgba(0,0,0,0.4)',\n xl: '0 16px 48px rgba(0,0,0,0.5)',\n },\n\n // Glow effects (for enhanced themes)\n glows: {\n primary: 'rgba(76, 154, 255, 0.4)',\n success: 'rgba(16, 185, 129, 0.4)',\n error: 'rgba(239, 68, 68, 0.4)',\n ambient: 'rgba(76, 154, 255, 0.08)',\n },\n\n transitions: {\n fast: '0.15s ease',\n normal: '0.2s ease',\n slow: '0.3s ease',\n },\n\n zIndex: {\n dropdown: '100',\n modal: '1000',\n fullscreen: '1000',\n modalOverFullscreen: '10000',\n },\n};\n\n// ============================================================================\n// CSS Variable Name Generator\n// ============================================================================\nfunction toVarName(category: string, key: string): string {\n // Convert camelCase to kebab-case\n const kebab = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `--hustle-${category}-${kebab}`;\n}\n\n// ============================================================================\n// CSS Variables Stylesheet (inject this once in your app)\n// ============================================================================\nfunction generateCSSVariables(): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(defaults.colors)) {\n lines.push(` ${toVarName('color', key)}: ${value};`);\n }\n\n // Typography\n for (const [key, value] of Object.entries(defaults.typography)) {\n lines.push(` ${toVarName('font', key)}: ${value};`);\n }\n\n // Spacing\n for (const [key, value] of Object.entries(defaults.spacing)) {\n lines.push(` ${toVarName('space', key)}: ${value};`);\n }\n\n // Radius\n for (const [key, value] of Object.entries(defaults.radius)) {\n lines.push(` ${toVarName('radius', key)}: ${value};`);\n }\n\n // Shadows\n for (const [key, value] of Object.entries(defaults.shadows)) {\n lines.push(` ${toVarName('shadow', key)}: ${value};`);\n }\n\n // Glows\n for (const [key, value] of Object.entries(defaults.glows)) {\n lines.push(` ${toVarName('glow', key)}: ${value};`);\n }\n\n // Transitions\n for (const [key, value] of Object.entries(defaults.transitions)) {\n lines.push(` ${toVarName('transition', key)}: ${value};`);\n }\n\n // Z-Index\n for (const [key, value] of Object.entries(defaults.zIndex)) {\n lines.push(` ${toVarName('z', key)}: ${value};`);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/**\n * CSS Variables stylesheet - inject this in your app's <head> or include in your CSS\n * Contains all default token values as CSS custom properties\n */\nexport const cssVariables = generateCSSVariables();\n\n// ============================================================================\n// Token Accessors (use CSS var() with fallback to default)\n// ============================================================================\nfunction createColorTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.colors)) {\n result[key] = `var(${toVarName('color', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.colors;\n}\n\nfunction createTypographyTokens() {\n const result: Record<string, string | number> = {};\n for (const [key, defaultValue] of Object.entries(defaults.typography)) {\n result[key] = `var(${toVarName('font', key)}, ${defaultValue})`;\n }\n return result as unknown as {\n fontFamily: string;\n fontFamilyMono: string;\n fontSizeXs: string;\n fontSizeSm: string;\n fontSizeMd: string;\n fontSizeLg: string;\n fontSizeXl: string;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightSemibold: number;\n lineHeightTight: number;\n lineHeightNormal: number;\n lineHeightRelaxed: number;\n };\n}\n\nfunction createSpacingTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.spacing)) {\n result[key] = `var(${toVarName('space', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.spacing;\n}\n\nfunction createRadiusTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.radius)) {\n result[key] = `var(${toVarName('radius', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.radius;\n}\n\nfunction createShadowTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.shadows)) {\n result[key] = `var(${toVarName('shadow', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.shadows;\n}\n\nfunction createGlowTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.glows)) {\n result[key] = `var(${toVarName('glow', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.glows;\n}\n\nfunction createTransitionTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.transitions)) {\n result[key] = `var(${toVarName('transition', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.transitions;\n}\n\nfunction createZIndexTokens() {\n const result: Record<string, number> = {};\n for (const [key, defaultValue] of Object.entries(defaults.zIndex)) {\n // z-index needs to be a number for React inline styles\n // We keep the default value as number, CSS var override still works\n result[key] = parseInt(defaultValue, 10);\n }\n return result as { dropdown: number; modal: number; fullscreen: number; modalOverFullscreen: number };\n}\n\n// ============================================================================\n// Exported Tokens (use these in components)\n// ============================================================================\nexport const tokens = {\n colors: createColorTokens(),\n typography: createTypographyTokens(),\n spacing: createSpacingTokens(),\n radius: createRadiusTokens(),\n shadows: createShadowTokens(),\n glows: createGlowTokens(),\n transitions: createTransitionTokens(),\n zIndex: createZIndexTokens(),\n};\n\nexport type Tokens = typeof tokens;\n\n/**\n * Raw default values (without CSS var() wrapper)\n * Use this if you need the actual values, not CSS variable references\n */\nexport const defaultTokens = defaults;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get a token value by path (e.g., 'colors.bgPrimary')\n */\nexport function getTokenValue(path: string): string | number | undefined {\n const parts = path.split('.');\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current as string | number | undefined;\n}\n\n/**\n * Create a themed style object\n */\nexport function createStyle(mapping: Record<string, string>): React.CSSProperties {\n const result: Record<string, unknown> = {};\n\n for (const [cssProp, tokenPath] of Object.entries(mapping)) {\n const value = getTokenValue(tokenPath);\n if (value !== undefined) {\n result[cssProp] = value;\n }\n }\n\n return result as React.CSSProperties;\n}\n\n// ============================================================================\n// Common Style Presets\n// ============================================================================\nexport const presets = {\n base: {\n fontFamily: tokens.typography.fontFamily,\n fontSize: tokens.typography.fontSizeMd,\n lineHeight: tokens.typography.lineHeightNormal,\n color: tokens.colors.textPrimary,\n } as React.CSSProperties,\n\n card: {\n background: tokens.colors.bgSecondary,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: tokens.radius.xl,\n } as React.CSSProperties,\n\n input: {\n background: tokens.colors.bgTertiary,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textPrimary,\n fontSize: tokens.typography.fontSizeMd,\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n outline: 'none',\n transition: `border-color ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: tokens.spacing.sm,\n padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,\n borderRadius: tokens.radius.lg,\n fontSize: tokens.typography.fontSizeMd,\n fontWeight: tokens.typography.fontWeightMedium,\n cursor: 'pointer',\n transition: `all ${tokens.transitions.normal}`,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n outline: 'none',\n } as React.CSSProperties,\n\n buttonPrimary: {\n background: tokens.colors.accentPrimary,\n color: tokens.colors.textInverse,\n borderColor: tokens.colors.accentPrimary,\n } as React.CSSProperties,\n\n buttonSecondary: {\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textPrimary,\n borderColor: tokens.colors.borderSecondary,\n } as React.CSSProperties,\n\n buttonIcon: {\n width: '36px',\n height: '36px',\n padding: 0,\n // background inherited from global button styles\n color: tokens.colors.textSecondary,\n } as React.CSSProperties,\n\n mono: {\n fontFamily: tokens.typography.fontFamilyMono,\n fontSize: tokens.typography.fontSizeSm,\n } as React.CSSProperties,\n\n label: {\n display: 'block',\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n } as React.CSSProperties,\n};\n\n// ============================================================================\n// Animation Keyframes\n// ============================================================================\n\n/**\n * Animation keyframes only (no CSS variable defaults)\n * Use this in components to avoid overriding consumer theme customizations\n */\nexport const animations = `\n@keyframes hustle-spin {\n to { transform: rotate(360deg); }\n}\n@keyframes hustle-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n@keyframes hustle-glow {\n 0%, 100% {\n opacity: 1;\n text-shadow: 0 0 4px ${defaults.colors.accentPrimaryBg};\n }\n 50% {\n opacity: 0.6;\n text-shadow: 0 0 8px ${defaults.colors.accentPrimary};\n }\n}\n`;\n\n/**\n * @deprecated Use `animations` instead. This includes CSS variable defaults\n * which can override consumer theme customizations.\n */\nexport const keyframes = `\n${cssVariables}\n${animations}\n`;\n\nexport default tokens;\n","'use client';\n\nimport React, { useCallback, useState } from 'react';\nimport { useEmblemAuth } from '../providers/EmblemAuthProvider';\nimport { tokens, presets, animations } from '../styles';\n\n/**\n * Props for ConnectButton component\n */\nexport interface ConnectButtonProps {\n /** Additional CSS classes */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom content when disconnected */\n connectLabel?: React.ReactNode;\n /** Custom content while loading */\n loadingLabel?: React.ReactNode;\n /** Callback after successful connection */\n onConnect?: () => void;\n /** Callback after disconnection */\n onDisconnect?: () => void;\n /** Show vault info dropdown when connected */\n showVaultInfo?: boolean;\n /** Disable the button */\n disabled?: boolean;\n}\n\n/**\n * Truncate wallet address for display\n */\nfunction truncateAddress(address: string): string {\n if (!address || address.length < 10) return address || '';\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Copy text to clipboard\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// Styles using design tokens\nconst styles = {\n wrapper: {\n position: 'relative' as const,\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n },\n\n button: {\n ...presets.button,\n padding: `${tokens.spacing.sm} ${tokens.spacing.xl}`,\n } as React.CSSProperties,\n\n disconnected: {\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textPrimary,\n borderColor: tokens.colors.borderSecondary,\n } as React.CSSProperties,\n\n disconnectedHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.borderHover,\n } as React.CSSProperties,\n\n connected: {\n background: 'transparent',\n color: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n borderRadius: tokens.radius.pill,\n } as React.CSSProperties,\n\n connectedHover: {\n background: tokens.colors.accentSuccessBg,\n } as React.CSSProperties,\n\n loading: {\n background: tokens.colors.borderSecondary,\n color: tokens.colors.textSecondary,\n cursor: 'wait',\n } as React.CSSProperties,\n\n disabled: {\n background: tokens.colors.borderSecondary,\n color: tokens.colors.textTertiary,\n cursor: 'not-allowed',\n opacity: 0.5,\n } as React.CSSProperties,\n\n icon: {\n fontSize: tokens.typography.fontSizeLg,\n } as React.CSSProperties,\n\n spinner: {\n display: 'inline-block',\n width: '14px',\n height: '14px',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n } as React.CSSProperties,\n\n address: {\n ...presets.mono,\n color: tokens.colors.textPrimary,\n } as React.CSSProperties,\n\n dot: {\n color: tokens.colors.textSecondary,\n } as React.CSSProperties,\n\n check: {\n color: tokens.colors.accentSuccess,\n } as React.CSSProperties,\n\n arrow: {\n fontSize: '10px',\n color: tokens.colors.textSecondary,\n marginLeft: tokens.spacing.xs,\n } as React.CSSProperties,\n\n // Disconnect button\n disconnectBtn: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textSecondary,\n cursor: 'pointer',\n fontSize: '16px',\n transition: `all ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n\n disconnectBtnHover: {\n borderColor: tokens.colors.accentError,\n color: tokens.colors.accentError,\n } as React.CSSProperties,\n\n // Vault info dropdown\n dropdown: {\n position: 'absolute' as const,\n top: '100%',\n left: 0,\n marginTop: tokens.spacing.xs,\n background: tokens.colors.bgPrimary,\n border: `1px solid ${tokens.colors.accentSuccess}`,\n borderRadius: tokens.radius.xl,\n padding: tokens.spacing.lg,\n minWidth: '300px',\n zIndex: tokens.zIndex.dropdown,\n boxShadow: `0 8px 32px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accentSuccessBg}`,\n },\n\n dropdownHeader: {\n fontSize: tokens.typography.fontSizeXs,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textSecondary,\n letterSpacing: '0.5px',\n marginBottom: tokens.spacing.lg,\n textTransform: 'uppercase' as const,\n },\n\n dropdownRow: {\n marginBottom: tokens.spacing.md,\n },\n\n dropdownLabel: {\n display: 'block',\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n },\n\n dropdownValueRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: tokens.spacing.sm,\n },\n\n dropdownValue: {\n fontSize: tokens.typography.fontSizeMd,\n color: tokens.colors.textPrimary,\n fontWeight: tokens.typography.fontWeightMedium,\n flex: 1,\n },\n\n dropdownValueMono: {\n ...presets.mono,\n wordBreak: 'break-all' as const,\n },\n\n copyBtn: {\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n color: tokens.colors.textSecondary,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.radius.sm,\n cursor: 'pointer',\n fontSize: tokens.typography.fontSizeXs,\n transition: `all ${tokens.transitions.normal}`,\n whiteSpace: 'nowrap' as const,\n },\n\n copyBtnHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.accentPrimary,\n color: tokens.colors.accentPrimary,\n },\n\n copyBtnCopied: {\n background: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n color: tokens.colors.textInverse,\n },\n};\n\n/**\n * ConnectButton - A button to trigger Emblem Auth connection\n * When connected, shows vault info dropdown and separate disconnect button\n */\nexport function ConnectButton({\n className = '',\n style,\n connectLabel = 'Connect',\n loadingLabel = 'Connecting...',\n onConnect,\n onDisconnect,\n showVaultInfo = true,\n disabled = false,\n}: ConnectButtonProps) {\n const {\n isAuthenticated,\n isLoading,\n walletAddress,\n vaultId,\n openAuthModal,\n logout,\n } = useEmblemAuth();\n\n const [isHovered, setIsHovered] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [disconnectHovered, setDisconnectHovered] = useState(false);\n const [copiedField, setCopiedField] = useState<string | null>(null);\n const [copyHovered, setCopyHovered] = useState<string | null>(null);\n\n const handleClick = useCallback(async () => {\n if (disabled) return;\n\n if (!isAuthenticated && !isLoading) {\n await openAuthModal();\n onConnect?.();\n }\n // When connected, clicking toggles dropdown (handled by hover)\n }, [disabled, isAuthenticated, isLoading, openAuthModal, onConnect]);\n\n const handleDisconnect = useCallback(() => {\n logout();\n onDisconnect?.();\n setShowDropdown(false);\n }, [logout, onDisconnect]);\n\n const handleCopy = useCallback(async (field: string, value: string) => {\n const success = await copyToClipboard(value);\n if (success) {\n setCopiedField(field);\n setTimeout(() => setCopiedField(null), 1500);\n }\n }, []);\n\n // Build style based on state\n let buttonStyle: React.CSSProperties = { ...styles.button };\n let content: React.ReactNode = connectLabel;\n\n if (disabled) {\n buttonStyle = { ...buttonStyle, ...styles.disconnected, ...styles.disabled };\n } else if (isLoading) {\n buttonStyle = { ...buttonStyle, ...styles.disconnected, ...styles.loading };\n content = (\n <>\n <span style={styles.spinner} />\n {loadingLabel}\n </>\n );\n } else if (isAuthenticated) {\n buttonStyle = { ...buttonStyle, ...styles.connected };\n if (isHovered || showDropdown) {\n buttonStyle = { ...buttonStyle, ...styles.connectedHover };\n }\n const truncated = truncateAddress(walletAddress || '');\n\n content = (\n <>\n <span style={styles.check}>✓</span>\n <span>Connected</span>\n <span style={styles.dot}>•</span>\n <span style={styles.address}>{truncated}</span>\n <span style={styles.arrow}>▾</span>\n </>\n );\n } else {\n buttonStyle = { ...buttonStyle, ...styles.disconnected };\n if (isHovered) {\n buttonStyle = { ...buttonStyle, ...styles.disconnectedHover };\n }\n content = (\n <>\n <span style={styles.icon}>→</span>\n {connectLabel}\n </>\n );\n }\n\n // Merge with passed style\n if (style) {\n buttonStyle = { ...buttonStyle, ...style };\n }\n\n // Render copy button helper\n const renderCopyBtn = (field: string, value: string) => {\n const isCopied = copiedField === field;\n const isHover = copyHovered === field;\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); handleCopy(field, value); }}\n style={{\n ...styles.copyBtn,\n ...(isCopied ? styles.copyBtnCopied : isHover ? styles.copyBtnHover : {}),\n }}\n onMouseEnter={() => setCopyHovered(field)}\n onMouseLeave={() => setCopyHovered(null)}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n );\n };\n\n return (\n <>\n <style>{animations}</style>\n <div\n style={styles.wrapper}\n onMouseEnter={() => isAuthenticated && showVaultInfo && setShowDropdown(true)}\n onMouseLeave={() => setShowDropdown(false)}\n >\n {/* Main button */}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={className}\n style={buttonStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {content}\n </button>\n\n {/* Disconnect button (only when authenticated) */}\n {isAuthenticated && (\n <button\n type=\"button\"\n onClick={handleDisconnect}\n style={{\n ...styles.disconnectBtn,\n ...(disconnectHovered ? styles.disconnectBtnHover : {}),\n }}\n onMouseEnter={() => setDisconnectHovered(true)}\n onMouseLeave={() => setDisconnectHovered(false)}\n title=\"Disconnect\"\n >\n ⏻\n </button>\n )}\n\n {/* Vault info dropdown */}\n {isAuthenticated && showVaultInfo && showDropdown && (\n <div style={styles.dropdown}>\n <div style={styles.dropdownHeader}>Vault Information</div>\n\n {/* Vault ID */}\n <div style={styles.dropdownRow}>\n <span style={styles.dropdownLabel}>Vault ID</span>\n <div style={styles.dropdownValueRow}>\n <span style={styles.dropdownValue}>#{vaultId}</span>\n {renderCopyBtn('vaultId', vaultId || '')}\n </div>\n </div>\n\n {/* Connected Wallet */}\n <div style={{ ...styles.dropdownRow, marginBottom: 0 }}>\n <span style={styles.dropdownLabel}>Connected Wallet</span>\n <div style={styles.dropdownValueRow}>\n <span style={{ ...styles.dropdownValue, ...styles.dropdownValueMono }}>\n {walletAddress}\n </span>\n {renderCopyBtn('wallet', walletAddress || '')}\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport default ConnectButton;\n","'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { useEmblemAuth } from '../providers/EmblemAuthProvider';\nimport { tokens, presets, animations } from '../styles';\n\n/**\n * Props for AuthStatus component\n */\nexport interface AuthStatusProps {\n /** Additional CSS classes */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Show expandable vault details */\n showVaultInfo?: boolean;\n /** Show logout button */\n showLogout?: boolean;\n}\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (!address || address.length < 10) return address || '';\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Copy text to clipboard\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// Styles using design tokens\nconst s = {\n container: {\n position: 'relative' as const,\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n fontFamily: tokens.typography.fontFamily,\n },\n disconnected: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n color: tokens.colors.textSecondary,\n fontSize: tokens.typography.fontSizeMd,\n },\n dot: {\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: tokens.radius.full,\n backgroundColor: tokens.colors.textTertiary,\n },\n dotConnected: {\n backgroundColor: tokens.colors.accentSuccess,\n },\n spinner: {\n display: 'inline-block',\n width: '12px',\n height: '12px',\n border: `2px solid ${tokens.colors.textSecondary}`,\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n },\n logoutBtn: {\n ...presets.buttonIcon,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n transition: `all ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n logoutBtnHover: {\n borderColor: tokens.colors.accentError,\n color: tokens.colors.accentError,\n },\n vaultInfoWrapper: {\n position: 'relative' as const,\n },\n vaultInfo: {\n position: 'absolute' as const,\n top: '100%',\n right: 0,\n marginTop: tokens.spacing.sm,\n background: tokens.colors.bgSecondary,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: tokens.radius.xl,\n padding: tokens.spacing.lg,\n minWidth: '380px',\n zIndex: tokens.zIndex.dropdown,\n boxShadow: tokens.shadows.lg,\n },\n vaultInfoHeader: {\n fontSize: tokens.typography.fontSizeXs,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textSecondary,\n letterSpacing: '0.5px',\n marginBottom: tokens.spacing.lg,\n textTransform: 'uppercase' as const,\n },\n vaultInfoRow: {\n marginBottom: tokens.spacing.md,\n },\n vaultLabel: {\n display: 'block',\n fontSize: '12px',\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n },\n vaultValueRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: tokens.spacing.sm,\n },\n vaultValue: {\n fontSize: tokens.typography.fontSizeMd,\n color: tokens.colors.textPrimary,\n fontWeight: tokens.typography.fontWeightMedium,\n flex: 1,\n },\n vaultValueMono: {\n ...presets.mono,\n wordBreak: 'break-all' as const,\n },\n copyBtn: {\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n color: tokens.colors.textSecondary,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.radius.sm,\n cursor: 'pointer',\n fontSize: tokens.typography.fontSizeXs,\n transition: `all ${tokens.transitions.normal}`,\n whiteSpace: 'nowrap' as const,\n },\n copyBtnHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.accentPrimary,\n color: tokens.colors.accentPrimary,\n },\n copyBtnCopied: {\n background: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n color: tokens.colors.textInverse,\n },\n};\n\n/**\n * AuthStatus - Displays current authentication status and vault info\n */\nexport function AuthStatus({\n className = '',\n style,\n showVaultInfo = false,\n showLogout = false,\n}: AuthStatusProps) {\n const {\n isAuthenticated,\n isLoading,\n walletAddress,\n vaultId,\n vaultInfo,\n logout,\n } = useEmblemAuth();\n\n const [isHovered, setIsHovered] = useState(false);\n const [logoutHovered, setLogoutHovered] = useState(false);\n const [copiedField, setCopiedField] = useState<string | null>(null);\n const [copyHovered, setCopyHovered] = useState<string | null>(null);\n\n const handleCopy = useCallback(async (field: string, value: string) => {\n const success = await copyToClipboard(value);\n if (success) {\n setCopiedField(field);\n setTimeout(() => setCopiedField(null), 1500);\n }\n }, []);\n\n // Not authenticated\n if (!isAuthenticated) {\n if (isLoading) {\n return (\n <>\n <style>{animations}</style>\n <div className={className} style={{ ...s.disconnected, ...style }}>\n <span style={s.spinner} />\n <span>Connecting...</span>\n </div>\n </>\n );\n }\n\n return (\n <div className={className} style={{ ...s.disconnected, ...style }}>\n <span style={s.dot} />\n <span>Not connected</span>\n </div>\n );\n }\n\n // Authenticated\n return (\n <>\n <style>{animations}</style>\n <div className={className} style={{ ...s.container, ...style }}>\n {/* Vault info wrapper for hover effect */}\n <div\n style={s.vaultInfoWrapper}\n onMouseEnter={() => showVaultInfo && setIsHovered(true)}\n onMouseLeave={() => showVaultInfo && setIsHovered(false)}\n >\n {/* Connected indicator - just a dot */}\n <span style={{ ...s.dot, ...s.dotConnected }} title=\"Connected\" />\n\n {/* Vault info dropdown on hover */}\n {showVaultInfo && isHovered && (\n <div style={s.vaultInfo}>\n <div style={s.vaultInfoHeader}>Vault Information</div>\n\n {/* Vault ID */}\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault ID</span>\n <div style={s.vaultValueRow}>\n <span style={s.vaultValue}>#{vaultId}</span>\n <CopyButton\n field=\"vaultId\"\n value={vaultId || ''}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n\n {/* Connected Wallet */}\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Connected Wallet</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{walletAddress}</span>\n <CopyButton\n field=\"wallet\"\n value={walletAddress || ''}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n\n {/* EVM Address */}\n {vaultInfo?.evmAddress && (\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault EVM Address</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{vaultInfo.evmAddress}</span>\n <CopyButton\n field=\"evmAddress\"\n value={vaultInfo.evmAddress}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n )}\n\n {/* Solana Address */}\n {vaultInfo?.solanaAddress && (\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault Solana Address</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{vaultInfo.solanaAddress}</span>\n <CopyButton\n field=\"solAddress\"\n value={vaultInfo.solanaAddress}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Logout button */}\n {showLogout && (\n <button\n type=\"button\"\n onClick={logout}\n style={{\n ...s.logoutBtn,\n ...(logoutHovered ? s.logoutBtnHover : {}),\n }}\n onMouseEnter={() => setLogoutHovered(true)}\n onMouseLeave={() => setLogoutHovered(false)}\n title=\"Disconnect\"\n >\n ⏻\n </button>\n )}\n </div>\n </>\n );\n}\n\n// Copy button helper\ninterface CopyButtonProps {\n field: string;\n value: string;\n copiedField: string | null;\n copyHovered: string | null;\n setCopyHovered: (field: string | null) => void;\n onCopy: (field: string, value: string) => void;\n}\n\nfunction CopyButton({ field, value, copiedField, copyHovered, setCopyHovered, onCopy }: CopyButtonProps) {\n const isCopied = copiedField === field;\n const isHovered = copyHovered === field;\n\n return (\n <button\n type=\"button\"\n onClick={() => onCopy(field, value)}\n style={{\n ...s.copyBtn,\n ...(isCopied ? s.copyBtnCopied : isHovered ? s.copyBtnHover : {}),\n }}\n onMouseEnter={() => setCopyHovered(field)}\n onMouseLeave={() => setCopyHovered(null)}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n );\n}\n\nexport default AuthStatus;\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for ConnectButton component
|
|
6
|
+
*/
|
|
7
|
+
interface ConnectButtonProps {
|
|
8
|
+
/** Additional CSS classes */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Additional inline styles */
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
/** Custom content when disconnected */
|
|
13
|
+
connectLabel?: React.ReactNode;
|
|
14
|
+
/** Custom content while loading */
|
|
15
|
+
loadingLabel?: React.ReactNode;
|
|
16
|
+
/** Callback after successful connection */
|
|
17
|
+
onConnect?: () => void;
|
|
18
|
+
/** Callback after disconnection */
|
|
19
|
+
onDisconnect?: () => void;
|
|
20
|
+
/** Show vault info dropdown when connected */
|
|
21
|
+
showVaultInfo?: boolean;
|
|
22
|
+
/** Disable the button */
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* ConnectButton - A button to trigger Emblem Auth connection
|
|
27
|
+
* When connected, shows vault info dropdown and separate disconnect button
|
|
28
|
+
*/
|
|
29
|
+
declare function ConnectButton({ className, style, connectLabel, loadingLabel, onConnect, onDisconnect, showVaultInfo, disabled, }: ConnectButtonProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Props for AuthStatus component
|
|
33
|
+
*/
|
|
34
|
+
interface AuthStatusProps {
|
|
35
|
+
/** Additional CSS classes */
|
|
36
|
+
className?: string;
|
|
37
|
+
/** Additional inline styles */
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
/** Show expandable vault details */
|
|
40
|
+
showVaultInfo?: boolean;
|
|
41
|
+
/** Show logout button */
|
|
42
|
+
showLogout?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* AuthStatus - Displays current authentication status and vault info
|
|
46
|
+
*/
|
|
47
|
+
declare function AuthStatus({ className, style, showVaultInfo, showLogout, }: AuthStatusProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
49
|
+
export { AuthStatus, type AuthStatusProps, ConnectButton, type ConnectButtonProps };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props for ConnectButton component
|
|
6
|
+
*/
|
|
7
|
+
interface ConnectButtonProps {
|
|
8
|
+
/** Additional CSS classes */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Additional inline styles */
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
/** Custom content when disconnected */
|
|
13
|
+
connectLabel?: React.ReactNode;
|
|
14
|
+
/** Custom content while loading */
|
|
15
|
+
loadingLabel?: React.ReactNode;
|
|
16
|
+
/** Callback after successful connection */
|
|
17
|
+
onConnect?: () => void;
|
|
18
|
+
/** Callback after disconnection */
|
|
19
|
+
onDisconnect?: () => void;
|
|
20
|
+
/** Show vault info dropdown when connected */
|
|
21
|
+
showVaultInfo?: boolean;
|
|
22
|
+
/** Disable the button */
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* ConnectButton - A button to trigger Emblem Auth connection
|
|
27
|
+
* When connected, shows vault info dropdown and separate disconnect button
|
|
28
|
+
*/
|
|
29
|
+
declare function ConnectButton({ className, style, connectLabel, loadingLabel, onConnect, onDisconnect, showVaultInfo, disabled, }: ConnectButtonProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Props for AuthStatus component
|
|
33
|
+
*/
|
|
34
|
+
interface AuthStatusProps {
|
|
35
|
+
/** Additional CSS classes */
|
|
36
|
+
className?: string;
|
|
37
|
+
/** Additional inline styles */
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
/** Show expandable vault details */
|
|
40
|
+
showVaultInfo?: boolean;
|
|
41
|
+
/** Show logout button */
|
|
42
|
+
showLogout?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* AuthStatus - Displays current authentication status and vault info
|
|
46
|
+
*/
|
|
47
|
+
declare function AuthStatus({ className, style, showVaultInfo, showLogout, }: AuthStatusProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
49
|
+
export { AuthStatus, type AuthStatusProps, ConnectButton, type ConnectButtonProps };
|