@gamifyio/react 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.tsx","../src/hooks.ts","../src/components.tsx"],"names":["GamifyContext","createContext","ThemeContext","defaultTheme","isServer","GamifyProvider","config","theme","children","clientRef","useRef","mergedTheme","useMemo","client","newClient","Gamify","useEffect","contextValue","eventType","properties","userId","traits","jsx","useGamifyContext","useContext","useGamifyTheme","useGamify","context","useTrack","useCallback","useIdentify","useSession","state","setState","useState","updateCart","items","coupons","currency","s","session","error","message","applyCoupon","code","complete","clearSession","refresh","useLoyalty","options","refreshProfile","profile","refreshHistory","limit","offset","history","useReferral","setReferrer","clearReferrer","detectFromUrl","useAffiliateStats","refreshStats","forceRefresh","stats","useLeaderboard","customLimit","leaderboard","useQuests","response","useStreaks","freeze","ruleId","result","useBadges","category","earned","b","locked","useRewards","available","i","unavailable","redeem","itemId","MotionDiv","AnimatePresenceWrapper","Fragment","framerMotion","GamifyErrorBoundary","React","props","withErrorBoundary","Component","fallback","WrappedComponent","GamifyPageView","pageName","pathname","track","lastPathRef","page","GamifyTrackClick","cloneElement","e","createThemedStyles","AffiliateStatsInner","className","style","themeOverride","autoRefresh","showTierBadge","showReferralCode","showEarningsBreakdown","renderLoading","renderError","globalTheme","themedStyles","loading","copied","setCopied","cardStyle","valueStyle","formatCurrency","cents","handleCopyCode","err","tierColor","tierName","name","containerStyle","jsxs","AffiliateStats","LeaderboardInner","currentUserId","emptyMessage","showMedals","showTierInfo","showEarnings","renderRow","getMedalColor","rank","getRowStyle","isCurrentUser","textStyle","secondaryStyle","currentUserRank","entry","index","medalColor","rowContent","Leaderboard","ReferralLinkInner","baseUrl","copyButtonText","copiedText","shareButtonText","shareTitle","shareText","showShareButton","showReferrerAttribution","referrerCode","onSetReferrer","onDetectFromUrl","onClearReferrer","onCopy","onShare","referrerInput","setReferrerInput","userReferralCode","origin","referralLink","handleCopy","handleShare","handleSetReferrer","canShare","inputStyle","buttonStyle","ReferralLink","gamificationStyles","getStatusColors","status","QuestProgressInner","questId","hideCompleted","expandable","defaultExpandedId","showXpReward","onComplete","renderQuest","quests","previousQuests","expandedQuestId","setExpandedQuestId","quest","prev","newMap","q","inProgressQuest","filteredQuests","getStatusBadgeStyle","getQuestBgStyle","toggleExpand","id","isExpanded","statusBadgeStyle","questBgStyle","questContent","step","QuestProgress","StreakFlameInner","size","showFreezeButton","onFreeze","streaks","freezing","setFreezing","displayStreaks","sizeStyles","handleFreeze","streakId","streak","statusColors","canFreeze","StreakFlame","BadgeGridInner","showLocked","columns","showProgressSummary","showFilterTabs","showStats","onBadgeClick","renderBadge","badges","filter","setFilter","shouldShowSummary","displayBadges","getRarityColors","rarity","gridStyle","unlockedCount","totalCount","progressPercent","f","badge","rarityColors","badgeContent","BadgeGrid","LevelProgressInner","showNextTier","showBenefits","progressFillStyle","key","value","LevelProgress","RewardStoreInner","showUnavailable","showPointsHeader","onRedeem","renderItem","userPoints","redeemingId","setRedeemingId","displayItems","handleRedeem","item","isRedeeming","RewardStore"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { Gamify, type GamifyConfig, type Theme, defaultTheme } from '@gamifyio/core';\n\n/**\n * Context value for Gamify React SDK\n */\nexport interface GamifyContextValue {\n /** The underlying Gamify client instance */\n client: Gamify;\n /** Track an event */\n track: (eventType: string, properties?: Record<string, unknown>) => void;\n /** Identify a user */\n identify: (userId: string, traits?: Record<string, unknown>) => void;\n /** Reset user identity */\n reset: () => void;\n /** Get current user ID */\n getUserId: () => string | null;\n /** Get anonymous ID */\n getAnonymousId: () => string;\n}\n\nconst GamifyContext = createContext<GamifyContextValue | null>(null);\n\n/**\n * Theme context for SDK components\n */\nconst ThemeContext = createContext<Theme>(defaultTheme);\n\n/**\n * Props for GamifyProvider\n */\nexport interface GamifyProviderProps {\n /** Gamify SDK configuration */\n config: GamifyConfig;\n /** Optional theme override (Partial<Theme>) */\n theme?: Partial<Theme>;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Check if code is running on the server\n */\nfunction isServer(): boolean {\n return typeof window === 'undefined';\n}\n\n/**\n * GamifyProvider - Initializes and provides Gamify SDK to React components\n *\n * @example\n * ```tsx\n * <GamifyProvider config={{ apiKey: 'your-api-key' }}>\n * <App />\n * </GamifyProvider>\n *\n * // With custom theme\n * <GamifyProvider\n * config={{ apiKey: 'your-api-key' }}\n * theme={{ primary: '#00FF00' }}\n * >\n * <App />\n * </GamifyProvider>\n * ```\n */\nexport function GamifyProvider({ config, theme, children }: GamifyProviderProps) {\n const clientRef = useRef<Gamify | null>(null);\n\n // Merge user theme with defaults\n const mergedTheme = useMemo<Theme>(() => {\n if (!theme) return defaultTheme;\n return { ...defaultTheme, ...theme };\n }, [theme]);\n\n // Initialize client only once and only on client-side\n const client = useMemo(() => {\n // SSR safety: return null on server\n if (isServer()) {\n return null;\n }\n\n // Reuse existing client if config hasn't changed\n if (clientRef.current) {\n return clientRef.current;\n }\n\n const newClient = new Gamify(config);\n clientRef.current = newClient;\n return newClient;\n }, [config.apiKey, config.endpoint]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (clientRef.current) {\n clientRef.current.shutdown();\n clientRef.current = null;\n }\n };\n }, []);\n\n // Create context value with wrapper methods\n const contextValue = useMemo<GamifyContextValue | null>(() => {\n if (!client) return null;\n\n return {\n client,\n track: (eventType, properties) => client.track(eventType, properties),\n identify: (userId, traits) => client.identify(userId, traits),\n reset: () => client.reset(),\n getUserId: () => client.getUserId(),\n getAnonymousId: () => client.getAnonymousId(),\n };\n }, [client]);\n\n // During SSR, render children without context but with theme\n if (!contextValue) {\n return (\n <ThemeContext.Provider value={mergedTheme}>\n {children}\n </ThemeContext.Provider>\n );\n }\n\n return (\n <ThemeContext.Provider value={mergedTheme}>\n <GamifyContext.Provider value={contextValue}>\n {children}\n </GamifyContext.Provider>\n </ThemeContext.Provider>\n );\n}\n\n/**\n * useGamifyContext - Internal hook to access Gamify context\n */\nexport function useGamifyContext(): GamifyContextValue | null {\n return useContext(GamifyContext);\n}\n\n/**\n * useGamifyTheme - Hook to access the current theme\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const theme = useGamifyTheme();\n * return <div style={{ color: theme.foreground }}>Themed content</div>;\n * }\n * ```\n */\nexport function useGamifyTheme(): Theme {\n return useContext(ThemeContext);\n}\n","'use client';\n\nimport { useCallback, useState, useEffect } from 'react';\nimport { useGamifyContext, type GamifyContextValue } from './context.js';\nimport type {\n CartItem,\n SessionResponse,\n LoyaltyProfile,\n LoyaltyHistoryResponse,\n // Issue #22: Affiliate types\n AffiliateStats,\n LeaderboardResponse,\n // Gamification types\n QuestWithProgress,\n StreakWithProgress,\n StreaksResponse,\n FreezeResponse,\n BadgeWithStatus,\n BadgesResponse,\n RewardItem,\n RewardsStoreResponse,\n RedemptionResult,\n} from '@gamifyio/core';\n\n/**\n * useGamify - Hook to access Gamify SDK methods\n *\n * @throws Error if used outside of GamifyProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track, identify } = useGamify();\n *\n * const handleClick = () => {\n * track('button_click', { buttonId: 'submit' });\n * };\n *\n * return <button onClick={handleClick}>Submit</button>;\n * }\n * ```\n */\nexport function useGamify(): GamifyContextValue {\n const context = useGamifyContext();\n\n if (!context) {\n throw new Error(\n 'useGamify must be used within a GamifyProvider. ' +\n 'Make sure your component is wrapped with <GamifyProvider>.'\n );\n }\n\n return context;\n}\n\n/**\n * useTrack - Hook for tracking events\n *\n * Returns a memoized track function that can be safely used in dependencies.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const track = useTrack();\n *\n * useEffect(() => {\n * track('component_viewed', { componentName: 'MyComponent' });\n * }, [track]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTrack(): (\n eventType: string,\n properties?: Record<string, unknown>\n) => void {\n const context = useGamifyContext();\n\n return useCallback(\n (eventType: string, properties?: Record<string, unknown>) => {\n if (context) {\n context.track(eventType, properties);\n }\n },\n [context]\n );\n}\n\n/**\n * useIdentify - Hook for identifying users\n *\n * Returns a memoized identify function.\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const identify = useIdentify();\n *\n * const handleLogin = async (user: User) => {\n * await loginUser(user);\n * identify(user.id, { email: user.email, name: user.name });\n * };\n *\n * return <button onClick={handleLogin}>Login</button>;\n * }\n * ```\n */\nexport function useIdentify(): (\n userId: string,\n traits?: Record<string, unknown>\n) => void {\n const context = useGamifyContext();\n\n return useCallback(\n (userId: string, traits?: Record<string, unknown>) => {\n if (context) {\n context.identify(userId, traits);\n }\n },\n [context]\n );\n}\n\n// ============================================\n// Issue #14: useSession Hook\n// ============================================\n\ninterface SessionState {\n session: SessionResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface SessionActions {\n updateCart: (items: CartItem[], coupons?: string[], currency?: string) => Promise<void>;\n applyCoupon: (code: string) => Promise<void>;\n complete: () => Promise<void>;\n clearSession: () => void;\n refresh: () => Promise<void>;\n}\n\n/**\n * useSession - Hook for managing cart sessions with discounts\n *\n * @example\n * ```tsx\n * function CartPage() {\n * const { session, loading, updateCart, applyCoupon, complete } = useSession();\n *\n * const handleAddItem = async (item: CartItem) => {\n * const items = [...(session?.items || []), item];\n * await updateCart(items);\n * };\n *\n * return (\n * <div>\n * {loading && <Spinner />}\n * <p>Subtotal: ${session?.subtotal}</p>\n * <p>Discount: ${session?.discount}</p>\n * <p>Total: ${session?.total}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSession(): SessionState & SessionActions {\n const context = useGamifyContext();\n const [state, setState] = useState<SessionState>({\n session: context?.client?.session?.getCachedSession() ?? null,\n loading: false,\n error: null,\n });\n\n const updateCart = useCallback(\n async (items: CartItem[], coupons?: string[], currency?: string) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.updateCart(items, coupons, currency);\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n const applyCoupon = useCallback(\n async (code: string) => {\n if (!context?.client?.session) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.applyCoupon(code);\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n const complete = useCallback(async () => {\n if (!context?.client?.session) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.complete();\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const clearSession = useCallback(() => {\n if (context?.client?.session) {\n context.client.session.clearSession();\n setState({ session: null, loading: false, error: null });\n }\n }, [context]);\n\n const refresh = useCallback(async () => {\n if (!context?.client?.session) {\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.getSession();\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n return {\n ...state,\n updateCart,\n applyCoupon,\n complete,\n clearSession,\n refresh,\n };\n}\n\n// ============================================\n// Issue #15: useLoyalty Hook\n// ============================================\n\ninterface LoyaltyState {\n profile: LoyaltyProfile | null;\n history: LoyaltyHistoryResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface LoyaltyActions {\n refreshProfile: () => Promise<void>;\n refreshHistory: (limit?: number, offset?: number) => Promise<void>;\n}\n\n/**\n * useLoyalty - Hook for managing customer loyalty data\n *\n * @param options - Auto-refresh options\n *\n * @example\n * ```tsx\n * function LoyaltyDashboard() {\n * const { profile, history, loading, refreshProfile } = useLoyalty({\n * autoRefresh: true,\n * });\n *\n * return (\n * <div>\n * {loading && <Spinner />}\n * <p>Points: {profile?.points}</p>\n * <p>Tier: {profile?.tier?.name}</p>\n * <p>Next tier: {profile?.nextTier?.name} ({profile?.nextTier?.pointsNeeded} points needed)</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useLoyalty(options?: {\n autoRefresh?: boolean;\n}): LoyaltyState & LoyaltyActions {\n const context = useGamifyContext();\n const [state, setState] = useState<LoyaltyState>({\n profile: context?.client?.loyalty?.getCachedProfile() ?? null,\n history: null,\n loading: false,\n error: null,\n });\n\n const refreshProfile = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const profile = await context.client.getLoyaltyProfile();\n setState((s) => ({ ...s, profile, loading: false, error: null }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const refreshHistory = useCallback(\n async (limit?: number, offset?: number) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const history = await context.client.getLoyaltyHistory(limit, offset);\n setState((s) => ({ ...s, history, loading: false, error: null }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refreshProfile();\n }\n }, [options?.autoRefresh, context, refreshProfile]);\n\n return {\n ...state,\n refreshProfile,\n refreshHistory,\n };\n}\n\n// ============================================\n// Issue #22: useReferral Hook\n// ============================================\n\ninterface ReferralState {\n referrerCode: string | null;\n hasReferrer: boolean;\n}\n\ninterface ReferralActions {\n setReferrer: (code: string) => void;\n clearReferrer: () => void;\n detectFromUrl: () => string | null;\n}\n\n/**\n * useReferral - Hook for managing referral attribution\n *\n * Automatically detects `?ref=code` parameter from URLs and stores\n * the referrer code in localStorage for attribution tracking.\n *\n * @example\n * ```tsx\n * function SignupPage() {\n * const { referrerCode, hasReferrer, setReferrer } = useReferral();\n *\n * useEffect(() => {\n * if (hasReferrer) {\n * console.log('User was referred by:', referrerCode);\n * }\n * }, [hasReferrer, referrerCode]);\n *\n * return (\n * <div>\n * {hasReferrer && <p>Thanks for using referral code: {referrerCode}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useReferral(): ReferralState & ReferralActions {\n const context = useGamifyContext();\n const [state, setState] = useState<ReferralState>({\n referrerCode: context?.client?.referral?.getReferrer() ?? null,\n hasReferrer: context?.client?.referral?.hasReferrer() ?? false,\n });\n\n const setReferrer = useCallback(\n (code: string) => {\n if (context?.client?.referral) {\n context.client.referral.setReferrer(code);\n setState({\n referrerCode: code,\n hasReferrer: true,\n });\n }\n },\n [context]\n );\n\n const clearReferrer = useCallback(() => {\n if (context?.client?.referral) {\n context.client.referral.clearReferrer();\n setState({\n referrerCode: null,\n hasReferrer: false,\n });\n }\n }, [context]);\n\n const detectFromUrl = useCallback(() => {\n if (context?.client?.referral) {\n const code = context.client.referral.detectReferrerFromUrl();\n if (code) {\n setState({\n referrerCode: code,\n hasReferrer: true,\n });\n }\n return code;\n }\n return null;\n }, [context]);\n\n // Auto-detect on mount\n useEffect(() => {\n if (context?.client?.referral) {\n const code = context.client.referral.getReferrer();\n setState({\n referrerCode: code,\n hasReferrer: code !== null,\n });\n }\n }, [context]);\n\n return {\n ...state,\n setReferrer,\n clearReferrer,\n detectFromUrl,\n };\n}\n\n// ============================================\n// Issue #22: useAffiliateStats Hook\n// ============================================\n\ninterface AffiliateState {\n stats: AffiliateStats | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface AffiliateActions {\n refreshStats: (forceRefresh?: boolean) => Promise<void>;\n}\n\n/**\n * useAffiliateStats - Hook for fetching user affiliate statistics\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function AffiliateDashboard() {\n * const { stats, loading, error, refreshStats } = useAffiliateStats({\n * autoRefresh: true,\n * });\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <div>\n * <p>Your referral code: {stats?.referralCode}</p>\n * <p>Referrals: {stats?.referralCount}</p>\n * <p>Total earnings: ${(stats?.earnings.totalEarned ?? 0) / 100}</p>\n * <p>Current tier: {stats?.tier?.name ?? 'None'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAffiliateStats(options?: {\n autoRefresh?: boolean;\n}): AffiliateState & AffiliateActions {\n const context = useGamifyContext();\n const [state, setState] = useState<AffiliateState>({\n stats: context?.client?.affiliate?.getCachedStats() ?? null,\n loading: false,\n error: null,\n });\n\n const refreshStats = useCallback(\n async (forceRefresh = false) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const stats = await context.client.getAffiliateStats(forceRefresh);\n setState({ stats, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refreshStats();\n }\n }, [options?.autoRefresh, context, refreshStats]);\n\n return {\n ...state,\n refreshStats,\n };\n}\n\n// ============================================\n// Issue #22: useLeaderboard Hook\n// ============================================\n\ninterface LeaderboardState {\n leaderboard: LeaderboardResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface LeaderboardActions {\n refresh: (limit?: number) => Promise<void>;\n}\n\n/**\n * useLeaderboard - Hook for fetching affiliate leaderboard data\n *\n * @param limit - Number of entries to fetch (default: 10)\n *\n * @example\n * ```tsx\n * function LeaderboardPage() {\n * const { leaderboard, loading, error, refresh } = useLeaderboard(10);\n *\n * useEffect(() => {\n * refresh();\n * }, [refresh]);\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <ol>\n * {leaderboard?.entries.map((entry) => (\n * <li key={entry.userId}>\n * #{entry.rank} - {entry.displayName}: {entry.referralCount} referrals\n * </li>\n * ))}\n * </ol>\n * );\n * }\n * ```\n */\nexport function useLeaderboard(\n limit = 10\n): LeaderboardState & LeaderboardActions {\n const context = useGamifyContext();\n const [state, setState] = useState<LeaderboardState>({\n leaderboard: null,\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(\n async (customLimit?: number) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const leaderboard = await context.client.getLeaderboard(customLimit ?? limit);\n setState({ leaderboard, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context, limit]\n );\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #25-28: useQuests Hook\n// ============================================\n\ninterface QuestsState {\n quests: QuestWithProgress[];\n loading: boolean;\n error: string | null;\n}\n\ninterface QuestsActions {\n refresh: () => Promise<void>;\n}\n\n/**\n * useQuests - Hook for fetching user's quest progress\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function QuestsPage() {\n * const { quests, loading, error, refresh } = useQuests({ autoRefresh: true });\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <div>\n * {quests.map((quest) => (\n * <div key={quest.id}>\n * <h3>{quest.name}</h3>\n * <p>Progress: {quest.percentComplete}%</p>\n * <p>Status: {quest.status}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuests(options?: {\n autoRefresh?: boolean;\n}): QuestsState & QuestsActions {\n const context = useGamifyContext();\n const [state, setState] = useState<QuestsState>({\n quests: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getQuests();\n setState({ quests: response.quests, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #32: useStreaks Hook\n// ============================================\n\ninterface StreaksState {\n streaks: StreakWithProgress[];\n stats: StreaksResponse['stats'] | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface StreaksActions {\n refresh: () => Promise<void>;\n freeze: (ruleId: string) => Promise<FreezeResponse | null>;\n}\n\n/**\n * useStreaks - Hook for managing user's streak progress\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function StreaksPage() {\n * const { streaks, stats, loading, freeze } = useStreaks({ autoRefresh: true });\n *\n * return (\n * <div>\n * <p>Active streaks: {stats?.totalActive}</p>\n * {streaks.map((streak) => (\n * <div key={streak.id}>\n * <span>🔥 {streak.currentCount}</span>\n * <span>{streak.name}</span>\n * {streak.freezeInventory > 0 && (\n * <button onClick={() => freeze(streak.id)}>\n * Use Freeze ({streak.freezeInventory} left)\n * </button>\n * )}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStreaks(options?: {\n autoRefresh?: boolean;\n}): StreaksState & StreaksActions {\n const context = useGamifyContext();\n const [state, setState] = useState<StreaksState>({\n streaks: [],\n stats: null,\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getStreaks();\n setState({\n streaks: response.streaks,\n stats: response.stats,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const freeze = useCallback(\n async (ruleId: string): Promise<FreezeResponse | null> => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return null;\n }\n\n try {\n const result = await context.client.useStreakFreeze(ruleId);\n // Refresh to update freeze count\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, error: message }));\n return null;\n }\n },\n [context, refresh]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n freeze,\n };\n}\n\n// ============================================\n// Issue #33: useBadges Hook\n// ============================================\n\ninterface BadgesState {\n badges: BadgeWithStatus[];\n stats: BadgesResponse['stats'] | null;\n earned: BadgeWithStatus[];\n locked: BadgeWithStatus[];\n loading: boolean;\n error: string | null;\n}\n\ninterface BadgesActions {\n refresh: (category?: string) => Promise<void>;\n}\n\n/**\n * useBadges - Hook for fetching user's badge collection\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function BadgesPage() {\n * const { badges, earned, locked, stats, loading } = useBadges({ autoRefresh: true });\n *\n * return (\n * <div>\n * <p>Unlocked: {stats?.unlocked} / {stats?.total}</p>\n * <div className=\"grid\">\n * {badges.map((badge) => (\n * <div key={badge.id} className={badge.isUnlocked ? '' : 'grayscale'}>\n * <img src={badge.iconUrl} alt={badge.name} />\n * <span>{badge.name}</span>\n * <span className={`rarity-${badge.rarity.toLowerCase()}`}>\n * {badge.rarity}\n * </span>\n * </div>\n * ))}\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useBadges(options?: {\n autoRefresh?: boolean;\n category?: string;\n}): BadgesState & BadgesActions {\n const context = useGamifyContext();\n const [state, setState] = useState<BadgesState>({\n badges: [],\n stats: null,\n earned: [],\n locked: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(\n async (category?: string) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getBadges(category ?? options?.category);\n const earned = response.badges.filter((b) => b.isUnlocked);\n const locked = response.badges.filter((b) => !b.isUnlocked);\n setState({\n badges: response.badges,\n stats: response.stats,\n earned,\n locked,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context, options?.category]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #34: useRewards Hook\n// ============================================\n\ninterface RewardsState {\n items: RewardItem[];\n userPoints: number;\n available: RewardItem[];\n unavailable: RewardItem[];\n loading: boolean;\n error: string | null;\n}\n\ninterface RewardsActions {\n refresh: () => Promise<void>;\n redeem: (itemId: string) => Promise<RedemptionResult | null>;\n}\n\n/**\n * useRewards - Hook for fetching and redeeming rewards\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function RewardsStore() {\n * const { items, userPoints, loading, redeem } = useRewards({ autoRefresh: true });\n *\n * const handleRedeem = async (itemId: string) => {\n * const result = await redeem(itemId);\n * if (result?.success) {\n * alert('Reward redeemed!');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Your points: {userPoints}</p>\n * <div className=\"grid\">\n * {items.map((item) => (\n * <div key={item.id}>\n * <img src={item.imageUrl} alt={item.name} />\n * <span>{item.name}</span>\n * <span>{item.pointsCost} points</span>\n * <button\n * disabled={!item.isAvailable}\n * onClick={() => handleRedeem(item.id)}\n * >\n * {item.canAfford ? 'Redeem' : `Need ${item.pointsCost - userPoints} more`}\n * </button>\n * </div>\n * ))}\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useRewards(options?: {\n autoRefresh?: boolean;\n}): RewardsState & RewardsActions {\n const context = useGamifyContext();\n const [state, setState] = useState<RewardsState>({\n items: [],\n userPoints: 0,\n available: [],\n unavailable: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getRewardsStore();\n const available = response.items.filter((i) => i.isAvailable);\n const unavailable = response.items.filter((i) => !i.isAvailable);\n setState({\n items: response.items,\n userPoints: response.userPoints,\n available,\n unavailable,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const redeem = useCallback(\n async (itemId: string): Promise<RedemptionResult | null> => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return null;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const result = await context.client.redeemReward(itemId);\n // Refresh to update points and availability\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n return null;\n }\n },\n [context, refresh]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n redeem,\n };\n}\n","'use client';\n\nimport React, { useEffect, useRef, useState, cloneElement } from 'react';\nimport {\n useTrack,\n useAffiliateStats,\n useLeaderboard,\n useReferral,\n useQuests,\n useStreaks,\n useBadges,\n useRewards,\n useLoyalty,\n} from './hooks.js';\nimport { useGamifyTheme } from './context.js';\nimport type { Theme } from '@gamifyio/core';\nimport type {\n LeaderboardEntry,\n QuestWithProgress,\n QuestStep,\n StreakWithProgress,\n BadgeWithStatus,\n BadgeRarity,\n RewardItem,\n RedemptionResult,\n} from '@gamifyio/core';\n\n// ============================================\n// Optional framer-motion support\n// ============================================\n\ntype MotionComponent = React.ComponentType<{\n initial?: Record<string, unknown>;\n animate?: Record<string, unknown>;\n exit?: Record<string, unknown>;\n transition?: Record<string, unknown>;\n style?: React.CSSProperties;\n className?: string;\n children?: React.ReactNode;\n key?: string | number;\n onClick?: () => void;\n}>;\n\ntype AnimatePresenceComponent = React.ComponentType<{\n children?: React.ReactNode;\n mode?: 'sync' | 'wait' | 'popLayout';\n}>;\n\nlet MotionDiv: MotionComponent | 'div' = 'div';\nlet AnimatePresenceWrapper: AnimatePresenceComponent = ({ children }: { children?: React.ReactNode }) => <>{children}</>;\n\n// Try to import framer-motion (will fail gracefully if not installed)\ntry {\n // Dynamic import at module level for bundlers that support it\n const framerMotion = require('framer-motion');\n if (framerMotion?.motion?.div) {\n MotionDiv = framerMotion.motion.div;\n }\n if (framerMotion?.AnimatePresence) {\n AnimatePresenceWrapper = framerMotion.AnimatePresence;\n }\n} catch {\n // framer-motion not installed, use fallbacks\n}\n\n// Helper to check if animations are available\nconst hasAnimations = MotionDiv !== 'div';\n\n// ============================================\n// Error Boundary for SDK Components\n// ============================================\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\n/**\n * Error boundary component to prevent SDK components from crashing client sites\n */\nclass GamifyErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n return (\n <div style={{ padding: '16px', color: '#6c757d', fontSize: '14px', textAlign: 'center' }}>\n Unable to load this section. Please try refreshing the page.\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n/**\n * HOC to wrap components with error boundary\n */\nfunction withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n fallback?: React.ReactNode\n): React.FC<P> {\n const WrappedComponent: React.FC<P> = (props: P) => {\n return (\n <GamifyErrorBoundary fallback={fallback}>\n <Component {...props} />\n </GamifyErrorBoundary>\n );\n };\n WrappedComponent.displayName = `WithErrorBoundary(${Component.displayName || Component.name || 'Component'})`;\n return WrappedComponent;\n}\n\n/**\n * Props for GamifyPageView component\n */\nexport interface GamifyPageViewProps {\n /** Custom page name (defaults to document.title or window.location.pathname) */\n pageName?: string;\n /** Additional properties to include with page view events */\n properties?: Record<string, unknown>;\n /** Track on route changes (for SPAs) - requires pathname prop */\n pathname?: string;\n}\n\n/**\n * GamifyPageView - Component for automatic page view tracking\n *\n * Place this component in your layout or page components to automatically\n * track page views. For SPAs using Next.js App Router, pass the pathname\n * from usePathname() to track route changes.\n *\n * @example\n * ```tsx\n * // Basic usage - tracks on mount\n * function Page() {\n * return (\n * <>\n * <GamifyPageView />\n * <div>Page content</div>\n * </>\n * );\n * }\n *\n * // With Next.js App Router\n * 'use client';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * return (\n * <>\n * <GamifyPageView pathname={pathname} />\n * {children}\n * </>\n * );\n * }\n *\n * // With custom properties\n * function ProductPage({ productId }) {\n * return (\n * <>\n * <GamifyPageView\n * pageName=\"Product Detail\"\n * properties={{ productId, category: 'electronics' }}\n * />\n * <div>Product content</div>\n * </>\n * );\n * }\n * ```\n */\nexport function GamifyPageView({\n pageName,\n properties,\n pathname,\n}: GamifyPageViewProps) {\n const track = useTrack();\n const lastPathRef = useRef<string | null>(null);\n\n useEffect(() => {\n // Skip if running on server\n if (typeof window === 'undefined') {\n return;\n }\n\n // For SPA routing: only track if pathname changed\n if (pathname !== undefined) {\n if (lastPathRef.current === pathname) {\n return;\n }\n lastPathRef.current = pathname;\n }\n\n // Determine page name\n const page =\n pageName ??\n (typeof document !== 'undefined' ? document.title : null) ??\n (typeof window !== 'undefined' ? window.location.pathname : 'unknown');\n\n // Track page view\n track('page_view', {\n page,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n ...properties,\n });\n }, [track, pageName, pathname, properties]);\n\n // This component doesn't render anything\n return null;\n}\n\n/**\n * Props for GamifyTrackClick component\n */\nexport interface GamifyTrackClickProps {\n /** Event type to track */\n eventType: string;\n /** Properties to include with the event */\n properties?: Record<string, unknown>;\n /** Child element (must accept onClick) */\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>;\n}\n\n/**\n * GamifyTrackClick - Component wrapper for click tracking\n *\n * Wraps a child element and tracks clicks automatically.\n *\n * @example\n * ```tsx\n * <GamifyTrackClick\n * eventType=\"button_click\"\n * properties={{ buttonId: 'subscribe', location: 'header' }}\n * >\n * <button>Subscribe</button>\n * </GamifyTrackClick>\n * ```\n */\nexport function GamifyTrackClick({\n eventType,\n properties,\n children,\n}: GamifyTrackClickProps) {\n const track = useTrack();\n\n const handleClick = (e: React.MouseEvent) => {\n track(eventType, properties);\n\n // Call original onClick if it exists\n if (children.props.onClick) {\n children.props.onClick(e);\n }\n };\n\n // Clone the child and inject onClick handler\n return cloneElement(children, { onClick: handleClick });\n}\n\n// ============================================\n// Issue #23: Affiliate UI Components\n// ============================================\n\n/**\n * Create themed styles for SDK components\n * Uses CSS-in-JS for zero-dependency styling\n */\nfunction createThemedStyles(theme: Theme) {\n return {\n statsContainer: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n statsCard: {\n backgroundColor: theme.cardBackground ?? theme.background,\n borderRadius: '8px',\n padding: '16px',\n textAlign: 'center' as const,\n border: `1px solid ${theme.cardBorder ?? theme.border}`,\n } as React.CSSProperties,\n statsValue: {\n fontSize: '24px',\n fontWeight: 'bold',\n color: theme.foreground,\n marginBottom: '4px',\n } as React.CSSProperties,\n statsLabel: {\n fontSize: '14px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n leaderboardContainer: {\n padding: '16px',\n } as React.CSSProperties,\n leaderboardList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n } as React.CSSProperties,\n leaderboardRow: {\n display: 'flex',\n alignItems: 'center',\n padding: '12px',\n borderBottom: `1px solid ${theme.border}`,\n } as React.CSSProperties,\n leaderboardRowHighlighted: {\n display: 'flex',\n alignItems: 'center',\n padding: '12px',\n borderBottom: `1px solid ${theme.border}`,\n backgroundColor: `${theme.primary}20`,\n } as React.CSSProperties,\n leaderboardRank: {\n fontWeight: 'bold',\n width: '40px',\n color: theme.foreground,\n } as React.CSSProperties,\n leaderboardName: {\n flex: 1,\n marginLeft: '12px',\n color: theme.foreground,\n } as React.CSSProperties,\n leaderboardStats: {\n color: theme.foregroundSecondary,\n fontSize: '14px',\n } as React.CSSProperties,\n leaderboardEmpty: {\n textAlign: 'center' as const,\n padding: '32px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n referralContainer: {\n display: 'flex',\n gap: '8px',\n padding: '8px',\n } as React.CSSProperties,\n referralInput: {\n flex: 1,\n padding: '10px 12px',\n border: `1px solid ${theme.inputBorder ?? theme.border}`,\n borderRadius: '6px',\n fontSize: '14px',\n backgroundColor: theme.inputBackground ?? theme.backgroundSecondary,\n color: theme.foreground,\n } as React.CSSProperties,\n referralButton: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: theme.buttonBackground ?? theme.primary,\n color: theme.buttonForeground ?? theme.primaryForeground,\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n } as React.CSSProperties,\n // Tier badge styles\n tierBadge: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px',\n borderRadius: '8px',\n marginBottom: '12px',\n } as React.CSSProperties,\n tierBadgeIcon: {\n width: '20px',\n height: '20px',\n } as React.CSSProperties,\n tierBadgeText: {\n flex: 1,\n } as React.CSSProperties,\n tierBadgeName: {\n fontWeight: '500',\n fontSize: '14px',\n } as React.CSSProperties,\n tierBadgeRate: {\n fontSize: '12px',\n opacity: 0.8,\n } as React.CSSProperties,\n // Referral code row\n referralCodeRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: theme.backgroundSecondary,\n borderRadius: '8px',\n marginBottom: '12px',\n } as React.CSSProperties,\n referralCodeLabel: {\n fontSize: '12px',\n color: theme.foregroundSecondary,\n marginBottom: '2px',\n } as React.CSSProperties,\n referralCodeValue: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n referralCodeCopyButton: {\n padding: '6px 10px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: theme.foregroundSecondary,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as React.CSSProperties,\n // 2-column stats grid\n statsGrid2Col: {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '12px',\n marginBottom: '12px',\n } as React.CSSProperties,\n // Earnings breakdown\n earningsBreakdown: {\n borderTop: `1px solid ${theme.border}`,\n paddingTop: '12px',\n marginTop: '12px',\n } as React.CSSProperties,\n earningsTitle: {\n fontSize: '14px',\n fontWeight: '500',\n color: theme.foreground,\n marginBottom: '8px',\n } as React.CSSProperties,\n earningsRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '4px 0',\n } as React.CSSProperties,\n earningsLabel: {\n fontSize: '14px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n earningsValue: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n earningsValueGreen: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.success,\n } as React.CSSProperties,\n earningsValueYellow: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.warning,\n } as React.CSSProperties,\n // Medal styles for leaderboard\n medalIcon: {\n width: '24px',\n height: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '18px',\n } as React.CSSProperties,\n // Referrer attribution\n referrerSection: {\n borderTop: `1px solid ${theme.border}`,\n paddingTop: '12px',\n marginTop: '12px',\n } as React.CSSProperties,\n referrerTitle: {\n fontSize: '14px',\n fontWeight: '500',\n color: theme.foreground,\n marginBottom: '8px',\n } as React.CSSProperties,\n referrerBadge: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: `${theme.success}15`,\n border: `1px solid ${theme.success}30`,\n borderRadius: '8px',\n } as React.CSSProperties,\n referrerBadgeInfo: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n referrerBadgeIcon: {\n color: theme.success,\n } as React.CSSProperties,\n referrerClearButton: {\n padding: '4px 8px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: theme.foregroundSecondary,\n cursor: 'pointer',\n } as React.CSSProperties,\n referrerInputRow: {\n display: 'flex',\n gap: '8px',\n marginBottom: '8px',\n } as React.CSSProperties,\n referrerDetectButton: {\n width: '100%',\n padding: '10px 16px',\n border: `1px solid ${theme.border}`,\n borderRadius: '6px',\n backgroundColor: theme.backgroundSecondary,\n color: theme.foreground,\n cursor: 'pointer',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n } as React.CSSProperties,\n // Filter tabs\n filterTabs: {\n display: 'flex',\n gap: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n filterTab: {\n padding: '6px 12px',\n fontSize: '12px',\n borderRadius: '9999px',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: theme.backgroundSecondary,\n color: theme.foregroundSecondary,\n transition: 'all 0.2s',\n } as React.CSSProperties,\n filterTabActive: {\n padding: '6px 12px',\n fontSize: '12px',\n borderRadius: '9999px',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: theme.primary,\n color: theme.primaryForeground,\n } as React.CSSProperties,\n // Progress summary for badges\n progressSummary: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: theme.backgroundSecondary,\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n progressSummaryLeft: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n } as React.CSSProperties,\n progressSummaryIcon: {\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: `${theme.primary}20`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.primary,\n fontSize: '18px',\n } as React.CSSProperties,\n progressSummaryText: {\n fontWeight: '500',\n fontSize: '16px',\n color: theme.foreground,\n } as React.CSSProperties,\n progressSummarySubtext: {\n fontSize: '12px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n progressSummaryBar: {\n width: '80px',\n height: '8px',\n backgroundColor: theme.border,\n borderRadius: '4px',\n overflow: 'hidden',\n } as React.CSSProperties,\n progressSummaryBarFill: {\n height: '100%',\n backgroundColor: theme.primary,\n borderRadius: '4px',\n } as React.CSSProperties,\n // Badge progress bar for locked badges\n badgeProgressBar: {\n width: '100%',\n height: '4px',\n backgroundColor: theme.border,\n borderRadius: '2px',\n overflow: 'hidden',\n marginTop: '8px',\n } as React.CSSProperties,\n badgeProgressFill: {\n height: '100%',\n backgroundColor: theme.foregroundSecondary,\n borderRadius: '2px',\n } as React.CSSProperties,\n badgeProgressText: {\n fontSize: '10px',\n color: theme.foregroundSecondary,\n marginTop: '4px',\n } as React.CSSProperties,\n badgeCheckmark: {\n position: 'absolute' as const,\n top: '8px',\n right: '8px',\n color: theme.success,\n } as React.CSSProperties,\n };\n}\n\n// Type for themed styles\ntype ThemedStyles = ReturnType<typeof createThemedStyles>;\n\n/**\n * Props for AffiliateStats component\n */\nexport interface AffiliateStatsProps {\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n valueColor?: string;\n labelColor?: string;\n };\n /** Auto-refresh stats on mount */\n autoRefresh?: boolean;\n /** Show tier badge with commission rate (default: true) */\n showTierBadge?: boolean;\n /** Show referral code with copy button (default: true) */\n showReferralCode?: boolean;\n /** Show earnings breakdown section (default: true) */\n showEarningsBreakdown?: boolean;\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * AffiliateStats - Display grid with affiliate statistics\n *\n * Shows referral count, clicks, and earnings in a card layout.\n * Headless-first: unstyled by default but includes sensible defaults.\n *\n * @example\n * ```tsx\n * <AffiliateStats autoRefresh />\n *\n * // With custom theme\n * <AffiliateStats\n * theme={{ cardBackground: '#1a1a1a', valueColor: '#fff' }}\n * />\n * ```\n */\nfunction AffiliateStatsInner({\n className,\n style,\n theme: themeOverride,\n autoRefresh = true,\n showTierBadge = true,\n showReferralCode = true,\n showEarningsBreakdown = true,\n renderLoading,\n renderError,\n}: AffiliateStatsProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { stats, loading, error, refreshStats } = useAffiliateStats({ autoRefresh });\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (autoRefresh) {\n void refreshStats();\n }\n }, [autoRefresh, refreshStats]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n if (!stats || !stats.earnings) {\n return null;\n }\n\n const cardStyle = {\n ...themedStyles.statsCard,\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { border: `1px solid ${themeOverride.cardBorder}` }),\n };\n\n const valueStyle = {\n ...themedStyles.statsValue,\n ...(themeOverride?.valueColor && { color: themeOverride.valueColor }),\n };\n\n const formatCurrency = (cents: number) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: stats.earnings?.currency ?? 'USD',\n }).format(cents / 100);\n };\n\n const handleCopyCode = async () => {\n if (!stats.referralCode) return;\n try {\n await navigator.clipboard.writeText(stats.referralCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n // Get tier color based on tier name (common tier naming conventions)\n const getTierColor = (tierName?: string): string => {\n if (!tierName) return '#6c757d';\n const name = tierName.toLowerCase();\n if (name.includes('elite') || name.includes('diamond') || name.includes('platinum')) return '#FFD700';\n if (name.includes('gold') || name.includes('vip')) return '#FFD700';\n if (name.includes('silver') || name.includes('pro')) return '#C0C0C0';\n if (name.includes('bronze') || name.includes('starter')) return '#CD7F32';\n return '#0d6efd'; // Default blue\n };\n\n const tierColor = getTierColor(stats.tier?.name);\n\n const containerStyle: React.CSSProperties = {\n padding: '16px',\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { border: `1px solid ${themeOverride.cardBorder}` }),\n ...style,\n };\n\n return (\n <div className={className} style={containerStyle}>\n {/* Tier Badge */}\n {showTierBadge && (\n <div\n style={{\n ...themedStyles.tierBadge,\n backgroundColor: stats.tier ? `${tierColor}20` : globalTheme.backgroundSecondary,\n }}\n >\n <span style={{ ...themedStyles.tierBadgeIcon, color: tierColor }}>👑</span>\n <div style={themedStyles.tierBadgeText}>\n <div style={{ ...themedStyles.tierBadgeName, color: stats.tier ? tierColor : globalTheme.foregroundSecondary }}>\n {stats.tier ? `${stats.tier.name} Affiliate` : 'No Tier'}\n </div>\n <div style={{ ...themedStyles.tierBadgeRate, color: stats.tier ? tierColor : globalTheme.foregroundSecondary }}>\n {stats.tier\n ? `${stats.tier.value}% commission rate`\n : 'Refer users to unlock affiliate status'}\n </div>\n </div>\n </div>\n )}\n\n {/* Referral Code */}\n {showReferralCode && stats.referralCode && (\n <div style={themedStyles.referralCodeRow}>\n <div>\n <div style={themedStyles.referralCodeLabel}>Your referral code</div>\n <div style={themedStyles.referralCodeValue}>{stats.referralCode}</div>\n </div>\n <button\n type=\"button\"\n onClick={handleCopyCode}\n style={themedStyles.referralCodeCopyButton}\n aria-label=\"Copy referral code\"\n >\n {copied ? '✓' : '📋'}\n </button>\n </div>\n )}\n\n {/* 2-Column Stats Grid */}\n <div style={themedStyles.statsGrid2Col}>\n <div style={cardStyle}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', color: globalTheme.foregroundSecondary, marginBottom: '4px' }}>\n <span>👥</span>\n <span style={{ fontSize: '12px' }}>Referrals</span>\n </div>\n <div style={{ ...valueStyle, fontFamily: 'monospace' }}>{stats.referralCount}</div>\n </div>\n <div style={cardStyle}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', color: globalTheme.foregroundSecondary, marginBottom: '4px' }}>\n <span>💰</span>\n <span style={{ fontSize: '12px' }}>Commissions</span>\n </div>\n <div style={{ ...valueStyle, fontFamily: 'monospace' }}>{stats.earnings.transactionCount}</div>\n </div>\n </div>\n\n {/* Earnings Breakdown */}\n {showEarningsBreakdown && (\n <div style={themedStyles.earningsBreakdown}>\n <div style={themedStyles.earningsTitle}>Earnings</div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Total Earned</span>\n <span style={themedStyles.earningsValueGreen}>\n {formatCurrency(stats.earnings.totalEarned)}\n </span>\n </div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Pending</span>\n <span style={themedStyles.earningsValueYellow}>\n {formatCurrency(stats.earnings.totalPending)}\n </span>\n </div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Paid Out</span>\n <span style={{ ...themedStyles.earningsValue, color: globalTheme.foregroundSecondary }}>\n {formatCurrency(stats.earnings.totalPaid)}\n </span>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const AffiliateStats = withErrorBoundary(AffiliateStatsInner);\n\n/**\n * Props for Leaderboard component\n */\nexport interface LeaderboardProps {\n /** Number of entries to display (default: 10) */\n limit?: number;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Current user ID for highlighting */\n currentUserId?: string;\n /** Custom empty state message */\n emptyMessage?: string;\n /** Show medal icons for top 3 positions (default: true) */\n showMedals?: boolean;\n /** Show tier info with percentage (default: true) */\n showTierInfo?: boolean;\n /** Show earnings column (default: true) */\n showEarnings?: boolean;\n /** Theme customization */\n theme?: {\n rowBackground?: string;\n highlightBackground?: string;\n textColor?: string;\n secondaryColor?: string;\n };\n /** Custom render for each row */\n renderRow?: (entry: LeaderboardEntry, isCurrentUser: boolean) => React.ReactNode;\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * Leaderboard - Ranked affiliate leaderboard display\n *\n * Shows ranked list of top affiliates with referral counts.\n * Highlights the current user if their ID is provided.\n *\n * @example\n * ```tsx\n * <Leaderboard limit={10} currentUserId={userId} />\n *\n * // With custom render\n * <Leaderboard\n * renderRow={(entry, isCurrent) => (\n * <div className={isCurrent ? 'highlight' : ''}>\n * #{entry.rank} - {entry.displayName}\n * </div>\n * )}\n * />\n * ```\n */\nfunction LeaderboardInner({\n limit = 10,\n className,\n style,\n currentUserId,\n emptyMessage = 'No leaderboard data available yet.',\n showMedals = true,\n showTierInfo = true,\n showEarnings = true,\n theme: themeOverride,\n renderRow,\n renderLoading,\n renderError,\n}: LeaderboardProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { leaderboard, loading, error, refresh } = useLeaderboard(limit);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n if (!leaderboard || leaderboard.entries.length === 0) {\n return (\n <div className={className} style={{ ...themedStyles.leaderboardEmpty, ...style }}>\n {emptyMessage}\n </div>\n );\n }\n\n // Medal colors for top 3\n const getMedalColor = (rank: number): string | null => {\n if (!showMedals) return null;\n switch (rank) {\n case 1: return globalTheme.medalGold;\n case 2: return globalTheme.medalSilver;\n case 3: return globalTheme.medalBronze;\n default: return null;\n }\n };\n\n const formatCurrency = (cents: number) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(cents / 100);\n };\n\n const getRowStyle = (isCurrentUser: boolean): React.CSSProperties => ({\n ...(isCurrentUser ? themedStyles.leaderboardRowHighlighted : themedStyles.leaderboardRow),\n ...(themeOverride?.rowBackground && !isCurrentUser && { backgroundColor: themeOverride.rowBackground }),\n ...(themeOverride?.highlightBackground && isCurrentUser && { backgroundColor: themeOverride.highlightBackground }),\n ...(isCurrentUser && {\n backgroundColor: `${globalTheme.primary}15`,\n border: `1px solid ${globalTheme.primary}40`,\n borderRadius: '8px',\n }),\n });\n\n const textStyle = themeOverride?.textColor ? { color: themeOverride.textColor } : {};\n const secondaryStyle = themeOverride?.secondaryColor\n ? { ...themedStyles.leaderboardStats, color: themeOverride.secondaryColor }\n : themedStyles.leaderboardStats;\n\n // Find current user rank\n const currentUserRank = currentUserId\n ? leaderboard.entries.find((e) => e.userId === currentUserId)?.rank\n : null;\n\n return (\n <div className={className} style={{ ...themedStyles.leaderboardContainer, ...style }}>\n {/* Current user rank badge */}\n {currentUserRank && (\n <div style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginBottom: '8px'\n }}>\n <span style={{\n fontSize: '12px',\n backgroundColor: `${globalTheme.primary}30`,\n color: globalTheme.primary,\n padding: '4px 8px',\n borderRadius: '9999px',\n }}>\n Your rank: #{currentUserRank}\n </span>\n </div>\n )}\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {leaderboard.entries.map((entry, index) => {\n const isCurrentUser = currentUserId === entry.userId;\n const medalColor = getMedalColor(entry.rank);\n\n if (renderRow) {\n return <div key={entry.userId}>{renderRow(entry, isCurrentUser)}</div>;\n }\n\n const rowContent = (\n <div style={getRowStyle(isCurrentUser)}>\n {/* Rank / Medal */}\n <div style={themedStyles.medalIcon}>\n {medalColor ? (\n <span style={{ color: medalColor }}>🏅</span>\n ) : (\n <span style={{ fontSize: '14px', fontFamily: 'monospace', color: globalTheme.foregroundSecondary }}>\n #{entry.rank}\n </span>\n )}\n </div>\n\n {/* Name & Tier */}\n <div style={{ flex: 1, marginLeft: '12px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ ...themedStyles.leaderboardName, ...textStyle, marginLeft: 0 }}>\n {entry.displayName ?? `User ${entry.userId.slice(0, 8)}`}\n </span>\n {isCurrentUser && (\n <span style={{ fontSize: '12px', color: globalTheme.primary }}>(You)</span>\n )}\n </div>\n {showTierInfo && entry.tier && (\n <div style={{ fontSize: '12px', color: globalTheme.foregroundSecondary }}>\n {entry.tier.name} ({entry.tier.value}%)\n </div>\n )}\n </div>\n\n {/* Stats */}\n <div style={{ textAlign: 'right' }}>\n <div style={{ fontFamily: 'monospace', fontSize: '14px', fontWeight: '500', color: globalTheme.foreground }}>\n {entry.referralCount} referrals\n </div>\n {showEarnings && entry.totalEarnings !== undefined && (\n <div style={{ ...secondaryStyle, fontFamily: 'monospace' }}>\n {formatCurrency(entry.totalEarnings)}\n </div>\n )}\n </div>\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={entry.userId}\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n transition={{ delay: index * 0.05 }}\n >\n {rowContent}\n </Motion>\n );\n }\n\n return <div key={entry.userId}>{rowContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n\n {/* Footer */}\n <p style={{ fontSize: '12px', color: '#6c757d', textAlign: 'center', marginTop: '12px' }}>\n Rankings based on total referrals\n </p>\n </div>\n );\n}\n\nexport const Leaderboard = withErrorBoundary(LeaderboardInner);\n\n/**\n * Props for ReferralLink component\n */\nexport interface ReferralLinkProps {\n /** Base URL for referral link (defaults to current origin) */\n baseUrl?: string;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Text for copy button */\n copyButtonText?: string;\n /** Text shown after copying */\n copiedText?: string;\n /** Text for share button (mobile only) */\n shareButtonText?: string;\n /** Share title */\n shareTitle?: string;\n /** Share text */\n shareText?: string;\n /** Show share button on mobile */\n showShareButton?: boolean;\n /** Show referrer attribution section (default: true) */\n showReferrerAttribution?: boolean;\n /** Current referrer code (who referred this user) */\n referrerCode?: string | null;\n /** Callback when referrer is set */\n onSetReferrer?: (code: string) => void;\n /** Callback to detect referrer from URL */\n onDetectFromUrl?: () => void;\n /** Callback when referrer is cleared */\n onClearReferrer?: () => void;\n /** Theme customization */\n theme?: {\n inputBackground?: string;\n inputBorder?: string;\n inputColor?: string;\n buttonBackground?: string;\n buttonColor?: string;\n };\n /** Callback when link is copied */\n onCopy?: (link: string) => void;\n /** Callback when link is shared */\n onShare?: (link: string) => void;\n}\n\n/**\n * ReferralLink - Input field with user's referral code and copy/share buttons\n *\n * Displays the user's unique referral link with easy copy functionality.\n * Includes native share button for mobile devices.\n *\n * @example\n * ```tsx\n * <ReferralLink />\n *\n * // With custom base URL\n * <ReferralLink\n * baseUrl=\"https://myapp.com/signup\"\n * shareTitle=\"Join my app!\"\n * shareText=\"Sign up using my referral link\"\n * />\n * ```\n */\nfunction ReferralLinkInner({\n baseUrl,\n className,\n style,\n copyButtonText = 'Copy',\n copiedText = 'Copied!',\n shareButtonText = 'Share',\n shareTitle = 'Check this out!',\n shareText = 'Join using my referral link',\n showShareButton = true,\n showReferrerAttribution = true,\n referrerCode,\n onSetReferrer,\n onDetectFromUrl,\n onClearReferrer,\n theme: themeOverride,\n onCopy,\n onShare,\n}: ReferralLinkProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { stats, loading } = useAffiliateStats({ autoRefresh: true });\n const [copied, setCopied] = useState(false);\n const [referrerInput, setReferrerInput] = useState('');\n\n const userReferralCode = stats?.referralCode;\n\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const referralLink = `${baseUrl ?? origin}?ref=${userReferralCode}`;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(referralLink);\n setCopied(true);\n onCopy?.(referralLink);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n const handleShare = async () => {\n if (typeof navigator !== 'undefined' && navigator.share) {\n try {\n await navigator.share({\n title: shareTitle,\n text: shareText,\n url: referralLink,\n });\n onShare?.(referralLink);\n } catch (err) {\n // User cancelled or share failed\n if ((err as Error).name !== 'AbortError') {\n console.error('Failed to share:', err);\n }\n }\n }\n };\n\n const handleSetReferrer = () => {\n if (referrerInput.trim() && onSetReferrer) {\n onSetReferrer(referrerInput.trim());\n setReferrerInput('');\n }\n };\n\n const canShare = typeof navigator !== 'undefined' && 'share' in navigator;\n\n const inputStyle = {\n ...themedStyles.referralInput,\n ...(themeOverride?.inputBackground && { backgroundColor: themeOverride.inputBackground }),\n ...(themeOverride?.inputBorder && { border: `1px solid ${themeOverride.inputBorder}` }),\n ...(themeOverride?.inputColor && { color: themeOverride.inputColor }),\n };\n\n const buttonStyle = {\n ...themedStyles.referralButton,\n ...(themeOverride?.buttonBackground && { backgroundColor: themeOverride.buttonBackground }),\n ...(themeOverride?.buttonColor && { color: themeOverride.buttonColor }),\n };\n\n const containerStyle: React.CSSProperties = {\n padding: '16px',\n ...style,\n };\n\n // Show loading or empty state when no referral code\n if (loading || !userReferralCode) {\n return (\n <div className={className} style={containerStyle}>\n <div style={{ marginBottom: '8px' }}>\n <p style={{ fontSize: '14px', color: globalTheme.foregroundSecondary, marginBottom: '8px' }}>\n Your unique referral link:\n </p>\n <div style={themedStyles.referralContainer}>\n <input\n type=\"text\"\n readOnly\n value={loading ? 'Loading...' : 'No referral code assigned'}\n disabled\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px', opacity: 0.6 }}\n />\n <button type=\"button\" disabled style={{ ...buttonStyle, opacity: 0.5, cursor: 'not-allowed' }}>\n 📋\n </button>\n </div>\n {!loading && !userReferralCode && (\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginTop: '8px' }}>\n Complete a referral action to get your unique code.\n </p>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={containerStyle}>\n {/* Your Referral Link */}\n <div style={{ marginBottom: '8px' }}>\n <p style={{ fontSize: '14px', color: globalTheme.foregroundSecondary, marginBottom: '8px' }}>\n Your unique referral link:\n </p>\n <div style={themedStyles.referralContainer}>\n <input\n type=\"text\"\n readOnly\n value={referralLink}\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px' }}\n onClick={(e) => (e.target as HTMLInputElement).select()}\n />\n <button type=\"button\" onClick={handleCopy} style={buttonStyle}>\n {copied ? '✓' : '📋'}\n </button>\n {showShareButton && canShare && (\n <button type=\"button\" onClick={handleShare} style={buttonStyle}>\n {shareButtonText}\n </button>\n )}\n </div>\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginTop: '4px' }}>\n Code: <span style={{ fontFamily: 'monospace', fontWeight: '500', color: globalTheme.foreground }}>{userReferralCode}</span>\n </p>\n </div>\n\n {/* Referrer Attribution */}\n {showReferrerAttribution && (\n <div style={themedStyles.referrerSection}>\n <p style={themedStyles.referrerTitle}>Referrer Attribution</p>\n\n {referrerCode ? (\n <div style={themedStyles.referrerBadge}>\n <div style={themedStyles.referrerBadgeInfo}>\n <span style={themedStyles.referrerBadgeIcon}>👤</span>\n <span>\n Referred by: <span style={{ fontFamily: 'monospace', fontWeight: '500' }}>{referrerCode}</span>\n </span>\n </div>\n {onClearReferrer && (\n <button\n type=\"button\"\n onClick={onClearReferrer}\n style={themedStyles.referrerClearButton}\n aria-label=\"Clear referrer\"\n >\n ✕\n </button>\n )}\n </div>\n ) : (\n <div>\n {onSetReferrer && (\n <div style={themedStyles.referrerInputRow}>\n <input\n type=\"text\"\n value={referrerInput}\n onChange={(e) => setReferrerInput(e.target.value)}\n placeholder=\"Enter referrer code...\"\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px' }}\n />\n <button\n type=\"button\"\n onClick={handleSetReferrer}\n disabled={!referrerInput.trim()}\n style={{\n ...buttonStyle,\n opacity: referrerInput.trim() ? 1 : 0.5,\n cursor: referrerInput.trim() ? 'pointer' : 'not-allowed',\n }}\n >\n Set\n </button>\n </div>\n )}\n {onDetectFromUrl && (\n <button\n type=\"button\"\n onClick={onDetectFromUrl}\n style={themedStyles.referrerDetectButton}\n >\n <span>🔗</span>\n Detect from URL\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ReferralLink = withErrorBoundary(ReferralLinkInner);\n\n// ============================================\n// Issue #25-28: Quest Components\n// ============================================\n\n/**\n * Extended styles for gamification components\n */\nconst gamificationStyles = {\n // Quest styles\n questContainer: {\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n marginBottom: '12px',\n } as React.CSSProperties,\n questHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '12px',\n } as React.CSSProperties,\n questTitle: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n margin: 0,\n } as React.CSSProperties,\n questDescription: {\n fontSize: '14px',\n color: '#6c757d',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n questBadge: {\n fontSize: '12px',\n padding: '4px 8px',\n borderRadius: '12px',\n fontWeight: '500',\n } as React.CSSProperties,\n questProgressBar: {\n width: '100%',\n height: '8px',\n backgroundColor: '#e9ecef',\n borderRadius: '4px',\n overflow: 'hidden',\n marginBottom: '12px',\n } as React.CSSProperties,\n questProgressFill: {\n height: '100%',\n backgroundColor: '#0d6efd',\n borderRadius: '4px',\n transition: 'width 0.3s ease',\n } as React.CSSProperties,\n questStepList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n } as React.CSSProperties,\n questStep: {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 0',\n borderBottom: '1px solid #f8f9fa',\n fontSize: '14px',\n } as React.CSSProperties,\n questStepIcon: {\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '12px',\n fontSize: '12px',\n } as React.CSSProperties,\n questStepText: {\n flex: 1,\n color: '#212529',\n } as React.CSSProperties,\n questStepCount: {\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n questReward: {\n display: 'flex',\n alignItems: 'center',\n marginTop: '12px',\n padding: '8px 12px',\n backgroundColor: '#fff3cd',\n borderRadius: '6px',\n fontSize: '14px',\n color: '#856404',\n } as React.CSSProperties,\n\n // Streak styles\n streakContainer: {\n display: 'flex',\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n } as React.CSSProperties,\n streakFlame: {\n fontSize: '32px',\n marginRight: '12px',\n } as React.CSSProperties,\n streakCount: {\n fontSize: '28px',\n fontWeight: 'bold',\n color: '#212529',\n marginRight: '8px',\n } as React.CSSProperties,\n streakLabel: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n streakInfo: {\n flex: 1,\n } as React.CSSProperties,\n streakName: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n } as React.CSSProperties,\n streakStatus: {\n fontSize: '12px',\n padding: '2px 8px',\n borderRadius: '10px',\n marginLeft: '8px',\n } as React.CSSProperties,\n freezeButton: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#17a2b8',\n color: 'white',\n cursor: 'pointer',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n } as React.CSSProperties,\n freezeButtonDisabled: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#6c757d',\n color: 'white',\n cursor: 'not-allowed',\n fontSize: '14px',\n opacity: 0.6,\n } as React.CSSProperties,\n\n // Badge styles\n badgeGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n badgeCard: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n cursor: 'pointer',\n transition: 'transform 0.2s, box-shadow 0.2s',\n } as React.CSSProperties,\n badgeCardLocked: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n cursor: 'pointer',\n opacity: 0.6,\n filter: 'grayscale(100%)',\n } as React.CSSProperties,\n badgeIcon: {\n width: '64px',\n height: '64px',\n borderRadius: '50%',\n objectFit: 'cover' as const,\n marginBottom: '8px',\n backgroundColor: '#e9ecef',\n } as React.CSSProperties,\n badgeName: {\n fontSize: '14px',\n fontWeight: '500',\n color: '#212529',\n textAlign: 'center' as const,\n marginBottom: '4px',\n } as React.CSSProperties,\n badgeRarity: {\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '10px',\n fontWeight: '500',\n textTransform: 'uppercase' as const,\n } as React.CSSProperties,\n badgeStats: {\n display: 'flex',\n justifyContent: 'center',\n gap: '16px',\n padding: '12px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n badgeStat: {\n textAlign: 'center' as const,\n } as React.CSSProperties,\n badgeStatValue: {\n fontSize: '20px',\n fontWeight: 'bold',\n color: '#212529',\n } as React.CSSProperties,\n badgeStatLabel: {\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n\n // Level/Tier styles\n levelContainer: {\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n } as React.CSSProperties,\n levelHeader: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: '12px',\n } as React.CSSProperties,\n levelIcon: {\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n marginRight: '12px',\n backgroundColor: '#e9ecef',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '24px',\n } as React.CSSProperties,\n levelInfo: {\n flex: 1,\n } as React.CSSProperties,\n levelTierName: {\n fontSize: '18px',\n fontWeight: '600',\n color: '#212529',\n } as React.CSSProperties,\n levelPoints: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n levelProgressContainer: {\n marginTop: '12px',\n } as React.CSSProperties,\n levelProgressHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '6px',\n fontSize: '13px',\n } as React.CSSProperties,\n levelProgressBar: {\n width: '100%',\n height: '10px',\n backgroundColor: '#e9ecef',\n borderRadius: '5px',\n overflow: 'hidden',\n } as React.CSSProperties,\n levelProgressFill: {\n height: '100%',\n background: 'linear-gradient(90deg, #667eea 0%, #764ba2 100%)',\n borderRadius: '5px',\n transition: 'width 0.3s ease',\n } as React.CSSProperties,\n levelBenefits: {\n marginTop: '16px',\n padding: '12px',\n backgroundColor: '#f8f9fa',\n borderRadius: '6px',\n } as React.CSSProperties,\n levelBenefitsTitle: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#212529',\n marginBottom: '8px',\n } as React.CSSProperties,\n levelBenefitsList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n fontSize: '13px',\n color: '#495057',\n } as React.CSSProperties,\n levelBenefitItem: {\n padding: '4px 0',\n display: 'flex',\n alignItems: 'center',\n } as React.CSSProperties,\n\n // Reward store styles\n rewardStoreGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n rewardCard: {\n display: 'flex',\n flexDirection: 'column' as const,\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n overflow: 'hidden',\n } as React.CSSProperties,\n rewardCardUnavailable: {\n display: 'flex',\n flexDirection: 'column' as const,\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n overflow: 'hidden',\n opacity: 0.7,\n } as React.CSSProperties,\n rewardImage: {\n width: '100%',\n height: '120px',\n objectFit: 'cover' as const,\n backgroundColor: '#e9ecef',\n } as React.CSSProperties,\n rewardContent: {\n padding: '12px',\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n } as React.CSSProperties,\n rewardName: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n marginBottom: '4px',\n } as React.CSSProperties,\n rewardDescription: {\n fontSize: '13px',\n color: '#6c757d',\n marginBottom: '8px',\n flex: 1,\n } as React.CSSProperties,\n rewardCost: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#0d6efd',\n marginBottom: '8px',\n } as React.CSSProperties,\n rewardButton: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#0d6efd',\n color: 'white',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n width: '100%',\n } as React.CSSProperties,\n rewardButtonDisabled: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#6c757d',\n color: 'white',\n cursor: 'not-allowed',\n fontSize: '14px',\n fontWeight: '500',\n width: '100%',\n } as React.CSSProperties,\n rewardPointsHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n rewardPointsLabel: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n rewardPointsValue: {\n fontSize: '24px',\n fontWeight: 'bold',\n color: '#212529',\n } as React.CSSProperties,\n\n // Accordion/Expandable quest styles\n questAccordion: {\n borderRadius: '8px',\n overflow: 'hidden',\n marginBottom: '8px',\n } as React.CSSProperties,\n questAccordionHeader: {\n width: '100%',\n padding: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n textAlign: 'left' as const,\n } as React.CSSProperties,\n questAccordionIcon: {\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '20px',\n flexShrink: 0,\n } as React.CSSProperties,\n questAccordionInfo: {\n flex: 1,\n minWidth: 0,\n } as React.CSSProperties,\n questAccordionTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '4px',\n } as React.CSSProperties,\n questAccordionName: {\n fontWeight: '500',\n fontSize: '14px',\n color: '#212529',\n } as React.CSSProperties,\n questAccordionStatusBadge: {\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '9999px',\n fontWeight: '500',\n } as React.CSSProperties,\n questAccordionMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n questAccordionChevron: {\n color: '#6c757d',\n transition: 'transform 0.2s',\n flexShrink: 0,\n } as React.CSSProperties,\n questAccordionContent: {\n padding: '0 12px 12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n};\n\n/**\n * Helper function to get status badge colors\n */\nfunction getStatusColors(status: string): { bg: string; color: string } {\n switch (status) {\n case 'completed':\n return { bg: '#d4edda', color: '#155724' };\n case 'in_progress':\n return { bg: '#cce5ff', color: '#004085' };\n case 'active':\n return { bg: '#cce5ff', color: '#004085' };\n case 'frozen':\n return { bg: '#cce5ff', color: '#17a2b8' };\n case 'at_risk':\n return { bg: '#fff3cd', color: '#856404' };\n case 'broken':\n return { bg: '#f8d7da', color: '#721c24' };\n default:\n return { bg: '#e9ecef', color: '#6c757d' };\n }\n}\n\n/**\n * Helper function to get rarity colors\n */\nfunction getRarityColors(rarity: BadgeRarity): { bg: string; color: string } {\n switch (rarity) {\n case 'COMMON':\n return { bg: '#e9ecef', color: '#495057' };\n case 'RARE':\n return { bg: '#cce5ff', color: '#004085' };\n case 'EPIC':\n return { bg: '#e2d5f1', color: '#6f42c1' };\n case 'LEGENDARY':\n return { bg: '#fff3cd', color: '#856404' };\n default:\n return { bg: '#e9ecef', color: '#6c757d' };\n }\n}\n\n/**\n * Props for QuestProgress component\n */\nexport interface QuestProgressProps {\n /** Specific quest ID to display (shows all if not provided) */\n questId?: string;\n /** Hide completed quests */\n hideCompleted?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Enable expandable accordion mode (default: true) */\n expandable?: boolean;\n /** Default expanded quest ID (defaults to first in-progress) */\n defaultExpandedId?: string;\n /** Show XP reward in header (default: true) */\n showXpReward?: boolean;\n /** Callback when a quest is completed */\n onComplete?: (quest: QuestWithProgress) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n progressColor?: string;\n textColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each quest */\n renderQuest?: (quest: QuestWithProgress) => React.ReactNode;\n}\n\n/**\n * QuestProgress - Display quest progress with step checklist\n *\n * Shows quest name, description, progress bar, and step completion status.\n *\n * @example\n * ```tsx\n * <QuestProgress hideCompleted onComplete={(quest) => console.log('Completed:', quest.name)} />\n * ```\n */\nfunction QuestProgressInner({\n questId,\n hideCompleted = false,\n className,\n style,\n expandable = true,\n defaultExpandedId,\n showXpReward = true,\n onComplete,\n theme,\n renderLoading,\n renderError,\n renderQuest,\n}: QuestProgressProps) {\n const { quests, loading, error, refresh } = useQuests({ autoRefresh: true });\n const previousQuests = useRef<Map<string, QuestWithProgress>>(new Map());\n const [expandedQuestId, setExpandedQuestId] = useState<string | null>(null);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // Track completions\n useEffect(() => {\n if (onComplete) {\n quests.forEach((quest) => {\n const prev = previousQuests.current.get(quest.id);\n if (prev && prev.status !== 'completed' && quest.status === 'completed') {\n onComplete(quest);\n }\n });\n }\n // Update previous state\n const newMap = new Map<string, QuestWithProgress>();\n quests.forEach((q) => newMap.set(q.id, q));\n previousQuests.current = newMap;\n }, [quests, onComplete]);\n\n // Set default expanded quest (first in-progress or provided ID)\n useEffect(() => {\n if (quests.length > 0 && expandedQuestId === null) {\n if (defaultExpandedId) {\n setExpandedQuestId(defaultExpandedId);\n } else {\n const inProgressQuest = quests.find((q) => q.status === 'in_progress');\n setExpandedQuestId(inProgressQuest?.id ?? null);\n }\n }\n }, [quests, defaultExpandedId, expandedQuestId]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let filteredQuests = quests;\n if (questId) {\n filteredQuests = quests.filter((q) => q.id === questId);\n }\n if (hideCompleted) {\n filteredQuests = filteredQuests.filter((q) => q.status !== 'completed');\n }\n\n if (filteredQuests.length === 0) {\n return (\n <div style={{ textAlign: 'center', padding: '24px', color: '#6c757d' }}>\n <span style={{ fontSize: '40px', display: 'block', marginBottom: '8px', opacity: 0.5 }}>🎯</span>\n <p>No quests available</p>\n </div>\n );\n }\n\n const getStatusBadgeStyle = (status: string): React.CSSProperties => {\n switch (status) {\n case 'completed':\n return { backgroundColor: 'rgba(40, 167, 69, 0.2)', color: '#28a745' };\n case 'in_progress':\n return { backgroundColor: 'rgba(13, 110, 253, 0.2)', color: '#0d6efd' };\n default:\n return { backgroundColor: '#f8f9fa', color: '#6c757d' };\n }\n };\n\n const getQuestBgStyle = (status: string): React.CSSProperties => {\n switch (status) {\n case 'completed':\n return { backgroundColor: 'rgba(40, 167, 69, 0.05)', borderColor: 'rgba(40, 167, 69, 0.2)' };\n case 'in_progress':\n return { backgroundColor: 'rgba(13, 110, 253, 0.05)', borderColor: 'rgba(13, 110, 253, 0.2)' };\n default:\n return { backgroundColor: '#f8f9fa', borderColor: '#e9ecef' };\n }\n };\n\n const toggleExpand = (id: string) => {\n if (!expandable) return;\n setExpandedQuestId(expandedQuestId === id ? null : id);\n };\n\n return (\n <div className={className} style={{ ...style, display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {filteredQuests.map((quest) => {\n if (renderQuest) {\n return <div key={quest.id}>{renderQuest(quest)}</div>;\n }\n\n const isExpanded = !expandable || expandedQuestId === quest.id;\n const statusBadgeStyle = getStatusBadgeStyle(quest.status);\n const questBgStyle = getQuestBgStyle(quest.status);\n\n const questContent = (\n <div\n style={{\n ...gamificationStyles.questAccordion,\n border: '1px solid',\n ...questBgStyle,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n ...(theme?.cardBorder && { borderColor: theme.cardBorder }),\n }}\n >\n {/* Quest Header */}\n <button\n type=\"button\"\n onClick={() => toggleExpand(quest.id)}\n style={{\n ...gamificationStyles.questAccordionHeader,\n cursor: expandable ? 'pointer' : 'default',\n }}\n >\n {/* Icon */}\n <div\n style={{\n ...gamificationStyles.questAccordionIcon,\n backgroundColor: quest.status === 'completed' ? 'rgba(40, 167, 69, 0.2)' : 'rgba(13, 110, 253, 0.2)',\n }}\n >\n {quest.status === 'completed' ? (\n <span style={{ color: '#28a745' }}>✓</span>\n ) : (\n <span style={{ color: '#0d6efd' }}>🎯</span>\n )}\n </div>\n\n {/* Title & Meta */}\n <div style={gamificationStyles.questAccordionInfo}>\n <div style={gamificationStyles.questAccordionTitle}>\n <span style={{ ...gamificationStyles.questAccordionName, ...(theme?.textColor && { color: theme.textColor }) }}>\n {quest.name}\n </span>\n <span\n style={{\n ...gamificationStyles.questAccordionStatusBadge,\n ...statusBadgeStyle,\n }}\n >\n {quest.status === 'completed'\n ? 'Complete'\n : quest.status === 'in_progress'\n ? `${quest.percentComplete}%`\n : 'Not Started'}\n </span>\n </div>\n <div style={gamificationStyles.questAccordionMeta}>\n {showXpReward && quest.xpReward > 0 && (\n <>\n <span>⭐</span>\n <span>+{quest.xpReward} XP</span>\n <span style={{ color: '#e9ecef' }}>|</span>\n </>\n )}\n <span>{quest.steps.length} steps</span>\n </div>\n </div>\n\n {/* Chevron */}\n {expandable && (\n <span\n style={{\n ...gamificationStyles.questAccordionChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n >\n ▶\n </span>\n )}\n </button>\n\n {/* Expandable Content */}\n {isExpanded && (\n <div style={gamificationStyles.questAccordionContent}>\n {/* Progress Bar */}\n {quest.status !== 'completed' && (\n <div style={{ ...gamificationStyles.questProgressBar, marginBottom: '12px', height: '6px' }}>\n <div\n style={{\n ...gamificationStyles.questProgressFill,\n width: `${quest.percentComplete}%`,\n ...(theme?.progressColor && { backgroundColor: theme.progressColor }),\n }}\n />\n </div>\n )}\n\n {/* Steps */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {quest.steps.map((step, index) => (\n <div\n key={step.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n padding: '8px',\n borderRadius: '6px',\n opacity: step.completed ? 0.6 : 1,\n }}\n >\n <div\n style={{\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold',\n flexShrink: 0,\n backgroundColor: step.completed ? 'rgba(40, 167, 69, 0.2)' : '#f8f9fa',\n color: step.completed ? '#28a745' : '#6c757d',\n }}\n >\n {step.completed ? '✓' : index + 1}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: '500',\n textDecoration: step.completed ? 'line-through' : 'none',\n color: step.completed ? '#6c757d' : '#212529',\n }}\n >\n {step.name}\n </div>\n <div style={{ fontSize: '12px', color: '#6c757d' }}>\n {step.currentCount}/{step.requiredCount}\n {step.requiredCount > 1 && !step.completed && (\n <span style={{ marginLeft: '8px' }}>\n ({Math.round((step.currentCount / step.requiredCount) * 100)}%)\n </span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={quest.id}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n >\n {questContent}\n </Motion>\n );\n }\n\n return <div key={quest.id}>{questContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n );\n}\n\nexport const QuestProgress = withErrorBoundary(QuestProgressInner);\n\n// ============================================\n// Issue #32: Streak Components\n// ============================================\n\n/**\n * Props for StreakFlame component\n */\nexport interface StreakFlameProps {\n /** Specific streak rule ID to display */\n ruleId?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Show freeze button */\n showFreezeButton?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Callback when freeze is used */\n onFreeze?: (ruleId: string, remainingFreezes: number) => void;\n /** Theme customization */\n theme?: {\n flameColor?: string;\n countColor?: string;\n cardBackground?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * StreakFlame - Display streak counter with flame icon\n *\n * Shows current streak count with status indicator and optional freeze button.\n *\n * @example\n * ```tsx\n * <StreakFlame showFreezeButton onFreeze={(id, remaining) => console.log('Freeze used')} />\n * ```\n */\nfunction StreakFlameInner({\n ruleId,\n size = 'md',\n showFreezeButton = true,\n className,\n style,\n onFreeze,\n theme,\n renderLoading,\n renderError,\n}: StreakFlameProps) {\n const { streaks, stats, loading, error, freeze, refresh } = useStreaks({ autoRefresh: true });\n const [freezing, setFreezing] = useState(false);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let displayStreaks = streaks;\n if (ruleId) {\n displayStreaks = streaks.filter((s) => s.id === ruleId);\n }\n\n if (displayStreaks.length === 0) {\n return <div style={{ textAlign: 'center', padding: '16px', color: '#6c757d' }}>No streaks available</div>;\n }\n\n const sizeStyles = {\n sm: { flame: '24px', count: '20px', container: '12px' },\n md: { flame: '32px', count: '28px', container: '16px' },\n lg: { flame: '48px', count: '40px', container: '20px' },\n };\n\n const handleFreeze = async (streakId: string) => {\n setFreezing(true);\n try {\n const result = await freeze(streakId);\n if (result && onFreeze) {\n onFreeze(streakId, result.remainingFreezes);\n }\n } finally {\n setFreezing(false);\n }\n };\n\n return (\n <div className={className} style={style}>\n {displayStreaks.map((streak) => {\n const statusColors = getStatusColors(streak.status);\n const canFreeze = streak.freezeInventory > 0 && !streak.freezeUsedToday;\n\n return (\n <div\n key={streak.id}\n style={{\n ...gamificationStyles.streakContainer,\n padding: sizeStyles[size].container,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n }}\n >\n <span\n style={{\n ...gamificationStyles.streakFlame,\n fontSize: sizeStyles[size].flame,\n ...(theme?.flameColor && { color: theme.flameColor }),\n }}\n >\n 🔥\n </span>\n <span\n style={{\n ...gamificationStyles.streakCount,\n fontSize: sizeStyles[size].count,\n ...(theme?.countColor && { color: theme.countColor }),\n }}\n >\n {streak.currentCount}\n </span>\n <div style={gamificationStyles.streakInfo}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span style={gamificationStyles.streakName}>{streak.name}</span>\n <span\n style={{\n ...gamificationStyles.streakStatus,\n backgroundColor: statusColors.bg,\n color: statusColors.color,\n }}\n >\n {streak.status}\n </span>\n </div>\n <span style={gamificationStyles.streakLabel}>\n Best: {streak.maxStreak} days\n </span>\n </div>\n {showFreezeButton && (\n <button\n type=\"button\"\n onClick={() => void handleFreeze(streak.id)}\n disabled={!canFreeze || freezing}\n style={canFreeze ? gamificationStyles.freezeButton : gamificationStyles.freezeButtonDisabled}\n >\n <span>❄️</span>\n <span>{streak.freezeInventory}</span>\n </button>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport const StreakFlame = withErrorBoundary(StreakFlameInner);\n\n// ============================================\n// Issue #33: Badge Components\n// ============================================\n\n/**\n * Props for BadgeGrid component\n */\nexport interface BadgeGridProps {\n /** Show locked (unearned) badges */\n showLocked?: boolean;\n /** Filter by category */\n category?: string;\n /** Number of grid columns */\n columns?: number;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Show progress summary header (default: true) */\n showProgressSummary?: boolean;\n /** Show filter tabs (All/Earned/Locked) (default: true) */\n showFilterTabs?: boolean;\n /** @deprecated Use showProgressSummary instead */\n showStats?: boolean;\n /** Callback when a badge is clicked */\n onBadgeClick?: (badge: BadgeWithStatus) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each badge */\n renderBadge?: (badge: BadgeWithStatus) => React.ReactNode;\n}\n\n/**\n * BadgeGrid - Display badge collection in a grid\n *\n * Shows badges with unlock status, rarity indicators, and optional filtering.\n *\n * @example\n * ```tsx\n * <BadgeGrid showLocked showStats onBadgeClick={(badge) => showBadgeModal(badge)} />\n * ```\n */\nfunction BadgeGridInner({\n showLocked = true,\n category,\n columns = 2,\n className,\n style,\n showProgressSummary = true,\n showFilterTabs = true,\n showStats, // deprecated, use showProgressSummary\n onBadgeClick,\n theme: themeOverride,\n renderLoading,\n renderError,\n renderBadge,\n}: BadgeGridProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { badges, stats, loading, error, refresh } = useBadges({ autoRefresh: true, category });\n const [filter, setFilter] = useState<'all' | 'unlocked' | 'locked'>('all');\n\n // Handle deprecated prop\n const shouldShowSummary = showProgressSummary ?? showStats ?? true;\n\n useEffect(() => {\n void refresh(category);\n }, [refresh, category]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n // Filter badges based on tab selection\n let displayBadges = badges;\n if (filter === 'unlocked') {\n displayBadges = badges.filter((b) => b.isUnlocked);\n } else if (filter === 'locked') {\n displayBadges = badges.filter((b) => !b.isUnlocked);\n } else if (!showLocked) {\n displayBadges = badges.filter((b) => b.isUnlocked);\n }\n\n // Updated rarity color scheme from theme\n const getRarityColors = (rarity: BadgeRarity): { color: string; bg: string } => {\n switch (rarity) {\n case 'LEGENDARY':\n return { color: globalTheme.rarityLegendary, bg: `${globalTheme.rarityLegendary}15` };\n case 'EPIC':\n return { color: globalTheme.rarityEpic, bg: `${globalTheme.rarityEpic}15` };\n case 'RARE':\n return { color: globalTheme.rarityRare, bg: `${globalTheme.rarityRare}15` };\n case 'COMMON':\n default:\n return { color: globalTheme.rarityCommon, bg: `${globalTheme.rarityCommon}15` };\n }\n };\n\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gap: '12px',\n padding: '0',\n };\n\n const unlockedCount = stats?.unlocked ?? badges.filter((b) => b.isUnlocked).length;\n const totalCount = stats?.total ?? badges.length;\n const progressPercent = totalCount > 0 ? (unlockedCount / totalCount) * 100 : 0;\n\n return (\n <div className={className} style={{ ...style, padding: '16px' }}>\n {/* Progress Summary */}\n {shouldShowSummary && (\n <div style={themedStyles.progressSummary}>\n <div style={themedStyles.progressSummaryLeft}>\n <div style={themedStyles.progressSummaryIcon}>✨</div>\n <div>\n <div style={themedStyles.progressSummaryText}>{unlockedCount} / {totalCount}</div>\n <div style={themedStyles.progressSummarySubtext}>Badges Earned</div>\n </div>\n </div>\n <div style={themedStyles.progressSummaryBar}>\n <div\n style={{\n ...themedStyles.progressSummaryBarFill,\n width: `${progressPercent}%`,\n }}\n />\n </div>\n </div>\n )}\n\n {/* Filter Tabs */}\n {showFilterTabs && (\n <div style={themedStyles.filterTabs}>\n {(['all', 'unlocked', 'locked'] as const).map((f) => (\n <button\n key={f}\n type=\"button\"\n onClick={() => setFilter(f)}\n style={filter === f ? themedStyles.filterTabActive : themedStyles.filterTab}\n >\n {f === 'all' ? 'All' : f === 'unlocked' ? 'Earned' : 'Locked'}\n </button>\n ))}\n </div>\n )}\n\n {/* Badge Grid */}\n <div style={gridStyle}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {displayBadges.map((badge) => {\n if (renderBadge) {\n return <div key={badge.id}>{renderBadge(badge)}</div>;\n }\n\n const rarityColors = getRarityColors(badge.rarity);\n\n const badgeContent = (\n <div\n style={{\n position: 'relative',\n padding: '12px',\n borderRadius: '8px',\n border: '1px solid',\n cursor: onBadgeClick ? 'pointer' : 'default',\n transition: 'all 0.2s',\n ...(badge.isUnlocked\n ? {\n backgroundColor: rarityColors.bg,\n borderColor: `${rarityColors.color}40`,\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { borderColor: themeOverride.cardBorder }),\n }\n : {\n backgroundColor: globalTheme.backgroundSecondary,\n borderColor: globalTheme.border,\n opacity: 0.6,\n }),\n }}\n onClick={() => onBadgeClick?.(badge)}\n onKeyDown={(e) => e.key === 'Enter' && onBadgeClick?.(badge)}\n role={onBadgeClick ? 'button' : undefined}\n tabIndex={onBadgeClick ? 0 : undefined}\n >\n {/* Checkmark for unlocked */}\n {badge.isUnlocked && (\n <div style={themedStyles.badgeCheckmark}>✓</div>\n )}\n\n {/* Badge Icon */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px' }}>\n <div\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: badge.isUnlocked ? `${rarityColors.color}20` : globalTheme.backgroundSecondary,\n }}\n >\n {badge.iconUrl ? (\n <img\n src={badge.iconUrl}\n alt={badge.name}\n style={{ width: '16px', height: '16px', objectFit: 'contain' }}\n />\n ) : badge.isUnlocked ? (\n <span style={{ color: rarityColors.color }}>🏅</span>\n ) : (\n <span style={{ color: globalTheme.foregroundSecondary }}>🔒</span>\n )}\n </div>\n </div>\n\n {/* Badge Info */}\n <h4 style={{ fontSize: '14px', fontWeight: '500', marginBottom: '4px', color: globalTheme.foreground }}>\n {badge.name}\n </h4>\n {badge.description && (\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginBottom: '8px', lineHeight: 1.4 }}>\n {badge.description}\n </p>\n )}\n\n {/* Rarity Badge */}\n <span\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n borderRadius: '9999px',\n fontWeight: '500',\n backgroundColor: `${rarityColors.color}20`,\n color: rarityColors.color,\n }}\n >\n {badge.rarity}\n </span>\n\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={badge.id}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n >\n {badgeContent}\n </Motion>\n );\n }\n\n return <div key={badge.id}>{badgeContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n\n {/* Empty State */}\n {displayBadges.length === 0 && (\n <div style={{ textAlign: 'center', padding: '24px', color: '#6c757d' }}>\n <span style={{ fontSize: '40px', display: 'block', marginBottom: '8px', opacity: 0.5 }}>🏅</span>\n <p>No badges found</p>\n </div>\n )}\n </div>\n );\n}\n\nexport const BadgeGrid = withErrorBoundary(BadgeGridInner);\n\n// ============================================\n// Issue #15: Level/Tier Components\n// ============================================\n\n/**\n * Props for LevelProgress component\n */\nexport interface LevelProgressProps {\n /** Show progress to next tier */\n showNextTier?: boolean;\n /** Show tier benefits */\n showBenefits?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n progressGradient?: string;\n textColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * LevelProgress - Display tier/level progress\n *\n * Shows current tier, XP/points, and progress to next tier.\n *\n * @example\n * ```tsx\n * <LevelProgress showNextTier showBenefits />\n * ```\n */\nfunction LevelProgressInner({\n showNextTier = true,\n showBenefits = false,\n className,\n style,\n theme,\n renderLoading,\n renderError,\n}: LevelProgressProps) {\n const { profile, loading, error, refreshProfile } = useLoyalty({ autoRefresh: true });\n\n useEffect(() => {\n void refreshProfile();\n }, [refreshProfile]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n if (!profile) {\n return null;\n }\n\n const progressPercent = profile.nextTier\n ? Math.min(100, ((profile.points) / (profile.nextTier.minPoints)) * 100)\n : 100;\n\n const containerStyle = {\n ...gamificationStyles.levelContainer,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n };\n\n const progressFillStyle = {\n ...gamificationStyles.levelProgressFill,\n width: `${progressPercent}%`,\n ...(theme?.progressGradient && { background: theme.progressGradient }),\n };\n\n return (\n <div className={className} style={{ ...containerStyle, ...style }}>\n <div style={gamificationStyles.levelHeader}>\n <div\n style={{\n ...gamificationStyles.levelIcon,\n ...(profile.tier?.color && { backgroundColor: profile.tier.color }),\n }}\n >\n {profile.tier?.iconUrl ? (\n <img\n src={profile.tier.iconUrl}\n alt={profile.tier.name}\n style={{ width: '100%', height: '100%', borderRadius: '50%' }}\n />\n ) : (\n '⭐'\n )}\n </div>\n <div style={gamificationStyles.levelInfo}>\n <div\n style={{\n ...gamificationStyles.levelTierName,\n ...(theme?.textColor && { color: theme.textColor }),\n }}\n >\n {profile.tier?.name ?? 'No Tier'}\n </div>\n <div style={gamificationStyles.levelPoints}>\n {profile.points.toLocaleString()} points\n </div>\n </div>\n </div>\n\n {showNextTier && profile.nextTier && (\n <div style={gamificationStyles.levelProgressContainer}>\n <div style={gamificationStyles.levelProgressHeader}>\n <span style={{ color: '#6c757d' }}>Progress to {profile.nextTier.name}</span>\n <span style={{ fontWeight: '500' }}>\n {profile.nextTier.pointsNeeded.toLocaleString()} points needed\n </span>\n </div>\n <div style={gamificationStyles.levelProgressBar}>\n <div style={progressFillStyle} />\n </div>\n </div>\n )}\n\n {showBenefits && profile.tier?.benefits && Object.keys(profile.tier.benefits).length > 0 && (\n <div style={gamificationStyles.levelBenefits}>\n <div style={gamificationStyles.levelBenefitsTitle}>Your Benefits</div>\n <ul style={gamificationStyles.levelBenefitsList}>\n {Object.entries(profile.tier.benefits).map(([key, value]) => (\n <li key={key} style={gamificationStyles.levelBenefitItem}>\n <span style={{ marginRight: '8px', color: '#28a745' }}>✓</span>\n {String(value)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nexport const LevelProgress = withErrorBoundary(LevelProgressInner);\n\n// ============================================\n// Issue #34: Reward Components\n// ============================================\n\n/**\n * Props for RewardStore component\n */\nexport interface RewardStoreProps {\n /** Show unavailable items */\n showUnavailable?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Show points header */\n showPointsHeader?: boolean;\n /** Callback when item is redeemed */\n onRedeem?: (item: RewardItem, result: RedemptionResult) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n buttonColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each item */\n renderItem?: (item: RewardItem, onRedeem: () => void) => React.ReactNode;\n}\n\n/**\n * RewardStore - Display reward catalog with redeem functionality\n *\n * Shows available rewards with point costs and redeem buttons.\n *\n * @example\n * ```tsx\n * <RewardStore\n * showPointsHeader\n * onRedeem={(item, result) => {\n * if (result.success) toast.success(`Redeemed ${item.name}!`);\n * }}\n * />\n * ```\n */\nfunction RewardStoreInner({\n showUnavailable = true,\n className,\n style,\n showPointsHeader = true,\n onRedeem,\n theme,\n renderLoading,\n renderError,\n renderItem,\n}: RewardStoreProps) {\n const { items, userPoints, loading, error, redeem, refresh } = useRewards({ autoRefresh: true });\n const [redeemingId, setRedeemingId] = useState<string | null>(null);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading && items.length === 0) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let displayItems = items;\n if (!showUnavailable) {\n displayItems = items.filter((i) => i.isAvailable);\n }\n\n const handleRedeem = async (item: RewardItem) => {\n setRedeemingId(item.id);\n try {\n const result = await redeem(item.id);\n if (result && onRedeem) {\n onRedeem(item, result);\n }\n } finally {\n setRedeemingId(null);\n }\n };\n\n return (\n <div className={className} style={style}>\n {showPointsHeader && (\n <div style={gamificationStyles.rewardPointsHeader}>\n <span style={gamificationStyles.rewardPointsLabel}>Your Points</span>\n <span style={gamificationStyles.rewardPointsValue}>{userPoints.toLocaleString()}</span>\n </div>\n )}\n\n <div style={gamificationStyles.rewardStoreGrid}>\n {displayItems.map((item) => {\n if (renderItem) {\n return <div key={item.id}>{renderItem(item, () => void handleRedeem(item))}</div>;\n }\n\n const cardStyle = item.isAvailable\n ? {\n ...gamificationStyles.rewardCard,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n }\n : gamificationStyles.rewardCardUnavailable;\n\n const buttonStyle = item.isAvailable && item.canAfford\n ? {\n ...gamificationStyles.rewardButton,\n ...(theme?.buttonColor && { backgroundColor: theme.buttonColor }),\n }\n : gamificationStyles.rewardButtonDisabled;\n\n const isRedeeming = redeemingId === item.id;\n\n return (\n <div key={item.id} style={cardStyle}>\n {item.imageUrl ? (\n <img src={item.imageUrl} alt={item.name} style={gamificationStyles.rewardImage} />\n ) : (\n <div style={{ ...gamificationStyles.rewardImage, display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: '32px' }}>\n 🎁\n </div>\n )}\n <div style={gamificationStyles.rewardContent}>\n <span style={gamificationStyles.rewardName}>{item.name}</span>\n {item.description && (\n <span style={gamificationStyles.rewardDescription}>{item.description}</span>\n )}\n <span style={gamificationStyles.rewardCost}>\n {item.pointsCost.toLocaleString()} points\n </span>\n {item.requiredBadgeName && !item.hasBadge && (\n <span style={{ fontSize: '12px', color: '#dc3545', marginBottom: '8px' }}>\n Requires: {item.requiredBadgeName}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => void handleRedeem(item)}\n disabled={!item.isAvailable || !item.canAfford || isRedeeming}\n style={buttonStyle}\n >\n {isRedeeming\n ? 'Redeeming...'\n : item.canAfford\n ? 'Redeem'\n : `Need ${(item.pointsCost - userPoints).toLocaleString()} more`}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const RewardStore = withErrorBoundary(RewardStoreInner);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context.tsx","../src/hooks.ts","../src/components.tsx"],"names":["GamifyContext","createContext","ThemeContext","defaultTheme","isServer","GamifyProvider","config","theme","children","clientRef","useRef","mergedTheme","useMemo","client","newClient","Gamify","useEffect","contextValue","eventType","properties","userId","traits","jsx","useGamifyContext","useContext","useGamifyTheme","useGamify","context","useTrack","useCallback","useIdentify","useSession","state","setState","useState","updateCart","items","coupons","currency","s","session","error","message","applyCoupon","code","complete","clearSession","refresh","useLoyalty","options","refreshProfile","profile","refreshHistory","limit","offset","history","useReferral","setReferrer","clearReferrer","detectFromUrl","useAffiliateStats","refreshStats","forceRefresh","stats","useLeaderboard","customLimit","leaderboard","useQuests","response","useStreaks","freeze","ruleId","result","useBadges","category","earned","b","locked","useRewards","available","i","unavailable","redeem","itemId","MotionDiv","AnimatePresenceWrapper","Fragment","framerMotion","SparklesIcon","size","color","style","jsxs","MedalIcon","LockIcon","GamifyErrorBoundary","React","props","withErrorBoundary","Component","fallback","WrappedComponent","GamifyPageView","pageName","pathname","track","lastPathRef","page","GamifyTrackClick","cloneElement","e","createThemedStyles","AffiliateStatsInner","className","themeOverride","autoRefresh","showTierBadge","showReferralCode","showEarningsBreakdown","renderLoading","renderError","globalTheme","themedStyles","loading","copied","setCopied","cardStyle","valueStyle","formatCurrency","cents","handleCopyCode","err","tierColor","tierName","name","containerStyle","AffiliateStats","LeaderboardInner","currentUserId","emptyMessage","showMedals","showTierInfo","showEarnings","renderRow","getMedalColor","rank","getRowStyle","isCurrentUser","textStyle","secondaryStyle","currentUserRank","entry","index","medalColor","rowContent","Leaderboard","ReferralLinkInner","baseUrl","copyButtonText","copiedText","shareButtonText","shareTitle","shareText","showShareButton","showReferrerAttribution","referrerCode","onSetReferrer","onDetectFromUrl","onClearReferrer","onCopy","onShare","referrerInput","setReferrerInput","userReferralCode","origin","referralLink","handleCopy","handleShare","handleSetReferrer","canShare","inputStyle","buttonStyle","ReferralLink","gamificationStyles","getStatusColors","status","QuestProgressInner","questId","hideCompleted","expandable","defaultExpandedId","showXpReward","onComplete","renderQuest","quests","previousQuests","expandedQuestId","setExpandedQuestId","quest","prev","newMap","q","inProgressQuest","filteredQuests","getStatusBadgeStyle","getQuestBgStyle","toggleExpand","id","isExpanded","statusBadgeStyle","questBgStyle","questContent","step","QuestProgress","StreakFlameInner","showFreezeButton","onFreeze","streaks","freezing","setFreezing","displayStreaks","sizeStyles","handleFreeze","streakId","streak","statusColors","canFreeze","StreakFlame","BadgeGridInner","showLocked","columns","showProgressSummary","showFilterTabs","showStats","onBadgeClick","renderBadge","badges","filter","setFilter","shouldShowSummary","displayBadges","getRarityColors","rarity","gridStyle","unlockedCount","totalCount","progressPercent","f","badge","rarityColors","badgeContent","BadgeGrid","LevelProgressInner","showNextTier","showBenefits","progressFillStyle","key","value","LevelProgress","RewardStoreInner","showUnavailable","showPointsHeader","onRedeem","renderItem","userPoints","redeemingId","setRedeemingId","displayItems","handleRedeem","item","isRedeeming","RewardStore"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { Gamify, type GamifyConfig, type Theme, defaultTheme } from '@gamifyio/core';\n\n/**\n * Context value for Gamify React SDK\n */\nexport interface GamifyContextValue {\n /** The underlying Gamify client instance */\n client: Gamify;\n /** Track an event */\n track: (eventType: string, properties?: Record<string, unknown>) => void;\n /** Identify a user */\n identify: (userId: string, traits?: Record<string, unknown>) => void;\n /** Reset user identity */\n reset: () => void;\n /** Get current user ID */\n getUserId: () => string | null;\n /** Get anonymous ID */\n getAnonymousId: () => string;\n}\n\nconst GamifyContext = createContext<GamifyContextValue | null>(null);\n\n/**\n * Theme context for SDK components\n */\nconst ThemeContext = createContext<Theme>(defaultTheme);\n\n/**\n * Props for GamifyProvider\n */\nexport interface GamifyProviderProps {\n /** Gamify SDK configuration */\n config: GamifyConfig;\n /** Optional theme override (Partial<Theme>) */\n theme?: Partial<Theme>;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Check if code is running on the server\n */\nfunction isServer(): boolean {\n return typeof window === 'undefined';\n}\n\n/**\n * GamifyProvider - Initializes and provides Gamify SDK to React components\n *\n * @example\n * ```tsx\n * <GamifyProvider config={{ apiKey: 'your-api-key' }}>\n * <App />\n * </GamifyProvider>\n *\n * // With custom theme\n * <GamifyProvider\n * config={{ apiKey: 'your-api-key' }}\n * theme={{ primary: '#00FF00' }}\n * >\n * <App />\n * </GamifyProvider>\n * ```\n */\nexport function GamifyProvider({ config, theme, children }: GamifyProviderProps) {\n const clientRef = useRef<Gamify | null>(null);\n\n // Merge user theme with defaults\n const mergedTheme = useMemo<Theme>(() => {\n if (!theme) return defaultTheme;\n return { ...defaultTheme, ...theme };\n }, [theme]);\n\n // Initialize client only once and only on client-side\n const client = useMemo(() => {\n // SSR safety: return null on server\n if (isServer()) {\n return null;\n }\n\n // Reuse existing client if config hasn't changed\n if (clientRef.current) {\n return clientRef.current;\n }\n\n const newClient = new Gamify(config);\n clientRef.current = newClient;\n return newClient;\n }, [config.apiKey, config.endpoint]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (clientRef.current) {\n clientRef.current.shutdown();\n clientRef.current = null;\n }\n };\n }, []);\n\n // Create context value with wrapper methods\n const contextValue = useMemo<GamifyContextValue | null>(() => {\n if (!client) return null;\n\n return {\n client,\n track: (eventType, properties) => client.track(eventType, properties),\n identify: (userId, traits) => client.identify(userId, traits),\n reset: () => client.reset(),\n getUserId: () => client.getUserId(),\n getAnonymousId: () => client.getAnonymousId(),\n };\n }, [client]);\n\n // During SSR, render children without context but with theme\n if (!contextValue) {\n return (\n <ThemeContext.Provider value={mergedTheme}>\n {children}\n </ThemeContext.Provider>\n );\n }\n\n return (\n <ThemeContext.Provider value={mergedTheme}>\n <GamifyContext.Provider value={contextValue}>\n {children}\n </GamifyContext.Provider>\n </ThemeContext.Provider>\n );\n}\n\n/**\n * useGamifyContext - Internal hook to access Gamify context\n */\nexport function useGamifyContext(): GamifyContextValue | null {\n return useContext(GamifyContext);\n}\n\n/**\n * useGamifyTheme - Hook to access the current theme\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const theme = useGamifyTheme();\n * return <div style={{ color: theme.foreground }}>Themed content</div>;\n * }\n * ```\n */\nexport function useGamifyTheme(): Theme {\n return useContext(ThemeContext);\n}\n","'use client';\n\nimport { useCallback, useState, useEffect } from 'react';\nimport { useGamifyContext, type GamifyContextValue } from './context.js';\nimport type {\n CartItem,\n SessionResponse,\n LoyaltyProfile,\n LoyaltyHistoryResponse,\n // Issue #22: Affiliate types\n AffiliateStats,\n LeaderboardResponse,\n // Gamification types\n QuestWithProgress,\n StreakWithProgress,\n StreaksResponse,\n FreezeResponse,\n BadgeWithStatus,\n BadgesResponse,\n RewardItem,\n RewardsStoreResponse,\n RedemptionResult,\n} from '@gamifyio/core';\n\n/**\n * useGamify - Hook to access Gamify SDK methods\n *\n * @throws Error if used outside of GamifyProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track, identify } = useGamify();\n *\n * const handleClick = () => {\n * track('button_click', { buttonId: 'submit' });\n * };\n *\n * return <button onClick={handleClick}>Submit</button>;\n * }\n * ```\n */\nexport function useGamify(): GamifyContextValue {\n const context = useGamifyContext();\n\n if (!context) {\n throw new Error(\n 'useGamify must be used within a GamifyProvider. ' +\n 'Make sure your component is wrapped with <GamifyProvider>.'\n );\n }\n\n return context;\n}\n\n/**\n * useTrack - Hook for tracking events\n *\n * Returns a memoized track function that can be safely used in dependencies.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const track = useTrack();\n *\n * useEffect(() => {\n * track('component_viewed', { componentName: 'MyComponent' });\n * }, [track]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTrack(): (\n eventType: string,\n properties?: Record<string, unknown>\n) => void {\n const context = useGamifyContext();\n\n return useCallback(\n (eventType: string, properties?: Record<string, unknown>) => {\n if (context) {\n context.track(eventType, properties);\n }\n },\n [context]\n );\n}\n\n/**\n * useIdentify - Hook for identifying users\n *\n * Returns a memoized identify function.\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const identify = useIdentify();\n *\n * const handleLogin = async (user: User) => {\n * await loginUser(user);\n * identify(user.id, { email: user.email, name: user.name });\n * };\n *\n * return <button onClick={handleLogin}>Login</button>;\n * }\n * ```\n */\nexport function useIdentify(): (\n userId: string,\n traits?: Record<string, unknown>\n) => void {\n const context = useGamifyContext();\n\n return useCallback(\n (userId: string, traits?: Record<string, unknown>) => {\n if (context) {\n context.identify(userId, traits);\n }\n },\n [context]\n );\n}\n\n// ============================================\n// Issue #14: useSession Hook\n// ============================================\n\ninterface SessionState {\n session: SessionResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface SessionActions {\n updateCart: (items: CartItem[], coupons?: string[], currency?: string) => Promise<void>;\n applyCoupon: (code: string) => Promise<void>;\n complete: () => Promise<void>;\n clearSession: () => void;\n refresh: () => Promise<void>;\n}\n\n/**\n * useSession - Hook for managing cart sessions with discounts\n *\n * @example\n * ```tsx\n * function CartPage() {\n * const { session, loading, updateCart, applyCoupon, complete } = useSession();\n *\n * const handleAddItem = async (item: CartItem) => {\n * const items = [...(session?.items || []), item];\n * await updateCart(items);\n * };\n *\n * return (\n * <div>\n * {loading && <Spinner />}\n * <p>Subtotal: ${session?.subtotal}</p>\n * <p>Discount: ${session?.discount}</p>\n * <p>Total: ${session?.total}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSession(): SessionState & SessionActions {\n const context = useGamifyContext();\n const [state, setState] = useState<SessionState>({\n session: context?.client?.session?.getCachedSession() ?? null,\n loading: false,\n error: null,\n });\n\n const updateCart = useCallback(\n async (items: CartItem[], coupons?: string[], currency?: string) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.updateCart(items, coupons, currency);\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n const applyCoupon = useCallback(\n async (code: string) => {\n if (!context?.client?.session) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.applyCoupon(code);\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n const complete = useCallback(async () => {\n if (!context?.client?.session) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.complete();\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const clearSession = useCallback(() => {\n if (context?.client?.session) {\n context.client.session.clearSession();\n setState({ session: null, loading: false, error: null });\n }\n }, [context]);\n\n const refresh = useCallback(async () => {\n if (!context?.client?.session) {\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const session = await context.client.session.getSession();\n setState({ session, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n return {\n ...state,\n updateCart,\n applyCoupon,\n complete,\n clearSession,\n refresh,\n };\n}\n\n// ============================================\n// Issue #15: useLoyalty Hook\n// ============================================\n\ninterface LoyaltyState {\n profile: LoyaltyProfile | null;\n history: LoyaltyHistoryResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface LoyaltyActions {\n refreshProfile: () => Promise<void>;\n refreshHistory: (limit?: number, offset?: number) => Promise<void>;\n}\n\n/**\n * useLoyalty - Hook for managing customer loyalty data\n *\n * @param options - Auto-refresh options\n *\n * @example\n * ```tsx\n * function LoyaltyDashboard() {\n * const { profile, history, loading, refreshProfile } = useLoyalty({\n * autoRefresh: true,\n * });\n *\n * return (\n * <div>\n * {loading && <Spinner />}\n * <p>Points: {profile?.points}</p>\n * <p>Tier: {profile?.tier?.name}</p>\n * <p>Next tier: {profile?.nextTier?.name} ({profile?.nextTier?.pointsNeeded} points needed)</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useLoyalty(options?: {\n autoRefresh?: boolean;\n}): LoyaltyState & LoyaltyActions {\n const context = useGamifyContext();\n const [state, setState] = useState<LoyaltyState>({\n profile: context?.client?.loyalty?.getCachedProfile() ?? null,\n history: null,\n loading: false,\n error: null,\n });\n\n const refreshProfile = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const profile = await context.client.getLoyaltyProfile();\n setState((s) => ({ ...s, profile, loading: false, error: null }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const refreshHistory = useCallback(\n async (limit?: number, offset?: number) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const history = await context.client.getLoyaltyHistory(limit, offset);\n setState((s) => ({ ...s, history, loading: false, error: null }));\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refreshProfile();\n }\n }, [options?.autoRefresh, context, refreshProfile]);\n\n return {\n ...state,\n refreshProfile,\n refreshHistory,\n };\n}\n\n// ============================================\n// Issue #22: useReferral Hook\n// ============================================\n\ninterface ReferralState {\n referrerCode: string | null;\n hasReferrer: boolean;\n}\n\ninterface ReferralActions {\n setReferrer: (code: string) => void;\n clearReferrer: () => void;\n detectFromUrl: () => string | null;\n}\n\n/**\n * useReferral - Hook for managing referral attribution\n *\n * Automatically detects `?ref=code` parameter from URLs and stores\n * the referrer code in localStorage for attribution tracking.\n *\n * @example\n * ```tsx\n * function SignupPage() {\n * const { referrerCode, hasReferrer, setReferrer } = useReferral();\n *\n * useEffect(() => {\n * if (hasReferrer) {\n * console.log('User was referred by:', referrerCode);\n * }\n * }, [hasReferrer, referrerCode]);\n *\n * return (\n * <div>\n * {hasReferrer && <p>Thanks for using referral code: {referrerCode}</p>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useReferral(): ReferralState & ReferralActions {\n const context = useGamifyContext();\n const [state, setState] = useState<ReferralState>({\n referrerCode: context?.client?.referral?.getReferrer() ?? null,\n hasReferrer: context?.client?.referral?.hasReferrer() ?? false,\n });\n\n const setReferrer = useCallback(\n (code: string) => {\n if (context?.client?.referral) {\n context.client.referral.setReferrer(code);\n setState({\n referrerCode: code,\n hasReferrer: true,\n });\n }\n },\n [context]\n );\n\n const clearReferrer = useCallback(() => {\n if (context?.client?.referral) {\n context.client.referral.clearReferrer();\n setState({\n referrerCode: null,\n hasReferrer: false,\n });\n }\n }, [context]);\n\n const detectFromUrl = useCallback(() => {\n if (context?.client?.referral) {\n const code = context.client.referral.detectReferrerFromUrl();\n if (code) {\n setState({\n referrerCode: code,\n hasReferrer: true,\n });\n }\n return code;\n }\n return null;\n }, [context]);\n\n // Auto-detect on mount\n useEffect(() => {\n if (context?.client?.referral) {\n const code = context.client.referral.getReferrer();\n setState({\n referrerCode: code,\n hasReferrer: code !== null,\n });\n }\n }, [context]);\n\n return {\n ...state,\n setReferrer,\n clearReferrer,\n detectFromUrl,\n };\n}\n\n// ============================================\n// Issue #22: useAffiliateStats Hook\n// ============================================\n\ninterface AffiliateState {\n stats: AffiliateStats | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface AffiliateActions {\n refreshStats: (forceRefresh?: boolean) => Promise<void>;\n}\n\n/**\n * useAffiliateStats - Hook for fetching user affiliate statistics\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function AffiliateDashboard() {\n * const { stats, loading, error, refreshStats } = useAffiliateStats({\n * autoRefresh: true,\n * });\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <div>\n * <p>Your referral code: {stats?.referralCode}</p>\n * <p>Referrals: {stats?.referralCount}</p>\n * <p>Total earnings: ${(stats?.earnings.totalEarned ?? 0) / 100}</p>\n * <p>Current tier: {stats?.tier?.name ?? 'None'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAffiliateStats(options?: {\n autoRefresh?: boolean;\n}): AffiliateState & AffiliateActions {\n const context = useGamifyContext();\n const [state, setState] = useState<AffiliateState>({\n stats: context?.client?.affiliate?.getCachedStats() ?? null,\n loading: false,\n error: null,\n });\n\n const refreshStats = useCallback(\n async (forceRefresh = false) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const stats = await context.client.getAffiliateStats(forceRefresh);\n setState({ stats, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refreshStats();\n }\n }, [options?.autoRefresh, context, refreshStats]);\n\n return {\n ...state,\n refreshStats,\n };\n}\n\n// ============================================\n// Issue #22: useLeaderboard Hook\n// ============================================\n\ninterface LeaderboardState {\n leaderboard: LeaderboardResponse | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface LeaderboardActions {\n refresh: (limit?: number) => Promise<void>;\n}\n\n/**\n * useLeaderboard - Hook for fetching affiliate leaderboard data\n *\n * @param limit - Number of entries to fetch (default: 10)\n *\n * @example\n * ```tsx\n * function LeaderboardPage() {\n * const { leaderboard, loading, error, refresh } = useLeaderboard(10);\n *\n * useEffect(() => {\n * refresh();\n * }, [refresh]);\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <ol>\n * {leaderboard?.entries.map((entry) => (\n * <li key={entry.userId}>\n * #{entry.rank} - {entry.displayName}: {entry.referralCount} referrals\n * </li>\n * ))}\n * </ol>\n * );\n * }\n * ```\n */\nexport function useLeaderboard(\n limit = 10\n): LeaderboardState & LeaderboardActions {\n const context = useGamifyContext();\n const [state, setState] = useState<LeaderboardState>({\n leaderboard: null,\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(\n async (customLimit?: number) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const leaderboard = await context.client.getLeaderboard(customLimit ?? limit);\n setState({ leaderboard, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context, limit]\n );\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #25-28: useQuests Hook\n// ============================================\n\ninterface QuestsState {\n quests: QuestWithProgress[];\n loading: boolean;\n error: string | null;\n}\n\ninterface QuestsActions {\n refresh: () => Promise<void>;\n}\n\n/**\n * useQuests - Hook for fetching user's quest progress\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function QuestsPage() {\n * const { quests, loading, error, refresh } = useQuests({ autoRefresh: true });\n *\n * if (loading) return <Spinner />;\n * if (error) return <Error message={error} />;\n *\n * return (\n * <div>\n * {quests.map((quest) => (\n * <div key={quest.id}>\n * <h3>{quest.name}</h3>\n * <p>Progress: {quest.percentComplete}%</p>\n * <p>Status: {quest.status}</p>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useQuests(options?: {\n autoRefresh?: boolean;\n}): QuestsState & QuestsActions {\n const context = useGamifyContext();\n const [state, setState] = useState<QuestsState>({\n quests: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getQuests();\n setState({ quests: response.quests, loading: false, error: null });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #32: useStreaks Hook\n// ============================================\n\ninterface StreaksState {\n streaks: StreakWithProgress[];\n stats: StreaksResponse['stats'] | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface StreaksActions {\n refresh: () => Promise<void>;\n freeze: (ruleId: string) => Promise<FreezeResponse | null>;\n}\n\n/**\n * useStreaks - Hook for managing user's streak progress\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function StreaksPage() {\n * const { streaks, stats, loading, freeze } = useStreaks({ autoRefresh: true });\n *\n * return (\n * <div>\n * <p>Active streaks: {stats?.totalActive}</p>\n * {streaks.map((streak) => (\n * <div key={streak.id}>\n * <span>🔥 {streak.currentCount}</span>\n * <span>{streak.name}</span>\n * {streak.freezeInventory > 0 && (\n * <button onClick={() => freeze(streak.id)}>\n * Use Freeze ({streak.freezeInventory} left)\n * </button>\n * )}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStreaks(options?: {\n autoRefresh?: boolean;\n}): StreaksState & StreaksActions {\n const context = useGamifyContext();\n const [state, setState] = useState<StreaksState>({\n streaks: [],\n stats: null,\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getStreaks();\n setState({\n streaks: response.streaks,\n stats: response.stats,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const freeze = useCallback(\n async (ruleId: string): Promise<FreezeResponse | null> => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return null;\n }\n\n try {\n const result = await context.client.useStreakFreeze(ruleId);\n // Refresh to update freeze count\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, error: message }));\n return null;\n }\n },\n [context, refresh]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n freeze,\n };\n}\n\n// ============================================\n// Issue #33: useBadges Hook\n// ============================================\n\ninterface BadgesState {\n badges: BadgeWithStatus[];\n stats: BadgesResponse['stats'] | null;\n earned: BadgeWithStatus[];\n locked: BadgeWithStatus[];\n loading: boolean;\n error: string | null;\n}\n\ninterface BadgesActions {\n refresh: (category?: string) => Promise<void>;\n}\n\n/**\n * useBadges - Hook for fetching user's badge collection\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function BadgesPage() {\n * const { badges, earned, locked, stats, loading } = useBadges({ autoRefresh: true });\n *\n * return (\n * <div>\n * <p>Unlocked: {stats?.unlocked} / {stats?.total}</p>\n * <div className=\"grid\">\n * {badges.map((badge) => (\n * <div key={badge.id} className={badge.isUnlocked ? '' : 'grayscale'}>\n * <img src={badge.iconUrl} alt={badge.name} />\n * <span>{badge.name}</span>\n * <span className={`rarity-${badge.rarity.toLowerCase()}`}>\n * {badge.rarity}\n * </span>\n * </div>\n * ))}\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useBadges(options?: {\n autoRefresh?: boolean;\n category?: string;\n}): BadgesState & BadgesActions {\n const context = useGamifyContext();\n const [state, setState] = useState<BadgesState>({\n badges: [],\n stats: null,\n earned: [],\n locked: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(\n async (category?: string) => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getBadges(category ?? options?.category);\n const earned = response.badges.filter((b) => b.isUnlocked);\n const locked = response.badges.filter((b) => !b.isUnlocked);\n setState({\n badges: response.badges,\n stats: response.stats,\n earned,\n locked,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n },\n [context, options?.category]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n };\n}\n\n// ============================================\n// Issue #34: useRewards Hook\n// ============================================\n\ninterface RewardsState {\n items: RewardItem[];\n userPoints: number;\n available: RewardItem[];\n unavailable: RewardItem[];\n loading: boolean;\n error: string | null;\n}\n\ninterface RewardsActions {\n refresh: () => Promise<void>;\n redeem: (itemId: string) => Promise<RedemptionResult | null>;\n}\n\n/**\n * useRewards - Hook for fetching and redeeming rewards\n *\n * @param options - Configuration options\n *\n * @example\n * ```tsx\n * function RewardsStore() {\n * const { items, userPoints, loading, redeem } = useRewards({ autoRefresh: true });\n *\n * const handleRedeem = async (itemId: string) => {\n * const result = await redeem(itemId);\n * if (result?.success) {\n * alert('Reward redeemed!');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Your points: {userPoints}</p>\n * <div className=\"grid\">\n * {items.map((item) => (\n * <div key={item.id}>\n * <img src={item.imageUrl} alt={item.name} />\n * <span>{item.name}</span>\n * <span>{item.pointsCost} points</span>\n * <button\n * disabled={!item.isAvailable}\n * onClick={() => handleRedeem(item.id)}\n * >\n * {item.canAfford ? 'Redeem' : `Need ${item.pointsCost - userPoints} more`}\n * </button>\n * </div>\n * ))}\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useRewards(options?: {\n autoRefresh?: boolean;\n}): RewardsState & RewardsActions {\n const context = useGamifyContext();\n const [state, setState] = useState<RewardsState>({\n items: [],\n userPoints: 0,\n available: [],\n unavailable: [],\n loading: false,\n error: null,\n });\n\n const refresh = useCallback(async () => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const response = await context.client.getRewardsStore();\n const available = response.items.filter((i) => i.isAvailable);\n const unavailable = response.items.filter((i) => !i.isAvailable);\n setState({\n items: response.items,\n userPoints: response.userPoints,\n available,\n unavailable,\n loading: false,\n error: null,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n }\n }, [context]);\n\n const redeem = useCallback(\n async (itemId: string): Promise<RedemptionResult | null> => {\n if (!context?.client) {\n setState((s) => ({ ...s, error: 'SDK not initialized' }));\n return null;\n }\n\n setState((s) => ({ ...s, loading: true, error: null }));\n\n try {\n const result = await context.client.redeemReward(itemId);\n // Refresh to update points and availability\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n setState((s) => ({ ...s, loading: false, error: message }));\n return null;\n }\n },\n [context, refresh]\n );\n\n // Auto-refresh on mount if user is identified\n useEffect(() => {\n if (options?.autoRefresh && context?.client?.getUserId()) {\n void refresh();\n }\n }, [options?.autoRefresh, context, refresh]);\n\n return {\n ...state,\n refresh,\n redeem,\n };\n}\n","'use client';\n\nimport React, { useEffect, useRef, useState, cloneElement } from 'react';\nimport {\n useTrack,\n useAffiliateStats,\n useLeaderboard,\n useReferral,\n useQuests,\n useStreaks,\n useBadges,\n useRewards,\n useLoyalty,\n} from './hooks.js';\nimport { useGamifyTheme } from './context.js';\nimport type { Theme } from '@gamifyio/core';\nimport type {\n LeaderboardEntry,\n QuestWithProgress,\n QuestStep,\n StreakWithProgress,\n BadgeWithStatus,\n BadgeRarity,\n RewardItem,\n RedemptionResult,\n} from '@gamifyio/core';\n\n// ============================================\n// Optional framer-motion support\n// ============================================\n\ntype MotionComponent = React.ComponentType<{\n initial?: Record<string, unknown>;\n animate?: Record<string, unknown>;\n exit?: Record<string, unknown>;\n transition?: Record<string, unknown>;\n style?: React.CSSProperties;\n className?: string;\n children?: React.ReactNode;\n key?: string | number;\n onClick?: () => void;\n}>;\n\ntype AnimatePresenceComponent = React.ComponentType<{\n children?: React.ReactNode;\n mode?: 'sync' | 'wait' | 'popLayout';\n}>;\n\nlet MotionDiv: MotionComponent | 'div' = 'div';\nlet AnimatePresenceWrapper: AnimatePresenceComponent = ({ children }: { children?: React.ReactNode }) => <>{children}</>;\n\n// Try to import framer-motion (will fail gracefully if not installed)\ntry {\n // Dynamic import at module level for bundlers that support it\n const framerMotion = require('framer-motion');\n if (framerMotion?.motion?.div) {\n MotionDiv = framerMotion.motion.div;\n }\n if (framerMotion?.AnimatePresence) {\n AnimatePresenceWrapper = framerMotion.AnimatePresence;\n }\n} catch {\n // framer-motion not installed, use fallbacks\n}\n\n// Helper to check if animations are available\nconst hasAnimations = MotionDiv !== 'div';\n\n// ============================================\n// Inline SVG Icons (lucide-react style)\n// ============================================\n\ninterface IconProps {\n size?: number;\n color?: string;\n style?: React.CSSProperties;\n}\n\nconst SparklesIcon: React.FC<IconProps> = ({ size = 20, color = 'currentColor', style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n >\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n <path d=\"M20 3v4\" />\n <path d=\"M22 5h-4\" />\n <path d=\"M4 17v2\" />\n <path d=\"M5 18H3\" />\n </svg>\n);\n\nconst MedalIcon: React.FC<IconProps> = ({ size = 20, color = 'currentColor', style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n >\n <path d=\"M7.21 15 2.66 7.14a2 2 0 0 1 .13-2.2L4.4 2.8A2 2 0 0 1 6 2h12a2 2 0 0 1 1.6.8l1.6 2.14a2 2 0 0 1 .14 2.2L16.79 15\" />\n <path d=\"M11 12 5.12 2.2\" />\n <path d=\"m13 12 5.88-9.8\" />\n <path d=\"M8 7h8\" />\n <circle cx=\"12\" cy=\"17\" r=\"5\" />\n <path d=\"M12 18v-2h-.5\" />\n </svg>\n);\n\nconst LockIcon: React.FC<IconProps> = ({ size = 20, color = 'currentColor', style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n >\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n);\n\n// ============================================\n// Error Boundary for SDK Components\n// ============================================\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}\n\n/**\n * Error boundary component to prevent SDK components from crashing client sites\n */\nclass GamifyErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n return (\n <div style={{ padding: '16px', color: '#6c757d', fontSize: '14px', textAlign: 'center' }}>\n Unable to load this section. Please try refreshing the page.\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n/**\n * HOC to wrap components with error boundary\n */\nfunction withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n fallback?: React.ReactNode\n): React.FC<P> {\n const WrappedComponent: React.FC<P> = (props: P) => {\n return (\n <GamifyErrorBoundary fallback={fallback}>\n <Component {...props} />\n </GamifyErrorBoundary>\n );\n };\n WrappedComponent.displayName = `WithErrorBoundary(${Component.displayName || Component.name || 'Component'})`;\n return WrappedComponent;\n}\n\n/**\n * Props for GamifyPageView component\n */\nexport interface GamifyPageViewProps {\n /** Custom page name (defaults to document.title or window.location.pathname) */\n pageName?: string;\n /** Additional properties to include with page view events */\n properties?: Record<string, unknown>;\n /** Track on route changes (for SPAs) - requires pathname prop */\n pathname?: string;\n}\n\n/**\n * GamifyPageView - Component for automatic page view tracking\n *\n * Place this component in your layout or page components to automatically\n * track page views. For SPAs using Next.js App Router, pass the pathname\n * from usePathname() to track route changes.\n *\n * @example\n * ```tsx\n * // Basic usage - tracks on mount\n * function Page() {\n * return (\n * <>\n * <GamifyPageView />\n * <div>Page content</div>\n * </>\n * );\n * }\n *\n * // With Next.js App Router\n * 'use client';\n * import { usePathname } from 'next/navigation';\n *\n * function Layout({ children }) {\n * const pathname = usePathname();\n * return (\n * <>\n * <GamifyPageView pathname={pathname} />\n * {children}\n * </>\n * );\n * }\n *\n * // With custom properties\n * function ProductPage({ productId }) {\n * return (\n * <>\n * <GamifyPageView\n * pageName=\"Product Detail\"\n * properties={{ productId, category: 'electronics' }}\n * />\n * <div>Product content</div>\n * </>\n * );\n * }\n * ```\n */\nexport function GamifyPageView({\n pageName,\n properties,\n pathname,\n}: GamifyPageViewProps) {\n const track = useTrack();\n const lastPathRef = useRef<string | null>(null);\n\n useEffect(() => {\n // Skip if running on server\n if (typeof window === 'undefined') {\n return;\n }\n\n // For SPA routing: only track if pathname changed\n if (pathname !== undefined) {\n if (lastPathRef.current === pathname) {\n return;\n }\n lastPathRef.current = pathname;\n }\n\n // Determine page name\n const page =\n pageName ??\n (typeof document !== 'undefined' ? document.title : null) ??\n (typeof window !== 'undefined' ? window.location.pathname : 'unknown');\n\n // Track page view\n track('page_view', {\n page,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n ...properties,\n });\n }, [track, pageName, pathname, properties]);\n\n // This component doesn't render anything\n return null;\n}\n\n/**\n * Props for GamifyTrackClick component\n */\nexport interface GamifyTrackClickProps {\n /** Event type to track */\n eventType: string;\n /** Properties to include with the event */\n properties?: Record<string, unknown>;\n /** Child element (must accept onClick) */\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>;\n}\n\n/**\n * GamifyTrackClick - Component wrapper for click tracking\n *\n * Wraps a child element and tracks clicks automatically.\n *\n * @example\n * ```tsx\n * <GamifyTrackClick\n * eventType=\"button_click\"\n * properties={{ buttonId: 'subscribe', location: 'header' }}\n * >\n * <button>Subscribe</button>\n * </GamifyTrackClick>\n * ```\n */\nexport function GamifyTrackClick({\n eventType,\n properties,\n children,\n}: GamifyTrackClickProps) {\n const track = useTrack();\n\n const handleClick = (e: React.MouseEvent) => {\n track(eventType, properties);\n\n // Call original onClick if it exists\n if (children.props.onClick) {\n children.props.onClick(e);\n }\n };\n\n // Clone the child and inject onClick handler\n return cloneElement(children, { onClick: handleClick });\n}\n\n// ============================================\n// Issue #23: Affiliate UI Components\n// ============================================\n\n/**\n * Create themed styles for SDK components\n * Uses CSS-in-JS for zero-dependency styling\n */\nfunction createThemedStyles(theme: Theme) {\n return {\n statsContainer: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n statsCard: {\n backgroundColor: theme.cardBackground ?? theme.background,\n borderRadius: '8px',\n padding: '16px',\n textAlign: 'center' as const,\n border: `1px solid ${theme.cardBorder ?? theme.border}`,\n } as React.CSSProperties,\n statsValue: {\n fontSize: '24px',\n fontWeight: 'bold',\n color: theme.foreground,\n marginBottom: '4px',\n } as React.CSSProperties,\n statsLabel: {\n fontSize: '14px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n leaderboardContainer: {\n padding: '16px',\n } as React.CSSProperties,\n leaderboardList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n } as React.CSSProperties,\n leaderboardRow: {\n display: 'flex',\n alignItems: 'center',\n padding: '12px',\n borderBottom: `1px solid ${theme.border}`,\n } as React.CSSProperties,\n leaderboardRowHighlighted: {\n display: 'flex',\n alignItems: 'center',\n padding: '12px',\n borderBottom: `1px solid ${theme.border}`,\n backgroundColor: `${theme.primary}20`,\n } as React.CSSProperties,\n leaderboardRank: {\n fontWeight: 'bold',\n width: '40px',\n color: theme.foreground,\n } as React.CSSProperties,\n leaderboardName: {\n flex: 1,\n marginLeft: '12px',\n color: theme.foreground,\n } as React.CSSProperties,\n leaderboardStats: {\n color: theme.foregroundSecondary,\n fontSize: '14px',\n } as React.CSSProperties,\n leaderboardEmpty: {\n textAlign: 'center' as const,\n padding: '32px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n referralContainer: {\n display: 'flex',\n gap: '8px',\n padding: '8px',\n } as React.CSSProperties,\n referralInput: {\n flex: 1,\n padding: '10px 12px',\n border: `1px solid ${theme.inputBorder ?? theme.border}`,\n borderRadius: '6px',\n fontSize: '14px',\n backgroundColor: theme.inputBackground ?? theme.backgroundSecondary,\n color: theme.foreground,\n } as React.CSSProperties,\n referralButton: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: theme.buttonBackground ?? theme.primary,\n color: theme.buttonForeground ?? theme.primaryForeground,\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n } as React.CSSProperties,\n // Tier badge styles\n tierBadge: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px',\n borderRadius: '8px',\n marginBottom: '12px',\n } as React.CSSProperties,\n tierBadgeIcon: {\n width: '20px',\n height: '20px',\n } as React.CSSProperties,\n tierBadgeText: {\n flex: 1,\n } as React.CSSProperties,\n tierBadgeName: {\n fontWeight: '500',\n fontSize: '14px',\n } as React.CSSProperties,\n tierBadgeRate: {\n fontSize: '12px',\n opacity: 0.8,\n } as React.CSSProperties,\n // Referral code row\n referralCodeRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: theme.backgroundSecondary,\n borderRadius: '8px',\n marginBottom: '12px',\n } as React.CSSProperties,\n referralCodeLabel: {\n fontSize: '12px',\n color: theme.foregroundSecondary,\n marginBottom: '2px',\n } as React.CSSProperties,\n referralCodeValue: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n referralCodeCopyButton: {\n padding: '6px 10px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: theme.foregroundSecondary,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as React.CSSProperties,\n // 2-column stats grid\n statsGrid2Col: {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '12px',\n marginBottom: '12px',\n } as React.CSSProperties,\n // Earnings breakdown\n earningsBreakdown: {\n borderTop: `1px solid ${theme.border}`,\n paddingTop: '12px',\n marginTop: '12px',\n } as React.CSSProperties,\n earningsTitle: {\n fontSize: '14px',\n fontWeight: '500',\n color: theme.foreground,\n marginBottom: '8px',\n } as React.CSSProperties,\n earningsRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '4px 0',\n } as React.CSSProperties,\n earningsLabel: {\n fontSize: '14px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n earningsValue: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n earningsValueGreen: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.success,\n } as React.CSSProperties,\n earningsValueYellow: {\n fontFamily: 'monospace',\n fontWeight: '500',\n fontSize: '14px',\n color: theme.warning,\n } as React.CSSProperties,\n // Medal styles for leaderboard\n medalIcon: {\n width: '24px',\n height: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '18px',\n } as React.CSSProperties,\n // Referrer attribution\n referrerSection: {\n borderTop: `1px solid ${theme.border}`,\n paddingTop: '12px',\n marginTop: '12px',\n } as React.CSSProperties,\n referrerTitle: {\n fontSize: '14px',\n fontWeight: '500',\n color: theme.foreground,\n marginBottom: '8px',\n } as React.CSSProperties,\n referrerBadge: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: `${theme.success}15`,\n border: `1px solid ${theme.success}30`,\n borderRadius: '8px',\n } as React.CSSProperties,\n referrerBadgeInfo: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '14px',\n color: theme.foreground,\n } as React.CSSProperties,\n referrerBadgeIcon: {\n color: theme.success,\n } as React.CSSProperties,\n referrerClearButton: {\n padding: '4px 8px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: theme.foregroundSecondary,\n cursor: 'pointer',\n } as React.CSSProperties,\n referrerInputRow: {\n display: 'flex',\n gap: '8px',\n marginBottom: '8px',\n } as React.CSSProperties,\n referrerDetectButton: {\n width: '100%',\n padding: '10px 16px',\n border: `1px solid ${theme.border}`,\n borderRadius: '6px',\n backgroundColor: theme.backgroundSecondary,\n color: theme.foreground,\n cursor: 'pointer',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n } as React.CSSProperties,\n // Filter tabs\n filterTabs: {\n display: 'flex',\n gap: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n filterTab: {\n padding: '6px 12px',\n fontSize: '12px',\n borderRadius: '9999px',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: theme.backgroundSecondary,\n color: theme.foregroundSecondary,\n transition: 'all 0.2s',\n } as React.CSSProperties,\n filterTabActive: {\n padding: '6px 12px',\n fontSize: '12px',\n borderRadius: '9999px',\n border: 'none',\n cursor: 'pointer',\n backgroundColor: theme.primary,\n color: theme.primaryForeground,\n } as React.CSSProperties,\n // Progress summary for badges\n progressSummary: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n backgroundColor: theme.backgroundSecondary,\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n progressSummaryLeft: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n } as React.CSSProperties,\n progressSummaryIcon: {\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: `${theme.primary}20`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.primary,\n fontSize: '18px',\n } as React.CSSProperties,\n progressSummaryText: {\n fontWeight: '500',\n fontSize: '16px',\n color: theme.foreground,\n } as React.CSSProperties,\n progressSummarySubtext: {\n fontSize: '12px',\n color: theme.foregroundSecondary,\n } as React.CSSProperties,\n progressSummaryBar: {\n width: '80px',\n height: '8px',\n backgroundColor: theme.border,\n borderRadius: '4px',\n overflow: 'hidden',\n } as React.CSSProperties,\n progressSummaryBarFill: {\n height: '100%',\n backgroundColor: theme.primary,\n borderRadius: '4px',\n } as React.CSSProperties,\n // Badge progress bar for locked badges\n badgeProgressBar: {\n width: '100%',\n height: '4px',\n backgroundColor: theme.border,\n borderRadius: '2px',\n overflow: 'hidden',\n marginTop: '8px',\n } as React.CSSProperties,\n badgeProgressFill: {\n height: '100%',\n backgroundColor: theme.foregroundSecondary,\n borderRadius: '2px',\n } as React.CSSProperties,\n badgeProgressText: {\n fontSize: '10px',\n color: theme.foregroundSecondary,\n marginTop: '4px',\n } as React.CSSProperties,\n badgeCheckmark: {\n position: 'absolute' as const,\n top: '8px',\n right: '8px',\n color: theme.success,\n } as React.CSSProperties,\n };\n}\n\n// Type for themed styles\ntype ThemedStyles = ReturnType<typeof createThemedStyles>;\n\n/**\n * Props for AffiliateStats component\n */\nexport interface AffiliateStatsProps {\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n valueColor?: string;\n labelColor?: string;\n };\n /** Auto-refresh stats on mount */\n autoRefresh?: boolean;\n /** Show tier badge with commission rate (default: true) */\n showTierBadge?: boolean;\n /** Show referral code with copy button (default: true) */\n showReferralCode?: boolean;\n /** Show earnings breakdown section (default: true) */\n showEarningsBreakdown?: boolean;\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * AffiliateStats - Display grid with affiliate statistics\n *\n * Shows referral count, clicks, and earnings in a card layout.\n * Headless-first: unstyled by default but includes sensible defaults.\n *\n * @example\n * ```tsx\n * <AffiliateStats autoRefresh />\n *\n * // With custom theme\n * <AffiliateStats\n * theme={{ cardBackground: '#1a1a1a', valueColor: '#fff' }}\n * />\n * ```\n */\nfunction AffiliateStatsInner({\n className,\n style,\n theme: themeOverride,\n autoRefresh = true,\n showTierBadge = true,\n showReferralCode = true,\n showEarningsBreakdown = true,\n renderLoading,\n renderError,\n}: AffiliateStatsProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { stats, loading, error, refreshStats } = useAffiliateStats({ autoRefresh });\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (autoRefresh) {\n void refreshStats();\n }\n }, [autoRefresh, refreshStats]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n if (!stats || !stats.earnings) {\n return null;\n }\n\n const cardStyle = {\n ...themedStyles.statsCard,\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { border: `1px solid ${themeOverride.cardBorder}` }),\n };\n\n const valueStyle = {\n ...themedStyles.statsValue,\n ...(themeOverride?.valueColor && { color: themeOverride.valueColor }),\n };\n\n const formatCurrency = (cents: number) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: stats.earnings?.currency ?? 'USD',\n }).format(cents / 100);\n };\n\n const handleCopyCode = async () => {\n if (!stats.referralCode) return;\n try {\n await navigator.clipboard.writeText(stats.referralCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n // Get tier color based on tier name (common tier naming conventions)\n const getTierColor = (tierName?: string): string => {\n if (!tierName) return '#6c757d';\n const name = tierName.toLowerCase();\n if (name.includes('elite') || name.includes('diamond') || name.includes('platinum')) return '#FFD700';\n if (name.includes('gold') || name.includes('vip')) return '#FFD700';\n if (name.includes('silver') || name.includes('pro')) return '#C0C0C0';\n if (name.includes('bronze') || name.includes('starter')) return '#CD7F32';\n return '#0d6efd'; // Default blue\n };\n\n const tierColor = getTierColor(stats.tier?.name);\n\n const containerStyle: React.CSSProperties = {\n padding: '16px',\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { border: `1px solid ${themeOverride.cardBorder}` }),\n ...style,\n };\n\n return (\n <div className={className} style={containerStyle}>\n {/* Tier Badge */}\n {showTierBadge && (\n <div\n style={{\n ...themedStyles.tierBadge,\n backgroundColor: stats.tier ? `${tierColor}20` : globalTheme.backgroundSecondary,\n }}\n >\n <span style={{ ...themedStyles.tierBadgeIcon, color: tierColor }}>👑</span>\n <div style={themedStyles.tierBadgeText}>\n <div style={{ ...themedStyles.tierBadgeName, color: stats.tier ? tierColor : globalTheme.foregroundSecondary }}>\n {stats.tier ? `${stats.tier.name} Affiliate` : 'No Tier'}\n </div>\n <div style={{ ...themedStyles.tierBadgeRate, color: stats.tier ? tierColor : globalTheme.foregroundSecondary }}>\n {stats.tier\n ? `${stats.tier.value}% commission rate`\n : 'Refer users to unlock affiliate status'}\n </div>\n </div>\n </div>\n )}\n\n {/* Referral Code */}\n {showReferralCode && stats.referralCode && (\n <div style={themedStyles.referralCodeRow}>\n <div>\n <div style={themedStyles.referralCodeLabel}>Your referral code</div>\n <div style={themedStyles.referralCodeValue}>{stats.referralCode}</div>\n </div>\n <button\n type=\"button\"\n onClick={handleCopyCode}\n style={themedStyles.referralCodeCopyButton}\n aria-label=\"Copy referral code\"\n >\n {copied ? '✓' : '📋'}\n </button>\n </div>\n )}\n\n {/* 2-Column Stats Grid */}\n <div style={themedStyles.statsGrid2Col}>\n <div style={cardStyle}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', color: globalTheme.foregroundSecondary, marginBottom: '4px' }}>\n <span>👥</span>\n <span style={{ fontSize: '12px' }}>Referrals</span>\n </div>\n <div style={{ ...valueStyle, fontFamily: 'monospace' }}>{stats.referralCount}</div>\n </div>\n <div style={cardStyle}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', color: globalTheme.foregroundSecondary, marginBottom: '4px' }}>\n <span>💰</span>\n <span style={{ fontSize: '12px' }}>Commissions</span>\n </div>\n <div style={{ ...valueStyle, fontFamily: 'monospace' }}>{stats.earnings.transactionCount}</div>\n </div>\n </div>\n\n {/* Earnings Breakdown */}\n {showEarningsBreakdown && (\n <div style={themedStyles.earningsBreakdown}>\n <div style={themedStyles.earningsTitle}>Earnings</div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Total Earned</span>\n <span style={themedStyles.earningsValueGreen}>\n {formatCurrency(stats.earnings.totalEarned)}\n </span>\n </div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Pending</span>\n <span style={themedStyles.earningsValueYellow}>\n {formatCurrency(stats.earnings.totalPending)}\n </span>\n </div>\n <div style={themedStyles.earningsRow}>\n <span style={themedStyles.earningsLabel}>Paid Out</span>\n <span style={{ ...themedStyles.earningsValue, color: globalTheme.foregroundSecondary }}>\n {formatCurrency(stats.earnings.totalPaid)}\n </span>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const AffiliateStats = withErrorBoundary(AffiliateStatsInner);\n\n/**\n * Props for Leaderboard component\n */\nexport interface LeaderboardProps {\n /** Number of entries to display (default: 10) */\n limit?: number;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Current user ID for highlighting */\n currentUserId?: string;\n /** Custom empty state message */\n emptyMessage?: string;\n /** Show medal icons for top 3 positions (default: true) */\n showMedals?: boolean;\n /** Show tier info with percentage (default: true) */\n showTierInfo?: boolean;\n /** Show earnings column (default: true) */\n showEarnings?: boolean;\n /** Theme customization */\n theme?: {\n rowBackground?: string;\n highlightBackground?: string;\n textColor?: string;\n secondaryColor?: string;\n };\n /** Custom render for each row */\n renderRow?: (entry: LeaderboardEntry, isCurrentUser: boolean) => React.ReactNode;\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * Leaderboard - Ranked affiliate leaderboard display\n *\n * Shows ranked list of top affiliates with referral counts.\n * Highlights the current user if their ID is provided.\n *\n * @example\n * ```tsx\n * <Leaderboard limit={10} currentUserId={userId} />\n *\n * // With custom render\n * <Leaderboard\n * renderRow={(entry, isCurrent) => (\n * <div className={isCurrent ? 'highlight' : ''}>\n * #{entry.rank} - {entry.displayName}\n * </div>\n * )}\n * />\n * ```\n */\nfunction LeaderboardInner({\n limit = 10,\n className,\n style,\n currentUserId,\n emptyMessage = 'No leaderboard data available yet.',\n showMedals = true,\n showTierInfo = true,\n showEarnings = true,\n theme: themeOverride,\n renderRow,\n renderLoading,\n renderError,\n}: LeaderboardProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { leaderboard, loading, error, refresh } = useLeaderboard(limit);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n if (!leaderboard || leaderboard.entries.length === 0) {\n return (\n <div className={className} style={{ ...themedStyles.leaderboardEmpty, ...style }}>\n {emptyMessage}\n </div>\n );\n }\n\n // Medal colors for top 3\n const getMedalColor = (rank: number): string | null => {\n if (!showMedals) return null;\n switch (rank) {\n case 1: return globalTheme.medalGold;\n case 2: return globalTheme.medalSilver;\n case 3: return globalTheme.medalBronze;\n default: return null;\n }\n };\n\n const formatCurrency = (cents: number) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(cents / 100);\n };\n\n const getRowStyle = (isCurrentUser: boolean): React.CSSProperties => ({\n ...(isCurrentUser ? themedStyles.leaderboardRowHighlighted : themedStyles.leaderboardRow),\n ...(themeOverride?.rowBackground && !isCurrentUser && { backgroundColor: themeOverride.rowBackground }),\n ...(themeOverride?.highlightBackground && isCurrentUser && { backgroundColor: themeOverride.highlightBackground }),\n ...(isCurrentUser && {\n backgroundColor: `${globalTheme.primary}15`,\n border: `1px solid ${globalTheme.primary}40`,\n borderRadius: '8px',\n }),\n });\n\n const textStyle = themeOverride?.textColor ? { color: themeOverride.textColor } : {};\n const secondaryStyle = themeOverride?.secondaryColor\n ? { ...themedStyles.leaderboardStats, color: themeOverride.secondaryColor }\n : themedStyles.leaderboardStats;\n\n // Find current user rank\n const currentUserRank = currentUserId\n ? leaderboard.entries.find((e) => e.userId === currentUserId)?.rank\n : null;\n\n return (\n <div className={className} style={{ ...themedStyles.leaderboardContainer, ...style }}>\n {/* Current user rank badge */}\n {currentUserRank && (\n <div style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginBottom: '8px'\n }}>\n <span style={{\n fontSize: '12px',\n backgroundColor: `${globalTheme.primary}30`,\n color: globalTheme.primary,\n padding: '4px 8px',\n borderRadius: '9999px',\n }}>\n Your rank: #{currentUserRank}\n </span>\n </div>\n )}\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {leaderboard.entries.map((entry, index) => {\n const isCurrentUser = currentUserId === entry.userId;\n const medalColor = getMedalColor(entry.rank);\n\n if (renderRow) {\n return <div key={entry.userId}>{renderRow(entry, isCurrentUser)}</div>;\n }\n\n const rowContent = (\n <div style={getRowStyle(isCurrentUser)}>\n {/* Rank / Medal */}\n <div style={themedStyles.medalIcon}>\n {medalColor ? (\n <MedalIcon size={20} color={medalColor} />\n ) : (\n <span style={{ fontSize: '14px', fontFamily: 'monospace', color: globalTheme.foregroundSecondary }}>\n #{entry.rank}\n </span>\n )}\n </div>\n\n {/* Name & Tier */}\n <div style={{ flex: 1, marginLeft: '12px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ ...themedStyles.leaderboardName, ...textStyle, marginLeft: 0 }}>\n {entry.displayName ?? `User ${entry.userId.slice(0, 8)}`}\n </span>\n {isCurrentUser && (\n <span style={{ fontSize: '12px', color: globalTheme.primary }}>(You)</span>\n )}\n </div>\n {showTierInfo && entry.tier && (\n <div style={{ fontSize: '12px', color: globalTheme.foregroundSecondary }}>\n {entry.tier.name} ({entry.tier.value}%)\n </div>\n )}\n </div>\n\n {/* Stats */}\n <div style={{ textAlign: 'right' }}>\n <div style={{ fontFamily: 'monospace', fontSize: '14px', fontWeight: '500', color: globalTheme.foreground }}>\n {entry.referralCount} referrals\n </div>\n {showEarnings && entry.totalEarnings !== undefined && (\n <div style={{ ...secondaryStyle, fontFamily: 'monospace' }}>\n {formatCurrency(entry.totalEarnings)}\n </div>\n )}\n </div>\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={entry.userId}\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 20 }}\n transition={{ delay: index * 0.05 }}\n >\n {rowContent}\n </Motion>\n );\n }\n\n return <div key={entry.userId}>{rowContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n\n {/* Footer */}\n <p style={{ fontSize: '12px', color: '#6c757d', textAlign: 'center', marginTop: '12px' }}>\n Rankings based on total referrals\n </p>\n </div>\n );\n}\n\nexport const Leaderboard = withErrorBoundary(LeaderboardInner);\n\n/**\n * Props for ReferralLink component\n */\nexport interface ReferralLinkProps {\n /** Base URL for referral link (defaults to current origin) */\n baseUrl?: string;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Text for copy button */\n copyButtonText?: string;\n /** Text shown after copying */\n copiedText?: string;\n /** Text for share button (mobile only) */\n shareButtonText?: string;\n /** Share title */\n shareTitle?: string;\n /** Share text */\n shareText?: string;\n /** Show share button on mobile */\n showShareButton?: boolean;\n /** Show referrer attribution section (default: true) */\n showReferrerAttribution?: boolean;\n /** Current referrer code (who referred this user) */\n referrerCode?: string | null;\n /** Callback when referrer is set */\n onSetReferrer?: (code: string) => void;\n /** Callback to detect referrer from URL */\n onDetectFromUrl?: () => void;\n /** Callback when referrer is cleared */\n onClearReferrer?: () => void;\n /** Theme customization */\n theme?: {\n inputBackground?: string;\n inputBorder?: string;\n inputColor?: string;\n buttonBackground?: string;\n buttonColor?: string;\n };\n /** Callback when link is copied */\n onCopy?: (link: string) => void;\n /** Callback when link is shared */\n onShare?: (link: string) => void;\n}\n\n/**\n * ReferralLink - Input field with user's referral code and copy/share buttons\n *\n * Displays the user's unique referral link with easy copy functionality.\n * Includes native share button for mobile devices.\n *\n * @example\n * ```tsx\n * <ReferralLink />\n *\n * // With custom base URL\n * <ReferralLink\n * baseUrl=\"https://myapp.com/signup\"\n * shareTitle=\"Join my app!\"\n * shareText=\"Sign up using my referral link\"\n * />\n * ```\n */\nfunction ReferralLinkInner({\n baseUrl,\n className,\n style,\n copyButtonText = 'Copy',\n copiedText = 'Copied!',\n shareButtonText = 'Share',\n shareTitle = 'Check this out!',\n shareText = 'Join using my referral link',\n showShareButton = true,\n showReferrerAttribution = true,\n referrerCode,\n onSetReferrer,\n onDetectFromUrl,\n onClearReferrer,\n theme: themeOverride,\n onCopy,\n onShare,\n}: ReferralLinkProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { stats, loading } = useAffiliateStats({ autoRefresh: true });\n const [copied, setCopied] = useState(false);\n const [referrerInput, setReferrerInput] = useState('');\n\n const userReferralCode = stats?.referralCode;\n\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const referralLink = `${baseUrl ?? origin}?ref=${userReferralCode}`;\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(referralLink);\n setCopied(true);\n onCopy?.(referralLink);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n const handleShare = async () => {\n if (typeof navigator !== 'undefined' && navigator.share) {\n try {\n await navigator.share({\n title: shareTitle,\n text: shareText,\n url: referralLink,\n });\n onShare?.(referralLink);\n } catch (err) {\n // User cancelled or share failed\n if ((err as Error).name !== 'AbortError') {\n console.error('Failed to share:', err);\n }\n }\n }\n };\n\n const handleSetReferrer = () => {\n if (referrerInput.trim() && onSetReferrer) {\n onSetReferrer(referrerInput.trim());\n setReferrerInput('');\n }\n };\n\n const canShare = typeof navigator !== 'undefined' && 'share' in navigator;\n\n const inputStyle = {\n ...themedStyles.referralInput,\n ...(themeOverride?.inputBackground && { backgroundColor: themeOverride.inputBackground }),\n ...(themeOverride?.inputBorder && { border: `1px solid ${themeOverride.inputBorder}` }),\n ...(themeOverride?.inputColor && { color: themeOverride.inputColor }),\n };\n\n const buttonStyle = {\n ...themedStyles.referralButton,\n ...(themeOverride?.buttonBackground && { backgroundColor: themeOverride.buttonBackground }),\n ...(themeOverride?.buttonColor && { color: themeOverride.buttonColor }),\n };\n\n const containerStyle: React.CSSProperties = {\n padding: '16px',\n ...style,\n };\n\n // Show loading or empty state when no referral code\n if (loading || !userReferralCode) {\n return (\n <div className={className} style={containerStyle}>\n <div style={{ marginBottom: '8px' }}>\n <p style={{ fontSize: '14px', color: globalTheme.foregroundSecondary, marginBottom: '8px' }}>\n Your unique referral link:\n </p>\n <div style={themedStyles.referralContainer}>\n <input\n type=\"text\"\n readOnly\n value={loading ? 'Loading...' : 'No referral code assigned'}\n disabled\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px', opacity: 0.6 }}\n />\n <button type=\"button\" disabled style={{ ...buttonStyle, opacity: 0.5, cursor: 'not-allowed' }}>\n 📋\n </button>\n </div>\n {!loading && !userReferralCode && (\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginTop: '8px' }}>\n Complete a referral action to get your unique code.\n </p>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={containerStyle}>\n {/* Your Referral Link */}\n <div style={{ marginBottom: '8px' }}>\n <p style={{ fontSize: '14px', color: globalTheme.foregroundSecondary, marginBottom: '8px' }}>\n Your unique referral link:\n </p>\n <div style={themedStyles.referralContainer}>\n <input\n type=\"text\"\n readOnly\n value={referralLink}\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px' }}\n onClick={(e) => (e.target as HTMLInputElement).select()}\n />\n <button type=\"button\" onClick={handleCopy} style={buttonStyle}>\n {copied ? '✓' : '📋'}\n </button>\n {showShareButton && canShare && (\n <button type=\"button\" onClick={handleShare} style={buttonStyle}>\n {shareButtonText}\n </button>\n )}\n </div>\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginTop: '4px' }}>\n Code: <span style={{ fontFamily: 'monospace', fontWeight: '500', color: globalTheme.foreground }}>{userReferralCode}</span>\n </p>\n </div>\n\n {/* Referrer Attribution */}\n {showReferrerAttribution && (\n <div style={themedStyles.referrerSection}>\n <p style={themedStyles.referrerTitle}>Referrer Attribution</p>\n\n {referrerCode ? (\n <div style={themedStyles.referrerBadge}>\n <div style={themedStyles.referrerBadgeInfo}>\n <span style={themedStyles.referrerBadgeIcon}>👤</span>\n <span>\n Referred by: <span style={{ fontFamily: 'monospace', fontWeight: '500' }}>{referrerCode}</span>\n </span>\n </div>\n {onClearReferrer && (\n <button\n type=\"button\"\n onClick={onClearReferrer}\n style={themedStyles.referrerClearButton}\n aria-label=\"Clear referrer\"\n >\n ✕\n </button>\n )}\n </div>\n ) : (\n <div>\n {onSetReferrer && (\n <div style={themedStyles.referrerInputRow}>\n <input\n type=\"text\"\n value={referrerInput}\n onChange={(e) => setReferrerInput(e.target.value)}\n placeholder=\"Enter referrer code...\"\n style={{ ...inputStyle, fontFamily: 'monospace', fontSize: '12px' }}\n />\n <button\n type=\"button\"\n onClick={handleSetReferrer}\n disabled={!referrerInput.trim()}\n style={{\n ...buttonStyle,\n opacity: referrerInput.trim() ? 1 : 0.5,\n cursor: referrerInput.trim() ? 'pointer' : 'not-allowed',\n }}\n >\n Set\n </button>\n </div>\n )}\n {onDetectFromUrl && (\n <button\n type=\"button\"\n onClick={onDetectFromUrl}\n style={themedStyles.referrerDetectButton}\n >\n <span>🔗</span>\n Detect from URL\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ReferralLink = withErrorBoundary(ReferralLinkInner);\n\n// ============================================\n// Issue #25-28: Quest Components\n// ============================================\n\n/**\n * Extended styles for gamification components\n */\nconst gamificationStyles = {\n // Quest styles\n questContainer: {\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n marginBottom: '12px',\n } as React.CSSProperties,\n questHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '12px',\n } as React.CSSProperties,\n questTitle: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n margin: 0,\n } as React.CSSProperties,\n questDescription: {\n fontSize: '14px',\n color: '#6c757d',\n margin: '4px 0 0 0',\n } as React.CSSProperties,\n questBadge: {\n fontSize: '12px',\n padding: '4px 8px',\n borderRadius: '12px',\n fontWeight: '500',\n } as React.CSSProperties,\n questProgressBar: {\n width: '100%',\n height: '8px',\n backgroundColor: '#e9ecef',\n borderRadius: '4px',\n overflow: 'hidden',\n marginBottom: '12px',\n } as React.CSSProperties,\n questProgressFill: {\n height: '100%',\n backgroundColor: '#0d6efd',\n borderRadius: '4px',\n transition: 'width 0.3s ease',\n } as React.CSSProperties,\n questStepList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n } as React.CSSProperties,\n questStep: {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 0',\n borderBottom: '1px solid #f8f9fa',\n fontSize: '14px',\n } as React.CSSProperties,\n questStepIcon: {\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '12px',\n fontSize: '12px',\n } as React.CSSProperties,\n questStepText: {\n flex: 1,\n color: '#212529',\n } as React.CSSProperties,\n questStepCount: {\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n questReward: {\n display: 'flex',\n alignItems: 'center',\n marginTop: '12px',\n padding: '8px 12px',\n backgroundColor: '#fff3cd',\n borderRadius: '6px',\n fontSize: '14px',\n color: '#856404',\n } as React.CSSProperties,\n\n // Streak styles\n streakContainer: {\n display: 'flex',\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n } as React.CSSProperties,\n streakFlame: {\n fontSize: '32px',\n marginRight: '12px',\n } as React.CSSProperties,\n streakCount: {\n fontSize: '28px',\n fontWeight: 'bold',\n color: '#212529',\n marginRight: '8px',\n } as React.CSSProperties,\n streakLabel: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n streakInfo: {\n flex: 1,\n } as React.CSSProperties,\n streakName: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n } as React.CSSProperties,\n streakStatus: {\n fontSize: '12px',\n padding: '2px 8px',\n borderRadius: '10px',\n marginLeft: '8px',\n } as React.CSSProperties,\n freezeButton: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#17a2b8',\n color: 'white',\n cursor: 'pointer',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n } as React.CSSProperties,\n freezeButtonDisabled: {\n padding: '8px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#6c757d',\n color: 'white',\n cursor: 'not-allowed',\n fontSize: '14px',\n opacity: 0.6,\n } as React.CSSProperties,\n\n // Badge styles\n badgeGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n badgeCard: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n cursor: 'pointer',\n transition: 'transform 0.2s, box-shadow 0.2s',\n } as React.CSSProperties,\n badgeCardLocked: {\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n cursor: 'pointer',\n opacity: 0.6,\n filter: 'grayscale(100%)',\n } as React.CSSProperties,\n badgeIcon: {\n width: '64px',\n height: '64px',\n borderRadius: '50%',\n objectFit: 'cover' as const,\n marginBottom: '8px',\n backgroundColor: '#e9ecef',\n } as React.CSSProperties,\n badgeName: {\n fontSize: '14px',\n fontWeight: '500',\n color: '#212529',\n textAlign: 'center' as const,\n marginBottom: '4px',\n } as React.CSSProperties,\n badgeRarity: {\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '10px',\n fontWeight: '500',\n textTransform: 'uppercase' as const,\n } as React.CSSProperties,\n badgeStats: {\n display: 'flex',\n justifyContent: 'center',\n gap: '16px',\n padding: '12px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n badgeStat: {\n textAlign: 'center' as const,\n } as React.CSSProperties,\n badgeStatValue: {\n fontSize: '20px',\n fontWeight: 'bold',\n color: '#212529',\n } as React.CSSProperties,\n badgeStatLabel: {\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n\n // Level/Tier styles\n levelContainer: {\n padding: '16px',\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n } as React.CSSProperties,\n levelHeader: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: '12px',\n } as React.CSSProperties,\n levelIcon: {\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n marginRight: '12px',\n backgroundColor: '#e9ecef',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '24px',\n } as React.CSSProperties,\n levelInfo: {\n flex: 1,\n } as React.CSSProperties,\n levelTierName: {\n fontSize: '18px',\n fontWeight: '600',\n color: '#212529',\n } as React.CSSProperties,\n levelPoints: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n levelProgressContainer: {\n marginTop: '12px',\n } as React.CSSProperties,\n levelProgressHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '6px',\n fontSize: '13px',\n } as React.CSSProperties,\n levelProgressBar: {\n width: '100%',\n height: '10px',\n backgroundColor: '#e9ecef',\n borderRadius: '5px',\n overflow: 'hidden',\n } as React.CSSProperties,\n levelProgressFill: {\n height: '100%',\n background: 'linear-gradient(90deg, #667eea 0%, #764ba2 100%)',\n borderRadius: '5px',\n transition: 'width 0.3s ease',\n } as React.CSSProperties,\n levelBenefits: {\n marginTop: '16px',\n padding: '12px',\n backgroundColor: '#f8f9fa',\n borderRadius: '6px',\n } as React.CSSProperties,\n levelBenefitsTitle: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#212529',\n marginBottom: '8px',\n } as React.CSSProperties,\n levelBenefitsList: {\n listStyle: 'none',\n padding: 0,\n margin: 0,\n fontSize: '13px',\n color: '#495057',\n } as React.CSSProperties,\n levelBenefitItem: {\n padding: '4px 0',\n display: 'flex',\n alignItems: 'center',\n } as React.CSSProperties,\n\n // Reward store styles\n rewardStoreGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))',\n gap: '16px',\n padding: '16px',\n } as React.CSSProperties,\n rewardCard: {\n display: 'flex',\n flexDirection: 'column' as const,\n backgroundColor: '#fff',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n overflow: 'hidden',\n } as React.CSSProperties,\n rewardCardUnavailable: {\n display: 'flex',\n flexDirection: 'column' as const,\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n border: '1px solid #e9ecef',\n overflow: 'hidden',\n opacity: 0.7,\n } as React.CSSProperties,\n rewardImage: {\n width: '100%',\n height: '120px',\n objectFit: 'cover' as const,\n backgroundColor: '#e9ecef',\n } as React.CSSProperties,\n rewardContent: {\n padding: '12px',\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n } as React.CSSProperties,\n rewardName: {\n fontSize: '16px',\n fontWeight: '600',\n color: '#212529',\n marginBottom: '4px',\n } as React.CSSProperties,\n rewardDescription: {\n fontSize: '13px',\n color: '#6c757d',\n marginBottom: '8px',\n flex: 1,\n } as React.CSSProperties,\n rewardCost: {\n fontSize: '14px',\n fontWeight: '600',\n color: '#0d6efd',\n marginBottom: '8px',\n } as React.CSSProperties,\n rewardButton: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#0d6efd',\n color: 'white',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: '500',\n width: '100%',\n } as React.CSSProperties,\n rewardButtonDisabled: {\n padding: '10px 16px',\n border: 'none',\n borderRadius: '6px',\n backgroundColor: '#6c757d',\n color: 'white',\n cursor: 'not-allowed',\n fontSize: '14px',\n fontWeight: '500',\n width: '100%',\n } as React.CSSProperties,\n rewardPointsHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '16px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '16px',\n } as React.CSSProperties,\n rewardPointsLabel: {\n fontSize: '14px',\n color: '#6c757d',\n } as React.CSSProperties,\n rewardPointsValue: {\n fontSize: '24px',\n fontWeight: 'bold',\n color: '#212529',\n } as React.CSSProperties,\n\n // Accordion/Expandable quest styles\n questAccordion: {\n borderRadius: '8px',\n overflow: 'hidden',\n marginBottom: '8px',\n } as React.CSSProperties,\n questAccordionHeader: {\n width: '100%',\n padding: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n textAlign: 'left' as const,\n } as React.CSSProperties,\n questAccordionIcon: {\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '20px',\n flexShrink: 0,\n } as React.CSSProperties,\n questAccordionInfo: {\n flex: 1,\n minWidth: 0,\n } as React.CSSProperties,\n questAccordionTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '4px',\n } as React.CSSProperties,\n questAccordionName: {\n fontWeight: '500',\n fontSize: '14px',\n color: '#212529',\n } as React.CSSProperties,\n questAccordionStatusBadge: {\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '9999px',\n fontWeight: '500',\n } as React.CSSProperties,\n questAccordionMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '12px',\n color: '#6c757d',\n } as React.CSSProperties,\n questAccordionChevron: {\n color: '#6c757d',\n transition: 'transform 0.2s',\n flexShrink: 0,\n } as React.CSSProperties,\n questAccordionContent: {\n padding: '0 12px 12px',\n overflow: 'hidden',\n } as React.CSSProperties,\n};\n\n/**\n * Helper function to get status badge colors\n */\nfunction getStatusColors(status: string): { bg: string; color: string } {\n switch (status) {\n case 'completed':\n return { bg: '#d4edda', color: '#155724' };\n case 'in_progress':\n return { bg: '#cce5ff', color: '#004085' };\n case 'active':\n return { bg: '#cce5ff', color: '#004085' };\n case 'frozen':\n return { bg: '#cce5ff', color: '#17a2b8' };\n case 'at_risk':\n return { bg: '#fff3cd', color: '#856404' };\n case 'broken':\n return { bg: '#f8d7da', color: '#721c24' };\n default:\n return { bg: '#e9ecef', color: '#6c757d' };\n }\n}\n\n/**\n * Helper function to get rarity colors\n */\nfunction getRarityColors(rarity: BadgeRarity): { bg: string; color: string } {\n switch (rarity) {\n case 'COMMON':\n return { bg: '#e9ecef', color: '#495057' };\n case 'RARE':\n return { bg: '#cce5ff', color: '#004085' };\n case 'EPIC':\n return { bg: '#e2d5f1', color: '#6f42c1' };\n case 'LEGENDARY':\n return { bg: '#fff3cd', color: '#856404' };\n default:\n return { bg: '#e9ecef', color: '#6c757d' };\n }\n}\n\n/**\n * Props for QuestProgress component\n */\nexport interface QuestProgressProps {\n /** Specific quest ID to display (shows all if not provided) */\n questId?: string;\n /** Hide completed quests */\n hideCompleted?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Enable expandable accordion mode (default: true) */\n expandable?: boolean;\n /** Default expanded quest ID (defaults to first in-progress) */\n defaultExpandedId?: string;\n /** Show XP reward in header (default: true) */\n showXpReward?: boolean;\n /** Callback when a quest is completed */\n onComplete?: (quest: QuestWithProgress) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n progressColor?: string;\n textColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each quest */\n renderQuest?: (quest: QuestWithProgress) => React.ReactNode;\n}\n\n/**\n * QuestProgress - Display quest progress with step checklist\n *\n * Shows quest name, description, progress bar, and step completion status.\n *\n * @example\n * ```tsx\n * <QuestProgress hideCompleted onComplete={(quest) => console.log('Completed:', quest.name)} />\n * ```\n */\nfunction QuestProgressInner({\n questId,\n hideCompleted = false,\n className,\n style,\n expandable = true,\n defaultExpandedId,\n showXpReward = true,\n onComplete,\n theme,\n renderLoading,\n renderError,\n renderQuest,\n}: QuestProgressProps) {\n const { quests, loading, error, refresh } = useQuests({ autoRefresh: true });\n const previousQuests = useRef<Map<string, QuestWithProgress>>(new Map());\n const [expandedQuestId, setExpandedQuestId] = useState<string | null>(null);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // Track completions\n useEffect(() => {\n if (onComplete) {\n quests.forEach((quest) => {\n const prev = previousQuests.current.get(quest.id);\n if (prev && prev.status !== 'completed' && quest.status === 'completed') {\n onComplete(quest);\n }\n });\n }\n // Update previous state\n const newMap = new Map<string, QuestWithProgress>();\n quests.forEach((q) => newMap.set(q.id, q));\n previousQuests.current = newMap;\n }, [quests, onComplete]);\n\n // Set default expanded quest (first in-progress or provided ID)\n useEffect(() => {\n if (quests.length > 0 && expandedQuestId === null) {\n if (defaultExpandedId) {\n setExpandedQuestId(defaultExpandedId);\n } else {\n const inProgressQuest = quests.find((q) => q.status === 'in_progress');\n setExpandedQuestId(inProgressQuest?.id ?? null);\n }\n }\n }, [quests, defaultExpandedId, expandedQuestId]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let filteredQuests = quests;\n if (questId) {\n filteredQuests = quests.filter((q) => q.id === questId);\n }\n if (hideCompleted) {\n filteredQuests = filteredQuests.filter((q) => q.status !== 'completed');\n }\n\n if (filteredQuests.length === 0) {\n return (\n <div style={{ textAlign: 'center', padding: '24px', color: '#6c757d' }}>\n <span style={{ fontSize: '40px', display: 'block', marginBottom: '8px', opacity: 0.5 }}>🎯</span>\n <p>No quests available</p>\n </div>\n );\n }\n\n const getStatusBadgeStyle = (status: string): React.CSSProperties => {\n switch (status) {\n case 'completed':\n return { backgroundColor: 'rgba(40, 167, 69, 0.2)', color: '#28a745' };\n case 'in_progress':\n return { backgroundColor: 'rgba(13, 110, 253, 0.2)', color: '#0d6efd' };\n default:\n return { backgroundColor: '#f8f9fa', color: '#6c757d' };\n }\n };\n\n const getQuestBgStyle = (status: string): React.CSSProperties => {\n switch (status) {\n case 'completed':\n return { backgroundColor: 'rgba(40, 167, 69, 0.05)', borderColor: 'rgba(40, 167, 69, 0.2)' };\n case 'in_progress':\n return { backgroundColor: 'rgba(13, 110, 253, 0.05)', borderColor: 'rgba(13, 110, 253, 0.2)' };\n default:\n return { backgroundColor: '#f8f9fa', borderColor: '#e9ecef' };\n }\n };\n\n const toggleExpand = (id: string) => {\n if (!expandable) return;\n setExpandedQuestId(expandedQuestId === id ? null : id);\n };\n\n return (\n <div className={className} style={{ ...style, display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {filteredQuests.map((quest) => {\n if (renderQuest) {\n return <div key={quest.id}>{renderQuest(quest)}</div>;\n }\n\n const isExpanded = !expandable || expandedQuestId === quest.id;\n const statusBadgeStyle = getStatusBadgeStyle(quest.status);\n const questBgStyle = getQuestBgStyle(quest.status);\n\n const questContent = (\n <div\n style={{\n ...gamificationStyles.questAccordion,\n border: '1px solid',\n ...questBgStyle,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n ...(theme?.cardBorder && { borderColor: theme.cardBorder }),\n }}\n >\n {/* Quest Header */}\n <button\n type=\"button\"\n onClick={() => toggleExpand(quest.id)}\n style={{\n ...gamificationStyles.questAccordionHeader,\n cursor: expandable ? 'pointer' : 'default',\n }}\n >\n {/* Icon */}\n <div\n style={{\n ...gamificationStyles.questAccordionIcon,\n backgroundColor: quest.status === 'completed' ? 'rgba(40, 167, 69, 0.2)' : 'rgba(13, 110, 253, 0.2)',\n }}\n >\n {quest.status === 'completed' ? (\n <span style={{ color: '#28a745' }}>✓</span>\n ) : (\n <span style={{ color: '#0d6efd' }}>🎯</span>\n )}\n </div>\n\n {/* Title & Meta */}\n <div style={gamificationStyles.questAccordionInfo}>\n <div style={gamificationStyles.questAccordionTitle}>\n <span style={{ ...gamificationStyles.questAccordionName, ...(theme?.textColor && { color: theme.textColor }) }}>\n {quest.name}\n </span>\n <span\n style={{\n ...gamificationStyles.questAccordionStatusBadge,\n ...statusBadgeStyle,\n }}\n >\n {quest.status === 'completed'\n ? 'Complete'\n : quest.status === 'in_progress'\n ? `${quest.percentComplete}%`\n : 'Not Started'}\n </span>\n </div>\n <div style={gamificationStyles.questAccordionMeta}>\n {showXpReward && quest.xpReward > 0 && (\n <>\n <span>⭐</span>\n <span>+{quest.xpReward} XP</span>\n <span style={{ color: '#e9ecef' }}>|</span>\n </>\n )}\n <span>{quest.steps.length} steps</span>\n </div>\n </div>\n\n {/* Chevron */}\n {expandable && (\n <span\n style={{\n ...gamificationStyles.questAccordionChevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n >\n ▶\n </span>\n )}\n </button>\n\n {/* Expandable Content */}\n {isExpanded && (\n <div style={gamificationStyles.questAccordionContent}>\n {/* Progress Bar */}\n {quest.status !== 'completed' && (\n <div style={{ ...gamificationStyles.questProgressBar, marginBottom: '12px', height: '6px' }}>\n <div\n style={{\n ...gamificationStyles.questProgressFill,\n width: `${quest.percentComplete}%`,\n ...(theme?.progressColor && { backgroundColor: theme.progressColor }),\n }}\n />\n </div>\n )}\n\n {/* Steps */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {quest.steps.map((step, index) => (\n <div\n key={step.id}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n padding: '8px',\n borderRadius: '6px',\n opacity: step.completed ? 0.6 : 1,\n }}\n >\n <div\n style={{\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n fontWeight: 'bold',\n flexShrink: 0,\n backgroundColor: step.completed ? 'rgba(40, 167, 69, 0.2)' : '#f8f9fa',\n color: step.completed ? '#28a745' : '#6c757d',\n }}\n >\n {step.completed ? '✓' : index + 1}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: '500',\n textDecoration: step.completed ? 'line-through' : 'none',\n color: step.completed ? '#6c757d' : '#212529',\n }}\n >\n {step.name}\n </div>\n <div style={{ fontSize: '12px', color: '#6c757d' }}>\n {step.currentCount}/{step.requiredCount}\n {step.requiredCount > 1 && !step.completed && (\n <span style={{ marginLeft: '8px' }}>\n ({Math.round((step.currentCount / step.requiredCount) * 100)}%)\n </span>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={quest.id}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n >\n {questContent}\n </Motion>\n );\n }\n\n return <div key={quest.id}>{questContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n );\n}\n\nexport const QuestProgress = withErrorBoundary(QuestProgressInner);\n\n// ============================================\n// Issue #32: Streak Components\n// ============================================\n\n/**\n * Props for StreakFlame component\n */\nexport interface StreakFlameProps {\n /** Specific streak rule ID to display */\n ruleId?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Show freeze button */\n showFreezeButton?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Callback when freeze is used */\n onFreeze?: (ruleId: string, remainingFreezes: number) => void;\n /** Theme customization */\n theme?: {\n flameColor?: string;\n countColor?: string;\n cardBackground?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * StreakFlame - Display streak counter with flame icon\n *\n * Shows current streak count with status indicator and optional freeze button.\n *\n * @example\n * ```tsx\n * <StreakFlame showFreezeButton onFreeze={(id, remaining) => console.log('Freeze used')} />\n * ```\n */\nfunction StreakFlameInner({\n ruleId,\n size = 'md',\n showFreezeButton = true,\n className,\n style,\n onFreeze,\n theme,\n renderLoading,\n renderError,\n}: StreakFlameProps) {\n const { streaks, stats, loading, error, freeze, refresh } = useStreaks({ autoRefresh: true });\n const [freezing, setFreezing] = useState(false);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let displayStreaks = streaks;\n if (ruleId) {\n displayStreaks = streaks.filter((s) => s.id === ruleId);\n }\n\n if (displayStreaks.length === 0) {\n return <div style={{ textAlign: 'center', padding: '16px', color: '#6c757d' }}>No streaks available</div>;\n }\n\n const sizeStyles = {\n sm: { flame: '24px', count: '20px', container: '12px' },\n md: { flame: '32px', count: '28px', container: '16px' },\n lg: { flame: '48px', count: '40px', container: '20px' },\n };\n\n const handleFreeze = async (streakId: string) => {\n setFreezing(true);\n try {\n const result = await freeze(streakId);\n if (result && onFreeze) {\n onFreeze(streakId, result.remainingFreezes);\n }\n } finally {\n setFreezing(false);\n }\n };\n\n return (\n <div className={className} style={style}>\n {displayStreaks.map((streak) => {\n const statusColors = getStatusColors(streak.status);\n const canFreeze = streak.freezeInventory > 0 && !streak.freezeUsedToday;\n\n return (\n <div\n key={streak.id}\n style={{\n ...gamificationStyles.streakContainer,\n padding: sizeStyles[size].container,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n }}\n >\n <span\n style={{\n ...gamificationStyles.streakFlame,\n fontSize: sizeStyles[size].flame,\n ...(theme?.flameColor && { color: theme.flameColor }),\n }}\n >\n 🔥\n </span>\n <span\n style={{\n ...gamificationStyles.streakCount,\n fontSize: sizeStyles[size].count,\n ...(theme?.countColor && { color: theme.countColor }),\n }}\n >\n {streak.currentCount}\n </span>\n <div style={gamificationStyles.streakInfo}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <span style={gamificationStyles.streakName}>{streak.name}</span>\n <span\n style={{\n ...gamificationStyles.streakStatus,\n backgroundColor: statusColors.bg,\n color: statusColors.color,\n }}\n >\n {streak.status}\n </span>\n </div>\n <span style={gamificationStyles.streakLabel}>\n Best: {streak.maxStreak} days\n </span>\n </div>\n {showFreezeButton && (\n <button\n type=\"button\"\n onClick={() => void handleFreeze(streak.id)}\n disabled={!canFreeze || freezing}\n style={canFreeze ? gamificationStyles.freezeButton : gamificationStyles.freezeButtonDisabled}\n >\n <span>❄️</span>\n <span>{streak.freezeInventory}</span>\n </button>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport const StreakFlame = withErrorBoundary(StreakFlameInner);\n\n// ============================================\n// Issue #33: Badge Components\n// ============================================\n\n/**\n * Props for BadgeGrid component\n */\nexport interface BadgeGridProps {\n /** Show locked (unearned) badges */\n showLocked?: boolean;\n /** Filter by category */\n category?: string;\n /** Number of grid columns */\n columns?: number;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Show progress summary header (default: true) */\n showProgressSummary?: boolean;\n /** Show filter tabs (All/Earned/Locked) (default: true) */\n showFilterTabs?: boolean;\n /** @deprecated Use showProgressSummary instead */\n showStats?: boolean;\n /** Callback when a badge is clicked */\n onBadgeClick?: (badge: BadgeWithStatus) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n cardBorder?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each badge */\n renderBadge?: (badge: BadgeWithStatus) => React.ReactNode;\n}\n\n/**\n * BadgeGrid - Display badge collection in a grid\n *\n * Shows badges with unlock status, rarity indicators, and optional filtering.\n *\n * @example\n * ```tsx\n * <BadgeGrid showLocked showStats onBadgeClick={(badge) => showBadgeModal(badge)} />\n * ```\n */\nfunction BadgeGridInner({\n showLocked = true,\n category,\n columns = 2,\n className,\n style,\n showProgressSummary = true,\n showFilterTabs = true,\n showStats, // deprecated, use showProgressSummary\n onBadgeClick,\n theme: themeOverride,\n renderLoading,\n renderError,\n renderBadge,\n}: BadgeGridProps) {\n const globalTheme = useGamifyTheme();\n const themedStyles = createThemedStyles(globalTheme);\n const { badges, stats, loading, error, refresh } = useBadges({ autoRefresh: true, category });\n const [filter, setFilter] = useState<'all' | 'unlocked' | 'locked'>('all');\n\n // Handle deprecated prop\n const shouldShowSummary = showProgressSummary ?? showStats ?? true;\n\n useEffect(() => {\n void refresh(category);\n }, [refresh, category]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px', color: globalTheme.foregroundSecondary }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: globalTheme.error, padding: '16px' }}>{error}</div>;\n }\n\n // Filter badges based on tab selection\n let displayBadges = badges;\n if (filter === 'unlocked') {\n displayBadges = badges.filter((b) => b.isUnlocked);\n } else if (filter === 'locked') {\n displayBadges = badges.filter((b) => !b.isUnlocked);\n } else if (!showLocked) {\n displayBadges = badges.filter((b) => b.isUnlocked);\n }\n\n // Updated rarity color scheme from theme\n const getRarityColors = (rarity: BadgeRarity): { color: string; bg: string } => {\n switch (rarity) {\n case 'LEGENDARY':\n return { color: globalTheme.rarityLegendary, bg: `${globalTheme.rarityLegendary}15` };\n case 'EPIC':\n return { color: globalTheme.rarityEpic, bg: `${globalTheme.rarityEpic}15` };\n case 'RARE':\n return { color: globalTheme.rarityRare, bg: `${globalTheme.rarityRare}15` };\n case 'COMMON':\n default:\n return { color: globalTheme.rarityCommon, bg: `${globalTheme.rarityCommon}15` };\n }\n };\n\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gap: '12px',\n padding: '0',\n };\n\n const unlockedCount = stats?.unlocked ?? badges.filter((b) => b.isUnlocked).length;\n const totalCount = stats?.total ?? badges.length;\n const progressPercent = totalCount > 0 ? (unlockedCount / totalCount) * 100 : 0;\n\n return (\n <div className={className} style={{ ...style, padding: '16px' }}>\n {/* Progress Summary */}\n {shouldShowSummary && (\n <div style={themedStyles.progressSummary}>\n <div style={themedStyles.progressSummaryLeft}>\n <div style={themedStyles.progressSummaryIcon}><SparklesIcon size={20} /></div>\n <div>\n <div style={themedStyles.progressSummaryText}>{unlockedCount} / {totalCount}</div>\n <div style={themedStyles.progressSummarySubtext}>Badges Earned</div>\n </div>\n </div>\n <div style={themedStyles.progressSummaryBar}>\n <div\n style={{\n ...themedStyles.progressSummaryBarFill,\n width: `${progressPercent}%`,\n }}\n />\n </div>\n </div>\n )}\n\n {/* Filter Tabs */}\n {showFilterTabs && (\n <div style={themedStyles.filterTabs}>\n {(['all', 'unlocked', 'locked'] as const).map((f) => (\n <button\n key={f}\n type=\"button\"\n onClick={() => setFilter(f)}\n style={filter === f ? themedStyles.filterTabActive : themedStyles.filterTab}\n >\n {f === 'all' ? 'All' : f === 'unlocked' ? 'Earned' : 'Locked'}\n </button>\n ))}\n </div>\n )}\n\n {/* Badge Grid */}\n <div style={gridStyle}>\n <AnimatePresenceWrapper mode=\"popLayout\">\n {displayBadges.map((badge) => {\n if (renderBadge) {\n return <div key={badge.id}>{renderBadge(badge)}</div>;\n }\n\n const rarityColors = getRarityColors(badge.rarity);\n\n const badgeContent = (\n <div\n style={{\n position: 'relative',\n padding: '12px',\n borderRadius: '8px',\n border: '1px solid',\n cursor: onBadgeClick ? 'pointer' : 'default',\n transition: 'all 0.2s',\n ...(badge.isUnlocked\n ? {\n backgroundColor: rarityColors.bg,\n borderColor: `${rarityColors.color}40`,\n ...(themeOverride?.cardBackground && { backgroundColor: themeOverride.cardBackground }),\n ...(themeOverride?.cardBorder && { borderColor: themeOverride.cardBorder }),\n }\n : {\n backgroundColor: globalTheme.backgroundSecondary,\n borderColor: globalTheme.border,\n opacity: 0.6,\n }),\n }}\n onClick={() => onBadgeClick?.(badge)}\n onKeyDown={(e) => e.key === 'Enter' && onBadgeClick?.(badge)}\n role={onBadgeClick ? 'button' : undefined}\n tabIndex={onBadgeClick ? 0 : undefined}\n >\n {/* Checkmark for unlocked */}\n {badge.isUnlocked && (\n <div style={themedStyles.badgeCheckmark}>✓</div>\n )}\n\n {/* Badge Icon */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px' }}>\n <div\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: badge.isUnlocked ? `${rarityColors.color}20` : globalTheme.backgroundSecondary,\n }}\n >\n {badge.iconUrl ? (\n <img\n src={badge.iconUrl}\n alt={badge.name}\n style={{ width: '16px', height: '16px', objectFit: 'contain' }}\n />\n ) : badge.isUnlocked ? (\n <MedalIcon size={16} color={rarityColors.color} />\n ) : (\n <LockIcon size={16} color={globalTheme.foregroundSecondary} />\n )}\n </div>\n </div>\n\n {/* Badge Info */}\n <h4 style={{ fontSize: '14px', fontWeight: '500', marginBottom: '4px', color: globalTheme.foreground }}>\n {badge.name}\n </h4>\n {badge.description && (\n <p style={{ fontSize: '12px', color: globalTheme.foregroundSecondary, marginBottom: '8px', lineHeight: 1.4 }}>\n {badge.description}\n </p>\n )}\n\n {/* Rarity Badge */}\n <span\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n borderRadius: '9999px',\n fontWeight: '500',\n backgroundColor: `${rarityColors.color}20`,\n color: rarityColors.color,\n }}\n >\n {badge.rarity}\n </span>\n\n </div>\n );\n\n // Wrap with motion if available\n if (MotionDiv !== 'div') {\n const Motion = MotionDiv as MotionComponent;\n return (\n <Motion\n key={badge.id}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n >\n {badgeContent}\n </Motion>\n );\n }\n\n return <div key={badge.id}>{badgeContent}</div>;\n })}\n </AnimatePresenceWrapper>\n </div>\n\n {/* Empty State */}\n {displayBadges.length === 0 && (\n <div style={{ textAlign: 'center', padding: '24px', color: '#6c757d' }}>\n <MedalIcon size={40} style={{ display: 'block', marginBottom: '8px', opacity: 0.5 }} />\n <p>No badges found</p>\n </div>\n )}\n </div>\n );\n}\n\nexport const BadgeGrid = withErrorBoundary(BadgeGridInner);\n\n// ============================================\n// Issue #15: Level/Tier Components\n// ============================================\n\n/**\n * Props for LevelProgress component\n */\nexport interface LevelProgressProps {\n /** Show progress to next tier */\n showNextTier?: boolean;\n /** Show tier benefits */\n showBenefits?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n progressGradient?: string;\n textColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n}\n\n/**\n * LevelProgress - Display tier/level progress\n *\n * Shows current tier, XP/points, and progress to next tier.\n *\n * @example\n * ```tsx\n * <LevelProgress showNextTier showBenefits />\n * ```\n */\nfunction LevelProgressInner({\n showNextTier = true,\n showBenefits = false,\n className,\n style,\n theme,\n renderLoading,\n renderError,\n}: LevelProgressProps) {\n const { profile, loading, error, refreshProfile } = useLoyalty({ autoRefresh: true });\n\n useEffect(() => {\n void refreshProfile();\n }, [refreshProfile]);\n\n if (loading) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n if (!profile) {\n return null;\n }\n\n const progressPercent = profile.nextTier\n ? Math.min(100, ((profile.points) / (profile.nextTier.minPoints)) * 100)\n : 100;\n\n const containerStyle = {\n ...gamificationStyles.levelContainer,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n };\n\n const progressFillStyle = {\n ...gamificationStyles.levelProgressFill,\n width: `${progressPercent}%`,\n ...(theme?.progressGradient && { background: theme.progressGradient }),\n };\n\n return (\n <div className={className} style={{ ...containerStyle, ...style }}>\n <div style={gamificationStyles.levelHeader}>\n <div\n style={{\n ...gamificationStyles.levelIcon,\n ...(profile.tier?.color && { backgroundColor: profile.tier.color }),\n }}\n >\n {profile.tier?.iconUrl ? (\n <img\n src={profile.tier.iconUrl}\n alt={profile.tier.name}\n style={{ width: '100%', height: '100%', borderRadius: '50%' }}\n />\n ) : (\n '⭐'\n )}\n </div>\n <div style={gamificationStyles.levelInfo}>\n <div\n style={{\n ...gamificationStyles.levelTierName,\n ...(theme?.textColor && { color: theme.textColor }),\n }}\n >\n {profile.tier?.name ?? 'No Tier'}\n </div>\n <div style={gamificationStyles.levelPoints}>\n {profile.points.toLocaleString()} points\n </div>\n </div>\n </div>\n\n {showNextTier && profile.nextTier && (\n <div style={gamificationStyles.levelProgressContainer}>\n <div style={gamificationStyles.levelProgressHeader}>\n <span style={{ color: '#6c757d' }}>Progress to {profile.nextTier.name}</span>\n <span style={{ fontWeight: '500' }}>\n {profile.nextTier.pointsNeeded.toLocaleString()} points needed\n </span>\n </div>\n <div style={gamificationStyles.levelProgressBar}>\n <div style={progressFillStyle} />\n </div>\n </div>\n )}\n\n {showBenefits && profile.tier?.benefits && Object.keys(profile.tier.benefits).length > 0 && (\n <div style={gamificationStyles.levelBenefits}>\n <div style={gamificationStyles.levelBenefitsTitle}>Your Benefits</div>\n <ul style={gamificationStyles.levelBenefitsList}>\n {Object.entries(profile.tier.benefits).map(([key, value]) => (\n <li key={key} style={gamificationStyles.levelBenefitItem}>\n <span style={{ marginRight: '8px', color: '#28a745' }}>✓</span>\n {String(value)}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n\nexport const LevelProgress = withErrorBoundary(LevelProgressInner);\n\n// ============================================\n// Issue #34: Reward Components\n// ============================================\n\n/**\n * Props for RewardStore component\n */\nexport interface RewardStoreProps {\n /** Show unavailable items */\n showUnavailable?: boolean;\n /** Custom CSS class name */\n className?: string;\n /** Custom styles override */\n style?: React.CSSProperties;\n /** Show points header */\n showPointsHeader?: boolean;\n /** Callback when item is redeemed */\n onRedeem?: (item: RewardItem, result: RedemptionResult) => void;\n /** Theme customization */\n theme?: {\n cardBackground?: string;\n buttonColor?: string;\n };\n /** Custom render for loading state */\n renderLoading?: () => React.ReactNode;\n /** Custom render for error state */\n renderError?: (error: string) => React.ReactNode;\n /** Custom render for each item */\n renderItem?: (item: RewardItem, onRedeem: () => void) => React.ReactNode;\n}\n\n/**\n * RewardStore - Display reward catalog with redeem functionality\n *\n * Shows available rewards with point costs and redeem buttons.\n *\n * @example\n * ```tsx\n * <RewardStore\n * showPointsHeader\n * onRedeem={(item, result) => {\n * if (result.success) toast.success(`Redeemed ${item.name}!`);\n * }}\n * />\n * ```\n */\nfunction RewardStoreInner({\n showUnavailable = true,\n className,\n style,\n showPointsHeader = true,\n onRedeem,\n theme,\n renderLoading,\n renderError,\n renderItem,\n}: RewardStoreProps) {\n const { items, userPoints, loading, error, redeem, refresh } = useRewards({ autoRefresh: true });\n const [redeemingId, setRedeemingId] = useState<string | null>(null);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n if (loading && items.length === 0) {\n return renderLoading ? renderLoading() : <div style={{ textAlign: 'center', padding: '16px' }}>Loading...</div>;\n }\n\n if (error) {\n return renderError ? renderError(error) : <div style={{ color: 'red', padding: '16px' }}>{error}</div>;\n }\n\n let displayItems = items;\n if (!showUnavailable) {\n displayItems = items.filter((i) => i.isAvailable);\n }\n\n const handleRedeem = async (item: RewardItem) => {\n setRedeemingId(item.id);\n try {\n const result = await redeem(item.id);\n if (result && onRedeem) {\n onRedeem(item, result);\n }\n } finally {\n setRedeemingId(null);\n }\n };\n\n return (\n <div className={className} style={style}>\n {showPointsHeader && (\n <div style={gamificationStyles.rewardPointsHeader}>\n <span style={gamificationStyles.rewardPointsLabel}>Your Points</span>\n <span style={gamificationStyles.rewardPointsValue}>{userPoints.toLocaleString()}</span>\n </div>\n )}\n\n <div style={gamificationStyles.rewardStoreGrid}>\n {displayItems.map((item) => {\n if (renderItem) {\n return <div key={item.id}>{renderItem(item, () => void handleRedeem(item))}</div>;\n }\n\n const cardStyle = item.isAvailable\n ? {\n ...gamificationStyles.rewardCard,\n ...(theme?.cardBackground && { backgroundColor: theme.cardBackground }),\n }\n : gamificationStyles.rewardCardUnavailable;\n\n const buttonStyle = item.isAvailable && item.canAfford\n ? {\n ...gamificationStyles.rewardButton,\n ...(theme?.buttonColor && { backgroundColor: theme.buttonColor }),\n }\n : gamificationStyles.rewardButtonDisabled;\n\n const isRedeeming = redeemingId === item.id;\n\n return (\n <div key={item.id} style={cardStyle}>\n {item.imageUrl ? (\n <img src={item.imageUrl} alt={item.name} style={gamificationStyles.rewardImage} />\n ) : (\n <div style={{ ...gamificationStyles.rewardImage, display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: '32px' }}>\n 🎁\n </div>\n )}\n <div style={gamificationStyles.rewardContent}>\n <span style={gamificationStyles.rewardName}>{item.name}</span>\n {item.description && (\n <span style={gamificationStyles.rewardDescription}>{item.description}</span>\n )}\n <span style={gamificationStyles.rewardCost}>\n {item.pointsCost.toLocaleString()} points\n </span>\n {item.requiredBadgeName && !item.hasBadge && (\n <span style={{ fontSize: '12px', color: '#dc3545', marginBottom: '8px' }}>\n Requires: {item.requiredBadgeName}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => void handleRedeem(item)}\n disabled={!item.isAvailable || !item.canAfford || isRedeeming}\n style={buttonStyle}\n >\n {isRedeeming\n ? 'Redeeming...'\n : item.canAfford\n ? 'Redeem'\n : `Need ${(item.pointsCost - userPoints).toLocaleString()} more`}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const RewardStore = withErrorBoundary(RewardStoreInner);\n"]}
|