@algobright/solana-connector 0.1.4 → 0.1.5
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/ConnectButton.js +35 -12
- package/dist/ConnectButton.js.map +1 -1
- package/dist/ConnectButton.mjs +35 -12
- package/dist/ConnectButton.mjs.map +1 -1
- package/dist/{CustomQRCode.module-JW3JU3FX.module.css → CustomQRCode.module-WDQZB2O2.module.css} +0 -18
- package/dist/WalletModal.js +64 -39
- package/dist/WalletModal.js.map +1 -1
- package/dist/WalletModal.mjs +60 -35
- package/dist/WalletModal.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/Spinner.module-BLSWZSIL.module.css +0 -16
package/dist/ConnectButton.js
CHANGED
|
@@ -66,11 +66,40 @@ var Button_default = Button;
|
|
|
66
66
|
var Button_default2 = Button_default;
|
|
67
67
|
|
|
68
68
|
// src/components/shared/Spinner/Spinner.tsx
|
|
69
|
-
var import_Spinner = __toESM(require("./Spinner.module-BLSWZSIL.module.css"));
|
|
70
69
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
71
|
-
var Spinner = () =>
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
var Spinner = () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
71
|
+
"svg",
|
|
72
|
+
{
|
|
73
|
+
width: "1em",
|
|
74
|
+
height: "1em",
|
|
75
|
+
viewBox: "0 0 50 50",
|
|
76
|
+
style: { display: "inline-block", verticalAlign: "middle" },
|
|
77
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
78
|
+
"circle",
|
|
79
|
+
{
|
|
80
|
+
cx: "25",
|
|
81
|
+
cy: "25",
|
|
82
|
+
r: "20",
|
|
83
|
+
fill: "none",
|
|
84
|
+
stroke: "currentColor",
|
|
85
|
+
strokeWidth: "5",
|
|
86
|
+
strokeDasharray: "90, 150",
|
|
87
|
+
strokeLinecap: "round",
|
|
88
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
89
|
+
"animateTransform",
|
|
90
|
+
{
|
|
91
|
+
attributeName: "transform",
|
|
92
|
+
type: "rotate",
|
|
93
|
+
from: "0 25 25",
|
|
94
|
+
to: "360 25 25",
|
|
95
|
+
dur: "0.8s",
|
|
96
|
+
repeatCount: "indefinite"
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
);
|
|
74
103
|
var Spinner_default = Spinner;
|
|
75
104
|
|
|
76
105
|
// src/components/shared/Spinner/index.ts
|
|
@@ -151,7 +180,7 @@ DialogDescription.displayName = "DialogDescription";
|
|
|
151
180
|
// src/components/shared/CustomQRCode/CustomQRCode.tsx
|
|
152
181
|
var import_react3 = require("react");
|
|
153
182
|
var import_qrcode = __toESM(require("qrcode"));
|
|
154
|
-
var import_CustomQRCode = __toESM(require("./CustomQRCode.module-
|
|
183
|
+
var import_CustomQRCode = __toESM(require("./CustomQRCode.module-WDQZB2O2.module.css"));
|
|
155
184
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
156
185
|
function generateMatrix(value, errorCorrectionLevel) {
|
|
157
186
|
const arr = Array.prototype.slice.call(import_qrcode.default.create(value, { errorCorrectionLevel }).modules.data, 0);
|
|
@@ -382,13 +411,7 @@ function QRPlaceholder({
|
|
|
382
411
|
}
|
|
383
412
|
),
|
|
384
413
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: import_CustomQRCode.default.loaderWrapper, children: [
|
|
385
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
386
|
-
"div",
|
|
387
|
-
{
|
|
388
|
-
className: import_CustomQRCode.default.spinner,
|
|
389
|
-
style: { color: `${dotColor}40` }
|
|
390
|
-
}
|
|
391
|
-
),
|
|
414
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Spinner_default2, {}),
|
|
392
415
|
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: import_CustomQRCode.default.loadingText, style: { color: `${dotColor}70` }, children: "Generating QR code..." })
|
|
393
416
|
] })
|
|
394
417
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ConnectButton/index.ts","../src/components/ConnectButton/ConnectButton.tsx","../src/components/shared/Button/Button.tsx","../src/components/shared/Button/index.ts","../src/components/shared/Spinner/Spinner.tsx","../src/components/shared/Spinner/index.ts","../src/components/WalletModal/WalletModal.tsx","../src/components/shared/Dialog/Dialog.tsx","../src/components/shared/CustomQRCode/CustomQRCode.tsx","../src/components/shared/CustomQRCode/index.ts","../src/components/shared/Collapsible/Collapsible.tsx","../src/components/shared/Avatar/Avatar.tsx","../src/components/shared/Avatar/index.ts","../src/components/WalletModal/index.ts","../src/components/shared/Menu/Menu.tsx","../src/components/WalletDropdown/WalletDropdown.tsx","../src/utils/fetchBalance.tsx","../src/components/WalletDropdown/index.ts"],"sourcesContent":["import ConnectButton from \"./ConnectButton\"\nexport default ConnectButton;","\"use client\";\n\nimport { useState } from 'react';\nimport styles from './ConnectButton.module.css';\nimport { useConnector } from '@solana/connector';\nimport Button from '@shared/Button';\nimport Spinner from '@shared/Spinner';\nimport WalletModal from '@WalletModal';\nimport clsx from 'clsx';\nimport { Menu, MenuPopup, MenuPortal, MenuPositioner, MenuTrigger } from '@shared/Menu';\nimport Avatar from '@shared/Avatar';\nimport { ChevronDown } from 'lucide-react';\nimport WalletDropdown from '@WalletDropdown';\n\ninterface ConnectButtonProps {\n /** * The visual theme for the button and modals. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** * Custom Tailwind or CSS class for the main button element. \n * If not passed, standard kit styling is applied.\n */\n CN_ConnectButton?: string;\n\n /** * Custom CSS class for the dropdown menu. \n * If not passed, it defaults to the standard dropdown layout.\n */\n CN_DropdownMenu?: string;\n\n /** * Custom CSS class for the connection modal. \n * This modal displays all wallet options and the QR code for mobile linking.\n */\n CN_Modal?: string;\n\n /** * Initial text shown when the wallet is disconnected. \n * @default \"Connect Wallet\"\n */\n connectText?: string;\n\n /** * Text displayed while the wallet is in the 'connecting' state. \n * @default \"Connecting...\"\n */\n connectingText?: string;\n\n /** * If true, fetches and displays the native SOL balance. \n * @default false\n */\n showSolBalance?: boolean;\n\n /** * If provided, displays a specific SPL token balance (e.g., USDC). \n * If null/undefined, only SOL or no balance is shown.\n */\n showDefaultToken?: {\n address: string;\n symbol: string;\n };\n}\nexport function ConnectButton(props: ConnectButtonProps) {\n const {\n CN_DropdownMenu,\n theme = 'light',\n CN_ConnectButton,\n connectText = \"Connect Wallet\",\n connectingText = \"Connecting...\",\n showSolBalance = false,\n showDefaultToken\n } = props;\n const [isModalOpen, setIsModalOpen] = useState(false);\n const { isConnected, isConnecting, account, connector, walletConnectUri, clearWalletConnectUri } = useConnector();\n\n if (isConnected && account && connector) {\n const shortAddress = `${account.slice(0, 4)}...${account.slice(-4)}`;\n const walletIcon = connector.icon || undefined;\n\n return (\n <Menu >\n <MenuTrigger render={\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-theme={theme}\n className={clsx(styles.connectButton, CN_ConnectButton)}\n >\n <Avatar\n height={20}\n width={20}\n src={walletIcon}\n alt={connector.name}\n theme={theme}\n />\n <span >{shortAddress}</span>\n <ChevronDown size={16} />\n </Button>\n } />\n <MenuPortal>\n <MenuPositioner sideOffset={8} align=\"end\">\n <MenuPopup theme={theme}>\n <WalletDropdown\n CN_DropdownMenu={CN_DropdownMenu}\n allowNetworkSwitch={true}\n theme={theme}\n showSolBalance={showSolBalance}\n showDefaultToken={showDefaultToken}\n />\n </MenuPopup>\n </MenuPositioner>\n </MenuPortal>\n </Menu>\n );\n }\n\n const onOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n if (!open) {\n clearWalletConnectUri();\n }\n };\n\n return (\n <div>\n <Button\n variant='outline'\n size='sm'\n data-theme={theme}\n onClick={() => setIsModalOpen(true)}\n className={clsx(styles.connectButton, CN_ConnectButton)}\n >\n {isConnecting ? (\n <span><Spinner />{connectingText}</span>\n ) : (\n <span>{connectText}</span>\n )}\n </Button>\n\n <WalletModal\n theme={theme}\n open={isModalOpen}\n onOpenChange={onOpenChange}\n />\n\n </div>\n )\n}\n\nexport default ConnectButton","'use client';\n\nimport { forwardRef } from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Button.module.css';\n\n// 1. Define Types\ntype ButtonVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\n// 2. The Component\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\n return (\n <BaseButton\n ref={ref}\n\n className={`${styles.button} ${className || ''}`}\n data-variant={variant}\n data-size={size}\n\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport default Button;","import Button from \"./Button\";\n\nexport default Button;","import classes from './Spinner.module.css'\nconst Spinner = () => {\n return (\n <div className={classes.spinner} />\n )\n}\n\nexport default Spinner","import Spinner from \"./Spinner\";\nexport default Spinner;","import { useConnector, WalletConnectorId, WalletConnectorMetadata } from \"@solana/connector\";\nimport { Check, ChevronLeft, Copy, ExternalLink, Wallet, X } from \"lucide-react\";\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\nimport styles from './WalletModal.module.css';\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from \"@shared/Dialog\";\nimport Button from \"@shared/Button\";\nimport CustomQRCode from \"@shared//CustomQRCode\";\nimport Spinner from \"@shared/Spinner\";\nimport { SiWalletconnect } from \"react-icons/si\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@shared/Collapsible\";\nimport Avatar from \"@shared/Avatar\";\nimport { clsx } from \"clsx\";\n\n/**\n * Props for the WalletModal component.\n * This modal acts as the primary interface for users to select a wallet \n * or scan a QR code for mobile connection.\n */\ntype WalletModalProps = {\n /** * Custom CSS class for the modal overlay and container. \n * If not provided, the component uses the kit's default modal styling.\n */\n CN_Modal?: string;\n\n /** * The visual theme for the modal content. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** Controlled state: whether the modal is currently visible. */\n open: boolean;\n\n /** Callback function to handle opening and closing the modal. */\n onOpenChange: (open: boolean) => void;\n}\n\nexport function WalletModal(props: WalletModalProps) {\n const {\n CN_Modal,\n theme = 'light',\n open,\n onOpenChange,\n } = props;\n\n const { walletConnectUri, clearWalletConnectUri, walletStatus: { status }, isConnecting, connectorId, connectors, connectWallet, disconnectWallet } = useConnector();\n\n const [connectingConnectorId, setConnectingConnectorId] = useState<WalletConnectorId | null>(null);\n const [isOtherWalletsOpen, setIsOtherWalletsOpen] = useState(false);\n const [errorConnectorId, setErrorConnectorId] = useState<WalletConnectorId | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const isClient = useSyncExternalStore(\n () => () => { },\n () => true,\n () => false,\n );\n\n const recentlyConnectedConnectorId = useSyncExternalStore(\n () => () => { },\n () => localStorage.getItem('recentlyConnectedConnectorId') as WalletConnectorId | null,\n () => null\n );\n\n useEffect(() => {\n if (status === 'connected' && connectorId) {\n localStorage.setItem('recentlyConnectedConnectorId', connectorId);\n }\n }, [status, connectorId]);\n\n const walletConnectConnector = connectors.find(c => c.name === 'WalletConnect') ?? null;\n const isWalletConnectFlow =\n (!!walletConnectConnector &&\n (connectingConnectorId === walletConnectConnector.id ||\n (status === 'connecting' && connectorId === walletConnectConnector.id))) ||\n !!walletConnectUri;\n\n function cancelConnection() {\n clearWalletConnectUri?.();\n setConnectingConnectorId(null);\n disconnectWallet().catch(() => { });\n }\n\n // Clear error state when modal closes or user tries another wallet\n const clearError = () => {\n setErrorConnectorId(null);\n setErrorMessage(null);\n };\n\n const handleSelectWallet = async (connector: WalletConnectorMetadata) => {\n clearError();\n setConnectingConnectorId(connector.id);\n try {\n if (connector.name === 'WalletConnect') {\n clearWalletConnectUri?.();\n }\n await connectWallet(connector.id);\n localStorage.setItem('recentlyConnectedConnectorId', connector.id);\n // Don't close modal for WalletConnect - wait for connection\n if (connector.name !== 'WalletConnect') {\n onOpenChange(false);\n }\n } catch (error) {\n // Extract user-friendly error message\n const message = error instanceof Error ? error.message : 'An unexpected error occurred';\n if (message.includes('Connection cancelled')) return;\n\n // Set error state for UI feedback\n setErrorConnectorId(connector.id);\n setErrorMessage(message);\n\n // Log for telemetry/debugging (includes full error details)\n console.error('Failed to connect wallet:', {\n wallet: connector.name,\n connectorId: connector.id,\n error,\n message,\n timestamp: new Date().toISOString(),\n });\n } finally {\n setConnectingConnectorId(null);\n }\n };\n\n const handleCopyUri = async () => {\n if (!walletConnectUri) return;\n try {\n await navigator.clipboard.writeText(walletConnectUri);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy URI:', err);\n }\n };\n\n const handleBackFromWalletConnect = () => {\n cancelConnection();\n };\n\n const readyConnectors = connectors.filter(c => c.ready);\n const notReadyConnectors = connectors.filter(c => !c.ready);\n\n const sortedReadyConnectors = [...readyConnectors].sort((a, b) => {\n const aIsRecent = recentlyConnectedConnectorId === a.id;\n const bIsRecent = recentlyConnectedConnectorId === b.id;\n if (aIsRecent && !bIsRecent) return -1;\n if (!aIsRecent && bIsRecent) return 1;\n return 0;\n });\n\n const primaryWallets = sortedReadyConnectors.slice(0, 3);\n const otherWallets = sortedReadyConnectors.slice(3);\n\n const primayOuterHr = otherWallets.length > 0 && primaryWallets.length > 0;\n\n const getInstallUrl = (walletName: string, walletUrl?: string): string | undefined => {\n if (walletUrl) return walletUrl;\n\n const name = walletName.toLowerCase();\n if (name.includes('phantom')) return 'https://phantom.app';\n if (name.includes('solflare')) return 'https://solflare.com';\n if (name.includes('backpack')) return 'https://backpack.app';\n if (name.includes('glow')) return 'https://glow.app';\n if (name.includes('coinbase')) return 'https://www.coinbase.com/wallet';\n if (name.includes('ledger')) return 'https://www.ledger.com';\n if (name.includes('trust')) return 'https://trustwallet.com';\n if (name.includes('exodus')) return 'https://www.exodus.com';\n return undefined;\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n clearError();\n if (isConnecting || connectingConnectorId || walletConnectUri) {\n cancelConnection();\n }\n }\n onOpenChange(isOpen);\n };\n\n const walletLinkOpen = (walletName: string) => {\n const installUrl = getInstallUrl(walletName);\n if (installUrl) {\n window.open(installUrl, '_blank');\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange} >\n <DialogContent\n showCloseButton={false}\n className={clsx(styles.dialogContent, CN_Modal)}\n theme={theme}\n >\n {/* Header */}\n <div className={styles.dialogHeader}>\n {isWalletConnectFlow ? (\n <button\n onClick={handleBackFromWalletConnect}\n className={styles.iconButton}\n >\n <ChevronLeft />\n </button>\n ) : null}\n <DialogTitle className={styles.dialogTitle}>\n {isWalletConnectFlow ? 'WalletConnect' : 'Connect your wallet'}\n </DialogTitle>\n <DialogClose className={styles.iconButton}>\n <X />\n </DialogClose>\n </div>\n\n {/* WalletConnect QR Code Display */}\n {isWalletConnectFlow && (\n <div className={styles.walletsContainer}>\n <div className={styles.tooltipBubble}>\n <span>Use a WalletConnect</span>\n <div className={styles.tooltipIconWrapper}>\n <SiWalletconnect className={styles.tooltipIcon} />\n <div className={styles.tooltipCaret} />\n </div>\n <span>supported wallet to scan</span>\n </div>\n\n {/* QR Code */}\n <div className={styles.qrWrapper}>\n <CustomQRCode\n value={walletConnectUri ?? ''}\n size={280}\n ecl=\"M\"\n loading={!walletConnectUri}\n scanning={!!walletConnectUri}\n />\n </div>\n\n {/* Copy URI button */}\n <Button\n variant=\"outline\"\n onClick={handleCopyUri}\n disabled={!walletConnectUri}\n className={styles.copyButton}\n data-theme={theme}\n >\n {copied ? (\n <>\n <Check className={`${styles.icon} ${styles.successIcon}`} />\n Copy to Clipboard\n </>\n ) : (\n <>\n <Copy className={styles.icon} />\n Copy to Clipboard\n </>\n )}\n </Button>\n\n </div>\n )}\n\n {!isWalletConnectFlow && (\n <div className={styles.walletsContainer}>\n {/* 1. Loading State (Detecting Wallets) */}\n {!isClient && (\n <div className={styles.detectingWallets}>\n <Spinner />\n <p >Detecting wallets...</p>\n </div>\n )}\n\n {/* 2. Empty State (No Wallets Detected) */}\n {connectors.length === 0 && (\n <div className={styles.emptyStateContainer}>\n <Wallet className={styles.emptyStateIcon} />\n\n <h3 className={styles.emptyStateTitle}>No Wallets Detected</h3>\n\n <p className={styles.emptyStateDesc}>\n Install a Solana wallet extension to get started\n </p>\n\n <div className={styles.emptyStateActions}>\n <Button\n variant=\"outline\"\n data-theme={theme}\n onClick={() => walletLinkOpen('Phantom')}\n >\n Get Phantom\n </Button>\n <Button\n data-theme={theme}\n variant=\"outline\"\n onClick={() => walletLinkOpen('Backpack')}\n >\n Get Backpack\n </Button>\n </div>\n\n\n </div>\n )}\n\n <div className={styles.allWallets}>\n {primaryWallets.map((connector) => (\n <WalletButton\n key={connector.id}\n theme={theme}\n connector={connector}\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\n hasError={errorConnectorId === connector.id}\n isRecent={recentlyConnectedConnectorId === connector.id}\n\n onSelect={() => handleSelectWallet(connector)}\n getInstallUrl={getInstallUrl}\n />\n ))}\n </div>\n\n {otherWallets.length > 0 && (\n <>\n {primayOuterHr && <div className={styles.seprator} />}\n <Collapsible\n open={isOtherWalletsOpen}\n onOpenChange={setIsOtherWalletsOpen}\n className={styles.Collapsible}\n >\n <CollapsibleTrigger className={styles.hiddenExpand}>\n <span className={styles.textContainer}>Other Wallets</span>\n <HiddenWalletIcons wallets={otherWallets} className=\"shrink-0\" />\n </CollapsibleTrigger>\n <CollapsibleContent className={styles.allWallets}>\n {otherWallets.map((connector) => (\n <WalletButton\n key={connector.id}\n theme={theme}\n connector={connector}\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\n hasError={errorConnectorId === connector.id}\n isRecent={recentlyConnectedConnectorId === connector.id}\n onSelect={() => handleSelectWallet(connector)}\n getInstallUrl={getInstallUrl}\n />\n ))}\n </CollapsibleContent>\n </Collapsible>\n </>\n )}\n\n {notReadyConnectors.length > 0 && (\n <>\n {(primaryWallets.length > 0 || otherWallets.length > 0) && (\n <div className={styles.seprator} />\n )}\n\n <div className=\"space-y-2\">\n <h3 className={styles.sectionHeader}>\n {readyConnectors.length > 0 ? 'Unavailable Wallets' : 'Wallets'}\n </h3>\n\n <div className={styles.grid}>\n {notReadyConnectors.slice(0, 3).map((connector) => {\n const installUrl = getInstallUrl(connector.name);\n\n return (\n <div key={connector.id} className={styles.unavailableRow}>\n {/* Left: Icon & Text */}\n <div className={styles.walletInfo}>\n <Avatar\n width={40}\n height={40}\n src={connector.icon}\n alt={connector.name}\n theme={theme}\n />\n <div className=\"text-left\">\n <div className={styles.walletName}>\n {connector.name}\n </div>\n <div className={styles.unavailableLabel}>\n Not available\n </div>\n </div>\n </div>\n\n {/* Right: Install Button */}\n {installUrl && (\n <Button\n data-theme={theme}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.installButton}\n onClick={() => window.open(installUrl, '_blank')}\n >\n <ExternalLink />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n\n\n </div>\n )}\n\n </DialogContent>\n </Dialog >\n )\n\n}\n\nexport default WalletModal\n\n\ninterface WalletItemProps {\n connector: WalletConnectorMetadata;\n isThisConnecting: boolean;\n\n hasError?: boolean;\n isRecent?: boolean;\n theme?: 'light' | 'dark';\n onSelect: () => void;\n getInstallUrl: (walletName: string, walletUrl?: string) => string | undefined;\n}\nfunction WalletButton(props: WalletItemProps) {\n const { connector, isThisConnecting, hasError, isRecent, theme, onSelect, getInstallUrl } = props;\n\n const handleSelectWallet = () => {\n onSelect();\n }\n return (\n <Button\n key={connector.id}\n variant=\"outline\"\n data-error={hasError}\n data-theme={theme}\n className={styles.walletButton}\n onClick={handleSelectWallet}\n disabled={isThisConnecting}\n\n >\n {/* Left Side: Text Info */}\n <div className={styles.textContainer}>\n <div className={styles.nameRow}>\n <span>{connector.name}</span>\n {isRecent && <span className={styles.recentBadge}>Recent</span>}\n </div>\n\n {/* Status Text */}\n {isThisConnecting && (\n <div className={styles.statusText}>Connecting...</div>\n )}\n {hasError && !isThisConnecting && (\n <div className={styles.statusText} data-type=\"error\">\n Click to retry\n </div>\n )}\n </div>\n\n <div className={styles.iconContainer}>\n {isThisConnecting && <Spinner />}\n <Avatar\n width={40}\n height={40}\n src={connector.icon}\n alt={connector.name}\n theme={theme}\n />\n </div>\n\n </Button>\n )\n}\n\ninterface WalletIconSource {\n id: string;\n name: string;\n icon?: string | null;\n}\ninterface HiddenWalletIconsProps {\n wallets: WalletIconSource[];\n maxIcons?: number;\n className?: string;\n}\nexport function HiddenWalletIcons({ wallets, maxIcons = 4, className }: HiddenWalletIconsProps) {\n const previewWallets = wallets.slice(0, maxIcons);\n const placeholderCount = Math.max(0, maxIcons - previewWallets.length);\n\n return (\n <div\n className={`${styles.hiddenWalletGrid} ${className || ''}`}\n aria-hidden=\"true\"\n >\n {/* Render Actual Wallets */}\n {previewWallets.map(wallet => (\n <div\n key={wallet.id}\n className={styles.hiddenWalletIconWrapper}\n >\n {wallet.icon && (\n <img\n height={10}\n width={10}\n src={wallet.icon}\n alt={wallet.name}\n draggable={false}\n onError={(e: any) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n )}\n </div>\n ))}\n\n {Array.from({ length: placeholderCount }).map((_, index) => (\n <div\n key={`placeholder-${index}`}\n className={styles.hiddenWalletIconWrapper}\n />\n ))}\n </div>\n );\n}","'use client';\n\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport { X } from 'lucide-react';\nimport styles from './Dialog.module.css';\nimport clsx from 'clsx';\nimport { forwardRef } from 'react';\n\n// 1. Root Components\nconst Dialog = BaseDialog.Root;\nconst DialogTrigger = BaseDialog.Trigger;\nconst DialogPortal = BaseDialog.Portal;\nconst DialogClose = BaseDialog.Close;\n\n// 2. Backdrop\ntype DialogBackdropProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;\nconst DialogBackdrop = forwardRef<HTMLDivElement, DialogBackdropProps>(\n ({ className, ...props }, ref) => (\n <BaseDialog.Backdrop\n ref={ref}\n className={`${styles.backdrop} ${className || ''}`}\n {...props}\n />\n ),\n);\nDialogBackdrop.displayName = 'DialogBackdrop';\n\n// 3. Content (The Modal Box)\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Popup> & {\n showCloseButton?: boolean;\n theme?: 'light' | 'dark';\n};\nconst DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, theme, showCloseButton = true, ...props }, ref) => (\n <DialogPortal>\n <DialogBackdrop data-theme={theme} />\n <BaseDialog.Popup\n ref={ref}\n data-theme={theme}\n className={clsx(styles.content, className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogClose className={styles.closeButton}>\n <X />\n </DialogClose>\n )}\n </BaseDialog.Popup>\n </DialogPortal>\n )\n);\nDialogContent.displayName = 'DialogContent';\n\n// 4. Header\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={`${styles.header} ${className || ''}`} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\n// 5. Footer\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={`${styles.footer} ${className || ''}`} {...props} />\n);\nDialogFooter.displayName = 'DialogFooter';\n\n// 6. Title\nconst DialogTitle = forwardRef<HTMLHeadingElement, React.ComponentPropsWithoutRef<typeof BaseDialog.Title>>(\n ({ className, ...props }, ref) => (\n <BaseDialog.Title\n ref={ref}\n className={`${styles.title} ${className || ''}`}\n {...props}\n />\n ),\n);\nDialogTitle.displayName = 'DialogTitle';\n\n// 7. Description\nconst DialogDescription = forwardRef<\n HTMLParagraphElement,\n React.ComponentPropsWithoutRef<typeof BaseDialog.Description>\n>(({ className, ...props }, ref) => (\n <BaseDialog.Description\n ref={ref}\n className={`${styles.description} ${className || ''}`}\n {...props}\n />\n));\nDialogDescription.displayName = 'DialogDescription';\n\nexport {\n Dialog,\n DialogPortal,\n DialogBackdrop,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};","'use client';\n\nimport { useMemo, type ReactNode, type CSSProperties } from 'react';\nimport QRCodeUtil from 'qrcode';\nimport styles from './CustomQRCode.module.css';\n\n/**\n * Generate QR code matrix from value\n */\nfunction generateMatrix(value: string, errorCorrectionLevel: 'L' | 'M' | 'Q' | 'H') {\n const arr = Array.prototype.slice.call(QRCodeUtil.create(value, { errorCorrectionLevel }).modules.data, 0);\n const sqrt = Math.sqrt(arr.length);\n return arr.reduce(\n (rows: number[][], key: number, index: number) =>\n (index % sqrt === 0 ? rows.push([key]) : rows[rows.length - 1].push(key)) && rows,\n [] as number[][],\n );\n}\n\ninterface CustomQRCodeProps {\n value: string;\n size?: number;\n ecl?: 'L' | 'M' | 'Q' | 'H';\n clearArea?: boolean;\n image?: ReactNode;\n imageBackground?: string;\n dotColor?: string;\n backgroundColor?: string;\n}\n\n/**\n * QR Code SVG renderer\n */\nfunction QRCodeSVG({\n value,\n size: sizeProp = 200,\n ecl = 'M',\n clearArea = false,\n dotColor = 'currentColor',\n backgroundColor = '#ffffff',\n}: CustomQRCodeProps) {\n const logoSize = clearArea ? 76 : 0;\n const size = sizeProp - 10 * 2; // Account for padding\n\n const dots = useMemo(() => {\n const dots: ReactNode[] = [];\n const matrix = generateMatrix(value, ecl);\n const cellSize = size / matrix.length;\n\n // Finder pattern positions (3 corners)\n const qrList = [\n { x: 0, y: 0 },\n { x: 1, y: 0 },\n { x: 0, y: 1 },\n ];\n\n // Draw rounded finder patterns\n qrList.forEach(({ x, y }) => {\n const x1 = (matrix.length - 7) * cellSize * x;\n const y1 = (matrix.length - 7) * cellSize * y;\n for (let i = 0; i < 3; i++) {\n dots.push(\n <rect\n key={`finder-${i}-${x}-${y}`}\n fill={i % 2 !== 0 ? backgroundColor : dotColor}\n rx={(i - 2) * -5 + (i === 0 ? 2 : 3)}\n ry={(i - 2) * -5 + (i === 0 ? 2 : 3)}\n width={cellSize * (7 - i * 2)}\n height={cellSize * (7 - i * 2)}\n x={x1 + cellSize * i}\n y={y1 + cellSize * i}\n />,\n );\n }\n });\n\n // Calculate center clear area\n const clearArenaSize = Math.floor((logoSize + 25) / cellSize);\n const matrixMiddleStart = matrix.length / 2 - clearArenaSize / 2;\n const matrixMiddleEnd = matrix.length / 2 + clearArenaSize / 2 - 1;\n\n // Draw circular dots for data modules\n matrix.forEach((row: number[], i: number) => {\n row.forEach((_: number, j: number) => {\n if (matrix[i][j]) {\n // Skip dots under finder patterns\n if (!((i < 7 && j < 7) || (i > matrix.length - 8 && j < 7) || (i < 7 && j > matrix.length - 8))) {\n // Skip center area if clearArea is true\n if (\n !clearArea ||\n !(\n i > matrixMiddleStart &&\n i < matrixMiddleEnd &&\n j > matrixMiddleStart &&\n j < matrixMiddleEnd\n )\n ) {\n dots.push(\n <circle\n key={`dot-${i}-${j}`}\n cx={j * cellSize + cellSize / 2}\n cy={i * cellSize + cellSize / 2}\n fill={dotColor}\n r={cellSize / 3}\n />,\n );\n }\n }\n }\n });\n });\n\n return dots;\n }, [value, ecl, size, clearArea, logoSize, dotColor, backgroundColor]);\n\n return (\n <svg\n height={size}\n width={size}\n viewBox={`0 0 ${size} ${size}`}\n className={styles.svgFull}\n style={{ maxWidth: size, maxHeight: size }}\n >\n <rect fill=\"transparent\" height={size} width={size} />\n {dots}\n </svg>\n );\n}\n\n/**\n * Viewfinder corner brackets SVG\n */\nfunction ViewfinderFrame({\n size,\n color = '#2D2D2D',\n opacity = 0.01,\n}: {\n size: number;\n color?: string;\n opacity?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 283 283\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={styles.viewfinder}\n >\n <path\n d=\"M3.5 264.06C3.5 272.587 10.4127 279.5 18.9399 279.5H32.8799C33.7083 279.5 34.3799 280.172 34.3799 281V281C34.3799 281.828 33.7083 282.5 32.8799 282.5H17.4399C8.08427 282.5 0.5 274.916 0.5 265.56V250.12C0.5 249.292 1.17157 248.62 2 248.62V248.62C2.82843 248.62 3.5 249.292 3.5 250.12V264.06ZM282.5 266.058C282.5 275.139 275.139 282.5 266.058 282.5H251.116C250.288 282.5 249.616 281.828 249.616 281V281C249.616 280.172 250.288 279.5 251.116 279.5H264.558C272.81 279.5 279.5 272.81 279.5 264.558V250.12C279.5 249.292 280.172 248.62 281 248.62V248.62C281.828 248.62 282.5 249.292 282.5 250.12V266.058ZM34.3799 2C34.3799 2.82843 33.7083 3.5 32.8799 3.5H18.9399C10.4127 3.5 3.5 10.4127 3.5 18.9399V32.8799C3.5 33.7083 2.82843 34.3799 2 34.3799V34.3799C1.17157 34.3799 0.5 33.7083 0.5 32.8799V17.4399C0.5 8.08427 8.08427 0.5 17.4399 0.5H32.8799C33.7083 0.5 34.3799 1.17157 34.3799 2V2ZM282.5 32.8799C282.5 33.7083 281.828 34.3799 281 34.3799V34.3799C280.172 34.3799 279.5 33.7083 279.5 32.8799V18.4419C279.5 10.1897 272.81 3.5 264.558 3.5H251.116C250.288 3.5 249.616 2.82843 249.616 2V2C249.616 1.17157 250.288 0.5 251.116 0.5H266.058C275.139 0.5 282.5 7.86129 282.5 16.9419V32.8799Z\"\n fill={color}\n fillOpacity={opacity}\n />\n </svg>\n );\n}\n\ninterface CustomQRCodeContainerProps extends CustomQRCodeProps {\n image?: ReactNode;\n imageBackground?: string;\n className?: string;\n style?: CSSProperties;\n loading?: boolean;\n scanning?: boolean;\n error?: boolean;\n frameColor?: string;\n}\n\nexport function CustomQRCode({\n value,\n size = 280,\n ecl = 'M',\n clearArea = false,\n image,\n imageBackground = 'transparent',\n dotColor,\n backgroundColor,\n className,\n style,\n loading = false,\n scanning = true,\n error = false,\n frameColor,\n}: CustomQRCodeContainerProps) {\n const showPlaceholder = loading || !value;\n\n const resolvedBackground = backgroundColor || '#ffffff';\n const resolvedDotColor = dotColor || '#000000';\n const resolvedFrameColor = error ? '#FF0000' : frameColor || '#2D2D2D';\n const frameOpacity = error ? 0.56 : 0.01;\n\n return (\n <div\n className={`${styles.container} ${className || ''}`}\n style={{\n width: size,\n height: size,\n ...style,\n }}\n >\n {/* Viewfinder corner brackets */}\n <ViewfinderFrame size={size} color={resolvedFrameColor} opacity={frameOpacity} />\n\n {/* QR Content Area */}\n <div\n className={styles.contentArea}\n style={{ background: resolvedBackground }}\n data-error={error}\n >\n {/* Gradient glow background */}\n <div className={styles.glow} data-error={error} />\n\n {/* Shine scanning effect */}\n {scanning && !showPlaceholder && !error && (\n <div className={styles.shine} />\n )}\n\n {/* QR Code or placeholder */}\n <div className={styles.qrWrapper}>\n {showPlaceholder ? (\n <QRPlaceholder size={size} dotColor={resolvedDotColor} backgroundColor={resolvedBackground} />\n ) : (\n <>\n <QRCodeSVG\n value={value}\n size={size - 40}\n ecl={ecl}\n clearArea={clearArea || !!image}\n dotColor={resolvedDotColor}\n backgroundColor={resolvedBackground}\n />\n {image && (\n <div\n className={styles.logoWrapper}\n style={{\n width: '28%',\n height: '28%',\n background: imageBackground || resolvedBackground,\n }}\n >\n {image}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction QRPlaceholder({\n size,\n dotColor,\n backgroundColor,\n}: {\n size: number;\n dotColor: string;\n backgroundColor: string;\n}) {\n return (\n <div className={styles.placeholderContainer} style={{ width: size - 40, height: size - 40 }}>\n {/* Dot pattern background */}\n <div\n className={styles.placeholderPattern}\n style={{\n backgroundImage: `radial-gradient(${dotColor} 41%, transparent 41%)`,\n }}\n />\n\n {/* Corner finder pattern placeholders */}\n {[\n { top: 0, left: 0 },\n { top: 0, right: 0 },\n { bottom: 0, left: 0 },\n ].map((pos, i) => (\n <span\n key={i}\n className={styles.cornerSquare}\n style={{\n ...pos,\n background: dotColor,\n }}\n />\n ))}\n\n {/* Center area */}\n <div\n className={styles.centerArea}\n style={{\n background: backgroundColor,\n boxShadow: `0 0 0 7px ${backgroundColor}`,\n }}\n />\n\n {/* Loading spinner */}\n <div className={styles.loaderWrapper}>\n <div\n className={styles.spinner}\n style={{ color: `${dotColor}40` }}\n />\n <span className={styles.loadingText} style={{ color: `${dotColor}70` }}>\n Generating QR code...\n </span>\n </div>\n </div>\n );\n}\n\nCustomQRCode.displayName = 'CustomQRCode';","import { CustomQRCode } from \"./CustomQRCode\";\n\nexport default CustomQRCode;","'use client';\n\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport styles from './Collapsible.module.css';\nimport { forwardRef } from 'react';\n\nconst Collapsible = BaseCollapsible.Root;\nconst CollapsibleTrigger = forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Trigger>\n>(({ className, ...props }, ref) => (\n <BaseCollapsible.Trigger\n ref={ref}\n className={`${styles.trigger} ${className || ''}`}\n {...props}\n />\n));\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nconst CollapsibleContent = forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Panel>\n>(({ className, ...props }, ref) => (\n <BaseCollapsible.Panel\n ref={ref}\n className={`${styles.content} ${className || ''}`}\n {...props}\n />\n));\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };","import { useState } from 'react';\nimport styles from './Avatar.module.css';\nimport { Wallet } from 'lucide-react';\ninterface AvatarProps {\n height?: number | string;\n width?: number | string;\n src?: string;\n alt?: string;\n theme?: 'light' | 'dark';\n}\nexport function Avatar({\n height,\n width,\n src,\n alt,\n theme = 'light',\n}: AvatarProps) {\n const [hasError, setHasError] = useState(false);\n return (\n <div className={styles.avatar} data-theme={theme}>\n {src && !hasError ? (\n <img\n height={height}\n width={width}\n src={src}\n alt={alt || \"Avatar\"}\n onError={() => setHasError(true)}\n />\n ) : (\n <div className={styles.fallback} style={{ height, width }}>\n <Wallet />\n </div>\n )}\n </div>\n );\n}\n","import { Avatar } from './Avatar';\n\nexport default Avatar;","import WalletModal from \"./WalletModal\"\nexport default WalletModal;","'use client';\n\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\nimport styles from './Menu.module.css';\nimport { ComponentPropsWithoutRef, forwardRef } from 'react';\n\n\nconst Menu = BaseMenu.Root;\nconst MenuPortal = BaseMenu.Portal;\nconst MenuGroup = BaseMenu.Group;\n\n// Trigger \ntype MenuTriggerProps = ComponentPropsWithoutRef<typeof BaseMenu.Trigger> & {\n render: React.ReactElement;\n};\nconst MenuTrigger = forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Trigger\n ref={ref}\n className={`${className || ''}`}\n {...props}\n />\n )\n);\nMenuTrigger.displayName = 'MenuTrigger';\n\n// Position of the Popup\ntype MenuPositionerProps = ComponentPropsWithoutRef<typeof BaseMenu.Positioner>;\nconst MenuPositioner = forwardRef<HTMLDivElement, MenuPositionerProps>(\n ({ sideOffset = 8, ...props }, ref) => (\n <BaseMenu.Positioner ref={ref} sideOffset={sideOffset} {...props} />\n )\n);\nMenuPositioner.displayName = 'MenuPositioner';\n\n// Popup\ntype MenuPopupProps = ComponentPropsWithoutRef<typeof BaseMenu.Popup> & {\n theme?: 'light' | 'dark';\n};\nconst MenuPopup = forwardRef<HTMLDivElement, MenuPopupProps>(\n ({ className, theme, ...props }, ref) => (\n <BaseMenu.Popup\n ref={ref}\n data-theme={theme}\n className={`${styles.popup} ${className || ''}`}\n {...props}\n />\n )\n);\nMenuPopup.displayName = 'MenuPopup';\n\n// Item\ntype MenuItemProps = ComponentPropsWithoutRef<typeof BaseMenu.Item>;\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Item\n ref={ref}\n className={`${styles.item} ${className || ''}`}\n {...props}\n />\n )\n);\nMenuItem.displayName = 'MenuItem';\n\n// Separator\ntype MenuSeparatorProps = ComponentPropsWithoutRef<typeof BaseMenu.Separator>;\nconst MenuSeparator = forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Separator ref={ref} className={`${styles.separator} ${className || ''}`} {...props} />\n )\n);\nMenuSeparator.displayName = 'MenuSeparator';\n\n// Group Label\ntype MenuGroupLabelProps = ComponentPropsWithoutRef<typeof BaseMenu.GroupLabel>;\nconst MenuGroupLabel = forwardRef<HTMLDivElement, MenuGroupLabelProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.GroupLabel ref={ref} className={`${styles.groupLabel} ${className || ''}`} {...props} />\n )\n);\nMenuGroupLabel.displayName = 'MenuGroupLabel';\n\nexport { Menu, MenuTrigger, MenuPortal, MenuPositioner, MenuPopup, MenuItem, MenuSeparator, MenuGroup, MenuGroupLabel };","import { useEffect, useRef, useState } from 'react'\nimport { isAddress } from '@solana/kit';\nimport styles from './WalletDropdown.module.css'\nimport { motion } from 'motion/react';\nimport Avatar from '@shared/Avatar';\nimport { Check, ChevronLeft, Copy, Globe, LogOut, RefreshCw } from 'lucide-react';\nimport Button from '@shared/Button';\nimport { ClusterElement, DisconnectElement, useConnector, useConnectorClient } from '@solana/connector';\nimport { clsx } from 'clsx';\nimport { getSolBalance, getTokenBalance } from 'src/utils/fetchBalance';\n\n/**\n * Props for the WalletDropdown component.\n */\ninterface WalletDropdownProps {\n /** * Custom CSS class for the dropdown menu container. \n * If not passed, the component uses default absolute positioning.\n */\n CN_DropdownMenu?: string;\n\n /** * Visual theme for the dropdown items. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** * Enables the option to switch between Solana clusters. \n * @default true\n */\n allowNetworkSwitch?: boolean;\n\n /** * Displays the user's SOL balance inside the dropdown header. \n * @default true\n */\n showSolBalance?: boolean;\n\n /** * Configuration to display a specific SPL token balance. \n * If not provided, this defaults to false (hidden).\n */\n showDefaultToken?: {\n address: string;\n symbol: string;\n } | undefined;\n}\n\ntype DropdownView = 'wallet' | 'network';\n\nconst networkColor: Record<string, string> = {\n 'solana:mainnet': '#00c950',\n 'solana:devnet': '#2b7fff',\n 'solana:testnet': '#f0b100',\n 'solana:localnet': '#ff3b3b',\n};\n\nexport function WalletDropdown(props: WalletDropdownProps) {\n const client = useConnectorClient();\n\n const { CN_DropdownMenu,\n theme = 'light',\n allowNetworkSwitch = true,\n showSolBalance = true,\n showDefaultToken\n } = props\n\n const [view, setView] = useState<DropdownView>('wallet');\n const [copied, setCopied] = useState(false);\n\n const { account, connector } = useConnector();\n const fetchingSolBalance = useRef(false);\n const [isFetchingBalance, setIsFetchingBalance] = useState(false);\n\n const fetchingDefaultToken = useRef(false);\n const [isFetchingDefaultTokenBalance, setIsFetchingDefaultTokenBalance] = useState(false);\n\n const [solBalance, setSolBalance] = useState<number | null>(null);\n const [defaultTokenBalance, setDefaultTokenBalance] = useState<number | null>(null);\n\n const selectedAccount = account || '';\n const walletName = connector?.name || 'Unknown Wallet';\n const walletIcon = connector?.icon || undefined;\n const shortAddress = `${selectedAccount.slice(0, 4)}...${selectedAccount.slice(-4)}`;\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(selectedAccount);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n setCopied(false);\n console.error('Failed to copy to clipboard:', error);\n }\n }\n\n async function fetchSolBalance() {\n if (!client || fetchingSolBalance.current) return;\n setIsFetchingBalance(true);\n fetchingSolBalance.current = true;\n\n const solBalance = await getSolBalance(client, selectedAccount);\n setSolBalance(solBalance);\n\n setIsFetchingBalance(false);\n fetchingSolBalance.current = false;\n }\n\n async function fetchDefaultTokenBalance() {\n if (!showDefaultToken || !showDefaultToken.address || !client || fetchingDefaultToken.current) return;\n\n const isValidAddress = isAddress(showDefaultToken.address);\n if (!isValidAddress) {\n console.error('Invalid default token address:', showDefaultToken);\n return\n }\n\n setIsFetchingDefaultTokenBalance(true);\n fetchingDefaultToken.current = true;\n\n const tokenBalance = await getTokenBalance(client, selectedAccount, showDefaultToken.address);\n setDefaultTokenBalance(tokenBalance);\n\n setIsFetchingDefaultTokenBalance(false);\n fetchingDefaultToken.current = false;\n }\n\n useEffect(() => {\n if (showSolBalance && selectedAccount && client) {\n fetchSolBalance();\n }\n if (showDefaultToken && selectedAccount && client) {\n fetchDefaultTokenBalance();\n }\n }, [selectedAccount, client, showSolBalance, showDefaultToken]);\n\n if (view === 'wallet') {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className={clsx(styles.WalletDropdown, CN_DropdownMenu)}\n data-theme={theme}\n >\n {/* Header with Avatar and Address */}\n <div className={styles.Header}>\n <div className={styles.addressAndAvatar}>\n <Avatar\n width={48}\n height={48}\n src={walletIcon}\n alt={walletName}\n />\n <div className={styles.address}>\n <span className={styles.shortAddress}>{shortAddress}</span>\n <span className={styles.walletName}>{walletName}</span>\n </div>\n </div>\n\n <div className={styles.actions}>\n <Button\n type=\"button\"\n onClick={handleCopy}\n variant=\"outline\"\n size=\"icon\"\n className=\"rounded-full\"\n title={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ?\n <Check className={styles.checkIcon} /> :\n <Copy />\n }\n </Button>\n\n {/* Network Selector Globe Button */}\n {allowNetworkSwitch && (\n <ClusterElement\n render={({ cluster }) => (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setView('network')}\n title={`Network: ${cluster?.label || 'Unknown'}`}\n >\n <Globe />\n <span\n className={styles.networkIndicator}\n style={{ background: networkColor[cluster?.id || 'solana:mainnet'] }}\n />\n </Button>\n )}\n />\n )}\n </div>\n </div>\n\n {showSolBalance && (\n <div className={styles.balanceSection}>\n <div\n className={styles.balanceHeader}\n >\n <span className={styles.balanceLabel}>Balance</span>\n <button\n onClick={() => fetchSolBalance()}\n disabled={isFetchingBalance}\n title=\"Refresh balance\"\n className={styles.refreshButton}\n data-loading={isFetchingBalance}\n >\n <RefreshCw\n className={styles.refreshIcon}\n />\n </button>\n </div>\n <div className={styles.balanceValue} title={String(solBalance) || \"0\"}>\n {isFetchingBalance ? (\n <div className={styles.balanceLoading} />\n ) : solBalance !== null ? (\n `${solBalance.toFixed(4)} SOL`\n ) : (\n '-- SOL'\n )}\n </div>\n </div>\n )}\n\n {showDefaultToken && (\n <div className={styles.balanceSection}>\n <div\n className={styles.balanceHeader}\n >\n <span className={styles.balanceLabel}>Balance</span>\n <button\n onClick={() => fetchDefaultTokenBalance()}\n disabled={isFetchingDefaultTokenBalance}\n title=\"Refresh balance\"\n className={styles.refreshButton}\n data-loading={isFetchingDefaultTokenBalance}\n >\n <RefreshCw\n className={styles.refreshIcon}\n />\n </button>\n </div>\n <div className={styles.balanceValue} title={String(defaultTokenBalance) || \"0\"}>\n {isFetchingDefaultTokenBalance ? (\n <div className={styles.balanceLoading} />\n ) : defaultTokenBalance !== null ? (\n `${defaultTokenBalance.toFixed(4)} ${showDefaultToken?.symbol || ''}`\n ) : (\n `-- ${showDefaultToken?.symbol || ''}`\n )}\n </div>\n </div>\n )}\n\n <DisconnectElement\n render={({ disconnect, disconnecting }) => (\n <Button\n variant=\"default\"\n className={styles.disconnectButton}\n onClick={disconnect}\n disabled={disconnecting}\n >\n <LogOut className={styles.disconnectIcon} />\n {disconnecting ? 'Disconnecting...' : 'Disconnect'}\n </Button>\n )}\n />\n </motion.div>\n )\n }\n\n //network switch view\n if (view === 'network') {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className={clsx(styles.WalletDropdown, CN_DropdownMenu)}\n data-theme={theme}\n >\n {/* Header */}\n <div className={styles.NetworkHeader}>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setView('wallet')}\n title={`Network: Back to Wallet`}\n className={styles.backButton}\n >\n <ChevronLeft />\n </Button>\n <span>Network Settings</span>\n </div>\n\n {/* Network Options */}\n <ClusterElement\n render={({ cluster, clusters, setCluster }) => {\n const currentClusterId = (cluster as { id?: string })?.id || 'solana:mainnet';\n return (\n <div className={styles.networkOptions}>\n {clusters.map((network) => {\n const isSelected = currentClusterId === network.id;\n return (\n <div\n key={network.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setCluster(network.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setCluster(network.id);\n }\n }}\n className={styles.networkButton}\n >\n <div className={styles.networkName}>\n <span\n className={styles.networkColor}\n style={{ background: networkColor[network.id] }}\n />\n <span className={styles.networkLabel}>{network.label}</span>\n </div>\n <div className={styles.checkMark} data-selected={isSelected}>\n {isSelected && <Check />}\n </div>\n </div>\n );\n })}\n </div>\n );\n }}\n />\n </motion.div>\n )\n }\n}\n\nexport default WalletDropdown","import { findAssociatedTokenPda } from \"@solana-program/token\";\nimport { address, ConnectorClient, lamportsToSol } from \"@solana/connector\";\nimport { createSolanaRpc } from \"@solana/kit\";\n\nexport async function getSolBalance(\n client: ConnectorClient,\n pubkey: string\n): Promise<number> {\n let balance = 0;\n try {\n const rpcUrl = client.getRpcUrl();\n if (!rpcUrl) {\n console.error(\"RPC URL is not available from the ConnectorClient.\");\n return 0;\n }\n const pubkeyAddress = address(pubkey);\n const rpc = createSolanaRpc(rpcUrl);\n const balanceResponse = await rpc.getBalance(pubkeyAddress).send();\n balance = lamportsToSol(balanceResponse.value);\n } catch (error) {\n console.error(\"Error fetching SOL balance:\", error);\n } finally {\n return balance;\n }\n}\n\nexport async function getTokenBalance(\n client: ConnectorClient,\n pubkey: string,\n mintAddress: string\n): Promise<number> {\n let balance = 0;\n try {\n const rpcUrl = client.getRpcUrl();\n if (!rpcUrl) {\n console.error(\"RPC URL is not available from the ConnectorClient.\");\n return 0;\n }\n const pubkeyAddress = address(pubkey);\n const mintPubkey = address(mintAddress);\n const rpc = createSolanaRpc(rpcUrl);\n\n const mintInfo = await rpc.getAccountInfo(\n mintPubkey,\n { encoding: \"base64\" }\n ).send();\n\n const ownerProgram = mintInfo.value?.owner;\n if (!ownerProgram) {\n throw new Error('Failed to fetch mint account info');\n }\n const tokenProgram = address(ownerProgram)\n const [tokenPDA] = await findAssociatedTokenPda({\n mint: mintPubkey,\n owner: pubkeyAddress,\n tokenProgram: tokenProgram\n });\n const tokenBalance = await rpc.getTokenAccountBalance(tokenPDA).send();\n if (tokenBalance.value) {\n balance = parseFloat(tokenBalance.value.uiAmountString);\n }\n } catch (error) {\n // console.error(\"Error fetching token balance:\", error);\n } finally {\n return balance;\n }\n}","import WalletDropdown from './WalletDropdown';\n\n\nexport default WalletDropdown"],"mappings":"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","names":["ConnectButton_default","import_react","import_connector","BaseButton","styles","Button_default","import_jsx_runtime","classes","Spinner_default","import_lucide_react","import_react","import_react","import_jsx_runtime","BaseDialog","styles","clsx","import_react","import_jsx_runtime","QRCodeUtil","dots","styles","import_react","import_jsx_runtime","BaseCollapsible","styles","import_react","import_lucide_react","import_jsx_runtime","styles","import_clsx","import_jsx_runtime","styles","Button_default","Spinner_default","WalletModal_default","import_clsx","import_react","import_jsx_runtime","BaseMenu","styles","import_lucide_react","import_react","import_kit","import_lucide_react","import_connector","import_clsx","import_connector","import_jsx_runtime","solBalance","styles","Button_default","WalletDropdown_default","import_jsx_runtime","Button_default","clsx","styles","WalletDropdown_default","Spinner_default","WalletModal_default","ConnectButton_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ConnectButton/index.ts","../src/components/ConnectButton/ConnectButton.tsx","../src/components/shared/Button/Button.tsx","../src/components/shared/Button/index.ts","../src/components/shared/Spinner/Spinner.tsx","../src/components/shared/Spinner/index.ts","../src/components/WalletModal/WalletModal.tsx","../src/components/shared/Dialog/Dialog.tsx","../src/components/shared/CustomQRCode/CustomQRCode.tsx","../src/components/shared/CustomQRCode/index.ts","../src/components/shared/Collapsible/Collapsible.tsx","../src/components/shared/Avatar/Avatar.tsx","../src/components/shared/Avatar/index.ts","../src/components/WalletModal/index.ts","../src/components/shared/Menu/Menu.tsx","../src/components/WalletDropdown/WalletDropdown.tsx","../src/utils/fetchBalance.tsx","../src/components/WalletDropdown/index.ts"],"sourcesContent":["import ConnectButton from \"./ConnectButton\"\nexport default ConnectButton;","\"use client\";\n\nimport { useState } from 'react';\nimport styles from './ConnectButton.module.css';\nimport { useConnector } from '@solana/connector';\nimport Button from '@shared/Button';\nimport Spinner from '@shared/Spinner';\nimport WalletModal from '@WalletModal';\nimport clsx from 'clsx';\nimport { Menu, MenuPopup, MenuPortal, MenuPositioner, MenuTrigger } from '@shared/Menu';\nimport Avatar from '@shared/Avatar';\nimport { ChevronDown } from 'lucide-react';\nimport WalletDropdown from '@WalletDropdown';\n\ninterface ConnectButtonProps {\n /** * The visual theme for the button and modals. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** * Custom Tailwind or CSS class for the main button element. \n * If not passed, standard kit styling is applied.\n */\n CN_ConnectButton?: string;\n\n /** * Custom CSS class for the dropdown menu. \n * If not passed, it defaults to the standard dropdown layout.\n */\n CN_DropdownMenu?: string;\n\n /** * Custom CSS class for the connection modal. \n * This modal displays all wallet options and the QR code for mobile linking.\n */\n CN_Modal?: string;\n\n /** * Initial text shown when the wallet is disconnected. \n * @default \"Connect Wallet\"\n */\n connectText?: string;\n\n /** * Text displayed while the wallet is in the 'connecting' state. \n * @default \"Connecting...\"\n */\n connectingText?: string;\n\n /** * If true, fetches and displays the native SOL balance. \n * @default false\n */\n showSolBalance?: boolean;\n\n /** * If provided, displays a specific SPL token balance (e.g., USDC). \n * If null/undefined, only SOL or no balance is shown.\n */\n showDefaultToken?: {\n address: string;\n symbol: string;\n };\n}\nexport function ConnectButton(props: ConnectButtonProps) {\n const {\n CN_DropdownMenu,\n theme = 'light',\n CN_ConnectButton,\n connectText = \"Connect Wallet\",\n connectingText = \"Connecting...\",\n showSolBalance = false,\n showDefaultToken\n } = props;\n const [isModalOpen, setIsModalOpen] = useState(false);\n const { isConnected, isConnecting, account, connector, walletConnectUri, clearWalletConnectUri } = useConnector();\n\n if (isConnected && account && connector) {\n const shortAddress = `${account.slice(0, 4)}...${account.slice(-4)}`;\n const walletIcon = connector.icon || undefined;\n\n return (\n <Menu >\n <MenuTrigger render={\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-theme={theme}\n className={clsx(styles.connectButton, CN_ConnectButton)}\n >\n <Avatar\n height={20}\n width={20}\n src={walletIcon}\n alt={connector.name}\n theme={theme}\n />\n <span >{shortAddress}</span>\n <ChevronDown size={16} />\n </Button>\n } />\n <MenuPortal>\n <MenuPositioner sideOffset={8} align=\"end\">\n <MenuPopup theme={theme}>\n <WalletDropdown\n CN_DropdownMenu={CN_DropdownMenu}\n allowNetworkSwitch={true}\n theme={theme}\n showSolBalance={showSolBalance}\n showDefaultToken={showDefaultToken}\n />\n </MenuPopup>\n </MenuPositioner>\n </MenuPortal>\n </Menu>\n );\n }\n\n const onOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n if (!open) {\n clearWalletConnectUri();\n }\n };\n\n return (\n <div>\n <Button\n variant='outline'\n size='sm'\n data-theme={theme}\n onClick={() => setIsModalOpen(true)}\n className={clsx(styles.connectButton, CN_ConnectButton)}\n >\n {isConnecting ? (\n <span><Spinner />{connectingText}</span>\n ) : (\n <span>{connectText}</span>\n )}\n </Button>\n\n <WalletModal\n theme={theme}\n open={isModalOpen}\n onOpenChange={onOpenChange}\n />\n\n </div>\n )\n}\n\nexport default ConnectButton","'use client';\n\nimport { forwardRef } from 'react';\nimport { Button as BaseButton } from '@base-ui/react/button';\nimport styles from './Button.module.css';\n\n// 1. Define Types\ntype ButtonVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\n// 2. The Component\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\n return (\n <BaseButton\n ref={ref}\n\n className={`${styles.button} ${className || ''}`}\n data-variant={variant}\n data-size={size}\n\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport default Button;","import Button from \"./Button\";\n\nexport default Button;","const Spinner = () => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 50 50\"\n style={{ display: 'inline-block', verticalAlign: 'middle' }}\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"5\"\n strokeDasharray=\"90, 150\"\n strokeLinecap=\"round\"\n >\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 25 25\"\n to=\"360 25 25\"\n dur=\"0.8s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n);\nexport default Spinner","import Spinner from \"./Spinner\";\nexport default Spinner;","import { useConnector, WalletConnectorId, WalletConnectorMetadata } from \"@solana/connector\";\nimport { Check, ChevronLeft, Copy, ExternalLink, Wallet, X } from \"lucide-react\";\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\nimport styles from './WalletModal.module.css';\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from \"@shared/Dialog\";\nimport Button from \"@shared/Button\";\nimport CustomQRCode from \"@shared//CustomQRCode\";\nimport Spinner from \"@shared/Spinner\";\nimport { SiWalletconnect } from \"react-icons/si\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@shared/Collapsible\";\nimport Avatar from \"@shared/Avatar\";\nimport { clsx } from \"clsx\";\n\n/**\n * Props for the WalletModal component.\n * This modal acts as the primary interface for users to select a wallet \n * or scan a QR code for mobile connection.\n */\ntype WalletModalProps = {\n /** * Custom CSS class for the modal overlay and container. \n * If not provided, the component uses the kit's default modal styling.\n */\n CN_Modal?: string;\n\n /** * The visual theme for the modal content. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** Controlled state: whether the modal is currently visible. */\n open: boolean;\n\n /** Callback function to handle opening and closing the modal. */\n onOpenChange: (open: boolean) => void;\n}\n\nexport function WalletModal(props: WalletModalProps) {\n const {\n CN_Modal,\n theme = 'light',\n open,\n onOpenChange,\n } = props;\n\n const { walletConnectUri, clearWalletConnectUri, walletStatus: { status }, isConnecting, connectorId, connectors, connectWallet, disconnectWallet } = useConnector();\n\n const [connectingConnectorId, setConnectingConnectorId] = useState<WalletConnectorId | null>(null);\n const [isOtherWalletsOpen, setIsOtherWalletsOpen] = useState(false);\n const [errorConnectorId, setErrorConnectorId] = useState<WalletConnectorId | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const isClient = useSyncExternalStore(\n () => () => { },\n () => true,\n () => false,\n );\n\n const recentlyConnectedConnectorId = useSyncExternalStore(\n () => () => { },\n () => localStorage.getItem('recentlyConnectedConnectorId') as WalletConnectorId | null,\n () => null\n );\n\n useEffect(() => {\n if (status === 'connected' && connectorId) {\n localStorage.setItem('recentlyConnectedConnectorId', connectorId);\n }\n }, [status, connectorId]);\n\n const walletConnectConnector = connectors.find(c => c.name === 'WalletConnect') ?? null;\n const isWalletConnectFlow =\n (!!walletConnectConnector &&\n (connectingConnectorId === walletConnectConnector.id ||\n (status === 'connecting' && connectorId === walletConnectConnector.id))) ||\n !!walletConnectUri;\n\n function cancelConnection() {\n clearWalletConnectUri?.();\n setConnectingConnectorId(null);\n disconnectWallet().catch(() => { });\n }\n\n // Clear error state when modal closes or user tries another wallet\n const clearError = () => {\n setErrorConnectorId(null);\n setErrorMessage(null);\n };\n\n const handleSelectWallet = async (connector: WalletConnectorMetadata) => {\n clearError();\n setConnectingConnectorId(connector.id);\n try {\n if (connector.name === 'WalletConnect') {\n clearWalletConnectUri?.();\n }\n await connectWallet(connector.id);\n localStorage.setItem('recentlyConnectedConnectorId', connector.id);\n // Don't close modal for WalletConnect - wait for connection\n if (connector.name !== 'WalletConnect') {\n onOpenChange(false);\n }\n } catch (error) {\n // Extract user-friendly error message\n const message = error instanceof Error ? error.message : 'An unexpected error occurred';\n if (message.includes('Connection cancelled')) return;\n\n // Set error state for UI feedback\n setErrorConnectorId(connector.id);\n setErrorMessage(message);\n\n // Log for telemetry/debugging (includes full error details)\n console.error('Failed to connect wallet:', {\n wallet: connector.name,\n connectorId: connector.id,\n error,\n message,\n timestamp: new Date().toISOString(),\n });\n } finally {\n setConnectingConnectorId(null);\n }\n };\n\n const handleCopyUri = async () => {\n if (!walletConnectUri) return;\n try {\n await navigator.clipboard.writeText(walletConnectUri);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy URI:', err);\n }\n };\n\n const handleBackFromWalletConnect = () => {\n cancelConnection();\n };\n\n const readyConnectors = connectors.filter(c => c.ready);\n const notReadyConnectors = connectors.filter(c => !c.ready);\n\n const sortedReadyConnectors = [...readyConnectors].sort((a, b) => {\n const aIsRecent = recentlyConnectedConnectorId === a.id;\n const bIsRecent = recentlyConnectedConnectorId === b.id;\n if (aIsRecent && !bIsRecent) return -1;\n if (!aIsRecent && bIsRecent) return 1;\n return 0;\n });\n\n const primaryWallets = sortedReadyConnectors.slice(0, 3);\n const otherWallets = sortedReadyConnectors.slice(3);\n\n const primayOuterHr = otherWallets.length > 0 && primaryWallets.length > 0;\n\n const getInstallUrl = (walletName: string, walletUrl?: string): string | undefined => {\n if (walletUrl) return walletUrl;\n\n const name = walletName.toLowerCase();\n if (name.includes('phantom')) return 'https://phantom.app';\n if (name.includes('solflare')) return 'https://solflare.com';\n if (name.includes('backpack')) return 'https://backpack.app';\n if (name.includes('glow')) return 'https://glow.app';\n if (name.includes('coinbase')) return 'https://www.coinbase.com/wallet';\n if (name.includes('ledger')) return 'https://www.ledger.com';\n if (name.includes('trust')) return 'https://trustwallet.com';\n if (name.includes('exodus')) return 'https://www.exodus.com';\n return undefined;\n };\n\n const handleOpenChange = (isOpen: boolean) => {\n if (!isOpen) {\n clearError();\n if (isConnecting || connectingConnectorId || walletConnectUri) {\n cancelConnection();\n }\n }\n onOpenChange(isOpen);\n };\n\n const walletLinkOpen = (walletName: string) => {\n const installUrl = getInstallUrl(walletName);\n if (installUrl) {\n window.open(installUrl, '_blank');\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange} >\n <DialogContent\n showCloseButton={false}\n className={clsx(styles.dialogContent, CN_Modal)}\n theme={theme}\n >\n {/* Header */}\n <div className={styles.dialogHeader}>\n {isWalletConnectFlow ? (\n <button\n onClick={handleBackFromWalletConnect}\n className={styles.iconButton}\n >\n <ChevronLeft />\n </button>\n ) : null}\n <DialogTitle className={styles.dialogTitle}>\n {isWalletConnectFlow ? 'WalletConnect' : 'Connect your wallet'}\n </DialogTitle>\n <DialogClose className={styles.iconButton}>\n <X />\n </DialogClose>\n </div>\n\n {/* WalletConnect QR Code Display */}\n {isWalletConnectFlow && (\n <div className={styles.walletsContainer}>\n <div className={styles.tooltipBubble}>\n <span>Use a WalletConnect</span>\n <div className={styles.tooltipIconWrapper}>\n <SiWalletconnect className={styles.tooltipIcon} />\n <div className={styles.tooltipCaret} />\n </div>\n <span>supported wallet to scan</span>\n </div>\n\n {/* QR Code */}\n <div className={styles.qrWrapper}>\n <CustomQRCode\n value={walletConnectUri ?? ''}\n size={280}\n ecl=\"M\"\n loading={!walletConnectUri}\n scanning={!!walletConnectUri}\n />\n </div>\n\n {/* Copy URI button */}\n <Button\n variant=\"outline\"\n onClick={handleCopyUri}\n disabled={!walletConnectUri}\n className={styles.copyButton}\n data-theme={theme}\n >\n {copied ? (\n <>\n <Check className={`${styles.icon} ${styles.successIcon}`} />\n Copy to Clipboard\n </>\n ) : (\n <>\n <Copy className={styles.icon} />\n Copy to Clipboard\n </>\n )}\n </Button>\n\n </div>\n )}\n\n {!isWalletConnectFlow && (\n <div className={styles.walletsContainer}>\n {/* 1. Loading State (Detecting Wallets) */}\n {!isClient && (\n <div className={styles.detectingWallets}>\n <Spinner />\n <p >Detecting wallets...</p>\n </div>\n )}\n\n {/* 2. Empty State (No Wallets Detected) */}\n {connectors.length === 0 && (\n <div className={styles.emptyStateContainer}>\n <Wallet className={styles.emptyStateIcon} />\n\n <h3 className={styles.emptyStateTitle}>No Wallets Detected</h3>\n\n <p className={styles.emptyStateDesc}>\n Install a Solana wallet extension to get started\n </p>\n\n <div className={styles.emptyStateActions}>\n <Button\n variant=\"outline\"\n data-theme={theme}\n onClick={() => walletLinkOpen('Phantom')}\n >\n Get Phantom\n </Button>\n <Button\n data-theme={theme}\n variant=\"outline\"\n onClick={() => walletLinkOpen('Backpack')}\n >\n Get Backpack\n </Button>\n </div>\n\n\n </div>\n )}\n\n <div className={styles.allWallets}>\n {primaryWallets.map((connector) => (\n <WalletButton\n key={connector.id}\n theme={theme}\n connector={connector}\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\n hasError={errorConnectorId === connector.id}\n isRecent={recentlyConnectedConnectorId === connector.id}\n\n onSelect={() => handleSelectWallet(connector)}\n getInstallUrl={getInstallUrl}\n />\n ))}\n </div>\n\n {otherWallets.length > 0 && (\n <>\n {primayOuterHr && <div className={styles.seprator} />}\n <Collapsible\n open={isOtherWalletsOpen}\n onOpenChange={setIsOtherWalletsOpen}\n className={styles.Collapsible}\n >\n <CollapsibleTrigger className={styles.hiddenExpand}>\n <span className={styles.textContainer}>Other Wallets</span>\n <HiddenWalletIcons wallets={otherWallets} className=\"shrink-0\" />\n </CollapsibleTrigger>\n <CollapsibleContent className={styles.allWallets}>\n {otherWallets.map((connector) => (\n <WalletButton\n key={connector.id}\n theme={theme}\n connector={connector}\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\n hasError={errorConnectorId === connector.id}\n isRecent={recentlyConnectedConnectorId === connector.id}\n onSelect={() => handleSelectWallet(connector)}\n getInstallUrl={getInstallUrl}\n />\n ))}\n </CollapsibleContent>\n </Collapsible>\n </>\n )}\n\n {notReadyConnectors.length > 0 && (\n <>\n {(primaryWallets.length > 0 || otherWallets.length > 0) && (\n <div className={styles.seprator} />\n )}\n\n <div className=\"space-y-2\">\n <h3 className={styles.sectionHeader}>\n {readyConnectors.length > 0 ? 'Unavailable Wallets' : 'Wallets'}\n </h3>\n\n <div className={styles.grid}>\n {notReadyConnectors.slice(0, 3).map((connector) => {\n const installUrl = getInstallUrl(connector.name);\n\n return (\n <div key={connector.id} className={styles.unavailableRow}>\n {/* Left: Icon & Text */}\n <div className={styles.walletInfo}>\n <Avatar\n width={40}\n height={40}\n src={connector.icon}\n alt={connector.name}\n theme={theme}\n />\n <div className=\"text-left\">\n <div className={styles.walletName}>\n {connector.name}\n </div>\n <div className={styles.unavailableLabel}>\n Not available\n </div>\n </div>\n </div>\n\n {/* Right: Install Button */}\n {installUrl && (\n <Button\n data-theme={theme}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.installButton}\n onClick={() => window.open(installUrl, '_blank')}\n >\n <ExternalLink />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n\n\n </div>\n )}\n\n </DialogContent>\n </Dialog >\n )\n\n}\n\nexport default WalletModal\n\n\ninterface WalletItemProps {\n connector: WalletConnectorMetadata;\n isThisConnecting: boolean;\n\n hasError?: boolean;\n isRecent?: boolean;\n theme?: 'light' | 'dark';\n onSelect: () => void;\n getInstallUrl: (walletName: string, walletUrl?: string) => string | undefined;\n}\nfunction WalletButton(props: WalletItemProps) {\n const { connector, isThisConnecting, hasError, isRecent, theme, onSelect, getInstallUrl } = props;\n\n const handleSelectWallet = () => {\n onSelect();\n }\n return (\n <Button\n key={connector.id}\n variant=\"outline\"\n data-error={hasError}\n data-theme={theme}\n className={styles.walletButton}\n onClick={handleSelectWallet}\n disabled={isThisConnecting}\n\n >\n {/* Left Side: Text Info */}\n <div className={styles.textContainer}>\n <div className={styles.nameRow}>\n <span>{connector.name}</span>\n {isRecent && <span className={styles.recentBadge}>Recent</span>}\n </div>\n\n {/* Status Text */}\n {isThisConnecting && (\n <div className={styles.statusText}>Connecting...</div>\n )}\n {hasError && !isThisConnecting && (\n <div className={styles.statusText} data-type=\"error\">\n Click to retry\n </div>\n )}\n </div>\n\n <div className={styles.iconContainer}>\n {isThisConnecting && <Spinner />}\n <Avatar\n width={40}\n height={40}\n src={connector.icon}\n alt={connector.name}\n theme={theme}\n />\n </div>\n\n </Button>\n )\n}\n\ninterface WalletIconSource {\n id: string;\n name: string;\n icon?: string | null;\n}\ninterface HiddenWalletIconsProps {\n wallets: WalletIconSource[];\n maxIcons?: number;\n className?: string;\n}\nexport function HiddenWalletIcons({ wallets, maxIcons = 4, className }: HiddenWalletIconsProps) {\n const previewWallets = wallets.slice(0, maxIcons);\n const placeholderCount = Math.max(0, maxIcons - previewWallets.length);\n\n return (\n <div\n className={`${styles.hiddenWalletGrid} ${className || ''}`}\n aria-hidden=\"true\"\n >\n {/* Render Actual Wallets */}\n {previewWallets.map(wallet => (\n <div\n key={wallet.id}\n className={styles.hiddenWalletIconWrapper}\n >\n {wallet.icon && (\n <img\n height={10}\n width={10}\n src={wallet.icon}\n alt={wallet.name}\n draggable={false}\n onError={(e: any) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n )}\n </div>\n ))}\n\n {Array.from({ length: placeholderCount }).map((_, index) => (\n <div\n key={`placeholder-${index}`}\n className={styles.hiddenWalletIconWrapper}\n />\n ))}\n </div>\n );\n}","'use client';\n\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport { X } from 'lucide-react';\nimport styles from './Dialog.module.css';\nimport clsx from 'clsx';\nimport { forwardRef } from 'react';\n\n// 1. Root Components\nconst Dialog = BaseDialog.Root;\nconst DialogTrigger = BaseDialog.Trigger;\nconst DialogPortal = BaseDialog.Portal;\nconst DialogClose = BaseDialog.Close;\n\n// 2. Backdrop\ntype DialogBackdropProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;\nconst DialogBackdrop = forwardRef<HTMLDivElement, DialogBackdropProps>(\n ({ className, ...props }, ref) => (\n <BaseDialog.Backdrop\n ref={ref}\n className={`${styles.backdrop} ${className || ''}`}\n {...props}\n />\n ),\n);\nDialogBackdrop.displayName = 'DialogBackdrop';\n\n// 3. Content (The Modal Box)\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Popup> & {\n showCloseButton?: boolean;\n theme?: 'light' | 'dark';\n};\nconst DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, theme, showCloseButton = true, ...props }, ref) => (\n <DialogPortal>\n <DialogBackdrop data-theme={theme} />\n <BaseDialog.Popup\n ref={ref}\n data-theme={theme}\n className={clsx(styles.content, className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogClose className={styles.closeButton}>\n <X />\n </DialogClose>\n )}\n </BaseDialog.Popup>\n </DialogPortal>\n )\n);\nDialogContent.displayName = 'DialogContent';\n\n// 4. Header\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={`${styles.header} ${className || ''}`} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\n// 5. Footer\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={`${styles.footer} ${className || ''}`} {...props} />\n);\nDialogFooter.displayName = 'DialogFooter';\n\n// 6. Title\nconst DialogTitle = forwardRef<HTMLHeadingElement, React.ComponentPropsWithoutRef<typeof BaseDialog.Title>>(\n ({ className, ...props }, ref) => (\n <BaseDialog.Title\n ref={ref}\n className={`${styles.title} ${className || ''}`}\n {...props}\n />\n ),\n);\nDialogTitle.displayName = 'DialogTitle';\n\n// 7. Description\nconst DialogDescription = forwardRef<\n HTMLParagraphElement,\n React.ComponentPropsWithoutRef<typeof BaseDialog.Description>\n>(({ className, ...props }, ref) => (\n <BaseDialog.Description\n ref={ref}\n className={`${styles.description} ${className || ''}`}\n {...props}\n />\n));\nDialogDescription.displayName = 'DialogDescription';\n\nexport {\n Dialog,\n DialogPortal,\n DialogBackdrop,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};","'use client';\n\nimport { useMemo, type ReactNode, type CSSProperties } from 'react';\nimport QRCodeUtil from 'qrcode';\nimport styles from './CustomQRCode.module.css';\nimport Spinner from '@shared/Spinner';\n\n/**\n * Generate QR code matrix from value\n */\nfunction generateMatrix(value: string, errorCorrectionLevel: 'L' | 'M' | 'Q' | 'H') {\n const arr = Array.prototype.slice.call(QRCodeUtil.create(value, { errorCorrectionLevel }).modules.data, 0);\n const sqrt = Math.sqrt(arr.length);\n return arr.reduce(\n (rows: number[][], key: number, index: number) =>\n (index % sqrt === 0 ? rows.push([key]) : rows[rows.length - 1].push(key)) && rows,\n [] as number[][],\n );\n}\n\ninterface CustomQRCodeProps {\n value: string;\n size?: number;\n ecl?: 'L' | 'M' | 'Q' | 'H';\n clearArea?: boolean;\n image?: ReactNode;\n imageBackground?: string;\n dotColor?: string;\n backgroundColor?: string;\n}\n\n/**\n * QR Code SVG renderer\n */\nfunction QRCodeSVG({\n value,\n size: sizeProp = 200,\n ecl = 'M',\n clearArea = false,\n dotColor = 'currentColor',\n backgroundColor = '#ffffff',\n}: CustomQRCodeProps) {\n const logoSize = clearArea ? 76 : 0;\n const size = sizeProp - 10 * 2; // Account for padding\n\n const dots = useMemo(() => {\n const dots: ReactNode[] = [];\n const matrix = generateMatrix(value, ecl);\n const cellSize = size / matrix.length;\n\n // Finder pattern positions (3 corners)\n const qrList = [\n { x: 0, y: 0 },\n { x: 1, y: 0 },\n { x: 0, y: 1 },\n ];\n\n // Draw rounded finder patterns\n qrList.forEach(({ x, y }) => {\n const x1 = (matrix.length - 7) * cellSize * x;\n const y1 = (matrix.length - 7) * cellSize * y;\n for (let i = 0; i < 3; i++) {\n dots.push(\n <rect\n key={`finder-${i}-${x}-${y}`}\n fill={i % 2 !== 0 ? backgroundColor : dotColor}\n rx={(i - 2) * -5 + (i === 0 ? 2 : 3)}\n ry={(i - 2) * -5 + (i === 0 ? 2 : 3)}\n width={cellSize * (7 - i * 2)}\n height={cellSize * (7 - i * 2)}\n x={x1 + cellSize * i}\n y={y1 + cellSize * i}\n />,\n );\n }\n });\n\n // Calculate center clear area\n const clearArenaSize = Math.floor((logoSize + 25) / cellSize);\n const matrixMiddleStart = matrix.length / 2 - clearArenaSize / 2;\n const matrixMiddleEnd = matrix.length / 2 + clearArenaSize / 2 - 1;\n\n // Draw circular dots for data modules\n matrix.forEach((row: number[], i: number) => {\n row.forEach((_: number, j: number) => {\n if (matrix[i][j]) {\n // Skip dots under finder patterns\n if (!((i < 7 && j < 7) || (i > matrix.length - 8 && j < 7) || (i < 7 && j > matrix.length - 8))) {\n // Skip center area if clearArea is true\n if (\n !clearArea ||\n !(\n i > matrixMiddleStart &&\n i < matrixMiddleEnd &&\n j > matrixMiddleStart &&\n j < matrixMiddleEnd\n )\n ) {\n dots.push(\n <circle\n key={`dot-${i}-${j}`}\n cx={j * cellSize + cellSize / 2}\n cy={i * cellSize + cellSize / 2}\n fill={dotColor}\n r={cellSize / 3}\n />,\n );\n }\n }\n }\n });\n });\n\n return dots;\n }, [value, ecl, size, clearArea, logoSize, dotColor, backgroundColor]);\n\n return (\n <svg\n height={size}\n width={size}\n viewBox={`0 0 ${size} ${size}`}\n className={styles.svgFull}\n style={{ maxWidth: size, maxHeight: size }}\n >\n <rect fill=\"transparent\" height={size} width={size} />\n {dots}\n </svg>\n );\n}\n\n/**\n * Viewfinder corner brackets SVG\n */\nfunction ViewfinderFrame({\n size,\n color = '#2D2D2D',\n opacity = 0.01,\n}: {\n size: number;\n color?: string;\n opacity?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 283 283\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={styles.viewfinder}\n >\n <path\n d=\"M3.5 264.06C3.5 272.587 10.4127 279.5 18.9399 279.5H32.8799C33.7083 279.5 34.3799 280.172 34.3799 281V281C34.3799 281.828 33.7083 282.5 32.8799 282.5H17.4399C8.08427 282.5 0.5 274.916 0.5 265.56V250.12C0.5 249.292 1.17157 248.62 2 248.62V248.62C2.82843 248.62 3.5 249.292 3.5 250.12V264.06ZM282.5 266.058C282.5 275.139 275.139 282.5 266.058 282.5H251.116C250.288 282.5 249.616 281.828 249.616 281V281C249.616 280.172 250.288 279.5 251.116 279.5H264.558C272.81 279.5 279.5 272.81 279.5 264.558V250.12C279.5 249.292 280.172 248.62 281 248.62V248.62C281.828 248.62 282.5 249.292 282.5 250.12V266.058ZM34.3799 2C34.3799 2.82843 33.7083 3.5 32.8799 3.5H18.9399C10.4127 3.5 3.5 10.4127 3.5 18.9399V32.8799C3.5 33.7083 2.82843 34.3799 2 34.3799V34.3799C1.17157 34.3799 0.5 33.7083 0.5 32.8799V17.4399C0.5 8.08427 8.08427 0.5 17.4399 0.5H32.8799C33.7083 0.5 34.3799 1.17157 34.3799 2V2ZM282.5 32.8799C282.5 33.7083 281.828 34.3799 281 34.3799V34.3799C280.172 34.3799 279.5 33.7083 279.5 32.8799V18.4419C279.5 10.1897 272.81 3.5 264.558 3.5H251.116C250.288 3.5 249.616 2.82843 249.616 2V2C249.616 1.17157 250.288 0.5 251.116 0.5H266.058C275.139 0.5 282.5 7.86129 282.5 16.9419V32.8799Z\"\n fill={color}\n fillOpacity={opacity}\n />\n </svg>\n );\n}\n\ninterface CustomQRCodeContainerProps extends CustomQRCodeProps {\n image?: ReactNode;\n imageBackground?: string;\n className?: string;\n style?: CSSProperties;\n loading?: boolean;\n scanning?: boolean;\n error?: boolean;\n frameColor?: string;\n}\n\nexport function CustomQRCode({\n value,\n size = 280,\n ecl = 'M',\n clearArea = false,\n image,\n imageBackground = 'transparent',\n dotColor,\n backgroundColor,\n className,\n style,\n loading = false,\n scanning = true,\n error = false,\n frameColor,\n}: CustomQRCodeContainerProps) {\n const showPlaceholder = loading || !value;\n\n const resolvedBackground = backgroundColor || '#ffffff';\n const resolvedDotColor = dotColor || '#000000';\n const resolvedFrameColor = error ? '#FF0000' : frameColor || '#2D2D2D';\n const frameOpacity = error ? 0.56 : 0.01;\n\n return (\n <div\n className={`${styles.container} ${className || ''}`}\n style={{\n width: size,\n height: size,\n ...style,\n }}\n >\n {/* Viewfinder corner brackets */}\n <ViewfinderFrame size={size} color={resolvedFrameColor} opacity={frameOpacity} />\n\n {/* QR Content Area */}\n <div\n className={styles.contentArea}\n style={{ background: resolvedBackground }}\n data-error={error}\n >\n {/* Gradient glow background */}\n <div className={styles.glow} data-error={error} />\n\n {/* Shine scanning effect */}\n {scanning && !showPlaceholder && !error && (\n <div className={styles.shine} />\n )}\n\n {/* QR Code or placeholder */}\n <div className={styles.qrWrapper}>\n {showPlaceholder ? (\n <QRPlaceholder size={size} dotColor={resolvedDotColor} backgroundColor={resolvedBackground} />\n ) : (\n <>\n <QRCodeSVG\n value={value}\n size={size - 40}\n ecl={ecl}\n clearArea={clearArea || !!image}\n dotColor={resolvedDotColor}\n backgroundColor={resolvedBackground}\n />\n {image && (\n <div\n className={styles.logoWrapper}\n style={{\n width: '28%',\n height: '28%',\n background: imageBackground || resolvedBackground,\n }}\n >\n {image}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction QRPlaceholder({\n size,\n dotColor,\n backgroundColor,\n}: {\n size: number;\n dotColor: string;\n backgroundColor: string;\n}) {\n return (\n <div className={styles.placeholderContainer} style={{ width: size - 40, height: size - 40 }}>\n {/* Dot pattern background */}\n <div\n className={styles.placeholderPattern}\n style={{\n backgroundImage: `radial-gradient(${dotColor} 41%, transparent 41%)`,\n }}\n />\n\n {/* Corner finder pattern placeholders */}\n {[\n { top: 0, left: 0 },\n { top: 0, right: 0 },\n { bottom: 0, left: 0 },\n ].map((pos, i) => (\n <span\n key={i}\n className={styles.cornerSquare}\n style={{\n ...pos,\n background: dotColor,\n }}\n />\n ))}\n\n {/* Center area */}\n <div\n className={styles.centerArea}\n style={{\n background: backgroundColor,\n boxShadow: `0 0 0 7px ${backgroundColor}`,\n }}\n />\n\n {/* Loading spinner */}\n <div className={styles.loaderWrapper}>\n <Spinner />\n <span className={styles.loadingText} style={{ color: `${dotColor}70` }}>\n Generating QR code...\n </span>\n </div>\n </div>\n );\n}\n\nCustomQRCode.displayName = 'CustomQRCode';","import { CustomQRCode } from \"./CustomQRCode\";\n\nexport default CustomQRCode;","'use client';\n\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\nimport styles from './Collapsible.module.css';\nimport { forwardRef } from 'react';\n\nconst Collapsible = BaseCollapsible.Root;\nconst CollapsibleTrigger = forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Trigger>\n>(({ className, ...props }, ref) => (\n <BaseCollapsible.Trigger\n ref={ref}\n className={`${styles.trigger} ${className || ''}`}\n {...props}\n />\n));\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nconst CollapsibleContent = forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Panel>\n>(({ className, ...props }, ref) => (\n <BaseCollapsible.Panel\n ref={ref}\n className={`${styles.content} ${className || ''}`}\n {...props}\n />\n));\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };","import { useState } from 'react';\nimport styles from './Avatar.module.css';\nimport { Wallet } from 'lucide-react';\ninterface AvatarProps {\n height?: number | string;\n width?: number | string;\n src?: string;\n alt?: string;\n theme?: 'light' | 'dark';\n}\nexport function Avatar({\n height,\n width,\n src,\n alt,\n theme = 'light',\n}: AvatarProps) {\n const [hasError, setHasError] = useState(false);\n return (\n <div className={styles.avatar} data-theme={theme}>\n {src && !hasError ? (\n <img\n height={height}\n width={width}\n src={src}\n alt={alt || \"Avatar\"}\n onError={() => setHasError(true)}\n />\n ) : (\n <div className={styles.fallback} style={{ height, width }}>\n <Wallet />\n </div>\n )}\n </div>\n );\n}\n","import { Avatar } from './Avatar';\n\nexport default Avatar;","import WalletModal from \"./WalletModal\"\nexport default WalletModal;","'use client';\n\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\nimport styles from './Menu.module.css';\nimport { ComponentPropsWithoutRef, forwardRef } from 'react';\n\n\nconst Menu = BaseMenu.Root;\nconst MenuPortal = BaseMenu.Portal;\nconst MenuGroup = BaseMenu.Group;\n\n// Trigger \ntype MenuTriggerProps = ComponentPropsWithoutRef<typeof BaseMenu.Trigger> & {\n render: React.ReactElement;\n};\nconst MenuTrigger = forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Trigger\n ref={ref}\n className={`${className || ''}`}\n {...props}\n />\n )\n);\nMenuTrigger.displayName = 'MenuTrigger';\n\n// Position of the Popup\ntype MenuPositionerProps = ComponentPropsWithoutRef<typeof BaseMenu.Positioner>;\nconst MenuPositioner = forwardRef<HTMLDivElement, MenuPositionerProps>(\n ({ sideOffset = 8, ...props }, ref) => (\n <BaseMenu.Positioner ref={ref} sideOffset={sideOffset} {...props} />\n )\n);\nMenuPositioner.displayName = 'MenuPositioner';\n\n// Popup\ntype MenuPopupProps = ComponentPropsWithoutRef<typeof BaseMenu.Popup> & {\n theme?: 'light' | 'dark';\n};\nconst MenuPopup = forwardRef<HTMLDivElement, MenuPopupProps>(\n ({ className, theme, ...props }, ref) => (\n <BaseMenu.Popup\n ref={ref}\n data-theme={theme}\n className={`${styles.popup} ${className || ''}`}\n {...props}\n />\n )\n);\nMenuPopup.displayName = 'MenuPopup';\n\n// Item\ntype MenuItemProps = ComponentPropsWithoutRef<typeof BaseMenu.Item>;\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Item\n ref={ref}\n className={`${styles.item} ${className || ''}`}\n {...props}\n />\n )\n);\nMenuItem.displayName = 'MenuItem';\n\n// Separator\ntype MenuSeparatorProps = ComponentPropsWithoutRef<typeof BaseMenu.Separator>;\nconst MenuSeparator = forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.Separator ref={ref} className={`${styles.separator} ${className || ''}`} {...props} />\n )\n);\nMenuSeparator.displayName = 'MenuSeparator';\n\n// Group Label\ntype MenuGroupLabelProps = ComponentPropsWithoutRef<typeof BaseMenu.GroupLabel>;\nconst MenuGroupLabel = forwardRef<HTMLDivElement, MenuGroupLabelProps>(\n ({ className, ...props }, ref) => (\n <BaseMenu.GroupLabel ref={ref} className={`${styles.groupLabel} ${className || ''}`} {...props} />\n )\n);\nMenuGroupLabel.displayName = 'MenuGroupLabel';\n\nexport { Menu, MenuTrigger, MenuPortal, MenuPositioner, MenuPopup, MenuItem, MenuSeparator, MenuGroup, MenuGroupLabel };","import { useEffect, useRef, useState } from 'react'\nimport { isAddress } from '@solana/kit';\nimport styles from './WalletDropdown.module.css'\nimport { motion } from 'motion/react';\nimport Avatar from '@shared/Avatar';\nimport { Check, ChevronLeft, Copy, Globe, LogOut, RefreshCw } from 'lucide-react';\nimport Button from '@shared/Button';\nimport { ClusterElement, DisconnectElement, useConnector, useConnectorClient } from '@solana/connector';\nimport { clsx } from 'clsx';\nimport { getSolBalance, getTokenBalance } from 'src/utils/fetchBalance';\n\n/**\n * Props for the WalletDropdown component.\n */\ninterface WalletDropdownProps {\n /** * Custom CSS class for the dropdown menu container. \n * If not passed, the component uses default absolute positioning.\n */\n CN_DropdownMenu?: string;\n\n /** * Visual theme for the dropdown items. \n * @default 'light'\n */\n theme?: 'light' | 'dark';\n\n /** * Enables the option to switch between Solana clusters. \n * @default true\n */\n allowNetworkSwitch?: boolean;\n\n /** * Displays the user's SOL balance inside the dropdown header. \n * @default true\n */\n showSolBalance?: boolean;\n\n /** * Configuration to display a specific SPL token balance. \n * If not provided, this defaults to false (hidden).\n */\n showDefaultToken?: {\n address: string;\n symbol: string;\n } | undefined;\n}\n\ntype DropdownView = 'wallet' | 'network';\n\nconst networkColor: Record<string, string> = {\n 'solana:mainnet': '#00c950',\n 'solana:devnet': '#2b7fff',\n 'solana:testnet': '#f0b100',\n 'solana:localnet': '#ff3b3b',\n};\n\nexport function WalletDropdown(props: WalletDropdownProps) {\n const client = useConnectorClient();\n\n const { CN_DropdownMenu,\n theme = 'light',\n allowNetworkSwitch = true,\n showSolBalance = true,\n showDefaultToken\n } = props\n\n const [view, setView] = useState<DropdownView>('wallet');\n const [copied, setCopied] = useState(false);\n\n const { account, connector } = useConnector();\n const fetchingSolBalance = useRef(false);\n const [isFetchingBalance, setIsFetchingBalance] = useState(false);\n\n const fetchingDefaultToken = useRef(false);\n const [isFetchingDefaultTokenBalance, setIsFetchingDefaultTokenBalance] = useState(false);\n\n const [solBalance, setSolBalance] = useState<number | null>(null);\n const [defaultTokenBalance, setDefaultTokenBalance] = useState<number | null>(null);\n\n const selectedAccount = account || '';\n const walletName = connector?.name || 'Unknown Wallet';\n const walletIcon = connector?.icon || undefined;\n const shortAddress = `${selectedAccount.slice(0, 4)}...${selectedAccount.slice(-4)}`;\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(selectedAccount);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n setCopied(false);\n console.error('Failed to copy to clipboard:', error);\n }\n }\n\n async function fetchSolBalance() {\n if (!client || fetchingSolBalance.current) return;\n setIsFetchingBalance(true);\n fetchingSolBalance.current = true;\n\n const solBalance = await getSolBalance(client, selectedAccount);\n setSolBalance(solBalance);\n\n setIsFetchingBalance(false);\n fetchingSolBalance.current = false;\n }\n\n async function fetchDefaultTokenBalance() {\n if (!showDefaultToken || !showDefaultToken.address || !client || fetchingDefaultToken.current) return;\n\n const isValidAddress = isAddress(showDefaultToken.address);\n if (!isValidAddress) {\n console.error('Invalid default token address:', showDefaultToken);\n return\n }\n\n setIsFetchingDefaultTokenBalance(true);\n fetchingDefaultToken.current = true;\n\n const tokenBalance = await getTokenBalance(client, selectedAccount, showDefaultToken.address);\n setDefaultTokenBalance(tokenBalance);\n\n setIsFetchingDefaultTokenBalance(false);\n fetchingDefaultToken.current = false;\n }\n\n useEffect(() => {\n if (showSolBalance && selectedAccount && client) {\n fetchSolBalance();\n }\n if (showDefaultToken && selectedAccount && client) {\n fetchDefaultTokenBalance();\n }\n }, [selectedAccount, client, showSolBalance, showDefaultToken]);\n\n if (view === 'wallet') {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className={clsx(styles.WalletDropdown, CN_DropdownMenu)}\n data-theme={theme}\n >\n {/* Header with Avatar and Address */}\n <div className={styles.Header}>\n <div className={styles.addressAndAvatar}>\n <Avatar\n width={48}\n height={48}\n src={walletIcon}\n alt={walletName}\n />\n <div className={styles.address}>\n <span className={styles.shortAddress}>{shortAddress}</span>\n <span className={styles.walletName}>{walletName}</span>\n </div>\n </div>\n\n <div className={styles.actions}>\n <Button\n type=\"button\"\n onClick={handleCopy}\n variant=\"outline\"\n size=\"icon\"\n className=\"rounded-full\"\n title={copied ? 'Copied!' : 'Copy address'}\n >\n {copied ?\n <Check className={styles.checkIcon} /> :\n <Copy />\n }\n </Button>\n\n {/* Network Selector Globe Button */}\n {allowNetworkSwitch && (\n <ClusterElement\n render={({ cluster }) => (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setView('network')}\n title={`Network: ${cluster?.label || 'Unknown'}`}\n >\n <Globe />\n <span\n className={styles.networkIndicator}\n style={{ background: networkColor[cluster?.id || 'solana:mainnet'] }}\n />\n </Button>\n )}\n />\n )}\n </div>\n </div>\n\n {showSolBalance && (\n <div className={styles.balanceSection}>\n <div\n className={styles.balanceHeader}\n >\n <span className={styles.balanceLabel}>Balance</span>\n <button\n onClick={() => fetchSolBalance()}\n disabled={isFetchingBalance}\n title=\"Refresh balance\"\n className={styles.refreshButton}\n data-loading={isFetchingBalance}\n >\n <RefreshCw\n className={styles.refreshIcon}\n />\n </button>\n </div>\n <div className={styles.balanceValue} title={String(solBalance) || \"0\"}>\n {isFetchingBalance ? (\n <div className={styles.balanceLoading} />\n ) : solBalance !== null ? (\n `${solBalance.toFixed(4)} SOL`\n ) : (\n '-- SOL'\n )}\n </div>\n </div>\n )}\n\n {showDefaultToken && (\n <div className={styles.balanceSection}>\n <div\n className={styles.balanceHeader}\n >\n <span className={styles.balanceLabel}>Balance</span>\n <button\n onClick={() => fetchDefaultTokenBalance()}\n disabled={isFetchingDefaultTokenBalance}\n title=\"Refresh balance\"\n className={styles.refreshButton}\n data-loading={isFetchingDefaultTokenBalance}\n >\n <RefreshCw\n className={styles.refreshIcon}\n />\n </button>\n </div>\n <div className={styles.balanceValue} title={String(defaultTokenBalance) || \"0\"}>\n {isFetchingDefaultTokenBalance ? (\n <div className={styles.balanceLoading} />\n ) : defaultTokenBalance !== null ? (\n `${defaultTokenBalance.toFixed(4)} ${showDefaultToken?.symbol || ''}`\n ) : (\n `-- ${showDefaultToken?.symbol || ''}`\n )}\n </div>\n </div>\n )}\n\n <DisconnectElement\n render={({ disconnect, disconnecting }) => (\n <Button\n variant=\"default\"\n className={styles.disconnectButton}\n onClick={disconnect}\n disabled={disconnecting}\n >\n <LogOut className={styles.disconnectIcon} />\n {disconnecting ? 'Disconnecting...' : 'Disconnect'}\n </Button>\n )}\n />\n </motion.div>\n )\n }\n\n //network switch view\n if (view === 'network') {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className={clsx(styles.WalletDropdown, CN_DropdownMenu)}\n data-theme={theme}\n >\n {/* Header */}\n <div className={styles.NetworkHeader}>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setView('wallet')}\n title={`Network: Back to Wallet`}\n className={styles.backButton}\n >\n <ChevronLeft />\n </Button>\n <span>Network Settings</span>\n </div>\n\n {/* Network Options */}\n <ClusterElement\n render={({ cluster, clusters, setCluster }) => {\n const currentClusterId = (cluster as { id?: string })?.id || 'solana:mainnet';\n return (\n <div className={styles.networkOptions}>\n {clusters.map((network) => {\n const isSelected = currentClusterId === network.id;\n return (\n <div\n key={network.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setCluster(network.id)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setCluster(network.id);\n }\n }}\n className={styles.networkButton}\n >\n <div className={styles.networkName}>\n <span\n className={styles.networkColor}\n style={{ background: networkColor[network.id] }}\n />\n <span className={styles.networkLabel}>{network.label}</span>\n </div>\n <div className={styles.checkMark} data-selected={isSelected}>\n {isSelected && <Check />}\n </div>\n </div>\n );\n })}\n </div>\n );\n }}\n />\n </motion.div>\n )\n }\n}\n\nexport default WalletDropdown","import { findAssociatedTokenPda } from \"@solana-program/token\";\nimport { address, ConnectorClient, lamportsToSol } from \"@solana/connector\";\nimport { createSolanaRpc } from \"@solana/kit\";\n\nexport async function getSolBalance(\n client: ConnectorClient,\n pubkey: string\n): Promise<number> {\n let balance = 0;\n try {\n const rpcUrl = client.getRpcUrl();\n if (!rpcUrl) {\n console.error(\"RPC URL is not available from the ConnectorClient.\");\n return 0;\n }\n const pubkeyAddress = address(pubkey);\n const rpc = createSolanaRpc(rpcUrl);\n const balanceResponse = await rpc.getBalance(pubkeyAddress).send();\n balance = lamportsToSol(balanceResponse.value);\n } catch (error) {\n console.error(\"Error fetching SOL balance:\", error);\n } finally {\n return balance;\n }\n}\n\nexport async function getTokenBalance(\n client: ConnectorClient,\n pubkey: string,\n mintAddress: string\n): Promise<number> {\n let balance = 0;\n try {\n const rpcUrl = client.getRpcUrl();\n if (!rpcUrl) {\n console.error(\"RPC URL is not available from the ConnectorClient.\");\n return 0;\n }\n const pubkeyAddress = address(pubkey);\n const mintPubkey = address(mintAddress);\n const rpc = createSolanaRpc(rpcUrl);\n\n const mintInfo = await rpc.getAccountInfo(\n mintPubkey,\n { encoding: \"base64\" }\n ).send();\n\n const ownerProgram = mintInfo.value?.owner;\n if (!ownerProgram) {\n throw new Error('Failed to fetch mint account info');\n }\n const tokenProgram = address(ownerProgram)\n const [tokenPDA] = await findAssociatedTokenPda({\n mint: mintPubkey,\n owner: pubkeyAddress,\n tokenProgram: tokenProgram\n });\n const tokenBalance = await rpc.getTokenAccountBalance(tokenPDA).send();\n if (tokenBalance.value) {\n balance = parseFloat(tokenBalance.value.uiAmountString);\n }\n } catch (error) {\n // console.error(\"Error fetching token balance:\", error);\n } finally {\n return balance;\n }\n}","import WalletDropdown from './WalletDropdown';\n\n\nexport default WalletDropdown"],"mappings":"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","names":["ConnectButton_default","import_react","import_connector","BaseButton","styles","Button_default","import_jsx_runtime","Spinner_default","import_lucide_react","import_react","import_react","import_jsx_runtime","BaseDialog","styles","clsx","import_react","import_jsx_runtime","QRCodeUtil","dots","styles","Spinner_default","import_react","import_jsx_runtime","BaseCollapsible","styles","import_react","import_lucide_react","import_jsx_runtime","styles","import_clsx","import_jsx_runtime","styles","Button_default","Spinner_default","WalletModal_default","import_clsx","import_react","import_jsx_runtime","BaseMenu","styles","import_lucide_react","import_react","import_kit","import_lucide_react","import_connector","import_clsx","import_connector","import_jsx_runtime","solBalance","styles","Button_default","WalletDropdown_default","import_jsx_runtime","Button_default","clsx","styles","WalletDropdown_default","Spinner_default","WalletModal_default","ConnectButton_default"]}
|
package/dist/ConnectButton.mjs
CHANGED
|
@@ -31,11 +31,40 @@ var Button_default = Button;
|
|
|
31
31
|
var Button_default2 = Button_default;
|
|
32
32
|
|
|
33
33
|
// src/components/shared/Spinner/Spinner.tsx
|
|
34
|
-
import classes from "./Spinner.module-BLSWZSIL.module.css";
|
|
35
34
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
36
|
-
var Spinner = () =>
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
var Spinner = () => /* @__PURE__ */ jsx2(
|
|
36
|
+
"svg",
|
|
37
|
+
{
|
|
38
|
+
width: "1em",
|
|
39
|
+
height: "1em",
|
|
40
|
+
viewBox: "0 0 50 50",
|
|
41
|
+
style: { display: "inline-block", verticalAlign: "middle" },
|
|
42
|
+
children: /* @__PURE__ */ jsx2(
|
|
43
|
+
"circle",
|
|
44
|
+
{
|
|
45
|
+
cx: "25",
|
|
46
|
+
cy: "25",
|
|
47
|
+
r: "20",
|
|
48
|
+
fill: "none",
|
|
49
|
+
stroke: "currentColor",
|
|
50
|
+
strokeWidth: "5",
|
|
51
|
+
strokeDasharray: "90, 150",
|
|
52
|
+
strokeLinecap: "round",
|
|
53
|
+
children: /* @__PURE__ */ jsx2(
|
|
54
|
+
"animateTransform",
|
|
55
|
+
{
|
|
56
|
+
attributeName: "transform",
|
|
57
|
+
type: "rotate",
|
|
58
|
+
from: "0 25 25",
|
|
59
|
+
to: "360 25 25",
|
|
60
|
+
dur: "0.8s",
|
|
61
|
+
repeatCount: "indefinite"
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
);
|
|
39
68
|
var Spinner_default = Spinner;
|
|
40
69
|
|
|
41
70
|
// src/components/shared/Spinner/index.ts
|
|
@@ -116,7 +145,7 @@ DialogDescription.displayName = "DialogDescription";
|
|
|
116
145
|
// src/components/shared/CustomQRCode/CustomQRCode.tsx
|
|
117
146
|
import { useMemo } from "react";
|
|
118
147
|
import QRCodeUtil from "qrcode";
|
|
119
|
-
import styles3 from "./CustomQRCode.module-
|
|
148
|
+
import styles3 from "./CustomQRCode.module-WDQZB2O2.module.css";
|
|
120
149
|
import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
121
150
|
function generateMatrix(value, errorCorrectionLevel) {
|
|
122
151
|
const arr = Array.prototype.slice.call(QRCodeUtil.create(value, { errorCorrectionLevel }).modules.data, 0);
|
|
@@ -347,13 +376,7 @@ function QRPlaceholder({
|
|
|
347
376
|
}
|
|
348
377
|
),
|
|
349
378
|
/* @__PURE__ */ jsxs2("div", { className: styles3.loaderWrapper, children: [
|
|
350
|
-
/* @__PURE__ */ jsx4(
|
|
351
|
-
"div",
|
|
352
|
-
{
|
|
353
|
-
className: styles3.spinner,
|
|
354
|
-
style: { color: `${dotColor}40` }
|
|
355
|
-
}
|
|
356
|
-
),
|
|
379
|
+
/* @__PURE__ */ jsx4(Spinner_default2, {}),
|
|
357
380
|
/* @__PURE__ */ jsx4("span", { className: styles3.loadingText, style: { color: `${dotColor}70` }, children: "Generating QR code..." })
|
|
358
381
|
] })
|
|
359
382
|
] });
|