@luno-kit/ui 0.0.7 → 0.0.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AccountDetailsModal/index.tsx","../src/components/Dialog/index.tsx","../src/utils/cs.ts","../src/utils/debounce.ts","../src/providers/LunoKitProvider.tsx","../src/providers/ModalContext.tsx","../src/theme/context.tsx","../src/hooks/useCSSVariableInjection.ts","../src/assets/icons/Arrow.tsx","../src/assets/icons/Back.tsx","../src/assets/icons/Close.tsx","../src/assets/icons/Copy.tsx","../src/assets/icons/Disconnect.tsx","../src/assets/icons/List.tsx","../src/assets/icons/Success.tsx","../src/assets/icons/Switch.tsx","../src/components/AccountDetailsModal/MainView.tsx","../src/components/ChainIcon/index.tsx","../src/components/AccountDetailsModal/SwitchAccountView.tsx","../src/components/ChainList/index.tsx","../src/assets/icons/Search.tsx","../src/components/AccountDetailsModal/SwitchChainView.tsx","../src/components/Copy/index.tsx","../src/hooks/useAnimatedViews.ts","../src/components/ChainModal/index.tsx","../src/components/ConnectModal/index.tsx","../src/hooks/useConnectButton.ts","../src/hooks/useWindowSize.ts","../src/components/ConnectModal/WalletView.tsx","../src/components/QRCode/index.tsx","../src/components/ConnectButton/index.tsx","../src/components/SpiralAnimation/index.tsx","../src/components/ConnectModal/ConnectOptions.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport { useAccount, useActiveConnector } from '@luno-kit/react';\nimport { Dialog, DialogClose, DialogTitle } from '../Dialog';\nimport { cs } from '../../utils';\nimport { useAccountModal } from '../../providers';\nimport { Close, Back } from '../../assets/icons';\nimport { MainView } from './MainView';\nimport { SwitchAccountView } from './SwitchAccountView';\nimport { SwitchChainView } from './SwitchChainView';\nimport { Copy } from '../Copy'\nimport { formatAddress } from '@luno-kit/react/utils'\nimport { useAnimatedViews } from '../../hooks/useAnimatedViews'\n\nexport enum AccountModalView {\n main = 'main',\n switchAccount = 'switchAccount',\n switchChain = 'switchChain',\n}\n\nexport const AccountDetailsModal: React.FC = () => {\n const { isOpen, close } = useAccountModal();\n const { address, account } = useAccount();\n const activeConnector = useActiveConnector()\n\n const {\n currentView,\n containerRef,\n currentViewRef,\n handleViewChange,\n resetView\n } = useAnimatedViews({ initialView: AccountModalView.main });\n\n const handleModalClose = useCallback(() => {\n close();\n resetView();\n }, [close]);\n\n const viewTitle = useMemo(() => {\n if (currentView === AccountModalView.switchAccount) return 'Switch Account';\n if (currentView === AccountModalView.switchChain) return SwitchChainView.title;\n return null;\n }, [currentView]);\n\n const viewComponents = useMemo(() => ({\n [AccountModalView.main]: (\n <MainView\n onViewChange={handleViewChange}\n onModalClose={handleModalClose}\n />\n ),\n [AccountModalView.switchAccount]: (\n <SwitchAccountView onBack={() => handleViewChange(AccountModalView.main)} />\n ),\n [AccountModalView.switchChain]: (\n <SwitchChainView onBack={() => handleViewChange(AccountModalView.main)} />\n )\n }), [handleViewChange, handleModalClose]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={handleModalClose}\n >\n <div className={cs(\n 'flex flex-col w-full md:w-[360px] max-h-[512px] text-modalText',\n 'bg-modalBackground shadow-modal',\n currentView === AccountModalView.main ? 'gap-5' : 'gap-3.5'\n )}>\n <div className=\"flex items-stretch justify-between w-full px-4 pt-4\">\n {currentView === AccountModalView.main ? (\n <div className={'flex items-center gap-3 max-w-[80%]'}>\n {activeConnector?.icon && (\n <div className={'flex items-center justify-center w-[40px] h-[40px] shrink-0'}>\n <img src={activeConnector.icon} alt=\"\" className=\"w-full h-full object-contain\"/>\n </div>\n )}\n <div className=\"flex flex-col items-start gap-1.5 max-w-full\">\n <DialogTitle className={'sr-only'}>Account Details</DialogTitle>\n <div className=\"flex items-center gap-0.5 w-full \">\n <span className=\"text-base text-modalText font-semibold\">\n {formatAddress(address)}\n </span>\n <Copy copyText={address}/>\n </div>\n <div className={cs(\n \"text-sm leading-sm text-modalTextSecondary font-medium text-ellipsis overflow-hidden whitespace-nowrap\",\n account?.name && account?.name.length > 30 ? 'w-[90%]' : ''\n )}>\n {account?.name || activeConnector?.name}\n </div>\n </div>\n </div>\n ) : (\n <>\n <button\n className=\"flex items-center justify-center w-[30px] h-[30px] cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200\"\n onClick={() => handleViewChange(AccountModalView.main)}\n aria-label=\"Back\"\n >\n <Back />\n </button>\n <DialogTitle\n className=\"text-lg leading-lg text-modalText font-semibold transition-opacity duration-300\">\n {viewTitle}\n </DialogTitle>\n </>\n )}\n\n <DialogClose className=\"shrink-0 z-10 flex items-center justify-center h-[30px] w-[30px] rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200 cursor-pointer\">\n <Close />\n </DialogClose>\n </div>\n\n <div\n ref={containerRef}\n className=\"relative\"\n >\n <div ref={currentViewRef}>\n {viewComponents[currentView]}\n </div>\n </div>\n </div>\n </Dialog>\n );\n};\n","// packages/ui/src/components/Dialog/index.tsx\nimport React, { ReactNode } from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { cs } from '../../utils';\n\nexport type ModalSize = 'compact' | 'wide';\n\ninterface DialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n contentClassName?: string;\n overlayClassName?: string;\n}\n\ninterface DialogTitleProps {\n children: ReactNode;\n className?: string;\n}\n\ninterface DialogCloseProps {\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n}\n\nconst DialogRoot: React.FC<DialogProps> = ({\n open,\n onOpenChange,\n children,\n contentClassName,\n overlayClassName,\n}) => {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n {React.createElement(DialogPrimitive.Overlay as any, {\n className: cs(\n 'fixed inset-0 z-[100] bg-modalBackdrop luno-kit',\n 'data-[state=open]:[animation:overlay-in_150ms_ease-out]',\n overlayClassName\n )\n })}\n <DialogPrimitive.Content\n className={cs(\n 'luno-kit font-body fixed z-[200] text-modalText text-base leading-base',\n 'bg-modalBackground shadow-modal focus:outline-none overflow-hidden border border-modalBorder',\n 'transition-all duration-200',\n\n 'rounded-t-modalMobile bottom-0 left-0 w-full',\n 'translate-y-0 -translate-x-0',\n 'data-[state=open]:[animation:slide-up_200ms_ease-out]',\n\n 'md:bottom-auto md:left-1/2 md:top-1/2 md:-translate-x-1/2 md:-translate-y-1/2',\n 'md:w-auto md:rounded-modal',\n 'md:data-[state=open]:[animation:dialog-in_150ms_ease-out]',\n contentClassName\n )}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n\nconst DialogTitleWrapper: React.FC<DialogTitleProps> = ({ children, className }) =>\n React.createElement(DialogPrimitive.Title as any, { className }, children);\n\nconst DialogCloseWrapper: React.FC<DialogCloseProps> = ({ children, className, onClick }) =>\n React.createElement(DialogPrimitive.Close as any, { className, onClick }, children);\n\nexport const Dialog = DialogRoot;\nexport const DialogClose = DialogCloseWrapper;\nexport const DialogTitle = DialogTitleWrapper;\n\nexport type { DialogProps, DialogTitleProps, DialogCloseProps };\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst customTwMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [\n 'text-xs',\n 'text-sm',\n 'text-base',\n 'text-lg'\n ]\n }\n }\n});\n\nexport function cs(...inputs: ClassValue[]) {\n return customTwMerge(clsx(inputs));\n}\n","export function debounce(fn: () => void, ms: number) {\n let timer: NodeJS.Timeout | null;\n\n return () => {\n if (timer) {\n clearTimeout(timer as number);\n }\n\n timer = setTimeout(() => {\n timer = null;\n fn();\n }, ms);\n };\n}\n","import React, { ReactNode, useState } from 'react';\nimport { LunoProvider } from '@luno-kit/react';\nimport type { Config as LunoCoreConfig } from '@luno-kit/react/types'\n// @ts-ignore - @tanstack/react-query v5 API changes\nimport { QueryClient, QueryClientProvider, QueryClientConfig } from '@tanstack/react-query';\nimport { ModalProvider} from './ModalContext';\nimport { ThemeProvider } from '../theme';\nimport type { PartialLunokitTheme, LunokitThemeOverrides } from '../theme';\nimport { ConnectModal, AccountDetailsModal, ChainModal } from '../components'\nimport { ModalSize } from '../components/Dialog'\n\nexport interface LunoKitProviderProps {\n children: ReactNode;\n config: LunoCoreConfig & { modalSize?: ModalSize };\n queryClientConfig?: QueryClientConfig;\n theme?: PartialLunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides\n}\n\nexport const LunoKitProvider: React.FC<LunoKitProviderProps> = ({\n children,\n config,\n queryClientConfig,\n theme,\n}) => {\n const [queryClient] = useState(() => new QueryClient(queryClientConfig));\n\n return (\n <QueryClientProvider client={queryClient}>\n <LunoProvider config={config}>\n <ThemeProvider theme={theme}>\n <ModalProvider>\n <div className={'font-base luno-kit'}>\n {children}\n </div>\n <RenderModals modalSize={config.modalSize} />\n </ModalProvider>\n </ThemeProvider>\n </LunoProvider>\n </QueryClientProvider>\n );\n};\n\n\nconst RenderModals: React.FC<{modalSize?: ModalSize}> = ({ modalSize }: { modalSize?: ModalSize }) => {\n\n return (\n <>\n <ConnectModal size={modalSize} />\n <AccountDetailsModal />\n <ChainModal />\n </>\n );\n}\n","import React, { createContext, type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { ConnectionStatus, useStatus } from '@luno-kit/react'\n\nfunction useModalVisibility() {\n const [isOpen, setIsOpen] = useState(false);\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n return { isOpen, open, close };\n}\n\ninterface ModalContextValue {\n isConnectModalOpen: boolean;\n openConnectModal?: () => void;\n closeConnectModal: () => void;\n\n isAccountModalOpen: boolean;\n openAccountModal?: () => void;\n closeAccountModal: () => void;\n\n isChainModalOpen: boolean;\n openChainModal?: () => void;\n closeChainModal: () => void;\n\n closeAllModals: () => void;\n}\n\nconst ModalContext = createContext<ModalContextValue | undefined>(undefined);\n\ninterface ModalProviderProps {\n children: ReactNode;\n}\n\nexport const ModalProvider: React.FC<ModalProviderProps> = ({ children }) => {\n const { isOpen: isConnectModalOpen, open: openConnectModal, close: closeConnectModal } = useModalVisibility();\n const { isOpen: isAccountModalOpen, open: openAccountModal, close: closeAccountModal } = useModalVisibility();\n const { isOpen: isChainModalOpen, open: openChainModal, close: closeChainModal } = useModalVisibility();\n\n const connectionStatus = useStatus()\n\n const closeAllModals = useCallback(() => {\n closeConnectModal();\n closeAccountModal();\n closeChainModal();\n }, [closeConnectModal, closeAccountModal, closeChainModal]);\n\n useEffect(() => {\n if (connectionStatus === ConnectionStatus.Disconnected) { closeAccountModal(); closeChainModal(); }\n }, [connectionStatus, closeAccountModal, closeChainModal]);\n\n\n const contextValue = useMemo(() => ({\n isConnectModalOpen,\n isAccountModalOpen,\n isChainModalOpen,\n openConnectModal: connectionStatus !== ConnectionStatus.Connected ? openConnectModal : undefined,\n closeConnectModal,\n openAccountModal: connectionStatus === ConnectionStatus.Connected ? openAccountModal : undefined,\n closeAccountModal,\n openChainModal: connectionStatus === ConnectionStatus.Connected ? openChainModal: undefined,\n closeChainModal,\n closeAllModals,\n }), [\n isConnectModalOpen, openConnectModal, closeConnectModal,\n isAccountModalOpen, openAccountModal, closeAccountModal,\n isChainModalOpen, openChainModal, closeChainModal,\n closeAllModals, connectionStatus\n ]);\n\n return (\n <ModalContext.Provider value={contextValue}>\n {children}\n </ModalContext.Provider>\n );\n};\n\nexport const useConnectModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context) throw new Error('[ModalContext]: useConnectModal must be used within a ModalProvider');\n\n return {\n isOpen: context.isConnectModalOpen,\n open: context.openConnectModal,\n close: context.closeConnectModal,\n };\n};\n\nexport const useAccountModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context) throw new Error('[ModalContext]: useAccountModal must be used within a ModalProvider');\n return {\n isOpen: context.isAccountModalOpen,\n open: context.openAccountModal,\n close: context.closeAccountModal,\n };\n};\n\nexport const useChainModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context) throw new Error('[ModalContext]: useChainModal must be used within a ModalProvider');\n return {\n isOpen: context.isChainModalOpen,\n open: context.openChainModal,\n close: context.closeChainModal,\n };\n};\n\nexport const useCloseAllModals = (): () => void => {\n const context = useContext(ModalContext);\n if (!context) throw new Error('[ModalContext]: useCloseAllModals must be used within a ModalProvider');\n return context.closeAllModals;\n}\n","import React, { createContext, useState, useContext, ReactNode, useMemo, useCallback, useEffect } from 'react';\nimport type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types';\nimport { useCSSVariableInjection } from '../hooks/useCSSVariableInjection';\n\n// Theme preference storage\ninterface ThemePreference {\n isAuto: boolean;\n preferredTheme?: ThemeMode;\n}\n\nconst THEME_STORAGE_KEY = 'luno.lastThemePreference';\n\nconst saveThemePreference = (preference: ThemePreference) => {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, JSON.stringify(preference));\n } catch (e) {\n }\n};\n\ninterface ThemeContextValue {\n themeMode: ThemeMode;\n setThemeChoice: (choice: 'light' | 'dark' | 'auto') => void; // User explicit choice\n currentTheme: LunokitTheme | null; // null for default themes\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n theme?: PartialLunokitTheme | LunokitThemeOverrides;\n}\n\n// Helper function to check if theme is complete or partial\nconst isCompleteTheme = (theme: PartialLunokitTheme | LunokitThemeOverrides): theme is LunokitTheme => {\n return 'colors' in theme && 'fonts' in theme && 'radii' in theme && 'shadows' in theme && 'blurs' in theme;\n};\n\n// Hook to detect system theme\nconst useSystemTheme = () => {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateTheme = (e: MediaQueryListEvent | MediaQueryList) => {\n setSystemTheme(e.matches ? 'dark' : 'light');\n };\n\n updateTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateTheme);\n\n return () => mediaQuery.removeEventListener('change', updateTheme);\n }, []);\n\n return systemTheme;\n};\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: themeOverrides,\n}) => {\n const systemTheme = useSystemTheme();\n\n const [themeMode, setThemeMode] = useState<ThemeMode>(() => {\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(THEME_STORAGE_KEY);\n if (saved) {\n const preference = JSON.parse(saved);\n if (preference?.isAuto) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n } else if (preference?.preferredTheme) {\n return preference.preferredTheme;\n }\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n if (!themeOverrides || isCompleteTheme(themeOverrides)) {\n return 'light';\n }\n\n const overrides = themeOverrides as LunokitThemeOverrides;\n return overrides.defaultMode || 'light';\n });\n\n const [isAutoMode, setIsAutoMode] = useState<boolean>(() => {\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(THEME_STORAGE_KEY);\n if (saved) {\n const preference = JSON.parse(saved);\n return preference?.isAuto ?? false;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n if (!themeOverrides || isCompleteTheme(themeOverrides)) {\n return false;\n }\n\n const overrides = themeOverrides as LunokitThemeOverrides;\n return overrides.autoMode ?? false;\n });\n\n // Determine theme type and get relevant data\n const themeInfo = useMemo(() => {\n if (!themeOverrides) {\n return { type: 'default' as const, completeTheme: null, partialOverrides: null };\n }\n\n // Handle complete custom theme\n if (isCompleteTheme(themeOverrides)) {\n return { type: 'complete' as const, completeTheme: themeOverrides, partialOverrides: null };\n }\n\n // Handle theme overrides format\n const overrides = themeOverrides as LunokitThemeOverrides;\n\n // Apply complete theme override (highest priority)\n if (overrides.theme) {\n return { type: 'complete' as const, completeTheme: overrides.theme, partialOverrides: null };\n }\n\n // For partial overrides, get the current mode's overrides\n let partialOverrides: PartialLunokitTheme | null = null;\n if (themeMode === 'light' && overrides.light) {\n partialOverrides = overrides.light;\n } else if (themeMode === 'dark' && overrides.dark) {\n partialOverrides = overrides.dark;\n } else {\n partialOverrides = { ...overrides as PartialLunokitTheme }\n }\n\n return { type: 'partial' as const, completeTheme: null, partialOverrides };\n }, [themeMode, themeOverrides]);\n\n // Build current theme for context (only for complete themes)\n const currentTheme = useMemo(() => {\n return themeInfo.type === 'complete' ? themeInfo.completeTheme : null;\n }, [themeInfo]);\n\n // Inject CSS variables to DOM\n useCSSVariableInjection(themeInfo, themeMode);\n\n // User explicit choice handler (saves to storage)\n const setThemeChoice = useCallback((choice: 'light' | 'dark' | 'auto') => {\n const isAuto = choice === 'auto';\n setIsAutoMode(isAuto);\n\n if (isAuto) {\n setThemeMode(systemTheme || 'light');\n } else {\n setThemeMode(choice);\n }\n\n const preference: ThemePreference = {\n isAuto,\n ...(isAuto ? {} : { preferredTheme: choice })\n };\n\n saveThemePreference(preference);\n }, [systemTheme]);\n\n // Only listen to system theme changes for auto mode\n useEffect(() => {\n if (isAutoMode) {\n setThemeMode(systemTheme || 'light');\n }\n }, [systemTheme, isAutoMode]);\n\n const contextValue = useMemo(() => ({\n themeMode,\n setThemeChoice,\n currentTheme,\n }), [themeMode, setThemeChoice, currentTheme]);\n\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;\n};\n\nexport const useLunoTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)');\n }\n return context;\n};\n","import { useEffect } from 'react';\nimport type { LunokitTheme, PartialLunokitTheme, ThemeMode } from '../theme/types';\n\n// All theme variable names for cleanup\nconst ALL_THEME_VARS = [\n '--color-accentColor', '--color-walletSelectItemBackground', '--color-walletSelectItemBackgroundHover', '--color-walletSelectItemText',\n '--color-connectButtonBackground', '--color-connectButtonInnerBackground', '--color-connectButtonText',\n '--color-accountActionItemBackground', '--color-accountActionItemBackgroundHover', '--color-accountActionItemText',\n '--color-accountSelectItemBackground', '--color-accountSelectItemBackgroundHover', '--color-accountSelectItemText',\n '--color-currentNetworkButtonBackground', '--color-currentNetworkButtonText',\n '--color-networkSelectItemBackground', '--color-networkSelectItemBackgroundHover', '--color-networkSelectItemText',\n '--color-navigationButtonBackground', '--color-separatorLine',\n '--color-modalBackground', '--color-modalBackdrop', '--color-modalBorder', '--color-modalText', '--color-modalTextSecondary',\n '--color-modalControlButtonBackgroundHover', '--color-modalControlButtonText',\n '--color-success', '--color-successForeground', '--color-warning', '--color-warningForeground',\n '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton',\n '--font-body',\n '--radius-walletSelectItem', '--radius-connectButton', '--radius-modalControlButton', '--radius-accountActionItem',\n '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', '--radius-modalMobile',\n '--shadow-button', '--shadow-modal',\n '--blur-modalOverlay',\n];\n\ninterface ThemeInfo {\n type: 'default' | 'complete' | 'partial';\n completeTheme: LunokitTheme | null;\n partialOverrides: PartialLunokitTheme | null;\n}\n\nexport const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMode) => {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n\n if (themeInfo.type === 'complete' && themeInfo.completeTheme) {\n // Complete custom theme: inject all variables and remove data-theme\n Object.entries(themeInfo.completeTheme.colors).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--color-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.fonts).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--font-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.radii).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--radius-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.shadows).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--shadow-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.blurs).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--blur-${key}`, value);\n }\n });\n\n // Remove data-theme attribute for complete custom themes\n root.removeAttribute('data-theme');\n\n } else if (themeInfo.type === 'partial' && themeInfo.partialOverrides) {\n // Partial override: KEEP data-theme and inject only overridden variables\n root.setAttribute('data-theme', themeMode);\n\n // Only clear and inject if there are actual overrides\n const hasOverrides = Object.keys(themeInfo.partialOverrides).length > 0;\n if (hasOverrides) {\n // Clear all custom variables first\n ALL_THEME_VARS.forEach(varName => {\n root.style.removeProperty(varName);\n });\n\n // Inject only the overridden variables\n if (themeInfo.partialOverrides.colors) {\n Object.entries(themeInfo.partialOverrides.colors).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--color-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.fonts) {\n Object.entries(themeInfo.partialOverrides.fonts).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--font-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.radii) {\n Object.entries(themeInfo.partialOverrides.radii).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--radius-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.shadows) {\n Object.entries(themeInfo.partialOverrides.shadows).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--shadow-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.blurs) {\n Object.entries(themeInfo.partialOverrides.blurs).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--blur-${key}`, value);\n }\n });\n }\n }\n\n } else {\n // Default theme: just set data-theme and clear custom variables\n root.setAttribute('data-theme', themeMode);\n\n // Clear any previously injected custom variables\n ALL_THEME_VARS.forEach(varName => {\n root.style.removeProperty(varName);\n });\n }\n }, [themeInfo, themeMode]);\n};\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgArrow = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"arrow_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z\"></path>\n </svg>\n);\nexport default SvgArrow;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgBack = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z\"></path>\n </svg>\n);\nexport default SvgBack;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgClose = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z\"></path>\n </svg>\n);\nexport default SvgClose;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgCopy = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"copy_svg__icon\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"></path>\n </svg>\n);\nexport default SvgCopy;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgDisconnect = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z\"></path>\n </svg>\n);\nexport default SvgDisconnect;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgList = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"list_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M232,48V88a8,8,0,0,1-16,0V56H184a8,8,0,0,1,0-16h40A8,8,0,0,1,232,48ZM72,200H40V168a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16Zm152-40a8,8,0,0,0-8,8v32H184a8,8,0,0,0,0,16h40a8,8,0,0,0,8-8V168A8,8,0,0,0,224,160ZM32,96a8,8,0,0,0,8-8V56H72a8,8,0,0,0,0-16H32a8,8,0,0,0-8,8V88A8,8,0,0,0,32,96ZM188,167l-56,32a8,8,0,0,1-7.94,0L68,167A8,8,0,0,1,64,160V96a8,8,0,0,1,4-7l56-32a8,8,0,0,1,7.94,0l56,32a8,8,0,0,1,4,7v64A8,8,0,0,1,188,167ZM88.12,96,128,118.79,167.88,96,128,73.21ZM80,155.36l40,22.85V132.64L80,109.79Zm96,0V109.79l-40,22.85v45.57Z\"></path>\n </svg>\n);\nexport default SvgList;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgSuccess = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"success_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"></path>\n </svg>\n);\nexport default SvgSuccess;\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgSwitch = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n className=\"switch_svg__icon\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M253.66,133.66l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L216,132.69V128A88,88,0,0,0,56.49,76.67a8,8,0,0,1-13-9.34A104,104,0,0,1,232,128v4.69l10.34-10.35a8,8,0,0,1,11.32,11.32Zm-41.18,55A104,104,0,0,1,24,128v-4.69L13.66,133.66A8,8,0,0,1,2.34,122.34l24-24a8,8,0,0,1,11.32,0l24,24a8,8,0,0,1-11.32,11.32L40,123.31V128a87.62,87.62,0,0,0,22.24,58.41A79.66,79.66,0,0,1,98.3,157.66a48,48,0,1,1,59.4,0,79.59,79.59,0,0,1,36.08,28.78,89.68,89.68,0,0,0,5.71-7.11,8,8,0,0,1,13,9.34ZM128,152a32,32,0,1,0-32-32A32,32,0,0,0,128,152Zm0,64a88.2,88.2,0,0,0,53.92-18.49,64,64,0,0,0-107.84,0A87.57,87.57,0,0,0,128,216Z\"></path>\n </svg>\n);\nexport default SvgSwitch;\n","import React, { useMemo } from 'react';\nimport { cs } from '../../utils';\nimport { Arrow, Disconnect, List, Switch } from '../../assets/icons';\nimport { ChainIcon } from '../ChainIcon';\nimport { AccountModalView } from './index'\nimport {useAccount, useBalance, useChain, useDisconnect} from '@luno-kit/react'\nimport { getExplorerUrl } from '@luno-kit/react/utils'\n\ninterface MainViewProps {\n onViewChange: (view: AccountModalView) => void;\n onModalClose: () => void;\n}\n\nexport const MainView: React.FC<MainViewProps> = ({\n onViewChange,\n onModalClose,\n}) => {\n const { address } = useAccount();\n const { chain } = useChain();\n const { disconnectAsync } = useDisconnect();\n const { data: balance } = useBalance({ address });\n\n const items = useMemo(() => {\n return [\n {\n key: 'Chain Name',\n content: (\n <div className={'flex items-stretch w-full justify-between'}>\n <div className={'flex items-center gap-2'}>\n <div className=\"relative\">\n <ChainIcon\n className=\"w-[24px] h-[24px]\"\n chainIconUrl={chain?.chainIconUrl}\n chainName={chain?.name}\n />\n {/* <div className={'dot w-[8px] h-[8px] bg-accentColor absolute bottom-0 right-0 rounded-full'}/> */}\n </div>\n <div className={'flex flex-col items-start'}>\n <span className=\"text-base leading-base text-modalText\">{chain?.name || 'Polkadot'}</span>\n {balance ? (\n <span className={'text-modalTextSecondary text-xs leading-xs'}>\n {balance.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'}\n </span>\n ) : (\n <span className=\"animate-pulse rounded w-[80px] h-[16px] bg-skeleton\"/>\n )}\n </div>\n </div>\n <div\n className={'flex items-center justify-center'}>\n <Arrow className={'w-[16px] h-[16px] text-modalTextSecondary'} />\n </div>\n </div>\n ),\n onClick: () => onViewChange(AccountModalView.switchChain)\n },\n {\n key: 'View on Explorer',\n content: (\n <>\n <List className={'w-[24px] h-[24px]'} />\n <span className=\"text-base text-accountActionItemText\">View on Explorer</span>\n </>\n ),\n onClick: () => window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address'))\n },\n {\n key: 'Switch Account',\n content: (\n <>\n <Switch className={'w-[24px] h-[24px]'} />\n <span className=\"text-base text-accountActionItemText\">Switch Account</span>\n </>\n ),\n onClick: () => onViewChange(AccountModalView.switchAccount)\n }\n ];\n }, [onViewChange, chain, address, balance])\n\n const handleDisconnect = async () => {\n await disconnectAsync();\n onModalClose();\n };\n\n return (\n <div className=\"flex flex-col items-center gap-3 w-full\">\n <div className=\"flex flex-col gap-1.5 w-full px-4\">\n {items.map(i => (\n <SelectItem key={i.key} onClick={i.onClick}>\n {i.content}\n </SelectItem>\n ))}\n </div>\n <div className={'w-full mx-[-100px] h-[1px] bg-separatorLine'}/>\n\n <div className={'w-full px-4 pb-4'}>\n <SelectItem onClick={handleDisconnect}>\n <Disconnect />\n <span className=\"font-medium text-base text-accountActionItemText\">Disconnect</span>\n </SelectItem>\n </div>\n </div>\n );\n};\n\nconst SelectItem = ({ children, onClick }: { children: React.ReactNode; onClick?: () => void }) => {\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.()}\n className={cs(\n 'w-full p-2.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium',\n 'bg-accountActionItemBackground hover:bg-accountActionItemBackgroundHover',\n 'transition-colors duration-200',\n onClick ? 'cursor-pointer' : 'cursor-auto'\n )}\n aria-label={typeof children === 'string' ? children : undefined}\n >\n {children}\n </button>\n );\n};\n","import React from 'react';\nimport { cs } from '../../utils';\n\nexport interface ChainIconProps {\n chainIconUrl?: string;\n chainName?: string;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({\n chainIconUrl,\n chainName,\n className,\n}) => {\n if (chainIconUrl) {\n return (\n <img\n src={chainIconUrl}\n alt={chainName || 'Chain icon'}\n className={cs('w-full h-full object-cover rounded-full', className)}\n />\n );\n }\n\n return (\n <div className={cs(\n 'w-full h-full bg-gray-500 text-modalText font-semibold',\n 'flex items-center justify-center rounded-full',\n className\n )}>\n {chainName ? chainName.charAt(0).toUpperCase() : 'C'}\n </div>\n );\n};\n","import React, { useCallback } from 'react';\nimport { useAccount, useAccounts, useActiveConnector, useBalance, useChain } from '@luno-kit/react';\nimport { cs } from '../../utils';\nimport { formatAddress } from '@luno-kit/react/utils';\nimport type { Account } from '@luno-kit/react/types';\n\ninterface ViewComponent extends React.FC<SwitchAccountViewProps> {\n title?: string;\n}\n\ninterface SwitchAccountViewProps {\n onBack: () => void\n}\n\nexport const SwitchAccountView: ViewComponent = ({ onBack }) => {\n const { accounts, selectAccount } = useAccounts();\n const { address: currentAddress } = useAccount();\n\n const _selectAccount = useCallback((acc: Account) => {\n selectAccount(acc)\n onBack()\n }, [onBack])\n\n return (\n <div className=\"flex flex-col gap-1.5 pt-3 overflow-auto max-h-[400px] no-scrollbar p-4 pt-0\">\n {accounts.map((acc) => (\n <AccountItem\n key={acc.address}\n account={acc}\n isSelected={acc.address === currentAddress}\n selectAccount={_selectAccount}\n />\n ))}\n </div>\n );\n};\n\nSwitchAccountView.title = 'Switch Accounts';\n\ninterface AccountItemProps {\n isSelected: boolean;\n account: Account;\n selectAccount: (acc: Account) => void\n}\n\nconst AccountItem: React.FC<AccountItemProps> = React.memo(({\n isSelected,\n account,\n selectAccount\n}) => {\n const { chain } = useChain();\n const address = account.address;\n const { data: balance } = useBalance({ address });\n const connector = useActiveConnector()\n\n return (\n <button\n type=\"button\"\n onClick={() => selectAccount(account)}\n className={cs(\n 'px-3.5 py-2.5 w-full rounded-accountSelectItem border-none',\n 'bg-accountSelectItemBackground',\n 'text-left flex items-center justify-between gap-2',\n 'transition-colors duration-200',\n isSelected ? 'cursor-auto' : 'cursor-pointer hover:bg-accountSelectItemBackgroundHover'\n )}\n aria-label={account.name || address}\n disabled={isSelected}\n >\n <div className=\"flex items-center gap-2 grow overflow-hidden\">\n <div className=\"shrink-0 w-[24px] h-[24px] rounded-full flex items-center justify-center\">\n {connector?.icon && <img src={connector?.icon} alt=\"luno account\"/>}\n </div>\n <div className=\"flex flex-col items-start overflow-hidden\">\n <span className=\"whitespace-nowrap max-w-full text-ellipsis overflow-hidden font-medium text-sm leading-sm text-accountSelectItemText\">\n {account.name || formatAddress(address)}\n </span>\n {balance ? (\n <span className=\"text-xs text-modalTextSecondary font-medium\">\n {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'}\n </span>\n ) : (\n <span className=\"animate-pulse rounded w-[60px] h-[16px] bg-skeleton\"/>\n )}\n </div>\n </div>\n\n {isSelected && (\n <div className=\"shrink-0 border-[1px] border-solid border-accentColor rounded-full overflow-hidden flex items-center justify-center w-[16px] h-[16px]\">\n <div className=\"rounded-full bg-accentColor w-[8px] h-[8px]\" />\n </div>\n )}\n </button>\n );\n});\n","import React, { useMemo, useState } from 'react'\nimport { cs } from '../../utils'\nimport { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react'\nimport type { Chain } from '@luno-kit/react/types'\nimport { ChainIcon } from '../ChainIcon'\nimport Search from '../../assets/icons/Search'\n\ninterface ChainListProps {\n onChainSwitched?: (chain: Chain) => void;\n className?: string\n}\n\nexport const ChainList: React.FC<ChainListProps> = ({ onChainSwitched, className = '' }: ChainListProps) => {\n const { chain: currentChain } = useChain();\n const chains = useChains();\n const { switchChainAsync } = useSwitchChain();\n const { isApiReady, apiError } = useApi()\n\n const [switchingChain, setSwitchingChain] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredChains = useMemo(() => {\n return chains\n .filter(chain =>\n searchQuery.trim()\n ? chain.name.toLowerCase().includes(searchQuery.toLowerCase())\n : true\n )\n }, [chains, searchQuery]);\n\n const handleChainSelect = async (chain: Chain) => {\n if (chain.genesisHash === currentChain?.genesisHash) return;\n if (!isApiReady && !apiError) return\n\n setSwitchingChain(chain.genesisHash);\n try {\n await switchChainAsync({ chainId: chain.genesisHash });\n onChainSwitched?.(chain);\n } catch (error) {\n console.error('Failed to switch chain:', error);\n } finally {\n setSwitchingChain(null);\n }\n };\n\n return (\n <div className={cs('flex flex-col gap-3.5', className)}>\n <div className=\"relative pt-1\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-modalTextSecondary\" />\n <input\n type=\"text\"\n placeholder=\"Search by name\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-3 py-2 text-sm border border-networkSelectItemBackgroundHover rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent\"\n />\n </div>\n </div>\n\n {filteredChains.length > 0 && (\n <div className=\"flex flex-col gap-1.5 overflow-y-auto max-h-[380px]\">\n {filteredChains.map(chain => (\n <ChainItem\n key={chain.genesisHash}\n chain={chain}\n isSelected={chain.genesisHash === currentChain?.genesisHash}\n onSelect={handleChainSelect}\n isLoading={(switchingChain === chain.genesisHash || !isApiReady) && !apiError}\n isSwitching={switchingChain === chain.genesisHash}\n />\n ))}\n </div>\n )}\n\n {filteredChains.length === 0 && (\n <div className=\"flex items-center justify-center py-12\">\n <span className=\"text-modalTextSecondary text-xs\">\n No chains available\n </span>\n </div>\n )}\n </div>\n )\n}\n\ninterface ChainItemProps {\n chain: Chain;\n isSelected: boolean;\n isLoading: boolean;\n onSelect: (chain: Chain) => void;\n isSwitching: boolean;\n}\n\nconst ChainItem: React.FC<ChainItemProps> = React.memo(({\n chain,\n isSelected,\n isLoading,\n onSelect,\n isSwitching\n}) => {\n return (\n <button\n onClick={() => onSelect(chain)}\n disabled={isSelected || isLoading}\n className={cs(\n 'flex items-center justify-between p-2.5 rounded-networkSelectItem',\n 'bg-networkSelectItemBackground',\n 'transition-colors duration-200',\n (isSelected || isLoading)\n ? 'cursor-default'\n : 'cursor-pointer hover:bg-networkSelectItemBackgroundHover',\n isLoading && 'opacity-80'\n )}>\n <div className=\"flex items-center gap-2\">\n <ChainIcon\n className={'w-[20px] h-[20px] flex items-center justify-center leading-[20px]'}\n chainIconUrl={chain?.chainIconUrl}\n chainName={chain?.name}\n />\n\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium text-base text-modalText\">\n {chain.name}\n </span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-center h-[20px]\">\n {isSelected\n ? isLoading\n ? (\n <>\n <span className=\"text-accentColor text-xs leading-xs mr-1.5\">\n {isSwitching ? 'Switching' : 'Connecting'}\n </span>\n <div className=\"loading text-accentColor w-[15px] h-[15px]\"></div>\n </>\n )\n : (\n <span className=\"status-dot-container\">\n <span className=\"ping-animation\"></span>\n <span className=\"status-dot\"></span>\n </span>\n )\n : null\n }\n </div>\n </button>\n );\n});\n","import * as React from \"react\";\nimport type { SVGProps } from \"react\";\nconst SvgArrow = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"search_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n > \n <path d=\"M232.49,215.51,185,168a92.12,92.12,0,1,0-17,17l47.53,47.54a12,12,0,0,0,17-17ZM44,112a68,68,0,1,1,68,68A68.07,68.07,0,0,1,44,112Z\"></path>\n {/* <path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path> */}\n </svg>\n);\nexport default SvgArrow;\n\n","import React from 'react'\nimport { ChainList } from '../ChainList'\n\ninterface ViewComponent extends React.FC<SwitchChainViewProps> {\n title?: string;\n}\n\ninterface SwitchChainViewProps {\n onBack: () => void\n}\n\nexport const SwitchChainView: ViewComponent = ({ onBack }) => {\n return <ChainList className={'p-4 pt-0'} />\n}\n\nSwitchChainView.title = 'Select Networks';\n","import React, { useCallback, useState } from 'react'\nimport { Copy as CopyIcon, Success } from '../../assets/icons'\nimport { cs } from '../../utils'\n\ninterface CopyProps {\n copyText?: string\n label?: string\n className?: string\n}\n\nexport const Copy: React.FC<CopyProps> = ({ copyText, label, className = '' }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const copyToClipboard = useCallback(async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n return true;\n }\n return false;\n } catch (err) {\n console.error('Copy failed:', err);\n return false;\n }\n }, [])\n\n return (\n <button\n type=\"button\"\n className={cs(\n 'cursor-pointer bg-transparent border-none p-1 m-0 inline-flex items-center justify-center gap-1',\n 'rounded-modalControlButton hover:bg-modalControlButtonBackgroundHover transition-colors duration-200',\n className\n )}\n onClick={() => !isCopied && copyText && copyToClipboard(copyText)}\n aria-label=\"Copy address to clipboard\"\n disabled={isCopied}\n >\n {isCopied\n ? <Success className=\"text-accentColor\" width={16} height={16} />\n : <CopyIcon width={16} height={16} />}\n {label}\n </button>\n )\n}\n","import React, { useCallback, useState, useRef } from 'react';\n\ninterface UseAnimatedViewsProps<T> {\n initialView: T;\n animationDuration?: number;\n animationEasing?: string;\n}\n\ninterface UseAnimatedViewsReturn<T> {\n currentView: T;\n isAnimating: boolean;\n containerRef: React.RefObject<HTMLDivElement>;\n currentViewRef: React.RefObject<HTMLDivElement>;\n handleViewChange: (view: T) => void;\n resetView: () => void;\n}\n\nexport function useAnimatedViews<T>({\n initialView,\n animationDuration = 200,\n animationEasing = 'ease-out'\n}: UseAnimatedViewsProps<T>): UseAnimatedViewsReturn<T> {\n const [currentView, setCurrentView] = useState<T>(initialView);\n const [isAnimating, setIsAnimating] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const currentViewRef = useRef<HTMLDivElement>(null);\n\n const handleViewChange = useCallback((view: T) => {\n if (view === currentView || isAnimating) return;\n\n setIsAnimating(true);\n\n if (!containerRef.current) {\n setCurrentView(view);\n setIsAnimating(false);\n return;\n }\n\n const container = containerRef.current;\n const currentHeight = container.offsetHeight;\n\n setCurrentView(view);\n\n requestAnimationFrame(() => {\n if (!container || !currentViewRef.current) {\n setIsAnimating(false);\n return;\n }\n\n const newHeight = currentViewRef.current.offsetHeight;\n\n container.animate([\n { height: currentHeight + 'px' },\n { height: newHeight + 'px' }\n ], {\n duration: animationDuration,\n easing: animationEasing,\n fill: 'forwards'\n }).addEventListener('finish', () => {\n setIsAnimating(false);\n });\n });\n }, [currentView, isAnimating, animationDuration, animationEasing]);\n\n const resetView = useCallback(() => {\n setCurrentView(initialView);\n setIsAnimating(false);\n }, [initialView]);\n\n return {\n currentView,\n isAnimating,\n containerRef,\n currentViewRef,\n handleViewChange,\n resetView\n };\n}\n","import React from 'react';\nimport { Dialog, DialogTitle, DialogClose } from '../Dialog';\nimport { ChainList } from '../ChainList';\nimport { Close } from '../../assets/icons';\nimport { useChainModal } from '../../providers';\n\nexport interface ChainModalProps {}\n\nexport const ChainModal: React.FC<ChainModalProps> = () => {\n const { isOpen, close } = useChainModal();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && close()}>\n <div className=\"flex flex-col w-full md:w-[360px] max-h-[512px] p-4 gap-3.5 text-modalText\">\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"w-[30px]\" /> {/* Placeholder to keep title centered */}\n <DialogTitle className=\"text-lg leading-lg text-modalText font-semibold transition-opacity duration-300\">\n Select Network\n </DialogTitle>\n <DialogClose className=\"z-10 flex items-center justify-center h-[30px] w-[30px] rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200 cursor-pointer\">\n <Close />\n </DialogClose>\n </div>\n\n <ChainList />\n </div>\n </Dialog>\n );\n};\n","import React, {useEffect, useMemo, useState} from 'react';\nimport { useConnect } from '@luno-kit/react';\nimport { Dialog, DialogClose, DialogTitle, ModalSize } from '../Dialog';\nimport { cs } from '../../utils';\nimport { useConnectModal } from '../../providers'\nimport type { Connector } from '@luno-kit/react/types'\nimport { isMobileDevice } from '@luno-kit/react/utils'\nimport { Back, Close } from '../../assets/icons'\nimport { useWindowSize } from '../../hooks'\nimport { WalletView } from './WalletView'\nimport { useAnimatedViews } from '../../hooks/useAnimatedViews'\nimport { ConnectOptions } from './ConnectOptions'\n\nexport enum ConnectModalView {\n connectOptions = 'Connect Wallet',\n walletView = 'walletView',\n}\n\nexport interface ConnectModalProps {\n size?: ModalSize;\n}\n\nexport const ConnectModal: React.FC<ConnectModalProps> = ({\n size = 'wide',\n}) => {\n const { isOpen, close } = useConnectModal();\n const { connectAsync, reset: resetConnect, isPending: isConnecting, isError: connectError } = useConnect()\n const [selectedConnector, setSelectedConnector] = useState<Connector | null>(null)\n const [qrCode, setQrCode] = useState<string | undefined>()\n\n const { width: windowWidth } = useWindowSize()\n\n const isLargeWindow = windowWidth && windowWidth > 768;\n const isWide = !!(size === 'wide' && isLargeWindow);\n\n const {\n containerRef,\n currentViewRef,\n resetView,\n handleViewChange,\n currentView,\n } = useAnimatedViews({ initialView: ConnectModalView.connectOptions })\n\n const onQrCode = async (connector: Connector) => {\n const uri = await connector.getConnectionUri()\n\n setQrCode(uri)\n }\n\n const handleConnect = async (connector: Connector) => {\n if (isMobileDevice() && connector.links.deepLink) {\n try {\n await connectAsync({ connectorId: connector.id });\n _onOpenChange(false);\n return;\n } catch (error) {\n window.location.href = `${connector.links.deepLink}?url=${window.location.href}`;\n return;\n }\n }\n\n !isWide && handleViewChange(ConnectModalView.walletView)\n setSelectedConnector(connector)\n setQrCode(undefined)\n if (connector.hasConnectionUri()) {\n onQrCode(connector)\n }\n await connectAsync({ connectorId: connector.id })\n _onOpenChange(false)\n }\n\n const _onOpenChange = (open: boolean) => {\n !open && close()\n resetConnect()\n resetView()\n setSelectedConnector(null)\n setQrCode(undefined)\n }\n\n const viewComponents = useMemo(() => {\n return {\n [ConnectModalView.connectOptions]: <ConnectOptions onConnect={handleConnect} />,\n [ConnectModalView.walletView]: (\n <WalletView\n connectState={{ isConnecting, isError: connectError }}\n isWide={isWide}\n selectedConnector={selectedConnector}\n qrCode={qrCode}\n onConnect={handleConnect} />\n ),\n }\n }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError])\n\n useEffect(() => {\n if (isWide && currentView === ConnectModalView.walletView) {\n handleViewChange(ConnectModalView.connectOptions);\n }\n }, [isWide, currentView]);\n\n return (\n <Dialog open={isOpen} onOpenChange={_onOpenChange}>\n <div className={cs('flex items-stretch justify-between w-full md:max-h-[504px] md:max-w-[724px]')}>\n <div className={cs(\n 'flex flex-col items-start py-4 px-5 w-full md:w-auto',\n isWide ? 'md:min-w-[300px] border-r-[1px] border-r-solid border-r-separatorLine' : 'md:min-w-[360px]'\n )}>\n <div className={cs('flex items-center justify-between w-full', !isWide && 'pb-4')}>\n {currentView === ConnectModalView.connectOptions ? (\n <>\n {!isWide && <div className=\"w-[30px] h-[30px]\" aria-hidden />}\n <DialogTitle className={cs('text-lg leading-lg text-modalText font-bold', isWide ? 'pb-6' : 'flex-1 text-center')}>\n Connect Wallet\n </DialogTitle>\n </>\n ) : (\n <>\n <button\n className=\"flex items-center justify-center w-[30px] h-[30px] cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200\"\n onClick={() => handleViewChange(ConnectModalView.connectOptions)}\n aria-label=\"Back\"\n >\n <Back />\n </button>\n <DialogTitle\n className={cs(\n 'text-lg leading-lg text-modalText font-semibold transition-opacity duration-300',\n )}>\n {selectedConnector?.name}\n </DialogTitle>\n </>\n )}\n\n {!isWide && (\n <DialogClose\n className={'z-10 w-[30px] h-[30px] flex items-center justify-center cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200'}>\n <Close/>\n </DialogClose>\n )}\n </div>\n <div\n ref={containerRef}\n className=\"relative overflow-hidden w-full\">\n <div ref={currentViewRef}>\n {viewComponents[currentView]}\n </div>\n </div>\n\n {!isWide && currentView === ConnectModalView.connectOptions && (\n <>\n <p\n className={'cursor-pointer w-full pt-4 text-sm leading-sm text-accentColor font-medium text-center hover:text-modalText'}\n onClick={() => window.open('https://polkadot.com/get-started/wallets/')}>\n New to wallets?\n </p>\n </>\n )}\n\n </div>\n\n {isWide && (\n <WalletView\n connectState={{ isConnecting, isError: connectError }}\n isWide={isWide}\n selectedConnector={selectedConnector}\n qrCode={qrCode}\n onConnect={handleConnect}\n />\n )}\n </div>\n </Dialog>\n );\n};\n","import {\n useStatus,\n useAccount,\n useChain,\n useBalance,\n ConnectionStatus,\n useChains,\n useActiveConnector,\n} from '@luno-kit/react';\nimport type { Account, Chain, AccountBalance, Connector } from '@luno-kit/react/types'\nimport {\n useConnectModal,\n useAccountModal,\n useChainModal,\n} from '../providers';\n\nexport interface UseConnectButtonReturn {\n connectionStatus: ConnectionStatus;\n isConnected: boolean;\n isDisconnected: boolean;\n isConnecting: boolean;\n\n account?: Account;\n address?: string;\n displayAccount: string;\n\n currentChain?: Chain;\n configuredChains: Chain[];\n isChainSupported: boolean;\n chainIconUrl: string;\n chainName?: string;\n\n balance?: AccountBalance;\n\n activeConnector?: Connector;\n\n openConnectModal?: () => void;\n openAccountModal?: () => void;\n openChainModal?: () => void;\n\n isConnectModalOpen: boolean;\n isAccountModalOpen: boolean;\n isChainModalOpen: boolean;\n}\n\nexport function useConnectButton(): UseConnectButtonReturn {\n const connectionStatus = useStatus();\n const { account, address } = useAccount();\n const { chain: currentChain } = useChain();\n const configuredChains = useChains();\n const { data: balance } = useBalance({ address });\n const activeConnector = useActiveConnector()\n\n const { open: openConnectModal, isOpen: isConnectModalOpen } = useConnectModal();\n const { open: openAccountModal, isOpen: isAccountModalOpen } = useAccountModal();\n const { open: openChainModal, isOpen: isChainModalOpen } = useChainModal();\n\n const isConnecting = connectionStatus === ConnectionStatus.Connecting;\n const isConnected = connectionStatus === ConnectionStatus.Connected;\n const isDisconnected = connectionStatus === ConnectionStatus.Disconnected || connectionStatus === ConnectionStatus.Disconnecting;\n\n const isChainSupported: boolean = !!currentChain\n && configuredChains.some(c => c.genesisHash.toLowerCase() === currentChain.genesisHash.toLowerCase());\n\n return {\n activeConnector,\n connectionStatus,\n isConnected,\n isDisconnected,\n isConnecting,\n\n account,\n address,\n\n currentChain,\n configuredChains,\n isChainSupported,\n chainIconUrl: currentChain?.chainIconUrl!,\n chainName: currentChain?.name ,\n\n balance,\n\n openConnectModal,\n openAccountModal,\n openChainModal,\n\n isConnectModalOpen,\n isAccountModalOpen,\n isChainModalOpen,\n };\n}\n","import { useEffect, useState } from 'react';\nimport { debounce } from '../utils';\n\nexport const useWindowSize = () => {\n const [windowSize, setWindowSize] = useState<{\n width: number | undefined;\n height: number | undefined;\n }>({\n height: undefined,\n width: undefined,\n });\n\n useEffect(() => {\n const handleResize = debounce(() => {\n setWindowSize({\n height: window.innerHeight,\n width: window.innerWidth,\n });\n }, 500);\n window.addEventListener('resize', handleResize);\n handleResize();\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowSize;\n};\n","import React from 'react'\nimport { DialogClose } from '../Dialog'\nimport { Close } from '../../assets/icons'\nimport { QRCode } from '../QRCode'\nimport { cs } from '../../utils'\nimport { transitionClassName } from '../ConnectButton'\nimport { SpiralAnimation } from '../SpiralAnimation'\nimport type { Connector } from '@luno-kit/react/types'\nimport { Copy } from '../Copy'\n\ninterface Props {\n selectedConnector: Connector | null\n onConnect: (connector: Connector) => Promise<void>\n qrCode?: string\n isWide: boolean\n connectState: {\n isConnecting: boolean\n isError: boolean\n }\n}\n\nexport const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, isWide, connectState }: Props) => {\n const showQRCode = selectedConnector?.hasConnectionUri();\n\n return (\n <div className={cs(\n 'flex flex-col items-center',\n isWide ? 'w-[450px] p-4 min-h-[472px]' : 'justify-center w-full min-h-[400px]'\n )}>\n {isWide && (\n <div className={'w-full'}>\n <div className={'flex items-center justify-between'}>\n <div/>\n <DialogClose\n className={'z-10 w-[30px] h-[30px] flex items-center justify-center cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200'}>\n <Close/>\n </DialogClose>\n </div>\n </div>\n )}\n\n <div className={cs(\n 'flex items-center gap-4 flex-col grow justify-center',\n selectedConnector && showQRCode ? 'max-w-[300px]' : 'max-w-[360px]'\n )}>\n {selectedConnector ?\n showQRCode ? (\n <div className={'flex flex-col items-center gap-2.5'}>\n <QRCode size={300} logoBackground={selectedConnector.icon} uri={qrCode}/>\n <div className={'text-base leading-base font-medium text-center text-modalTextSecondary'}>\n Scan the QR code with {selectedConnector.id === 'nova' ? 'the Nova' : 'your phone'}\n </div>\n\n <div className=\"min-h-[20px] flex items-center justify-center \">\n {selectedConnector.links?.browserExtension\n ? (\n <p\n onClick={() => window.open(selectedConnector.links.browserExtension)}\n className={'cursor-pointer text-sm text-accentColor font-medium text-center hover:text-modalText'}>\n Don't have {selectedConnector.name}?\n </p>\n )\n : qrCode\n ? <Copy className={'text-sm leading-sm font-medium text-accentColor'} copyText={qrCode} label={'Copy Link'} />\n : null}\n\n </div>\n\n\n </div>\n ) : (\n <>\n <div className={'w-[80px] h-[80px]'}>\n <img src={selectedConnector.icon} className={'w-full h-full'} alt=\"\"/>\n </div>\n <p className={'text-lg leading-lg text-modalFont font-bold'}>\n Opening {selectedConnector.name}...\n </p>\n <p className={'pb-[10px] text-base text-modalTextSecondary leading-base font-medium text-center'}>\n Confirm connection in the extension\n </p>\n {connectState.isConnecting && (\n <div className=\"loading text-modalText\"></div>\n )}\n {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && (\n <p\n onClick={() => window.open(selectedConnector.links.browserExtension)}\n className={'cursor-pointer pt-6 text-sm text-accentColor font-medium text-center hover:text-modalText'}>\n Don‘t have {selectedConnector.name}?\n </p>\n )}\n {!connectState.isConnecting && connectState.isError && selectedConnector.isInstalled() && (\n <button\n className={cs(\n 'rounded-connectButton focus:outline-none py-[4px] px-[12px] cursor-pointer font-semibold text-sm text-modalText bg-connectButtonBackground shadow-connectButton active:scale-[0.95]',\n transitionClassName\n )}\n onClick={() => onConnect(selectedConnector!)}>\n Retry\n </button>\n )}\n </>\n ) : (\n <>\n <div className={'w-[160px] h-[160px] mb-4'}>\n <SpiralAnimation/>\n </div>\n <p\n className={'cursor-pointer text-base leading-base text-accentColor font-semibold text-center'}\n onClick={() => window.open('https://polkadot.com/get-started/wallets/')}>\n New to wallets?\n </p>\n\n <p className={'text-modalTextSecondary w-[250px] text-sm leading-sm font-medium text-center'}>\n Connect your wallet to start exploring and interacting with DApps.\n </p>\n </>\n )}\n </div>\n\n <div/>\n </div>\n )\n})\n","import { Cuer } from 'cuer'\n\nexport type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high';\n\ninterface Props {\n ecc?: ErrorCorrectionLevel;\n logoBackground?: string;\n logoUrl?: string | (() => Promise<string>);\n logoSize?: number;\n size: number;\n uri?: string;\n}\n\nexport const QRCode = ({\n logoBackground,\n uri,\n size,\n}: Props) => {\n if (!uri) {\n const QR_GRID_SIZE = 57;\n const FINDER_SIZE_WITH_MARGIN = 8;\n const ARENA_GRID_SIZE = Math.floor(QR_GRID_SIZE / 4);\n \n const cellSize = size / QR_GRID_SIZE;\n const arenaSize = ARENA_GRID_SIZE * cellSize;\n const arenaStart = Math.ceil(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2);\n const arenaEnd = arenaStart + ARENA_GRID_SIZE;\n \n const generateSkeletonDots = () => {\n const dots = [];\n for (let i = 0; i < QR_GRID_SIZE; i++) {\n for (let j = 0; j < QR_GRID_SIZE; j++) {\n if (i >= arenaStart && i < arenaEnd && j >= arenaStart && j < arenaEnd) continue;\n\n const isInFinder = \n (i < FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN) ||\n (i < FINDER_SIZE_WITH_MARGIN && j >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN) ||\n (i >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN);\n if (isInFinder) continue;\n\n const cx = j + 0.5;\n const cy = i + 0.5;\n\n dots.push(\n <rect\n key={`${i}-${j}`}\n x={cx - 0.4}\n y={cy - 0.4}\n width={0.8}\n height={0.8}\n rx={0.4}\n fill=\"var(--color-walletSelectItemBackground)\"\n />\n );\n }\n }\n return dots;\n };\n\n const renderFinderPattern = ({ position }: { position: 'top-left' | 'top-right' | 'bottom-left' }) => {\n const finderSize = 7 * cellSize;\n const positionStyles = {\n 'top-left': { top: 0, left: 0 },\n 'top-right': { top: 0, right: 0 },\n 'bottom-left': { bottom: 0, left: 0 },\n };\n\n return (\n <div \n className=\"absolute z-[4]\"\n style={{ \n width: `${finderSize}px`, \n height: `${finderSize}px`,\n ...positionStyles[position]\n }}\n >\n <div \n className=\"absolute inset-0\"\n style={{ \n borderRadius: `${2 * cellSize}px`,\n border: `${cellSize}px solid var(--color-walletSelectItemBackground)`,\n }}\n />\n <div \n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\"\n style={{\n width: `${3 * cellSize}px`,\n height: `${3 * cellSize}px`,\n borderRadius: `${0.5 * cellSize}px`,\n backgroundColor: 'var(--color-walletSelectItemBackground)'\n }}\n />\n </div>\n );\n };\n\n const renderArenaLogo = () => {\n const logoStart = arenaStart * cellSize;\n \n return (\n <div \n className=\"absolute z-[4] flex items-center justify-center box-border\"\n style={{ \n width: `${arenaSize}px`,\n height: `${arenaSize}px`,\n left: `${logoStart}px`,\n top: `${logoStart}px`,\n borderRadius: `${cellSize}px`,\n padding: `${cellSize / 2}px`\n }}\n >\n <img\n src={logoBackground}\n alt=\"QR Code Logo\"\n className=\"h-full w-full object-cover\"\n style={{\n borderRadius: `${cellSize}px`\n }}\n />\n </div>\n );\n };\n \n return (\n <div \n className=\"relative overflow-hidden flex items-center justify-center\"\n style={{ \n width: size, \n height: size,\n borderRadius: `${2 * cellSize}px`\n }}\n >\n <svg \n className=\"absolute inset-0 z-[3]\"\n width={size}\n height={size}\n viewBox={`0 0 ${QR_GRID_SIZE} ${QR_GRID_SIZE}`}\n >\n {generateSkeletonDots()}\n </svg>\n \n <div \n className=\"absolute inset-0 z-[100]\"\n style={{\n background: 'linear-gradient(90deg, transparent 50%, var(--color-walletSelectItemBackgroundHover), transparent)',\n backgroundSize: '200% 100%',\n transform: 'scale(1.5) rotate(45deg)',\n animation: 'shimmer 1000ms linear infinite both'\n }}\n />\n \n {renderFinderPattern({ position: 'top-left' })}\n {renderFinderPattern({ position: 'top-right' })}\n {renderFinderPattern({ position: 'bottom-left' })}\n \n {logoBackground && renderArenaLogo()}\n </div>\n )\n }\n return (\n <Cuer arena={logoBackground} value={uri} />\n )\n}\n","import React from 'react';\nimport { useConnectButton, useWindowSize } from '../../hooks';\nimport { cs } from '../../utils';\nimport { ChainIcon } from '../ChainIcon'\nimport { formatAddress } from '@luno-kit/react/utils'\n\nexport const transitionClassName = 'transition-transform transition-[125] hover:scale-[1.03] transition-ease'\n\nexport interface ConnectButtonProps {\n className?: string;\n label?: string;\n accountStatus?: 'full' | 'address';\n chainStatus?: 'full' | 'icon' | 'name' | 'none';\n showBalance?: boolean;\n displayPreference?: 'address' | 'name'\n}\n\nexport const ConnectButton: React.FC<ConnectButtonProps> = ({\n className,\n label = 'Connect Wallet',\n accountStatus = 'full',\n chainStatus = 'full',\n showBalance = true,\n displayPreference = 'address',\n}) => {\n const {\n isConnected,\n isDisconnected,\n account,\n balance,\n openConnectModal,\n openAccountModal,\n openChainModal,\n chainIconUrl,\n chainName,\n currentChain,\n activeConnector,\n } = useConnectButton();\n const { width: windowWidth } = useWindowSize()\n\n const isLargeWindow = windowWidth && windowWidth > 768\n\n if (isDisconnected || !isConnected || !activeConnector) {\n return (\n <button\n type=\"button\"\n onClick={() => openConnectModal?.()}\n className={cs(\n 'cursor-pointer font-semibold inline-flex items-center justify-center focus:outline-none',\n 'text-connectButtonText bg-connectButtonBackground shadow-button active:scale-[0.95]',\n 'rounded-connectButton',\n transitionClassName,\n 'px-3.5 text-base leading-base min-h-[40px]',\n className\n )}\n >\n {label}\n </button>\n );\n }\n\n return (\n <div className={cs('text-modalText flex items-stretch bg-transparent font-semibold text-base leading-base gap-3', className)}>\n {chainStatus !== 'none' && (\n <button\n type=\"button\"\n onClick={() => openChainModal?.()}\n className={cs(\n 'flex items-center rounded-currentNetworkButton cursor-pointer',\n 'bg-currentNetworkButtonBackground shadow-button',\n 'py-2 px-2.5 gap-1.5',\n transitionClassName,\n )}\n aria-label=\"Switch chain\"\n >\n {(chainStatus === 'full' || chainStatus === 'icon')\n ? <ChainIcon chainIconUrl={chainIconUrl} chainName={chainName} className=\"w-[24px] h-[24px]\"/>\n : null}\n {(chainStatus === 'full' || chainStatus === 'name') && isLargeWindow && (\n <span>{currentChain?.name || 'Unknown Chain'}</span>\n )}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => openAccountModal?.()}\n className={cs(\n 'flex items-center cursor-pointer rounded-connectButton bg-connectButtonBackground shadow-button',\n transitionClassName,\n )}\n aria-label=\"Open account modal\"\n >\n\n {showBalance && isLargeWindow && (\n <div className=\"p-2 pl-3\">\n {balance ? (\n <span>\n {balance?.formattedTransferable || balance?.formattedTotal || 0} {currentChain?.nativeCurrency?.symbol || ''}\n </span>\n ) : (\n <span className=\"block animate-pulse rounded w-[80px] h-[20px] bg-accountActionItemBackgroundHover\" />\n )}\n </div>\n )}\n\n <div className={cs(\n \"flex items-center overflow-hidden bg-connectButtonInnerBackground border-2 border-connectButtonBackground rounded-connectButton gap-1.5 max-h-[40px]\",\n showBalance && isLargeWindow ? 'bg-connectButtonInnerBackground py-1.5 px-2' : 'bg-connectButtonBackground py-2 px-2.5'\n )}>\n {accountStatus === 'full' && (\n <span className=\"w-[24px] h-[24px] flex items-center justify-center\">\n <img src={activeConnector.icon} alt=\"luno\" />\n </span>\n )}\n <span\n aria-label=\"Wallet icon placeholder\"\n className={cs((displayPreference === 'name' && account?.name) ? 'text-ellipsis overflow-hidden max-w-[100px] whitespace-nowrap' : '')}>\n {displayPreference === 'name' && account?.name ? account?.name : formatAddress(account?.address)}\n </span>\n </div>\n </button>\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport {cs} from '../../utils'\n\nexport interface SpiralAnimationProps {\n size?: number;\n dotCount?: number;\n duration?: number;\n className?: string;\n}\n\nexport const SpiralAnimation: React.FC<SpiralAnimationProps> = ({\n size = 160,\n dotCount = 300,\n duration = 3,\n className = ''\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n const DOT_RADIUS = 1;\n const MARGIN = 2;\n const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n const CENTER = size / 2;\n const MAX_RADIUS = CENTER - MARGIN - DOT_RADIUS;\n const svgNS = \"http://www.w3.org/2000/svg\";\n\n containerRef.current.innerHTML = '';\n\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", size.toString());\n svg.setAttribute(\"height\", size.toString());\n svg.setAttribute(\"viewBox\", `0 0 ${size} ${size}`);\n svg.style.display = 'block';\n\n containerRef.current.appendChild(svg);\n\n for (let i = 0; i < dotCount; i++) {\n const idx = i + 0.5;\n const frac = idx / dotCount;\n const r = Math.sqrt(frac) * MAX_RADIUS;\n const theta = idx * GOLDEN_ANGLE;\n const x = CENTER + r * Math.cos(theta);\n const y = CENTER + r * Math.sin(theta);\n\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"cx\", x.toString());\n circle.setAttribute(\"cy\", y.toString());\n circle.setAttribute(\"r\", DOT_RADIUS.toString());\n circle.setAttribute(\"fill\", \"currentColor\");\n circle.setAttribute(\"opacity\", \"0.6\");\n svg.appendChild(circle);\n\n const animR = document.createElementNS(svgNS, \"animate\");\n animR.setAttribute(\"attributeName\", \"r\");\n animR.setAttribute(\n \"values\",\n `${DOT_RADIUS * 0.5};${DOT_RADIUS * 1.8};${DOT_RADIUS * 0.5}`\n );\n animR.setAttribute(\"dur\", `${duration}s`);\n animR.setAttribute(\"begin\", `${frac * duration}s`);\n animR.setAttribute(\"repeatCount\", \"indefinite\");\n animR.setAttribute(\"calcMode\", \"spline\");\n animR.setAttribute(\"keySplines\", \"0.4 0 0.6 1;0.4 0 0.6 1\");\n circle.appendChild(animR);\n\n const animO = document.createElementNS(svgNS, \"animate\");\n animO.setAttribute(\"attributeName\", \"opacity\");\n animO.setAttribute(\"values\", \"0.2;1;0.2\");\n animO.setAttribute(\"dur\", `${duration}s`);\n animO.setAttribute(\"begin\", `${frac * duration}s`);\n animO.setAttribute(\"repeatCount\", \"indefinite\");\n animO.setAttribute(\"calcMode\", \"spline\");\n animO.setAttribute(\"keySplines\", \"0.4 0 0.6 1;0.4 0 0.6 1\");\n circle.appendChild(animO);\n }\n }, [size, dotCount, duration]);\n\n return (\n <div\n ref={containerRef}\n className={cs('text-accentColor inline-flex w-full h-full justify-center align-center', className)}\n />\n );\n};\n","import React, {useMemo} from 'react'\nimport { useConnectors } from '@luno-kit/react'\nimport { isMobileDevice } from '@luno-kit/react/utils'\nimport type { Connector } from '@luno-kit/react/types'\nimport { cs } from '../../utils'\n\ninterface Props {\n onConnect: (connector: Connector) => Promise<void>\n}\n\nconst popularConnectorIds = ['polkadot-js', 'subwallet-js', 'talisman', 'walletconnect', 'nova', 'nova-mobile']\n\nconst moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt']\n\nexport const ConnectOptions = React.memo(({ onConnect }: Props) => {\n const connectors = useConnectors();\n\n if (isMobileDevice()) {\n const filteredConnectors = connectors.filter(i => i.links.deepLink)\n\n return (\n <div className={'flex flex-col items-start gap-1 w-full'}>\n {filteredConnectors.map(i => (\n <ConnectorItem key={`${i.id}-${i.name}`} connector={i} onConnect={() => onConnect(i)}/>\n ))}\n </div>\n )\n }\n\n const installedConnectors = connectors.filter(c => c.isInstalled())\n const popularConnectors = connectors.filter(c => popularConnectorIds.includes(c.id) && !c.isInstalled())\n const moreConnectors = connectors.filter(c => moreConnectorIds.includes(c.id) && !c.isInstalled())\n\n const connectorGroup: { title: string; group: Connector[] }[] = useMemo(() => {\n return [\n {\n title: 'Installed',\n group: installedConnectors,\n },\n {\n title: 'Popular',\n group: popularConnectors,\n },\n {\n title: 'More',\n group: moreConnectors,\n }\n ]\n }, [installedConnectors, popularConnectors, moreConnectors])\n\n return (\n <div className={'flex flex-col items-start gap-4 w-full overflow-y-auto custom-scrollbar max-h-[400px]'}>\n {connectorGroup.map(g => {\n if (g.group.length === 0) return null\n return (\n <div key={g.title} className={'flex flex-col items-start gap-2 w-full'}>\n <div className={cs(\n 'text-sm font-semibold leading-base',\n g.title === 'Installed' ? 'text-accentColor' : 'text-modalTextSecondary'\n )}>\n {g.title}\n </div>\n <div className={'flex flex-col items-start gap-1.5 w-full'}>\n {g.group.map(i => (\n <ConnectorItem key={i.id} connector={i} onConnect={() => onConnect(i)}/>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n )\n})\n\ninterface ConnectorItemProps {\n connector: Connector;\n onConnect: () => void;\n}\n\nconst ConnectorItem: React.FC<ConnectorItemProps> = React.memo(({connector, onConnect}) => {\n return (\n <button\n onClick={onConnect}\n className={cs(\n 'cursor-pointer bg-walletSelectItemBackground p-2 w-full flex items-center gap-3 rounded-walletSelectItem border-none',\n 'hover:bg-walletSelectItemBackgroundHover transition-transform active:scale-[0.95]',\n 'text-left'\n )}\n >\n <div className={'w-[28px] h-[28px] rounded-[6px] overflow-hidden'}>\n <img\n src={connector.icon}\n alt={connector.name}\n className=\"w-full h-full\"\n />\n </div>\n\n <span className=\"font-semibold leading-base text-base text-modalText\">{connector.name}</span>\n </button>\n );\n});\n"],"mappings":"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","names":["useCallback","useMemo","useAccount","useActiveConnector","React","DialogPrimitive","clsx","extendTailwindMerge","customTwMerge","cs","inputs","debounce","fn","ms","timer","jsx","jsxs","DialogRoot","open","onOpenChange","children","contentClassName","overlayClassName","React","cs","DialogTitleWrapper","className","DialogCloseWrapper","onClick","Dialog","DialogClose","DialogTitle","useState","LunoProvider","QueryClient","QueryClientProvider","createContext","useCallback","useContext","useEffect","useMemo","useState","ConnectionStatus","useStatus","jsx","useModalVisibility","isOpen","setIsOpen","open","close","ModalContext","ModalProvider","children","isConnectModalOpen","openConnectModal","closeConnectModal","isAccountModalOpen","openAccountModal","closeAccountModal","isChainModalOpen","openChainModal","closeChainModal","connectionStatus","closeAllModals","contextValue","useConnectModal","context","useAccountModal","useChainModal","useCloseAllModals","createContext","useState","useContext","useMemo","useCallback","useEffect","useEffect","ALL_THEME_VARS","useCSSVariableInjection","themeInfo","themeMode","root","key","value","varName","jsx","THEME_STORAGE_KEY","saveThemePreference","preference","ThemeContext","createContext","isCompleteTheme","theme","useSystemTheme","systemTheme","setSystemTheme","useState","useEffect","mediaQuery","updateTheme","e","ThemeProvider","children","themeOverrides","themeMode","setThemeMode","saved","isAutoMode","setIsAutoMode","themeInfo","useMemo","overrides","partialOverrides","currentTheme","useCSSVariableInjection","setThemeChoice","useCallback","choice","isAuto","contextValue","useLunoTheme","context","useContext","Fragment","jsx","jsxs","LunoKitProvider","children","config","queryClientConfig","theme","queryClient","useState","QueryClient","QueryClientProvider","LunoProvider","ThemeProvider","ModalProvider","RenderModals","modalSize","ConnectModal","AccountDetailsModal","ChainModal","jsx","SvgArrow","props","Arrow_default","jsx","SvgBack","props","Back_default","jsx","SvgClose","props","Close_default","jsx","SvgCopy","props","Copy_default","jsx","SvgDisconnect","props","Disconnect_default","jsx","SvgList","props","List_default","jsx","SvgSuccess","props","Success_default","jsx","SvgSwitch","props","Switch_default","useMemo","jsx","ChainIcon","chainIconUrl","chainName","className","cs","useAccount","useBalance","useChain","useDisconnect","getExplorerUrl","Fragment","jsx","jsxs","MainView","onViewChange","onModalClose","address","chain","disconnectAsync","balance","items","useMemo","ChainIcon","Arrow_default","List_default","Switch_default","handleDisconnect","i","SelectItem","Disconnect_default","children","onClick","cs","React","useCallback","useAccount","useAccounts","useActiveConnector","useBalance","useChain","formatAddress","jsx","jsxs","SwitchAccountView","onBack","accounts","selectAccount","useAccounts","currentAddress","useAccount","_selectAccount","useCallback","acc","AccountItem","React","isSelected","account","chain","useChain","address","balance","useBalance","connector","useActiveConnector","cs","React","useMemo","useState","useApi","useChain","useChains","useSwitchChain","jsx","SvgArrow","props","Search_default","Fragment","jsx","jsxs","ChainList","onChainSwitched","className","currentChain","useChain","chains","useChains","switchChainAsync","useSwitchChain","isApiReady","apiError","useApi","switchingChain","setSwitchingChain","useState","searchQuery","setSearchQuery","filteredChains","useMemo","chain","handleChainSelect","error","cs","Search_default","e","ChainItem","React","isSelected","isLoading","onSelect","isSwitching","ChainIcon","jsx","SwitchChainView","onBack","ChainList","useCallback","useState","jsx","jsxs","Copy","copyText","label","className","isCopied","setIsCopied","useState","copyToClipboard","useCallback","text","err","cs","Success_default","Copy_default","formatAddress","useCallback","useState","useRef","useAnimatedViews","initialView","animationDuration","animationEasing","currentView","setCurrentView","isAnimating","setIsAnimating","containerRef","currentViewRef","handleViewChange","view","container","currentHeight","newHeight","resetView","Fragment","jsx","jsxs","AccountDetailsModal","isOpen","close","useAccountModal","address","account","useAccount","activeConnector","useActiveConnector","currentView","containerRef","currentViewRef","handleViewChange","resetView","useAnimatedViews","handleModalClose","useCallback","viewTitle","useMemo","SwitchChainView","viewComponents","jsx","MainView","SwitchAccountView","Dialog","jsxs","cs","DialogTitle","formatAddress","Copy","Fragment","Back_default","DialogClose","Close_default","jsx","jsxs","ChainModal","isOpen","close","useChainModal","Dialog","open","DialogTitle","DialogClose","Close_default","ChainList","useEffect","useMemo","useState","useConnect","isMobileDevice","useStatus","useAccount","useChain","useBalance","ConnectionStatus","useChains","useActiveConnector","useConnectButton","connectionStatus","useStatus","account","address","useAccount","currentChain","useChain","configuredChains","useChains","balance","useBalance","activeConnector","useActiveConnector","openConnectModal","isConnectModalOpen","useConnectModal","openAccountModal","isAccountModalOpen","useAccountModal","openChainModal","isChainModalOpen","useChainModal","isConnecting","ConnectionStatus","isConnected","isDisconnected","isChainSupported","c","useEffect","useState","useWindowSize","windowSize","setWindowSize","useState","useEffect","handleResize","debounce","React","Cuer","jsx","jsxs","QRCode","logoBackground","uri","size","ARENA_GRID_SIZE","cellSize","arenaSize","arenaStart","arenaEnd","generateSkeletonDots","dots","i","j","cx","cy","renderFinderPattern","position","finderSize","positionStyles","renderArenaLogo","logoStart","formatAddress","jsx","jsxs","transitionClassName","ConnectButton","className","label","accountStatus","chainStatus","showBalance","displayPreference","isConnected","isDisconnected","account","balance","openConnectModal","openAccountModal","openChainModal","chainIconUrl","chainName","currentChain","activeConnector","useConnectButton","windowWidth","useWindowSize","isLargeWindow","cs","ChainIcon","useEffect","useRef","jsx","SpiralAnimation","size","dotCount","duration","className","containerRef","useRef","useEffect","DOT_RADIUS","MARGIN","GOLDEN_ANGLE","CENTER","MAX_RADIUS","svgNS","svg","i","idx","frac","r","theta","x","circle","animR","animO","cs","Fragment","jsx","jsxs","WalletView","React","selectedConnector","onConnect","qrCode","isWide","connectState","showQRCode","cs","DialogClose","Close_default","QRCode","Copy","transitionClassName","SpiralAnimation","React","useMemo","useConnectors","isMobileDevice","jsx","jsxs","popularConnectorIds","moreConnectorIds","ConnectOptions","React","onConnect","connectors","useConnectors","isMobileDevice","filteredConnectors","i","ConnectorItem","installedConnectors","c","popularConnectors","moreConnectors","connectorGroup","useMemo","g","cs","connector","Fragment","jsx","jsxs","ConnectModal","size","isOpen","close","useConnectModal","connectAsync","resetConnect","isConnecting","connectError","useConnect","selectedConnector","setSelectedConnector","useState","qrCode","setQrCode","windowWidth","useWindowSize","isLargeWindow","isWide","containerRef","currentViewRef","resetView","handleViewChange","currentView","useAnimatedViews","onQrCode","connector","uri","handleConnect","isMobileDevice","_onOpenChange","open","viewComponents","useMemo","jsx","ConnectOptions","WalletView","useEffect","Dialog","jsxs","cs","Fragment","DialogTitle","Back_default","DialogClose","Close_default"]}
1
+ {"version":3,"sources":["../src/components/AccountDetailsModal/index.tsx","../src/assets/icons/Arrow.tsx","../src/assets/icons/Back.tsx","../src/assets/icons/Close.tsx","../src/assets/icons/Copy.tsx","../src/assets/icons/Disconnect.tsx","../src/assets/icons/List.tsx","../src/assets/icons/Success.tsx","../src/assets/icons/Search.tsx","../src/assets/icons/Switch.tsx","../src/hooks/useAnimatedViews.ts","../src/theme/context.tsx","../src/hooks/useCSSVariableInjection.ts","../src/providers/LunoKitProvider.tsx","../src/providers/ModalContext.tsx","../src/utils/cs.ts","../src/utils/debounce.ts","../src/components/Copy/index.tsx","../src/components/Dialog/index.tsx","../src/components/AccountDetailsModal/MainView.tsx","../src/components/ChainIcon/index.tsx","../src/components/AccountDetailsModal/SwitchAccountView.tsx","../src/components/ChainList/index.tsx","../src/components/AccountDetailsModal/SwitchChainView.tsx","../src/components/ChainModal/index.tsx","../src/components/ConnectButton/index.tsx","../src/hooks/useConnectButton.ts","../src/hooks/useWindowSize.ts","../src/components/ConnectModal/index.tsx","../src/components/ConnectModal/ConnectOptions.tsx","../src/components/ConnectModal/WalletView.tsx","../src/components/QRCode/index.tsx","../src/components/SpiralAnimation/index.tsx"],"sourcesContent":["import { useAccount, useActiveConnector } from '@luno-kit/react';\nimport { formatAddress } from '@luno-kit/react/utils';\nimport type React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport { Back, Close } from '../../assets/icons';\nimport { useAnimatedViews } from '../../hooks/useAnimatedViews';\nimport { useAccountModal } from '../../providers';\nimport { cs } from '../../utils';\nimport { Copy } from '../Copy';\nimport { Dialog, DialogClose, DialogTitle } from '../Dialog';\nimport { MainView } from './MainView';\nimport { SwitchAccountView } from './SwitchAccountView';\nimport { SwitchChainView } from './SwitchChainView';\n\nexport enum AccountModalView {\n main = 'main',\n switchAccount = 'switchAccount',\n switchChain = 'switchChain',\n}\n\nexport const AccountDetailsModal: React.FC = () => {\n const { isOpen, close } = useAccountModal();\n const { address, account } = useAccount();\n const activeConnector = useActiveConnector();\n\n const { currentView, containerRef, currentViewRef, handleViewChange, resetView } =\n useAnimatedViews({ initialView: AccountModalView.main });\n\n const handleModalClose = useCallback(() => {\n close();\n resetView();\n }, [close]);\n\n const viewTitle = useMemo(() => {\n if (currentView === AccountModalView.switchAccount) return 'Switch Account';\n if (currentView === AccountModalView.switchChain) return SwitchChainView.title;\n return null;\n }, [currentView]);\n\n const viewComponents = useMemo(\n () => ({\n [AccountModalView.main]: (\n <MainView onViewChange={handleViewChange} onModalClose={handleModalClose} />\n ),\n [AccountModalView.switchAccount]: (\n <SwitchAccountView onBack={() => handleViewChange(AccountModalView.main)} />\n ),\n [AccountModalView.switchChain]: (\n <SwitchChainView onBack={() => handleViewChange(AccountModalView.main)} />\n ),\n }),\n [handleViewChange, handleModalClose]\n );\n\n return (\n <Dialog open={isOpen} onOpenChange={handleModalClose}>\n <div\n className={cs(\n 'flex flex-col w-full md:w-[360px] max-h-[512px] text-modalText',\n 'bg-modalBackground shadow-modal',\n currentView === AccountModalView.main ? 'gap-5' : 'gap-3.5'\n )}\n >\n <div className=\"flex items-stretch justify-between w-full px-4 pt-4\">\n {currentView === AccountModalView.main ? (\n <div className={'flex items-center gap-3 max-w-[80%]'}>\n {activeConnector?.icon && (\n <div className={'flex items-center justify-center w-[40px] h-[40px] shrink-0'}>\n <img src={activeConnector.icon} alt=\"\" className=\"w-full h-full object-contain\" />\n </div>\n )}\n <div className=\"flex flex-col items-start gap-1.5 max-w-full\">\n <DialogTitle className={'sr-only'}>Account Details</DialogTitle>\n <div className=\"flex items-center gap-0.5 w-full \">\n <span className=\"text-base text-modalText font-semibold\">\n {formatAddress(address)}\n </span>\n <Copy copyText={address} />\n </div>\n <div\n className={cs(\n 'text-sm leading-sm text-modalTextSecondary font-medium text-ellipsis overflow-hidden whitespace-nowrap',\n account?.name && account?.name.length > 30 ? 'w-[90%]' : ''\n )}\n >\n {account?.name || activeConnector?.name}\n </div>\n </div>\n </div>\n ) : (\n <>\n <button\n className=\"flex items-center justify-center w-[30px] h-[30px] cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200\"\n onClick={() => handleViewChange(AccountModalView.main)}\n aria-label=\"Back\"\n >\n <Back />\n </button>\n <DialogTitle className=\"text-lg leading-lg text-modalText font-semibold transition-opacity duration-300\">\n {viewTitle}\n </DialogTitle>\n </>\n )}\n\n <DialogClose className=\"shrink-0 z-10 flex items-center justify-center h-[30px] w-[30px] rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200 cursor-pointer\">\n <Close />\n </DialogClose>\n </div>\n\n <div ref={containerRef} className=\"relative\">\n <div ref={currentViewRef}>{viewComponents[currentView]}</div>\n </div>\n </div>\n </Dialog>\n );\n};\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgArrow = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"arrow_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z\"></path>\n </svg>\n);\nexport default SvgArrow;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgBack = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z\"></path>\n </svg>\n);\nexport default SvgBack;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgClose = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z\"></path>\n </svg>\n);\nexport default SvgClose;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgCopy = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"copy_svg__icon\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n {...props}\n >\n <path d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"></path>\n </svg>\n);\nexport default SvgCopy;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgDisconnect = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n {...props}\n >\n <path d=\"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z\"></path>\n </svg>\n);\nexport default SvgDisconnect;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgList = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"list_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M232,48V88a8,8,0,0,1-16,0V56H184a8,8,0,0,1,0-16h40A8,8,0,0,1,232,48ZM72,200H40V168a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16Zm152-40a8,8,0,0,0-8,8v32H184a8,8,0,0,0,0,16h40a8,8,0,0,0,8-8V168A8,8,0,0,0,224,160ZM32,96a8,8,0,0,0,8-8V56H72a8,8,0,0,0,0-16H32a8,8,0,0,0-8,8V88A8,8,0,0,0,32,96ZM188,167l-56,32a8,8,0,0,1-7.94,0L68,167A8,8,0,0,1,64,160V96a8,8,0,0,1,4-7l56-32a8,8,0,0,1,7.94,0l56,32a8,8,0,0,1,4,7v64A8,8,0,0,1,188,167ZM88.12,96,128,118.79,167.88,96,128,73.21ZM80,155.36l40,22.85V132.64L80,109.79Zm96,0V109.79l-40,22.85v45.57Z\"></path>\n </svg>\n);\nexport default SvgList;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgSuccess = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"success_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"></path>\n </svg>\n);\nexport default SvgSuccess;\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nconst SvgArrow = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"search_svg__icon\"\n viewBox=\"0 0 256 256\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M232.49,215.51,185,168a92.12,92.12,0,1,0-17,17l47.53,47.54a12,12,0,0,0,17-17ZM44,112a68,68,0,1,1,68,68A68.07,68.07,0,0,1,44,112Z\"></path>\n {/* <path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path> */}\n </svg>\n);\nexport default SvgArrow;\n","import type { SVGProps } from 'react';\nimport * as React from 'react';\n\nconst SvgSwitch = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n className=\"switch_svg__icon\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M253.66,133.66l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L216,132.69V128A88,88,0,0,0,56.49,76.67a8,8,0,0,1-13-9.34A104,104,0,0,1,232,128v4.69l10.34-10.35a8,8,0,0,1,11.32,11.32Zm-41.18,55A104,104,0,0,1,24,128v-4.69L13.66,133.66A8,8,0,0,1,2.34,122.34l24-24a8,8,0,0,1,11.32,0l24,24a8,8,0,0,1-11.32,11.32L40,123.31V128a87.62,87.62,0,0,0,22.24,58.41A79.66,79.66,0,0,1,98.3,157.66a48,48,0,1,1,59.4,0,79.59,79.59,0,0,1,36.08,28.78,89.68,89.68,0,0,0,5.71-7.11,8,8,0,0,1,13,9.34ZM128,152a32,32,0,1,0-32-32A32,32,0,0,0,128,152Zm0,64a88.2,88.2,0,0,0,53.92-18.49,64,64,0,0,0-107.84,0A87.57,87.57,0,0,0,128,216Z\"></path>\n </svg>\n);\nexport default SvgSwitch;\n","import type React from 'react';\nimport { useCallback, useRef, useState } from 'react';\n\ninterface UseAnimatedViewsProps<T> {\n initialView: T;\n animationDuration?: number;\n animationEasing?: string;\n}\n\ninterface UseAnimatedViewsReturn<T> {\n currentView: T;\n isAnimating: boolean;\n containerRef: React.RefObject<HTMLDivElement>;\n currentViewRef: React.RefObject<HTMLDivElement>;\n handleViewChange: (view: T) => void;\n resetView: () => void;\n}\n\nexport function useAnimatedViews<T>({\n initialView,\n animationDuration = 200,\n animationEasing = 'ease-out',\n}: UseAnimatedViewsProps<T>): UseAnimatedViewsReturn<T> {\n const [currentView, setCurrentView] = useState<T>(initialView);\n const [isAnimating, setIsAnimating] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const currentViewRef = useRef<HTMLDivElement>(null);\n\n const handleViewChange = useCallback(\n (view: T) => {\n if (view === currentView || isAnimating) return;\n\n setIsAnimating(true);\n\n if (!containerRef.current) {\n setCurrentView(view);\n setIsAnimating(false);\n return;\n }\n\n const container = containerRef.current;\n const currentHeight = container.offsetHeight;\n\n setCurrentView(view);\n\n requestAnimationFrame(() => {\n if (!container || !currentViewRef.current) {\n setIsAnimating(false);\n return;\n }\n\n const newHeight = currentViewRef.current.offsetHeight;\n\n container\n .animate([{ height: currentHeight + 'px' }, { height: newHeight + 'px' }], {\n duration: animationDuration,\n easing: animationEasing,\n fill: 'forwards',\n })\n .addEventListener('finish', () => {\n setIsAnimating(false);\n });\n });\n },\n [currentView, isAnimating, animationDuration, animationEasing]\n );\n\n const resetView = useCallback(() => {\n setCurrentView(initialView);\n setIsAnimating(false);\n }, [initialView]);\n\n return {\n currentView,\n isAnimating,\n containerRef,\n currentViewRef,\n handleViewChange,\n resetView,\n };\n}\n","import type React from 'react';\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useCSSVariableInjection } from '../hooks/useCSSVariableInjection';\nimport type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types';\n\n// Theme preference storage\ninterface ThemePreference {\n isAuto: boolean;\n preferredTheme?: ThemeMode;\n}\n\nconst THEME_STORAGE_KEY = 'luno.lastThemePreference';\n\nconst saveThemePreference = (preference: ThemePreference) => {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, JSON.stringify(preference));\n } catch (e) {}\n};\n\ninterface ThemeContextValue {\n themeMode: ThemeMode;\n setThemeChoice: (choice: 'light' | 'dark' | 'auto') => void; // User explicit choice\n currentTheme: LunokitTheme | null; // null for default themes\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: ReactNode;\n theme?: PartialLunokitTheme | LunokitThemeOverrides;\n}\n\n// Helper function to check if theme is complete or partial\nconst isCompleteTheme = (\n theme: PartialLunokitTheme | LunokitThemeOverrides\n): theme is LunokitTheme => {\n return (\n 'colors' in theme &&\n 'fonts' in theme &&\n 'radii' in theme &&\n 'shadows' in theme &&\n 'blurs' in theme\n );\n};\n\n// Hook to detect system theme\nconst useSystemTheme = () => {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateTheme = (e: MediaQueryListEvent | MediaQueryList) => {\n setSystemTheme(e.matches ? 'dark' : 'light');\n };\n\n updateTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateTheme);\n\n return () => mediaQuery.removeEventListener('change', updateTheme);\n }, []);\n\n return systemTheme;\n};\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: themeOverrides,\n}) => {\n const systemTheme = useSystemTheme();\n\n const [themeMode, setThemeMode] = useState<ThemeMode>(() => {\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(THEME_STORAGE_KEY);\n if (saved) {\n const preference = JSON.parse(saved);\n if (preference?.isAuto) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n } else if (preference?.preferredTheme) {\n return preference.preferredTheme;\n }\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n if (!themeOverrides || isCompleteTheme(themeOverrides)) {\n return 'light';\n }\n\n const overrides = themeOverrides as LunokitThemeOverrides;\n return overrides.defaultMode || 'light';\n });\n\n const [isAutoMode, setIsAutoMode] = useState<boolean>(() => {\n if (typeof window !== 'undefined') {\n try {\n const saved = localStorage.getItem(THEME_STORAGE_KEY);\n if (saved) {\n const preference = JSON.parse(saved);\n return preference?.isAuto ?? false;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n }\n\n if (!themeOverrides || isCompleteTheme(themeOverrides)) {\n return false;\n }\n\n const overrides = themeOverrides as LunokitThemeOverrides;\n return overrides.autoMode ?? false;\n });\n\n // Determine theme type and get relevant data\n const themeInfo = useMemo(() => {\n if (!themeOverrides) {\n return { type: 'default' as const, completeTheme: null, partialOverrides: null };\n }\n\n // Handle complete custom theme\n if (isCompleteTheme(themeOverrides)) {\n return { type: 'complete' as const, completeTheme: themeOverrides, partialOverrides: null };\n }\n\n // Handle theme overrides format\n const overrides = themeOverrides as LunokitThemeOverrides;\n\n // Apply complete theme override (highest priority)\n if (overrides.theme) {\n return { type: 'complete' as const, completeTheme: overrides.theme, partialOverrides: null };\n }\n\n // For partial overrides, get the current mode's overrides\n let partialOverrides: PartialLunokitTheme | null = null;\n if (themeMode === 'light' && overrides.light) {\n partialOverrides = overrides.light;\n } else if (themeMode === 'dark' && overrides.dark) {\n partialOverrides = overrides.dark;\n } else {\n partialOverrides = { ...(overrides as PartialLunokitTheme) };\n }\n\n return { type: 'partial' as const, completeTheme: null, partialOverrides };\n }, [themeMode, themeOverrides]);\n\n // Build current theme for context (only for complete themes)\n const currentTheme = useMemo(() => {\n return themeInfo.type === 'complete' ? themeInfo.completeTheme : null;\n }, [themeInfo]);\n\n // Inject CSS variables to DOM\n useCSSVariableInjection(themeInfo, themeMode);\n\n // User explicit choice handler (saves to storage)\n const setThemeChoice = useCallback(\n (choice: 'light' | 'dark' | 'auto') => {\n const isAuto = choice === 'auto';\n setIsAutoMode(isAuto);\n\n if (isAuto) {\n setThemeMode(systemTheme || 'light');\n } else {\n setThemeMode(choice);\n }\n\n const preference: ThemePreference = {\n isAuto,\n ...(isAuto ? {} : { preferredTheme: choice }),\n };\n\n saveThemePreference(preference);\n },\n [systemTheme]\n );\n\n // Only listen to system theme changes for auto mode\n useEffect(() => {\n if (isAutoMode) {\n setThemeMode(systemTheme || 'light');\n }\n }, [systemTheme, isAutoMode]);\n\n const contextValue = useMemo(\n () => ({\n themeMode,\n setThemeChoice,\n currentTheme,\n }),\n [themeMode, setThemeChoice, currentTheme]\n );\n\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;\n};\n\nexport const useLunoTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\n 'useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)'\n );\n }\n return context;\n};\n","import { useEffect } from 'react';\nimport type { LunokitTheme, PartialLunokitTheme, ThemeMode } from '../theme/types';\n\n// All theme variable names for cleanup\nconst ALL_THEME_VARS = [\n '--color-accentColor',\n '--color-walletSelectItemBackground',\n '--color-walletSelectItemBackgroundHover',\n '--color-walletSelectItemText',\n '--color-connectButtonBackground',\n '--color-connectButtonInnerBackground',\n '--color-connectButtonText',\n '--color-accountActionItemBackground',\n '--color-accountActionItemBackgroundHover',\n '--color-accountActionItemText',\n '--color-accountSelectItemBackground',\n '--color-accountSelectItemBackgroundHover',\n '--color-accountSelectItemText',\n '--color-currentNetworkButtonBackground',\n '--color-currentNetworkButtonText',\n '--color-networkSelectItemBackground',\n '--color-networkSelectItemBackgroundHover',\n '--color-networkSelectItemText',\n '--color-navigationButtonBackground',\n '--color-separatorLine',\n '--color-modalBackground',\n '--color-modalBackdrop',\n '--color-modalBorder',\n '--color-modalText',\n '--color-modalTextSecondary',\n '--color-modalControlButtonBackgroundHover',\n '--color-modalControlButtonText',\n '--color-success',\n '--color-successForeground',\n '--color-warning',\n '--color-warningForeground',\n '--color-error',\n '--color-errorForeground',\n '--color-info',\n '--color-infoForeground',\n '--color-skeleton',\n '--font-body',\n '--radius-walletSelectItem',\n '--radius-connectButton',\n '--radius-modalControlButton',\n '--radius-accountActionItem',\n '--radius-accountSelectItem',\n '--radius-currentNetworkButton',\n '--radius-networkSelectItem',\n '--radius-modal',\n '--radius-modalMobile',\n '--shadow-button',\n '--shadow-modal',\n '--blur-modalOverlay',\n];\n\ninterface ThemeInfo {\n type: 'default' | 'complete' | 'partial';\n completeTheme: LunokitTheme | null;\n partialOverrides: PartialLunokitTheme | null;\n}\n\nexport const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMode) => {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n\n if (themeInfo.type === 'complete' && themeInfo.completeTheme) {\n // Complete custom theme: inject all variables and remove data-theme\n Object.entries(themeInfo.completeTheme.colors).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--color-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.fonts).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--font-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.radii).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--radius-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.shadows).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--shadow-${key}`, value);\n }\n });\n\n Object.entries(themeInfo.completeTheme.blurs).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--blur-${key}`, value);\n }\n });\n\n // Remove data-theme attribute for complete custom themes\n root.removeAttribute('data-theme');\n } else if (themeInfo.type === 'partial' && themeInfo.partialOverrides) {\n // Partial override: KEEP data-theme and inject only overridden variables\n root.setAttribute('data-theme', themeMode);\n\n // Only clear and inject if there are actual overrides\n const hasOverrides = Object.keys(themeInfo.partialOverrides).length > 0;\n if (hasOverrides) {\n // Clear all custom variables first\n ALL_THEME_VARS.forEach((varName) => {\n root.style.removeProperty(varName);\n });\n\n // Inject only the overridden variables\n if (themeInfo.partialOverrides.colors) {\n Object.entries(themeInfo.partialOverrides.colors).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--color-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.fonts) {\n Object.entries(themeInfo.partialOverrides.fonts).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--font-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.radii) {\n Object.entries(themeInfo.partialOverrides.radii).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--radius-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.shadows) {\n Object.entries(themeInfo.partialOverrides.shadows).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--shadow-${key}`, value);\n }\n });\n }\n\n if (themeInfo.partialOverrides.blurs) {\n Object.entries(themeInfo.partialOverrides.blurs).forEach(([key, value]) => {\n if (value) {\n root.style.setProperty(`--blur-${key}`, value);\n }\n });\n }\n }\n } else {\n // Default theme: just set data-theme and clear custom variables\n root.setAttribute('data-theme', themeMode);\n\n // Clear any previously injected custom variables\n ALL_THEME_VARS.forEach((varName) => {\n root.style.removeProperty(varName);\n });\n }\n }, [themeInfo, themeMode]);\n};\n","import { LunoProvider } from '@luno-kit/react';\nimport type { Config as LunoCoreConfig } from '@luno-kit/react/types';\n// @ts-ignore - @tanstack/react-query v5 API changes\nimport { QueryClient, type QueryClientConfig, QueryClientProvider } from '@tanstack/react-query';\nimport type React from 'react';\nimport { type ReactNode, useState } from 'react';\nimport { AccountDetailsModal, ChainModal, ConnectModal } from '../components';\nimport type { ModalSize } from '../components/Dialog';\nimport type { LunokitThemeOverrides, PartialLunokitTheme } from '../theme';\nimport { ThemeProvider } from '../theme';\nimport { ModalProvider } from './ModalContext';\n\nexport interface LunoKitProviderProps {\n children: ReactNode;\n config: LunoCoreConfig & { modalSize?: ModalSize };\n queryClientConfig?: QueryClientConfig;\n theme?: PartialLunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides\n}\n\nexport const LunoKitProvider: React.FC<LunoKitProviderProps> = ({\n children,\n config,\n queryClientConfig,\n theme,\n}) => {\n const [queryClient] = useState(() => new QueryClient(queryClientConfig));\n\n return (\n <QueryClientProvider client={queryClient}>\n <LunoProvider config={config}>\n <ThemeProvider theme={theme}>\n <ModalProvider>\n <div className={'font-base luno-kit'}>{children}</div>\n <RenderModals modalSize={config.modalSize} />\n </ModalProvider>\n </ThemeProvider>\n </LunoProvider>\n </QueryClientProvider>\n );\n};\n\nconst RenderModals: React.FC<{ modalSize?: ModalSize }> = ({\n modalSize,\n}: {\n modalSize?: ModalSize;\n}) => {\n return (\n <>\n <ConnectModal size={modalSize} />\n <AccountDetailsModal />\n <ChainModal />\n </>\n );\n};\n","import { ConnectionStatus, useStatus } from '@luno-kit/react';\nimport React, {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nfunction useModalVisibility() {\n const [isOpen, setIsOpen] = useState(false);\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n return { isOpen, open, close };\n}\n\ninterface ModalContextValue {\n isConnectModalOpen: boolean;\n openConnectModal?: () => void;\n closeConnectModal: () => void;\n\n isAccountModalOpen: boolean;\n openAccountModal?: () => void;\n closeAccountModal: () => void;\n\n isChainModalOpen: boolean;\n openChainModal?: () => void;\n closeChainModal: () => void;\n\n closeAllModals: () => void;\n}\n\nconst ModalContext = createContext<ModalContextValue | undefined>(undefined);\n\ninterface ModalProviderProps {\n children: ReactNode;\n}\n\nexport const ModalProvider: React.FC<ModalProviderProps> = ({ children }) => {\n const {\n isOpen: isConnectModalOpen,\n open: openConnectModal,\n close: closeConnectModal,\n } = useModalVisibility();\n const {\n isOpen: isAccountModalOpen,\n open: openAccountModal,\n close: closeAccountModal,\n } = useModalVisibility();\n const {\n isOpen: isChainModalOpen,\n open: openChainModal,\n close: closeChainModal,\n } = useModalVisibility();\n\n const connectionStatus = useStatus();\n\n const closeAllModals = useCallback(() => {\n closeConnectModal();\n closeAccountModal();\n closeChainModal();\n }, [closeConnectModal, closeAccountModal, closeChainModal]);\n\n useEffect(() => {\n if (connectionStatus === ConnectionStatus.Disconnected) {\n closeAccountModal();\n closeChainModal();\n }\n }, [connectionStatus, closeAccountModal, closeChainModal]);\n\n const contextValue = useMemo(\n () => ({\n isConnectModalOpen,\n isAccountModalOpen,\n isChainModalOpen,\n openConnectModal:\n connectionStatus !== ConnectionStatus.Connected ? openConnectModal : undefined,\n closeConnectModal,\n openAccountModal:\n connectionStatus === ConnectionStatus.Connected ? openAccountModal : undefined,\n closeAccountModal,\n openChainModal: connectionStatus === ConnectionStatus.Connected ? openChainModal : undefined,\n closeChainModal,\n closeAllModals,\n }),\n [\n isConnectModalOpen,\n openConnectModal,\n closeConnectModal,\n isAccountModalOpen,\n openAccountModal,\n closeAccountModal,\n isChainModalOpen,\n openChainModal,\n closeChainModal,\n closeAllModals,\n connectionStatus,\n ]\n );\n\n return <ModalContext.Provider value={contextValue}>{children}</ModalContext.Provider>;\n};\n\nexport const useConnectModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context)\n throw new Error('[ModalContext]: useConnectModal must be used within a ModalProvider');\n\n return {\n isOpen: context.isConnectModalOpen,\n open: context.openConnectModal,\n close: context.closeConnectModal,\n };\n};\n\nexport const useAccountModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context)\n throw new Error('[ModalContext]: useAccountModal must be used within a ModalProvider');\n return {\n isOpen: context.isAccountModalOpen,\n open: context.openAccountModal,\n close: context.closeAccountModal,\n };\n};\n\nexport const useChainModal = (): { isOpen: boolean; open?: () => void; close: () => void } => {\n const context = useContext(ModalContext);\n if (!context)\n throw new Error('[ModalContext]: useChainModal must be used within a ModalProvider');\n return {\n isOpen: context.isChainModalOpen,\n open: context.openChainModal,\n close: context.closeChainModal,\n };\n};\n\nexport const useCloseAllModals = (): (() => void) => {\n const context = useContext(ModalContext);\n if (!context)\n throw new Error('[ModalContext]: useCloseAllModals must be used within a ModalProvider');\n return context.closeAllModals;\n};\n","import { type ClassValue, clsx } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\nconst customTwMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': ['text-xs', 'text-sm', 'text-base', 'text-lg'],\n },\n },\n});\n\nexport function cs(...inputs: ClassValue[]) {\n return customTwMerge(clsx(inputs));\n}\n","export function debounce(fn: () => void, ms: number) {\n let timer: NodeJS.Timeout | null;\n\n return () => {\n if (timer) {\n clearTimeout(timer as number);\n }\n\n timer = setTimeout(() => {\n timer = null;\n fn();\n }, ms);\n };\n}\n","import type React from 'react';\nimport { useCallback, useState } from 'react';\nimport { Copy as CopyIcon, Success } from '../../assets/icons';\nimport { cs } from '../../utils';\n\ninterface CopyProps {\n copyText?: string;\n label?: string;\n className?: string;\n}\n\nexport const Copy: React.FC<CopyProps> = ({ copyText, label, className = '' }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const copyToClipboard = useCallback(async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n return true;\n }\n return false;\n } catch (err) {\n console.error('Copy failed:', err);\n return false;\n }\n }, []);\n\n return (\n <button\n type=\"button\"\n className={cs(\n 'cursor-pointer bg-transparent border-none p-1 m-0 inline-flex items-center justify-center gap-1',\n 'rounded-modalControlButton hover:bg-modalControlButtonBackgroundHover transition-colors duration-200',\n className\n )}\n onClick={() => !isCopied && copyText && copyToClipboard(copyText)}\n aria-label=\"Copy address to clipboard\"\n disabled={isCopied}\n >\n {isCopied ? (\n <Success className=\"text-accentColor\" width={16} height={16} />\n ) : (\n <CopyIcon width={16} height={16} />\n )}\n {label}\n </button>\n );\n};\n","// packages/ui/src/components/Dialog/index.tsx\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport React, { type ReactNode } from 'react';\nimport { cs } from '../../utils';\n\nexport type ModalSize = 'compact' | 'wide';\n\ninterface DialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n contentClassName?: string;\n overlayClassName?: string;\n}\n\ninterface DialogTitleProps {\n children: ReactNode;\n className?: string;\n}\n\ninterface DialogCloseProps {\n children: ReactNode;\n className?: string;\n onClick?: () => void;\n}\n\nconst DialogRoot: React.FC<DialogProps> = ({\n open,\n onOpenChange,\n children,\n contentClassName,\n overlayClassName,\n}) => {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n {React.createElement(DialogPrimitive.Overlay as any, {\n className: cs(\n 'fixed inset-0 z-[100] bg-modalBackdrop luno-kit',\n 'data-[state=open]:[animation:overlay-in_150ms_ease-out]',\n overlayClassName\n ),\n })}\n <DialogPrimitive.Content\n className={cs(\n 'luno-kit font-body fixed z-[200] text-modalText text-base leading-base',\n 'bg-modalBackground shadow-modal focus:outline-none overflow-hidden border border-modalBorder',\n 'transition-all duration-200',\n\n 'rounded-t-modalMobile bottom-0 left-0 w-full',\n 'translate-y-0 -translate-x-0',\n 'data-[state=open]:[animation:slide-up_200ms_ease-out]',\n\n 'md:bottom-auto md:left-1/2 md:top-1/2 md:-translate-x-1/2 md:-translate-y-1/2',\n 'md:w-auto md:rounded-modal',\n 'md:data-[state=open]:[animation:dialog-in_150ms_ease-out]',\n contentClassName\n )}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n\nconst DialogTitleWrapper: React.FC<DialogTitleProps> = ({ children, className }) =>\n React.createElement(DialogPrimitive.Title as any, { className }, children);\n\nconst DialogCloseWrapper: React.FC<DialogCloseProps> = ({ children, className, onClick }) =>\n React.createElement(DialogPrimitive.Close as any, { className, onClick }, children);\n\nexport const Dialog = DialogRoot;\nexport const DialogClose = DialogCloseWrapper;\nexport const DialogTitle = DialogTitleWrapper;\n\nexport type { DialogProps, DialogTitleProps, DialogCloseProps };\n","import { useAccount, useBalance, useChain, useChains, useDisconnect } from '@luno-kit/react';\nimport { getExplorerUrl } from '@luno-kit/react/utils';\nimport type React from 'react';\nimport { useMemo } from 'react';\nimport { Arrow, Disconnect, List, Switch } from '../../assets/icons';\nimport { cs } from '../../utils';\nimport { ChainIcon } from '../ChainIcon';\nimport { AccountModalView } from './index';\n\ninterface MainViewProps {\n onViewChange: (view: AccountModalView) => void;\n onModalClose: () => void;\n}\n\nexport const MainView: React.FC<MainViewProps> = ({ onViewChange, onModalClose }) => {\n const { address } = useAccount();\n const { chain } = useChain();\n const chains = useChains();\n const { disconnectAsync } = useDisconnect();\n const { data: balance } = useBalance({ address: chains.length > 0 ? address : undefined });\n\n const items = useMemo(() => {\n const chainSelectOptions = [\n {\n key: 'Chain Name',\n content: (\n <div className={'flex items-stretch w-full justify-between'}>\n <div className={'flex items-center gap-2'}>\n <div className=\"relative\">\n <ChainIcon\n className=\"w-[24px] h-[24px]\"\n chainIconUrl={chain?.chainIconUrl}\n chainName={chain?.name}\n />\n {/* <div className={'dot w-[8px] h-[8px] bg-accentColor absolute bottom-0 right-0 rounded-full'}/> */}\n </div>\n <div className={'flex flex-col items-start'}>\n <span className=\"text-base leading-base text-modalText\">\n {chain?.name || 'Polkadot'}\n </span>\n {balance ? (\n <span className={'text-modalTextSecondary text-xs leading-xs'}>\n {balance.formattedTransferable || '0.00'}{' '}\n {chain?.nativeCurrency?.symbol || 'DOT'}\n </span>\n ) : (\n <span className=\"animate-pulse rounded w-[80px] h-[16px] bg-skeleton\" />\n )}\n </div>\n </div>\n <div className={'flex items-center justify-center'}>\n <Arrow className={'w-[16px] h-[16px] text-modalTextSecondary'} />\n </div>\n </div>\n ),\n onClick: () => onViewChange(AccountModalView.switchChain),\n },\n {\n key: 'View on Explorer',\n content: (\n <>\n <List className={'w-[24px] h-[24px]'} />\n <span className=\"text-base text-accountActionItemText\">View on Explorer</span>\n </>\n ),\n onClick: () =>\n window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')),\n },\n ];\n\n const normalOptions = [\n {\n key: 'Switch Account',\n content: (\n <>\n <Switch className={'w-[24px] h-[24px]'} />\n <span className=\"text-base text-accountActionItemText\">Switch Account</span>\n </>\n ),\n onClick: () => onViewChange(AccountModalView.switchAccount),\n },\n ];\n\n return chains.length > 0 ? [...chainSelectOptions, ...normalOptions] : [...normalOptions];\n }, [onViewChange, chain, address, balance, chains]);\n\n const handleDisconnect = async () => {\n await disconnectAsync();\n onModalClose();\n };\n\n return (\n <div className=\"flex flex-col items-center gap-3 w-full\">\n <div className=\"flex flex-col gap-1.5 w-full px-4\">\n {items.map((i) => (\n <SelectItem key={i.key} onClick={i.onClick}>\n {i.content}\n </SelectItem>\n ))}\n </div>\n <div className={'w-full mx-[-100px] h-[1px] bg-separatorLine'} />\n\n <div className={'w-full px-4 pb-4'}>\n <SelectItem onClick={handleDisconnect}>\n <Disconnect />\n <span className=\"font-medium text-base text-accountActionItemText\">Disconnect</span>\n </SelectItem>\n </div>\n </div>\n );\n};\n\nconst SelectItem = ({ children, onClick }: { children: React.ReactNode; onClick?: () => void }) => {\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.()}\n className={cs(\n 'w-full p-2.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium',\n 'bg-accountActionItemBackground hover:bg-accountActionItemBackgroundHover',\n 'transition-colors duration-200',\n onClick ? 'cursor-pointer' : 'cursor-auto'\n )}\n aria-label={typeof children === 'string' ? children : undefined}\n >\n {children}\n </button>\n );\n};\n","import type React from 'react';\nimport { cs } from '../../utils';\n\nexport interface ChainIconProps {\n chainIconUrl?: string;\n chainName?: string;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({ chainIconUrl, chainName, className }) => {\n if (chainIconUrl) {\n return (\n <img\n src={chainIconUrl}\n alt={chainName || 'Chain icon'}\n className={cs('w-full h-full object-cover rounded-full', className)}\n />\n );\n }\n\n return (\n <div\n className={cs(\n 'w-full h-full bg-gray-500 text-modalText font-semibold',\n 'flex items-center justify-center rounded-full',\n className\n )}\n >\n {chainName ? chainName.charAt(0).toUpperCase() : 'C'}\n </div>\n );\n};\n","import {\n useAccount,\n useAccounts,\n useActiveConnector,\n useBalance,\n useChain,\n useChains,\n} from '@luno-kit/react';\nimport type { Account } from '@luno-kit/react/types';\nimport { formatAddress } from '@luno-kit/react/utils';\nimport React, { useCallback } from 'react';\nimport { cs } from '../../utils';\n\ninterface ViewComponent extends React.FC<SwitchAccountViewProps> {\n title?: string;\n}\n\ninterface SwitchAccountViewProps {\n onBack: () => void;\n}\n\nexport const SwitchAccountView: ViewComponent = ({ onBack }) => {\n const { accounts, selectAccount } = useAccounts();\n const { address: currentAddress } = useAccount();\n\n const _selectAccount = useCallback(\n (acc: Account) => {\n selectAccount(acc);\n onBack();\n },\n [onBack]\n );\n\n return (\n <div className=\"flex flex-col gap-1.5 pt-3 overflow-auto max-h-[400px] no-scrollbar p-4 pt-0\">\n {accounts.map((acc) => (\n <AccountItem\n key={acc.address}\n account={acc}\n isSelected={acc.address === currentAddress}\n selectAccount={_selectAccount}\n />\n ))}\n </div>\n );\n};\n\nSwitchAccountView.title = 'Switch Accounts';\n\ninterface AccountItemProps {\n isSelected: boolean;\n account: Account;\n selectAccount: (acc: Account) => void;\n}\n\nconst AccountItem: React.FC<AccountItemProps> = React.memo(\n ({ isSelected, account, selectAccount }) => {\n const { chain } = useChain();\n const chains = useChains();\n const address = account.address;\n const { data: balance } = useBalance({ address: chains.length > 0 ? address : undefined });\n const connector = useActiveConnector();\n\n return (\n <button\n type=\"button\"\n onClick={() => selectAccount(account)}\n className={cs(\n 'px-3.5 py-2.5 w-full rounded-accountSelectItem border-none',\n 'bg-accountSelectItemBackground',\n 'text-left flex items-center justify-between gap-2',\n 'transition-colors duration-200',\n isSelected ? 'cursor-auto' : 'cursor-pointer hover:bg-accountSelectItemBackgroundHover'\n )}\n aria-label={account.name || address}\n disabled={isSelected}\n >\n <div className=\"flex items-center gap-2 grow overflow-hidden\">\n <div className=\"shrink-0 w-[24px] h-[24px] rounded-full flex items-center justify-center\">\n {connector?.icon && <img src={connector?.icon} alt=\"luno account\" />}\n </div>\n <div className=\"flex flex-col items-start overflow-hidden\">\n <span className=\"whitespace-nowrap max-w-full text-ellipsis overflow-hidden font-medium text-sm leading-sm text-accountSelectItemText\">\n {account.name || formatAddress(address)}\n </span>\n {chains.length > 0 &&\n (balance ? (\n <span className=\"text-xs text-modalTextSecondary font-medium\">\n {balance?.formattedTransferable || '0.00'}{' '}\n {chain?.nativeCurrency?.symbol || 'DOT'}\n </span>\n ) : (\n <span className=\"animate-pulse rounded w-[60px] h-[16px] bg-skeleton\" />\n ))}\n </div>\n </div>\n\n {isSelected && (\n <div className=\"shrink-0 border-[1px] border-solid border-accentColor rounded-full overflow-hidden flex items-center justify-center w-[18px] h-[18px]\">\n <div className=\"rounded-full bg-accentColor w-[10px] h-[10px]\" />\n </div>\n )}\n </button>\n );\n }\n);\n","import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react';\nimport type { Chain } from '@luno-kit/react/types';\nimport React, { useMemo, useState } from 'react';\nimport { cs } from '../../utils';\nimport { ChainIcon } from '../ChainIcon';\nimport { Search } from '../../assets/icons';\n\ninterface ChainListProps {\n onChainSwitched?: (chain: Chain) => void;\n className?: string;\n}\n\nexport const ChainList: React.FC<ChainListProps> = ({\n onChainSwitched,\n className = '',\n}: ChainListProps) => {\n const { chain: currentChain } = useChain();\n const chains = useChains();\n const { switchChainAsync } = useSwitchChain();\n const { isApiReady, apiError } = useApi();\n\n const [switchingChain, setSwitchingChain] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredChains = useMemo(() => {\n return chains.filter((chain) =>\n searchQuery.trim() ? chain.name.toLowerCase().includes(searchQuery.toLowerCase()) : true\n );\n }, [chains, searchQuery]);\n\n const handleChainSelect = async (chain: Chain) => {\n if (chain.genesisHash === currentChain?.genesisHash) return;\n if (!isApiReady && !apiError) return;\n\n setSwitchingChain(chain.genesisHash);\n try {\n await switchChainAsync({ chainId: chain.genesisHash });\n onChainSwitched?.(chain);\n } catch (error) {\n console.error('Failed to switch chain:', error);\n } finally {\n setSwitchingChain(null);\n }\n };\n\n return (\n <div className={cs('flex flex-col gap-3.5', className)}>\n <div className=\"relative pt-1\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-modalTextSecondary\" />\n <input\n type=\"text\"\n placeholder=\"Search by name\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-10 pr-3 py-2 text-sm border border-networkSelectItemBackgroundHover rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent\"\n />\n </div>\n </div>\n\n {filteredChains.length > 0 && (\n <div className=\"flex flex-col gap-1.5 overflow-y-auto max-h-[380px]\">\n {filteredChains.map((chain) => (\n <ChainItem\n key={chain.genesisHash}\n chain={chain}\n isSelected={chain.genesisHash === currentChain?.genesisHash}\n onSelect={handleChainSelect}\n isLoading={(switchingChain === chain.genesisHash || !isApiReady) && !apiError}\n isSwitching={switchingChain === chain.genesisHash}\n />\n ))}\n </div>\n )}\n\n {filteredChains.length === 0 && (\n <div className=\"flex items-center justify-center py-12\">\n <span className=\"text-modalTextSecondary text-xs\">No chains available</span>\n </div>\n )}\n </div>\n );\n};\n\ninterface ChainItemProps {\n chain: Chain;\n isSelected: boolean;\n isLoading: boolean;\n onSelect: (chain: Chain) => void;\n isSwitching: boolean;\n}\n\nconst ChainItem: React.FC<ChainItemProps> = React.memo(\n ({ chain, isSelected, isLoading, onSelect, isSwitching }) => {\n return (\n <button\n onClick={() => onSelect(chain)}\n disabled={isSelected || isLoading}\n className={cs(\n 'flex items-center justify-between p-2.5 rounded-networkSelectItem',\n 'bg-networkSelectItemBackground',\n 'transition-colors duration-200',\n isSelected || isLoading\n ? 'cursor-default'\n : 'cursor-pointer hover:bg-networkSelectItemBackgroundHover',\n isLoading && 'opacity-80'\n )}\n >\n <div className=\"flex items-center gap-2\">\n <ChainIcon\n className={'w-[20px] h-[20px] flex items-center justify-center leading-[20px]'}\n chainIconUrl={chain?.chainIconUrl}\n chainName={chain?.name}\n />\n\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium text-base text-modalText\">{chain.name}</span>\n </div>\n </div>\n\n <div className=\"flex items-center justify-center h-[20px]\">\n {isSelected ? (\n isLoading ? (\n <>\n <span className=\"text-accentColor text-xs leading-xs mr-1.5\">\n {isSwitching ? 'Switching' : 'Connecting'}\n </span>\n <div className=\"loading text-accentColor w-[15px] h-[15px]\"></div>\n </>\n ) : (\n <span className=\"status-dot-container\">\n <span className=\"ping-animation\"></span>\n <span className=\"status-dot\"></span>\n </span>\n )\n ) : null}\n </div>\n </button>\n );\n }\n);\n","import type React from 'react';\nimport { ChainList } from '../ChainList';\n\ninterface ViewComponent extends React.FC<SwitchChainViewProps> {\n title?: string;\n}\n\ninterface SwitchChainViewProps {\n onBack: () => void;\n}\n\nexport const SwitchChainView: ViewComponent = ({ onBack }) => {\n return <ChainList className={'p-4 pt-0'} />;\n};\n\nSwitchChainView.title = 'Select Networks';\n","import type React from 'react';\nimport { Close } from '../../assets/icons';\nimport { useChainModal } from '../../providers';\nimport { ChainList } from '../ChainList';\nimport { Dialog, DialogClose, DialogTitle } from '../Dialog';\n\nexport type ChainModalProps = {};\n\nexport const ChainModal: React.FC<ChainModalProps> = () => {\n const { isOpen, close } = useChainModal();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && close()}>\n <div className=\"flex flex-col w-full md:w-[360px] max-h-[512px] p-4 gap-3.5 text-modalText\">\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"w-[30px]\" /> {/* Placeholder to keep title centered */}\n <DialogTitle className=\"text-lg leading-lg text-modalText font-semibold transition-opacity duration-300\">\n Select Network\n </DialogTitle>\n <DialogClose className=\"z-10 flex items-center justify-center h-[30px] w-[30px] rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200 cursor-pointer\">\n <Close />\n </DialogClose>\n </div>\n\n <ChainList />\n </div>\n </Dialog>\n );\n};\n","import { formatAddress } from '@luno-kit/react/utils';\nimport type React from 'react';\nimport { useConnectButton, useWindowSize } from '../../hooks';\nimport { cs } from '../../utils';\nimport { ChainIcon } from '../ChainIcon';\n\nexport const transitionClassName =\n 'transition-transform transition-[125] hover:scale-[1.03] transition-ease';\n\nexport interface ConnectButtonProps {\n className?: string;\n label?: string;\n accountStatus?: 'full' | 'address';\n chainStatus?: 'full' | 'icon' | 'name' | 'none';\n showBalance?: boolean;\n displayPreference?: 'address' | 'name';\n}\n\nexport const ConnectButton: React.FC<ConnectButtonProps> = ({\n className,\n label = 'Connect Wallet',\n accountStatus = 'full',\n chainStatus = 'full',\n showBalance = true,\n displayPreference = 'address',\n}) => {\n const {\n isConnected,\n isDisconnected,\n account,\n balance,\n openConnectModal,\n openAccountModal,\n openChainModal,\n chainIconUrl,\n chainName,\n currentChain,\n configuredChains,\n activeConnector,\n } = useConnectButton();\n const { width: windowWidth } = useWindowSize();\n\n const isLargeWindow = windowWidth && windowWidth > 768;\n\n if (isDisconnected || !isConnected || !activeConnector) {\n return (\n <button\n type=\"button\"\n onClick={() => openConnectModal?.()}\n className={cs(\n 'cursor-pointer font-semibold inline-flex items-center justify-center focus:outline-none',\n 'text-connectButtonText bg-connectButtonBackground shadow-button active:scale-[0.95]',\n 'rounded-connectButton',\n transitionClassName,\n 'px-3.5 text-base leading-base min-h-[40px]',\n className\n )}\n >\n {label}\n </button>\n );\n }\n\n return (\n <div\n className={cs(\n 'text-modalText flex items-stretch bg-transparent font-semibold text-base leading-base gap-3',\n className\n )}\n >\n {chainStatus !== 'none' && configuredChains.length > 0 && (\n <button\n type=\"button\"\n onClick={() => openChainModal?.()}\n className={cs(\n 'flex items-center rounded-currentNetworkButton cursor-pointer',\n 'bg-currentNetworkButtonBackground shadow-button',\n 'py-2 px-2.5 gap-1.5',\n transitionClassName\n )}\n aria-label=\"Switch chain\"\n >\n {chainStatus === 'full' || chainStatus === 'icon' ? (\n <ChainIcon\n chainIconUrl={chainIconUrl}\n chainName={chainName}\n className=\"w-[24px] h-[24px]\"\n />\n ) : null}\n {(chainStatus === 'full' || chainStatus === 'name') && isLargeWindow && (\n <span>{currentChain?.name || 'Unknown Chain'}</span>\n )}\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => openAccountModal?.()}\n className={cs(\n 'flex items-center cursor-pointer rounded-connectButton bg-connectButtonBackground shadow-button',\n transitionClassName\n )}\n aria-label=\"Open account modal\"\n >\n {configuredChains.length > 0 && showBalance && isLargeWindow && (\n <div className=\"p-2 pl-3\">\n {balance ? (\n <span>\n {balance?.formattedTransferable || balance?.formattedTotal || 0}{' '}\n {currentChain?.nativeCurrency?.symbol || ''}\n </span>\n ) : (\n <span className=\"block animate-pulse rounded w-[80px] h-[20px] bg-accountActionItemBackgroundHover\" />\n )}\n </div>\n )}\n\n <div\n className={cs(\n 'flex items-center overflow-hidden bg-connectButtonInnerBackground border-2 border-connectButtonBackground rounded-connectButton gap-1.5 max-h-[40px]',\n configuredChains.length > 0 && showBalance && isLargeWindow\n ? 'bg-connectButtonInnerBackground py-1.5 px-2'\n : 'bg-connectButtonBackground py-2 px-2.5'\n )}\n >\n {accountStatus === 'full' && (\n <span className=\"w-[24px] h-[24px] flex items-center justify-center\">\n <img src={activeConnector.icon} alt=\"luno\" />\n </span>\n )}\n <span\n aria-label=\"Wallet icon placeholder\"\n className={cs(\n displayPreference === 'name' && account?.name\n ? 'text-ellipsis overflow-hidden max-w-[115px] whitespace-nowrap'\n : ''\n )}\n >\n {displayPreference === 'name' && account?.name\n ? account?.name\n : formatAddress(account?.address)}\n </span>\n </div>\n </button>\n </div>\n );\n};\n","import {\n ConnectionStatus,\n useAccount,\n useActiveConnector,\n useBalance,\n useChain,\n useChains,\n useStatus,\n} from '@luno-kit/react';\nimport type { Account, AccountBalance, Chain, Connector } from '@luno-kit/react/types';\nimport { useAccountModal, useChainModal, useConnectModal } from '../providers';\n\nexport interface UseConnectButtonReturn {\n connectionStatus: ConnectionStatus;\n isConnected: boolean;\n isDisconnected: boolean;\n isConnecting: boolean;\n\n account?: Account;\n address?: string;\n\n currentChain?: Chain;\n configuredChains: Chain[];\n isChainSupported: boolean;\n chainIconUrl: string;\n chainName?: string;\n\n balance?: AccountBalance;\n\n activeConnector?: Connector;\n\n openConnectModal?: () => void;\n openAccountModal?: () => void;\n openChainModal?: () => void;\n\n isConnectModalOpen: boolean;\n isAccountModalOpen: boolean;\n isChainModalOpen: boolean;\n}\n\nexport function useConnectButton(): UseConnectButtonReturn {\n const connectionStatus = useStatus();\n const { account, address } = useAccount();\n const { chain: currentChain } = useChain();\n const configuredChains = useChains();\n const { data: balance } = useBalance({\n address: configuredChains.length > 0 ? address : undefined,\n });\n const activeConnector = useActiveConnector();\n\n const { open: openConnectModal, isOpen: isConnectModalOpen } = useConnectModal();\n const { open: openAccountModal, isOpen: isAccountModalOpen } = useAccountModal();\n const { open: openChainModal, isOpen: isChainModalOpen } = useChainModal();\n\n const isConnecting = connectionStatus === ConnectionStatus.Connecting;\n const isConnected = connectionStatus === ConnectionStatus.Connected;\n const isDisconnected =\n connectionStatus === ConnectionStatus.Disconnected ||\n connectionStatus === ConnectionStatus.Disconnecting;\n\n const isChainSupported: boolean =\n !!currentChain &&\n configuredChains.some(\n (c) => c.genesisHash.toLowerCase() === currentChain.genesisHash.toLowerCase()\n );\n\n return {\n activeConnector,\n connectionStatus,\n isConnected,\n isDisconnected,\n isConnecting,\n\n account,\n address,\n\n currentChain,\n configuredChains,\n isChainSupported,\n chainIconUrl: currentChain?.chainIconUrl!,\n chainName: currentChain?.name,\n\n balance,\n\n openConnectModal,\n openAccountModal,\n openChainModal,\n\n isConnectModalOpen,\n isAccountModalOpen,\n isChainModalOpen,\n };\n}\n","import { useEffect, useState } from 'react';\nimport { debounce } from '../utils';\n\nexport const useWindowSize = () => {\n const [windowSize, setWindowSize] = useState<{\n width: number | undefined;\n height: number | undefined;\n }>({\n height: undefined,\n width: undefined,\n });\n\n useEffect(() => {\n const handleResize = debounce(() => {\n setWindowSize({\n height: window.innerHeight,\n width: window.innerWidth,\n });\n }, 500);\n window.addEventListener('resize', handleResize);\n handleResize();\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowSize;\n};\n","import { useConnect } from '@luno-kit/react';\nimport type { Connector } from '@luno-kit/react/types';\nimport { isMobileDevice } from '@luno-kit/react/utils';\nimport type React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Back, Close } from '../../assets/icons';\nimport { useWindowSize } from '../../hooks';\nimport { useAnimatedViews } from '../../hooks/useAnimatedViews';\nimport { useConnectModal } from '../../providers';\nimport { cs } from '../../utils';\nimport { Dialog, DialogClose, DialogTitle, type ModalSize } from '../Dialog';\nimport { ConnectOptions } from './ConnectOptions';\nimport { WalletView } from './WalletView';\n\nexport enum ConnectModalView {\n connectOptions = 'Connect Wallet',\n walletView = 'walletView',\n}\n\nexport interface ConnectModalProps {\n size?: ModalSize;\n}\n\nexport const ConnectModal: React.FC<ConnectModalProps> = ({ size = 'wide' }) => {\n const { isOpen, close } = useConnectModal();\n const {\n connectAsync,\n reset: resetConnect,\n isPending: isConnecting,\n isError: connectError,\n } = useConnect();\n const [selectedConnector, setSelectedConnector] = useState<Connector | null>(null);\n const [qrCode, setQrCode] = useState<string | undefined>();\n\n const { width: windowWidth } = useWindowSize();\n\n const isLargeWindow = windowWidth && windowWidth > 768;\n const isWide = !!(size === 'wide' && isLargeWindow);\n\n const { containerRef, currentViewRef, resetView, handleViewChange, currentView } =\n useAnimatedViews({ initialView: ConnectModalView.connectOptions });\n\n const onQrCode = async (connector: Connector) => {\n const uri = await connector.getConnectionUri();\n\n setQrCode(uri);\n };\n\n const handleConnect = async (connector: Connector) => {\n if (isMobileDevice() && connector.links.deepLink) {\n try {\n await connectAsync({ connectorId: connector.id });\n _onOpenChange(false);\n return;\n } catch (error) {\n window.location.href = `${connector.links.deepLink}?url=${window.location.href}`;\n return;\n }\n }\n\n !isWide && handleViewChange(ConnectModalView.walletView);\n setSelectedConnector(connector);\n setQrCode(undefined);\n if (connector.hasConnectionUri()) {\n onQrCode(connector);\n }\n await connectAsync({ connectorId: connector.id });\n _onOpenChange(false);\n };\n\n const _onOpenChange = (open: boolean) => {\n !open && close();\n resetConnect();\n resetView();\n setSelectedConnector(null);\n setQrCode(undefined);\n };\n\n const viewComponents = useMemo(() => {\n return {\n [ConnectModalView.connectOptions]: <ConnectOptions onConnect={handleConnect} />,\n [ConnectModalView.walletView]: (\n <WalletView\n connectState={{ isConnecting, isError: connectError }}\n isWide={isWide}\n selectedConnector={selectedConnector}\n qrCode={qrCode}\n onConnect={handleConnect}\n />\n ),\n };\n }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError]);\n\n useEffect(() => {\n if (isWide && currentView === ConnectModalView.walletView) {\n handleViewChange(ConnectModalView.connectOptions);\n }\n }, [isWide, currentView]);\n\n return (\n <Dialog open={isOpen} onOpenChange={_onOpenChange}>\n <div\n className={cs(\n 'flex items-stretch justify-between w-full md:max-h-[504px] md:max-w-[724px]'\n )}\n >\n <div\n className={cs(\n 'flex flex-col items-start py-4 px-5 w-full md:w-auto',\n isWide\n ? 'md:min-w-[300px] border-r-[1px] border-r-solid border-r-separatorLine'\n : 'md:min-w-[360px]'\n )}\n >\n <div className={cs('flex items-center justify-between w-full', !isWide && 'pb-4')}>\n {currentView === ConnectModalView.connectOptions ? (\n <>\n {!isWide && <div className=\"w-[30px] h-[30px]\" aria-hidden />}\n <DialogTitle\n className={cs(\n 'text-lg leading-lg text-modalText font-bold',\n isWide ? 'pb-6' : 'flex-1 text-center'\n )}\n >\n Connect Wallet\n </DialogTitle>\n </>\n ) : (\n <>\n <button\n className=\"flex items-center justify-center w-[30px] h-[30px] cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200\"\n onClick={() => handleViewChange(ConnectModalView.connectOptions)}\n aria-label=\"Back\"\n >\n <Back />\n </button>\n <DialogTitle\n className={cs(\n 'text-lg leading-lg text-modalText font-semibold transition-opacity duration-300'\n )}\n >\n {selectedConnector?.name}\n </DialogTitle>\n </>\n )}\n\n {!isWide && (\n <DialogClose\n className={\n 'z-10 w-[30px] h-[30px] flex items-center justify-center cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200'\n }\n >\n <Close />\n </DialogClose>\n )}\n </div>\n <div ref={containerRef} className=\"relative overflow-hidden w-full\">\n <div ref={currentViewRef}>{viewComponents[currentView]}</div>\n </div>\n\n {!isWide && currentView === ConnectModalView.connectOptions && (\n <>\n <p\n className={\n 'cursor-pointer w-full pt-4 text-sm leading-sm text-accentColor font-medium text-center hover:text-modalText'\n }\n onClick={() => window.open('https://polkadot.com/get-started/wallets/')}\n >\n New to wallets?\n </p>\n </>\n )}\n </div>\n\n {isWide && (\n <WalletView\n connectState={{ isConnecting, isError: connectError }}\n isWide={isWide}\n selectedConnector={selectedConnector}\n qrCode={qrCode}\n onConnect={handleConnect}\n />\n )}\n </div>\n </Dialog>\n );\n};\n","import { useConnectors } from '@luno-kit/react';\nimport type { Connector } from '@luno-kit/react/types';\nimport { isMobileDevice } from '@luno-kit/react/utils';\nimport React, { useMemo } from 'react';\nimport { cs } from '../../utils';\n\ninterface Props {\n onConnect: (connector: Connector) => Promise<void>;\n}\n\nconst popularConnectorIds = [\n 'polkadot-js',\n 'subwallet-js',\n 'talisman',\n 'walletconnect',\n 'nova',\n 'nova-mobile',\n];\n\nconst moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt'];\n\nexport const ConnectOptions = React.memo(({ onConnect }: Props) => {\n const connectors = useConnectors();\n\n if (isMobileDevice()) {\n const filteredConnectors = connectors.filter((i) => i.links.deepLink);\n\n return (\n <div className={'flex flex-col items-start gap-1 w-full'}>\n {filteredConnectors.map((i) => (\n <ConnectorItem key={`${i.id}-${i.name}`} connector={i} onConnect={() => onConnect(i)} />\n ))}\n </div>\n );\n }\n\n const installedConnectors = connectors.filter((c) => c.isInstalled());\n const popularConnectors = connectors.filter(\n (c) => popularConnectorIds.includes(c.id) && !c.isInstalled()\n );\n const moreConnectors = connectors.filter(\n (c) => moreConnectorIds.includes(c.id) && !c.isInstalled()\n );\n\n const connectorGroup: { title: string; group: Connector[] }[] = useMemo(() => {\n return [\n {\n title: 'Installed',\n group: installedConnectors,\n },\n {\n title: 'Popular',\n group: popularConnectors,\n },\n {\n title: 'More',\n group: moreConnectors,\n },\n ];\n }, [installedConnectors, popularConnectors, moreConnectors]);\n\n return (\n <div\n className={\n 'flex flex-col items-start gap-4 w-full overflow-y-auto custom-scrollbar max-h-[400px]'\n }\n >\n {connectorGroup.map((g) => {\n if (g.group.length === 0) return null;\n return (\n <div key={g.title} className={'flex flex-col items-start gap-2 w-full'}>\n <div\n className={cs(\n 'text-sm font-semibold leading-base',\n g.title === 'Installed' ? 'text-accentColor' : 'text-modalTextSecondary'\n )}\n >\n {g.title}\n </div>\n <div className={'flex flex-col items-start gap-1.5 w-full'}>\n {g.group.map((i) => (\n <ConnectorItem key={i.id} connector={i} onConnect={() => onConnect(i)} />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n );\n});\n\ninterface ConnectorItemProps {\n connector: Connector;\n onConnect: () => void;\n}\n\nconst ConnectorItem: React.FC<ConnectorItemProps> = React.memo(({ connector, onConnect }) => {\n return (\n <button\n onClick={onConnect}\n className={cs(\n 'cursor-pointer bg-walletSelectItemBackground p-2 w-full flex items-center gap-3 rounded-walletSelectItem border-none',\n 'hover:bg-walletSelectItemBackgroundHover transition-transform active:scale-[0.95]',\n 'text-left'\n )}\n >\n <div className={'w-[28px] h-[28px] rounded-[6px] overflow-hidden'}>\n <img src={connector.icon} alt={connector.name} className=\"w-full h-full\" />\n </div>\n\n <span className=\"font-semibold leading-base text-base text-modalText\">{connector.name}</span>\n </button>\n );\n});\n","import type { Connector } from '@luno-kit/react/types';\nimport React from 'react';\nimport { Close } from '../../assets/icons';\nimport { cs } from '../../utils';\nimport { transitionClassName } from '../ConnectButton';\nimport { Copy } from '../Copy';\nimport { DialogClose } from '../Dialog';\nimport { QRCode } from '../QRCode';\nimport { SpiralAnimation } from '../SpiralAnimation';\n\ninterface Props {\n selectedConnector: Connector | null;\n onConnect: (connector: Connector) => Promise<void>;\n qrCode?: string;\n isWide: boolean;\n connectState: {\n isConnecting: boolean;\n isError: boolean;\n };\n}\n\nexport const WalletView = React.memo(\n ({ selectedConnector, onConnect, qrCode, isWide, connectState }: Props) => {\n const showQRCode = selectedConnector?.hasConnectionUri();\n\n return (\n <div\n className={cs(\n 'flex flex-col items-center',\n isWide ? 'w-[450px] p-4 min-h-[472px]' : 'justify-center w-full min-h-[400px]'\n )}\n >\n {isWide && (\n <div className={'w-full'}>\n <div className={'flex items-center justify-between'}>\n <div />\n <DialogClose\n className={\n 'z-10 w-[30px] h-[30px] flex items-center justify-center cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200'\n }\n >\n <Close />\n </DialogClose>\n </div>\n </div>\n )}\n\n <div\n className={cs(\n 'flex items-center gap-4 flex-col grow justify-center',\n selectedConnector && showQRCode ? 'max-w-[300px]' : 'max-w-[360px]'\n )}\n >\n {selectedConnector ? (\n showQRCode ? (\n <div className={'flex flex-col items-center gap-2.5'}>\n <QRCode size={300} logoBackground={selectedConnector.icon} uri={qrCode} />\n <div\n className={\n 'text-base leading-base font-medium text-center text-modalTextSecondary'\n }\n >\n Scan the QR code with{' '}\n {selectedConnector.id === 'nova' ? 'the Nova' : 'your phone'}\n </div>\n\n <div className=\"min-h-[20px] flex items-center justify-center \">\n {selectedConnector.links?.browserExtension ? (\n <p\n onClick={() => window.open(selectedConnector.links.browserExtension)}\n className={\n 'cursor-pointer text-sm text-accentColor font-medium text-center hover:text-modalText'\n }\n >\n Don't have {selectedConnector.name}?\n </p>\n ) : qrCode ? (\n <Copy\n className={'text-sm leading-sm font-medium text-accentColor'}\n copyText={qrCode}\n label={'Copy Link'}\n />\n ) : null}\n </div>\n </div>\n ) : (\n <>\n <div className={'w-[80px] h-[80px]'}>\n <img src={selectedConnector.icon} className={'w-full h-full'} alt=\"\" />\n </div>\n <p className={'text-lg leading-lg text-modalFont font-bold'}>\n Opening {selectedConnector.name}...\n </p>\n <p\n className={\n 'pb-[10px] text-base text-modalTextSecondary leading-base font-medium text-center'\n }\n >\n Confirm connection in the extension\n </p>\n {connectState.isConnecting && <div className=\"loading text-modalText\"></div>}\n {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && (\n <p\n onClick={() => window.open(selectedConnector.links.browserExtension)}\n className={\n 'cursor-pointer pt-6 text-sm text-accentColor font-medium text-center hover:text-modalText'\n }\n >\n Don‘t have {selectedConnector.name}?\n </p>\n )}\n {!connectState.isConnecting &&\n connectState.isError &&\n selectedConnector.isInstalled() && (\n <button\n className={cs(\n 'rounded-connectButton focus:outline-none py-[4px] px-[12px] cursor-pointer font-semibold text-sm text-modalText bg-connectButtonBackground shadow-connectButton active:scale-[0.95]',\n transitionClassName\n )}\n onClick={() => onConnect(selectedConnector!)}\n >\n Retry\n </button>\n )}\n </>\n )\n ) : (\n <>\n <div className={'w-[160px] h-[160px] mb-4'}>\n <SpiralAnimation />\n </div>\n <p\n className={\n 'cursor-pointer text-base leading-base text-accentColor font-semibold text-center'\n }\n onClick={() => window.open('https://polkadot.com/get-started/wallets/')}\n >\n New to wallets?\n </p>\n\n <p\n className={\n 'text-modalTextSecondary w-[250px] text-sm leading-sm font-medium text-center'\n }\n >\n Connect your wallet to start exploring and interacting with DApps.\n </p>\n </>\n )}\n </div>\n\n <div />\n </div>\n );\n }\n);\n","import { Cuer } from 'cuer';\n\nexport type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high';\n\ninterface Props {\n ecc?: ErrorCorrectionLevel;\n logoBackground?: string;\n logoUrl?: string | (() => Promise<string>);\n logoSize?: number;\n size: number;\n uri?: string;\n}\n\nexport const QRCode = ({ logoBackground, uri, size }: Props) => {\n if (!uri) {\n const QR_GRID_SIZE = 57;\n const FINDER_SIZE_WITH_MARGIN = 8;\n const ARENA_GRID_SIZE = Math.floor(QR_GRID_SIZE / 4);\n\n const cellSize = size / QR_GRID_SIZE;\n const arenaSize = ARENA_GRID_SIZE * cellSize;\n const arenaStart = Math.ceil(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2);\n const arenaEnd = arenaStart + ARENA_GRID_SIZE;\n\n const generateSkeletonDots = () => {\n const dots = [];\n for (let i = 0; i < QR_GRID_SIZE; i++) {\n for (let j = 0; j < QR_GRID_SIZE; j++) {\n if (i >= arenaStart && i < arenaEnd && j >= arenaStart && j < arenaEnd) continue;\n\n const isInFinder =\n (i < FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN) ||\n (i < FINDER_SIZE_WITH_MARGIN && j >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN) ||\n (i >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN);\n if (isInFinder) continue;\n\n const cx = j + 0.5;\n const cy = i + 0.5;\n\n dots.push(\n <rect\n key={`${i}-${j}`}\n x={cx - 0.4}\n y={cy - 0.4}\n width={0.8}\n height={0.8}\n rx={0.4}\n fill=\"var(--color-walletSelectItemBackground)\"\n />\n );\n }\n }\n return dots;\n };\n\n const renderFinderPattern = ({\n position,\n }: {\n position: 'top-left' | 'top-right' | 'bottom-left';\n }) => {\n const finderSize = 7 * cellSize;\n const positionStyles = {\n 'top-left': { top: 0, left: 0 },\n 'top-right': { top: 0, right: 0 },\n 'bottom-left': { bottom: 0, left: 0 },\n };\n\n return (\n <div\n className=\"absolute z-[4]\"\n style={{\n width: `${finderSize}px`,\n height: `${finderSize}px`,\n ...positionStyles[position],\n }}\n >\n <div\n className=\"absolute inset-0\"\n style={{\n borderRadius: `${2 * cellSize}px`,\n border: `${cellSize}px solid var(--color-walletSelectItemBackground)`,\n }}\n />\n <div\n className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2\"\n style={{\n width: `${3 * cellSize}px`,\n height: `${3 * cellSize}px`,\n borderRadius: `${0.5 * cellSize}px`,\n backgroundColor: 'var(--color-walletSelectItemBackground)',\n }}\n />\n </div>\n );\n };\n\n const renderArenaLogo = () => {\n const logoStart = arenaStart * cellSize;\n\n return (\n <div\n className=\"absolute z-[4] flex items-center justify-center box-border\"\n style={{\n width: `${arenaSize}px`,\n height: `${arenaSize}px`,\n left: `${logoStart}px`,\n top: `${logoStart}px`,\n borderRadius: `${cellSize}px`,\n padding: `${cellSize / 2}px`,\n }}\n >\n <img\n src={logoBackground}\n alt=\"QR Code Logo\"\n className=\"h-full w-full object-cover\"\n style={{\n borderRadius: `${cellSize}px`,\n }}\n />\n </div>\n );\n };\n\n return (\n <div\n className=\"relative overflow-hidden flex items-center justify-center\"\n style={{\n width: size,\n height: size,\n borderRadius: `${2 * cellSize}px`,\n }}\n >\n <svg\n className=\"absolute inset-0 z-[3]\"\n width={size}\n height={size}\n viewBox={`0 0 ${QR_GRID_SIZE} ${QR_GRID_SIZE}`}\n >\n {generateSkeletonDots()}\n </svg>\n\n <div\n className=\"absolute inset-0 z-[100]\"\n style={{\n background:\n 'linear-gradient(90deg, transparent 50%, var(--color-walletSelectItemBackgroundHover), transparent)',\n backgroundSize: '200% 100%',\n transform: 'scale(1.5) rotate(45deg)',\n animation: 'shimmer 1000ms linear infinite both',\n }}\n />\n\n {renderFinderPattern({ position: 'top-left' })}\n {renderFinderPattern({ position: 'top-right' })}\n {renderFinderPattern({ position: 'bottom-left' })}\n\n {logoBackground && renderArenaLogo()}\n </div>\n );\n }\n return <Cuer arena={logoBackground} value={uri} />;\n};\n","import type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { cs } from '../../utils';\n\nexport interface SpiralAnimationProps {\n size?: number;\n dotCount?: number;\n duration?: number;\n className?: string;\n}\n\nexport const SpiralAnimation: React.FC<SpiralAnimationProps> = ({\n size = 160,\n dotCount = 300,\n duration = 3,\n className = '',\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n const DOT_RADIUS = 1;\n const MARGIN = 2;\n const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n const CENTER = size / 2;\n const MAX_RADIUS = CENTER - MARGIN - DOT_RADIUS;\n const svgNS = 'http://www.w3.org/2000/svg';\n\n containerRef.current.innerHTML = '';\n\n const svg = document.createElementNS(svgNS, 'svg');\n svg.setAttribute('width', size.toString());\n svg.setAttribute('height', size.toString());\n svg.setAttribute('viewBox', `0 0 ${size} ${size}`);\n svg.style.display = 'block';\n\n containerRef.current.appendChild(svg);\n\n for (let i = 0; i < dotCount; i++) {\n const idx = i + 0.5;\n const frac = idx / dotCount;\n const r = Math.sqrt(frac) * MAX_RADIUS;\n const theta = idx * GOLDEN_ANGLE;\n const x = CENTER + r * Math.cos(theta);\n const y = CENTER + r * Math.sin(theta);\n\n const circle = document.createElementNS(svgNS, 'circle');\n circle.setAttribute('cx', x.toString());\n circle.setAttribute('cy', y.toString());\n circle.setAttribute('r', DOT_RADIUS.toString());\n circle.setAttribute('fill', 'currentColor');\n circle.setAttribute('opacity', '0.6');\n svg.appendChild(circle);\n\n const animR = document.createElementNS(svgNS, 'animate');\n animR.setAttribute('attributeName', 'r');\n animR.setAttribute('values', `${DOT_RADIUS * 0.5};${DOT_RADIUS * 1.8};${DOT_RADIUS * 0.5}`);\n animR.setAttribute('dur', `${duration}s`);\n animR.setAttribute('begin', `${frac * duration}s`);\n animR.setAttribute('repeatCount', 'indefinite');\n animR.setAttribute('calcMode', 'spline');\n animR.setAttribute('keySplines', '0.4 0 0.6 1;0.4 0 0.6 1');\n circle.appendChild(animR);\n\n const animO = document.createElementNS(svgNS, 'animate');\n animO.setAttribute('attributeName', 'opacity');\n animO.setAttribute('values', '0.2;1;0.2');\n animO.setAttribute('dur', `${duration}s`);\n animO.setAttribute('begin', `${frac * duration}s`);\n animO.setAttribute('repeatCount', 'indefinite');\n animO.setAttribute('calcMode', 'spline');\n animO.setAttribute('keySplines', '0.4 0 0.6 1;0.4 0 0.6 1');\n circle.appendChild(animO);\n }\n }, [size, dotCount, duration]);\n\n return (\n <div\n ref={containerRef}\n className={cs(\n 'text-accentColor inline-flex w-full h-full justify-center align-center',\n className\n )}\n />\n );\n};\n"],"mappings":"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","names":["useAccount","useActiveConnector","formatAddress","useCallback","useMemo","jsx","SvgArrow","props","Arrow_default","jsx","SvgBack","props","Back_default","jsx","SvgClose","props","Close_default","jsx","SvgCopy","props","Copy_default","jsx","SvgDisconnect","props","Disconnect_default","jsx","SvgList","props","List_default","jsx","SvgSuccess","props","Success_default","jsx","SvgArrow","props","Search_default","jsx","SvgSwitch","props","Switch_default","useCallback","useRef","useState","useAnimatedViews","initialView","animationDuration","animationEasing","currentView","setCurrentView","isAnimating","setIsAnimating","containerRef","currentViewRef","handleViewChange","view","container","currentHeight","newHeight","resetView","createContext","useCallback","useContext","useEffect","useMemo","useState","useEffect","ALL_THEME_VARS","useCSSVariableInjection","themeInfo","themeMode","root","key","value","varName","jsx","THEME_STORAGE_KEY","saveThemePreference","preference","ThemeContext","createContext","isCompleteTheme","theme","useSystemTheme","systemTheme","setSystemTheme","useState","useEffect","mediaQuery","updateTheme","e","ThemeProvider","children","themeOverrides","themeMode","setThemeMode","saved","isAutoMode","setIsAutoMode","themeInfo","useMemo","overrides","partialOverrides","currentTheme","useCSSVariableInjection","setThemeChoice","useCallback","choice","isAuto","contextValue","useLunoTheme","context","useContext","LunoProvider","QueryClient","QueryClientProvider","useState","ConnectionStatus","useStatus","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","useModalVisibility","isOpen","setIsOpen","open","close","ModalContext","ModalProvider","children","isConnectModalOpen","openConnectModal","closeConnectModal","isAccountModalOpen","openAccountModal","closeAccountModal","isChainModalOpen","openChainModal","closeChainModal","connectionStatus","closeAllModals","contextValue","useConnectModal","context","useAccountModal","useChainModal","useCloseAllModals","Fragment","jsx","jsxs","LunoKitProvider","children","config","queryClientConfig","theme","queryClient","useState","QueryClient","QueryClientProvider","LunoProvider","ThemeProvider","ModalProvider","RenderModals","modalSize","ConnectModal","AccountDetailsModal","ChainModal","clsx","extendTailwindMerge","customTwMerge","cs","inputs","debounce","fn","ms","timer","useCallback","useState","jsx","jsxs","Copy","copyText","label","className","isCopied","setIsCopied","useState","copyToClipboard","useCallback","text","err","cs","Success_default","Copy_default","DialogPrimitive","React","jsx","jsxs","DialogRoot","open","onOpenChange","children","contentClassName","overlayClassName","React","cs","DialogTitleWrapper","className","DialogCloseWrapper","onClick","Dialog","DialogClose","DialogTitle","useAccount","useBalance","useChain","useChains","useDisconnect","getExplorerUrl","useMemo","jsx","ChainIcon","chainIconUrl","chainName","className","cs","Fragment","jsx","jsxs","MainView","onViewChange","onModalClose","address","useAccount","chain","useChain","chains","useChains","disconnectAsync","useDisconnect","balance","useBalance","items","useMemo","chainSelectOptions","ChainIcon","Arrow_default","List_default","getExplorerUrl","normalOptions","Switch_default","handleDisconnect","i","SelectItem","Disconnect_default","children","onClick","cs","useAccount","useAccounts","useActiveConnector","useBalance","useChain","useChains","formatAddress","React","useCallback","jsx","jsxs","SwitchAccountView","onBack","accounts","selectAccount","useAccounts","currentAddress","useAccount","_selectAccount","useCallback","acc","AccountItem","React","isSelected","account","chain","useChain","chains","useChains","address","balance","useBalance","connector","useActiveConnector","cs","formatAddress","useApi","useChain","useChains","useSwitchChain","React","useMemo","useState","Fragment","jsx","jsxs","ChainList","onChainSwitched","className","currentChain","useChain","chains","useChains","switchChainAsync","useSwitchChain","isApiReady","apiError","useApi","switchingChain","setSwitchingChain","useState","searchQuery","setSearchQuery","filteredChains","useMemo","chain","handleChainSelect","error","cs","Search_default","e","ChainItem","React","isSelected","isLoading","onSelect","isSwitching","ChainIcon","jsx","SwitchChainView","onBack","ChainList","Fragment","jsx","jsxs","AccountDetailsModal","isOpen","close","useAccountModal","address","account","useAccount","activeConnector","useActiveConnector","currentView","containerRef","currentViewRef","handleViewChange","resetView","useAnimatedViews","handleModalClose","useCallback","viewTitle","useMemo","SwitchChainView","viewComponents","jsx","MainView","SwitchAccountView","Dialog","jsxs","cs","DialogTitle","formatAddress","Copy","Fragment","Back_default","DialogClose","Close_default","jsx","jsxs","ChainModal","isOpen","close","useChainModal","Dialog","open","DialogTitle","DialogClose","Close_default","ChainList","formatAddress","ConnectionStatus","useAccount","useActiveConnector","useBalance","useChain","useChains","useStatus","useConnectButton","connectionStatus","useStatus","account","address","useAccount","currentChain","useChain","configuredChains","useChains","balance","useBalance","activeConnector","useActiveConnector","openConnectModal","isConnectModalOpen","useConnectModal","openAccountModal","isAccountModalOpen","useAccountModal","openChainModal","isChainModalOpen","useChainModal","isConnecting","ConnectionStatus","isConnected","isDisconnected","isChainSupported","c","useEffect","useState","useWindowSize","windowSize","setWindowSize","useState","useEffect","handleResize","debounce","jsx","jsxs","transitionClassName","ConnectButton","className","label","accountStatus","chainStatus","showBalance","displayPreference","isConnected","isDisconnected","account","balance","openConnectModal","openAccountModal","openChainModal","chainIconUrl","chainName","currentChain","configuredChains","activeConnector","useConnectButton","windowWidth","useWindowSize","isLargeWindow","cs","ChainIcon","formatAddress","useConnect","isMobileDevice","useEffect","useMemo","useState","useConnectors","isMobileDevice","React","useMemo","jsx","jsxs","popularConnectorIds","moreConnectorIds","ConnectOptions","React","onConnect","connectors","useConnectors","isMobileDevice","filteredConnectors","i","ConnectorItem","installedConnectors","c","popularConnectors","moreConnectors","connectorGroup","useMemo","g","cs","connector","React","Cuer","jsx","jsxs","QRCode","logoBackground","uri","size","ARENA_GRID_SIZE","cellSize","arenaSize","arenaStart","arenaEnd","generateSkeletonDots","dots","i","j","cx","cy","renderFinderPattern","position","finderSize","positionStyles","renderArenaLogo","logoStart","useEffect","useRef","jsx","SpiralAnimation","size","dotCount","duration","className","containerRef","useRef","useEffect","DOT_RADIUS","MARGIN","GOLDEN_ANGLE","CENTER","MAX_RADIUS","svgNS","svg","i","idx","frac","r","theta","x","y","circle","animR","animO","cs","Fragment","jsx","jsxs","WalletView","React","selectedConnector","onConnect","qrCode","isWide","connectState","showQRCode","cs","DialogClose","Close_default","QRCode","Copy","transitionClassName","SpiralAnimation","Fragment","jsx","jsxs","ConnectModal","size","isOpen","close","useConnectModal","connectAsync","resetConnect","isConnecting","connectError","useConnect","selectedConnector","setSelectedConnector","useState","qrCode","setQrCode","windowWidth","useWindowSize","isLargeWindow","isWide","containerRef","currentViewRef","resetView","handleViewChange","currentView","useAnimatedViews","onQrCode","connector","uri","handleConnect","isMobileDevice","_onOpenChange","open","viewComponents","useMemo","jsx","ConnectOptions","WalletView","useEffect","Dialog","jsxs","cs","Fragment","DialogTitle","Back_default","DialogClose","Close_default"]}