@algobright/solana-connector-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Avatar.module-P7KEBP7R.module.css +42 -0
- package/dist/Button.module-7TPMDOJN.module.css +145 -0
- package/dist/Collapsible.module-NXSN3MGI.module.css +24 -0
- package/dist/ConnectButton.d.mts +14 -0
- package/dist/ConnectButton.d.ts +14 -0
- package/dist/ConnectButton.js +1248 -0
- package/dist/ConnectButton.js.map +1 -0
- package/dist/ConnectButton.mjs +1216 -0
- package/dist/ConnectButton.mjs.map +1 -0
- package/dist/ConnectButton.module-UWQKSVTP.module.css +8 -0
- package/dist/CustomQRCode.module-FOXENMZG.module.css +176 -0
- package/dist/Dialog.module-HCRT743N.module.css +136 -0
- package/dist/Menu.module-GV627ZLI.module.css +79 -0
- package/dist/Spinner.module-G7GUQJZJ.module.css +16 -0
- package/dist/WalletDropdown.d.mts +14 -0
- package/dist/WalletDropdown.d.ts +14 -0
- package/dist/WalletDropdown.js +346 -0
- package/dist/WalletDropdown.js.map +1 -0
- package/dist/WalletDropdown.mjs +314 -0
- package/dist/WalletDropdown.mjs.map +1 -0
- package/dist/WalletDropdown.module-342MM7XM.module.css +220 -0
- package/dist/WalletModal.d.mts +13 -0
- package/dist/WalletModal.d.ts +13 -0
- package/dist/WalletModal.js +838 -0
- package/dist/WalletModal.js.map +1 -0
- package/dist/WalletModal.mjs +806 -0
- package/dist/WalletModal.mjs.map +1 -0
- package/dist/WalletModal.module-PVV5PRXU.module.css +341 -0
- package/dist/index.d.mts +70 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +242 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +222 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/WalletModal/WalletModal.tsx","../src/components/shared/Dialog/Dialog.tsx","../src/components/shared/Button/Button.tsx","../src/components/shared/Button/index.ts","../src/components/shared/CustomQRCode/CustomQRCode.tsx","../src/components/shared/CustomQRCode/index.ts","../src/components/shared/Spinner/Spinner.tsx","../src/components/shared/Spinner/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"],"sourcesContent":["import { useConnector, WalletConnectorId, WalletConnectorMetadata } from \"@solana/connector\";\r\nimport { Check, ChevronLeft, Copy, ExternalLink, Wallet, X } from \"lucide-react\";\r\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\r\nimport styles from './WalletModal.module.css';\r\nimport { Dialog, DialogClose, DialogContent, DialogTitle } from \"@shared/Dialog\";\r\nimport Button from \"@shared/Button\";\r\nimport CustomQRCode from \"@shared//CustomQRCode\";\r\nimport Spinner from \"@shared/Spinner\";\r\nimport { SiWalletconnect } from \"react-icons/si\";\r\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@shared/Collapsible\";\r\nimport Avatar from \"@shared/Avatar\";\r\nimport { clsx } from \"clsx\";\r\n\r\ntype WalletModalProps = {\r\n CN_Modal?: string;\r\n theme?: 'light' | 'dark';\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n walletConnectUri: string | null;\r\n onClearWalletConnectUri: () => void;\r\n}\r\n\r\nexport function WalletModal(props: WalletModalProps) {\r\n const {\r\n CN_Modal,\r\n theme = 'light',\r\n open,\r\n onOpenChange,\r\n walletConnectUri,\r\n onClearWalletConnectUri\r\n } = props;\r\n\r\n const { walletStatus: { status }, isConnecting, connectorId, connectors, connectWallet, disconnectWallet } = useConnector();\r\n\r\n const [connectingConnectorId, setConnectingConnectorId] = useState<WalletConnectorId | null>(null);\r\n const [isOtherWalletsOpen, setIsOtherWalletsOpen] = useState(false);\r\n const [errorConnectorId, setErrorConnectorId] = useState<WalletConnectorId | null>(null);\r\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\r\n const [copied, setCopied] = useState(false);\r\n\r\n const isClient = useSyncExternalStore(\r\n () => () => { },\r\n () => true,\r\n () => false,\r\n );\r\n\r\n const recentlyConnectedConnectorId = useSyncExternalStore(\r\n () => () => { },\r\n () => localStorage.getItem('recentlyConnectedConnectorId') as WalletConnectorId | null,\r\n () => null\r\n );\r\n\r\n useEffect(() => {\r\n if (status === 'connected' && connectorId) {\r\n localStorage.setItem('recentlyConnectedConnectorId', connectorId);\r\n }\r\n }, [status, connectorId]);\r\n\r\n const walletConnectConnector = connectors.find(c => c.name === 'WalletConnect') ?? null;\r\n const isWalletConnectFlow =\r\n (!!walletConnectConnector &&\r\n (connectingConnectorId === walletConnectConnector.id ||\r\n (status === 'connecting' && connectorId === walletConnectConnector.id))) ||\r\n !!walletConnectUri;\r\n\r\n function cancelConnection() {\r\n onClearWalletConnectUri?.();\r\n setConnectingConnectorId(null);\r\n disconnectWallet().catch(() => { });\r\n }\r\n\r\n // Clear error state when modal closes or user tries another wallet\r\n const clearError = () => {\r\n setErrorConnectorId(null);\r\n setErrorMessage(null);\r\n };\r\n\r\n const handleSelectWallet = async (connector: WalletConnectorMetadata) => {\r\n clearError();\r\n setConnectingConnectorId(connector.id);\r\n try {\r\n if (connector.name === 'WalletConnect') {\r\n onClearWalletConnectUri?.();\r\n }\r\n await connectWallet(connector.id);\r\n localStorage.setItem('recentlyConnectedConnectorId', connector.id);\r\n // Don't close modal for WalletConnect - wait for connection\r\n if (connector.name !== 'WalletConnect') {\r\n onOpenChange(false);\r\n }\r\n } catch (error) {\r\n // Extract user-friendly error message\r\n const message = error instanceof Error ? error.message : 'An unexpected error occurred';\r\n if (message.includes('Connection cancelled')) return;\r\n\r\n // Set error state for UI feedback\r\n setErrorConnectorId(connector.id);\r\n setErrorMessage(message);\r\n\r\n // Log for telemetry/debugging (includes full error details)\r\n console.error('Failed to connect wallet:', {\r\n wallet: connector.name,\r\n connectorId: connector.id,\r\n error,\r\n message,\r\n timestamp: new Date().toISOString(),\r\n });\r\n } finally {\r\n setConnectingConnectorId(null);\r\n }\r\n };\r\n\r\n const handleCopyUri = async () => {\r\n if (!walletConnectUri) return;\r\n try {\r\n await navigator.clipboard.writeText(walletConnectUri);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy URI:', err);\r\n }\r\n };\r\n\r\n const handleBackFromWalletConnect = () => {\r\n cancelConnection();\r\n };\r\n\r\n const readyConnectors = connectors.filter(c => c.ready);\r\n const notReadyConnectors = connectors.filter(c => !c.ready);\r\n\r\n const sortedReadyConnectors = [...readyConnectors].sort((a, b) => {\r\n const aIsRecent = recentlyConnectedConnectorId === a.id;\r\n const bIsRecent = recentlyConnectedConnectorId === b.id;\r\n if (aIsRecent && !bIsRecent) return -1;\r\n if (!aIsRecent && bIsRecent) return 1;\r\n return 0;\r\n });\r\n\r\n const primaryWallets = sortedReadyConnectors.slice(0, 3);\r\n const otherWallets = sortedReadyConnectors.slice(3);\r\n\r\n const primayOuterHr = otherWallets.length > 0 && primaryWallets.length > 0;\r\n\r\n const getInstallUrl = (walletName: string, walletUrl?: string): string | undefined => {\r\n if (walletUrl) return walletUrl;\r\n\r\n const name = walletName.toLowerCase();\r\n if (name.includes('phantom')) return 'https://phantom.app';\r\n if (name.includes('solflare')) return 'https://solflare.com';\r\n if (name.includes('backpack')) return 'https://backpack.app';\r\n if (name.includes('glow')) return 'https://glow.app';\r\n if (name.includes('coinbase')) return 'https://www.coinbase.com/wallet';\r\n if (name.includes('ledger')) return 'https://www.ledger.com';\r\n if (name.includes('trust')) return 'https://trustwallet.com';\r\n if (name.includes('exodus')) return 'https://www.exodus.com';\r\n return undefined;\r\n };\r\n\r\n const handleOpenChange = (isOpen: boolean) => {\r\n if (!isOpen) {\r\n clearError();\r\n if (isConnecting || connectingConnectorId || walletConnectUri) {\r\n cancelConnection();\r\n }\r\n }\r\n onOpenChange(isOpen);\r\n };\r\n\r\n const walletLinkOpen = (walletName: string) => {\r\n const installUrl = getInstallUrl(walletName);\r\n if (installUrl) {\r\n window.open(installUrl, '_blank');\r\n }\r\n }\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={handleOpenChange} >\r\n <DialogContent\r\n showCloseButton={false}\r\n className={clsx(styles.dialogContent, CN_Modal)}\r\n theme={theme}\r\n >\r\n {/* Header */}\r\n <div className={styles.dialogHeader}>\r\n {isWalletConnectFlow ? (\r\n <button\r\n onClick={handleBackFromWalletConnect}\r\n className={styles.iconButton}\r\n >\r\n <ChevronLeft />\r\n </button>\r\n ) : null}\r\n <DialogTitle className={styles.dialogTitle}>\r\n {isWalletConnectFlow ? 'WalletConnect' : 'Connect your wallet'}\r\n </DialogTitle>\r\n <DialogClose className={styles.iconButton}>\r\n <X />\r\n </DialogClose>\r\n </div>\r\n\r\n {/* WalletConnect QR Code Display */}\r\n {isWalletConnectFlow && (\r\n <div className={styles.walletsContainer}>\r\n <div className={styles.tooltipBubble}>\r\n <span>Use a WalletConnect</span>\r\n <div className={styles.tooltipIconWrapper}>\r\n <SiWalletconnect className={styles.tooltipIcon} />\r\n <div className={styles.tooltipCaret} />\r\n </div>\r\n <span>supported wallet to scan</span>\r\n </div>\r\n\r\n {/* QR Code */}\r\n <div className={styles.qrWrapper}>\r\n <CustomQRCode\r\n value={walletConnectUri ?? ''}\r\n size={280}\r\n ecl=\"M\"\r\n loading={!walletConnectUri}\r\n scanning={!!walletConnectUri}\r\n />\r\n </div>\r\n\r\n {/* Copy URI button */}\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleCopyUri}\r\n disabled={!walletConnectUri}\r\n className={styles.copyButton}\r\n data-theme={theme}\r\n >\r\n {copied ? (\r\n <>\r\n <Check className={`${styles.icon} ${styles.successIcon}`} />\r\n Copy to Clipboard\r\n </>\r\n ) : (\r\n <>\r\n <Copy className={styles.icon} />\r\n Copy to Clipboard\r\n </>\r\n )}\r\n </Button>\r\n\r\n </div>\r\n )}\r\n\r\n {!isWalletConnectFlow && (\r\n <div className={styles.walletsContainer}>\r\n {/* 1. Loading State (Detecting Wallets) */}\r\n {!isClient && (\r\n <div className={styles.detectingWallets}>\r\n <Spinner />\r\n <p >Detecting wallets...</p>\r\n </div>\r\n )}\r\n\r\n {/* 2. Empty State (No Wallets Detected) */}\r\n {connectors.length === 0 && (\r\n <div className={styles.emptyStateContainer}>\r\n <Wallet className={styles.emptyStateIcon} />\r\n\r\n <h3 className={styles.emptyStateTitle}>No Wallets Detected</h3>\r\n\r\n <p className={styles.emptyStateDesc}>\r\n Install a Solana wallet extension to get started\r\n </p>\r\n\r\n <div className={styles.emptyStateActions}>\r\n <Button\r\n variant=\"outline\"\r\n data-theme={theme}\r\n onClick={() => walletLinkOpen('Phantom')}\r\n >\r\n Get Phantom\r\n </Button>\r\n <Button\r\n data-theme={theme}\r\n variant=\"outline\"\r\n onClick={() => walletLinkOpen('Backpack')}\r\n >\r\n Get Backpack\r\n </Button>\r\n </div>\r\n\r\n\r\n </div>\r\n )}\r\n\r\n <div className={styles.allWallets}>\r\n {primaryWallets.map((connector) => (\r\n <WalletButton\r\n key={connector.id}\r\n theme={theme}\r\n connector={connector}\r\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\r\n hasError={errorConnectorId === connector.id}\r\n isRecent={recentlyConnectedConnectorId === connector.id}\r\n\r\n onSelect={() => handleSelectWallet(connector)}\r\n getInstallUrl={getInstallUrl}\r\n />\r\n ))}\r\n </div>\r\n\r\n {otherWallets.length > 0 && (\r\n <>\r\n {primayOuterHr && <div className={styles.seprator} />}\r\n <Collapsible\r\n open={isOtherWalletsOpen}\r\n onOpenChange={setIsOtherWalletsOpen}\r\n className={styles.Collapsible}\r\n >\r\n <CollapsibleTrigger className={styles.hiddenExpand}>\r\n <span className={styles.textContainer}>Other Wallets</span>\r\n <HiddenWalletIcons wallets={otherWallets} className=\"shrink-0\" />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent className={styles.allWallets}>\r\n {otherWallets.map((connector) => (\r\n <WalletButton\r\n key={connector.id}\r\n theme={theme}\r\n connector={connector}\r\n isThisConnecting={isConnecting && connectingConnectorId === connector.id}\r\n hasError={errorConnectorId === connector.id}\r\n isRecent={recentlyConnectedConnectorId === connector.id}\r\n onSelect={() => handleSelectWallet(connector)}\r\n getInstallUrl={getInstallUrl}\r\n />\r\n ))}\r\n </CollapsibleContent>\r\n </Collapsible>\r\n </>\r\n )}\r\n\r\n {notReadyConnectors.length > 0 && (\r\n <>\r\n {(primaryWallets.length > 0 || otherWallets.length > 0) && (\r\n <div className={styles.seprator} />\r\n )}\r\n\r\n <div className=\"space-y-2\">\r\n <h3 className={styles.sectionHeader}>\r\n {readyConnectors.length > 0 ? 'Unavailable Wallets' : 'Wallets'}\r\n </h3>\r\n\r\n <div className={styles.grid}>\r\n {notReadyConnectors.slice(0, 3).map((connector) => {\r\n const installUrl = getInstallUrl(connector.name);\r\n\r\n return (\r\n <div key={connector.id} className={styles.unavailableRow}>\r\n {/* Left: Icon & Text */}\r\n <div className={styles.walletInfo}>\r\n <Avatar\r\n width={40}\r\n height={40}\r\n src={connector.icon}\r\n alt={connector.name}\r\n theme={theme}\r\n />\r\n <div className=\"text-left\">\r\n <div className={styles.walletName}>\r\n {connector.name}\r\n </div>\r\n <div className={styles.unavailableLabel}>\r\n Not available\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right: Install Button */}\r\n {installUrl && (\r\n <Button\r\n data-theme={theme}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className={styles.installButton}\r\n onClick={() => window.open(installUrl, '_blank')}\r\n >\r\n <ExternalLink />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n\r\n </div>\r\n )}\r\n\r\n </DialogContent>\r\n </Dialog >\r\n )\r\n\r\n}\r\n\r\nexport default WalletModal\r\n\r\n\r\ninterface WalletItemProps {\r\n connector: WalletConnectorMetadata;\r\n isThisConnecting: boolean;\r\n\r\n hasError?: boolean;\r\n isRecent?: boolean;\r\n theme?: 'light' | 'dark';\r\n onSelect: () => void;\r\n getInstallUrl: (walletName: string, walletUrl?: string) => string | undefined;\r\n}\r\nfunction WalletButton(props: WalletItemProps) {\r\n const { connector, isThisConnecting, hasError, isRecent, theme, onSelect, getInstallUrl } = props;\r\n\r\n const handleSelectWallet = () => {\r\n onSelect();\r\n }\r\n return (\r\n <Button\r\n key={connector.id}\r\n variant=\"outline\"\r\n data-error={hasError}\r\n data-theme={theme}\r\n className={styles.walletButton}\r\n onClick={handleSelectWallet}\r\n disabled={isThisConnecting}\r\n\r\n >\r\n {/* Left Side: Text Info */}\r\n <div className={styles.textContainer}>\r\n <div className={styles.nameRow}>\r\n <span>{connector.name}</span>\r\n {isRecent && <span className={styles.recentBadge}>Recent</span>}\r\n </div>\r\n\r\n {/* Status Text */}\r\n {isThisConnecting && (\r\n <div className={styles.statusText}>Connecting...</div>\r\n )}\r\n {hasError && !isThisConnecting && (\r\n <div className={styles.statusText} data-type=\"error\">\r\n Click to retry\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className={styles.iconContainer}>\r\n {isThisConnecting && <Spinner />}\r\n <Avatar\r\n width={40}\r\n height={40}\r\n src={connector.icon}\r\n alt={connector.name}\r\n theme={theme}\r\n />\r\n </div>\r\n\r\n </Button>\r\n )\r\n}\r\n\r\ninterface WalletIconSource {\r\n id: string;\r\n name: string;\r\n icon?: string | null;\r\n}\r\ninterface HiddenWalletIconsProps {\r\n wallets: WalletIconSource[];\r\n maxIcons?: number;\r\n className?: string;\r\n}\r\nexport function HiddenWalletIcons({ wallets, maxIcons = 4, className }: HiddenWalletIconsProps) {\r\n const previewWallets = wallets.slice(0, maxIcons);\r\n const placeholderCount = Math.max(0, maxIcons - previewWallets.length);\r\n\r\n return (\r\n <div\r\n className={`${styles.hiddenWalletGrid} ${className || ''}`}\r\n aria-hidden=\"true\"\r\n >\r\n {/* Render Actual Wallets */}\r\n {previewWallets.map(wallet => (\r\n <div\r\n key={wallet.id}\r\n className={styles.hiddenWalletIconWrapper}\r\n >\r\n {wallet.icon && (\r\n <img\r\n height={10}\r\n width={10}\r\n src={wallet.icon}\r\n alt={wallet.name}\r\n draggable={false}\r\n onError={(e: any) => {\r\n e.currentTarget.style.display = 'none';\r\n }}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n\r\n {Array.from({ length: placeholderCount }).map((_, index) => (\r\n <div\r\n key={`placeholder-${index}`}\r\n className={styles.hiddenWalletIconWrapper}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}","'use client';\r\n\r\nimport * as React from 'react';\r\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\r\nimport { X } from 'lucide-react';\r\nimport styles from './Dialog.module.css';\r\nimport clsx from 'clsx';\r\n\r\n// 1. Root Components\r\nconst Dialog = BaseDialog.Root;\r\nconst DialogTrigger = BaseDialog.Trigger;\r\nconst DialogPortal = BaseDialog.Portal;\r\nconst DialogClose = BaseDialog.Close;\r\n\r\n// 2. Backdrop\r\ntype DialogBackdropProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Backdrop>;\r\nconst DialogBackdrop = React.forwardRef<HTMLDivElement, DialogBackdropProps>(\r\n ({ className, ...props }, ref) => (\r\n <BaseDialog.Backdrop\r\n ref={ref}\r\n className={`${styles.backdrop} ${className || ''}`}\r\n {...props}\r\n />\r\n ),\r\n);\r\nDialogBackdrop.displayName = 'DialogBackdrop';\r\n\r\n// 3. Content (The Modal Box)\r\ntype DialogContentProps = React.ComponentPropsWithoutRef<typeof BaseDialog.Popup> & {\r\n showCloseButton?: boolean;\r\n theme?: 'light' | 'dark';\r\n};\r\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\r\n ({ className, children, theme, showCloseButton = true, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogBackdrop data-theme={theme} />\r\n <BaseDialog.Popup\r\n ref={ref}\r\n data-theme={theme}\r\n className={clsx(styles.content, className)}\r\n {...props}\r\n >\r\n {children}\r\n {showCloseButton && (\r\n <DialogClose className={styles.closeButton}>\r\n <X />\r\n </DialogClose>\r\n )}\r\n </BaseDialog.Popup>\r\n </DialogPortal>\r\n )\r\n);\r\nDialogContent.displayName = 'DialogContent';\r\n\r\n// 4. Header\r\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div className={`${styles.header} ${className || ''}`} {...props} />\r\n);\r\nDialogHeader.displayName = 'DialogHeader';\r\n\r\n// 5. Footer\r\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div className={`${styles.footer} ${className || ''}`} {...props} />\r\n);\r\nDialogFooter.displayName = 'DialogFooter';\r\n\r\n// 6. Title\r\nconst DialogTitle = React.forwardRef<HTMLHeadingElement, React.ComponentPropsWithoutRef<typeof BaseDialog.Title>>(\r\n ({ className, ...props }, ref) => (\r\n <BaseDialog.Title\r\n ref={ref}\r\n className={`${styles.title} ${className || ''}`}\r\n {...props}\r\n />\r\n ),\r\n);\r\nDialogTitle.displayName = 'DialogTitle';\r\n\r\n// 7. Description\r\nconst DialogDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.ComponentPropsWithoutRef<typeof BaseDialog.Description>\r\n>(({ className, ...props }, ref) => (\r\n <BaseDialog.Description\r\n ref={ref}\r\n className={`${styles.description} ${className || ''}`}\r\n {...props}\r\n />\r\n));\r\nDialogDescription.displayName = 'DialogDescription';\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogBackdrop,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n};","'use client';\r\n\r\nimport * as React from 'react';\r\nimport { Button as BaseButton } from '@base-ui/react/button';\r\nimport styles from './Button.module.css';\r\n\r\n// 1. Define Types\r\ntype ButtonVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\r\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\r\n\r\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: ButtonVariant;\r\n size?: ButtonSize;\r\n}\r\n\r\n// 2. The Component\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\r\n return (\r\n <BaseButton\r\n ref={ref}\r\n\r\n className={`${styles.button} ${className || ''}`}\r\n data-variant={variant}\r\n data-size={size}\r\n\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nButton.displayName = 'Button';\r\n\r\nexport default Button;","import Button from \"./Button\";\r\n\r\nexport default Button;","'use client';\r\n\r\nimport { useMemo, type ReactNode, type CSSProperties } from 'react';\r\nimport QRCodeUtil from 'qrcode';\r\nimport styles from './CustomQRCode.module.css';\r\n\r\n/**\r\n * Generate QR code matrix from value\r\n */\r\nfunction generateMatrix(value: string, errorCorrectionLevel: 'L' | 'M' | 'Q' | 'H') {\r\n const arr = Array.prototype.slice.call(QRCodeUtil.create(value, { errorCorrectionLevel }).modules.data, 0);\r\n const sqrt = Math.sqrt(arr.length);\r\n return arr.reduce(\r\n (rows: number[][], key: number, index: number) =>\r\n (index % sqrt === 0 ? rows.push([key]) : rows[rows.length - 1].push(key)) && rows,\r\n [] as number[][],\r\n );\r\n}\r\n\r\ninterface CustomQRCodeProps {\r\n value: string;\r\n size?: number;\r\n ecl?: 'L' | 'M' | 'Q' | 'H';\r\n clearArea?: boolean;\r\n image?: ReactNode;\r\n imageBackground?: string;\r\n dotColor?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\n/**\r\n * QR Code SVG renderer\r\n */\r\nfunction QRCodeSVG({\r\n value,\r\n size: sizeProp = 200,\r\n ecl = 'M',\r\n clearArea = false,\r\n dotColor = 'currentColor',\r\n backgroundColor = '#ffffff',\r\n}: CustomQRCodeProps) {\r\n const logoSize = clearArea ? 76 : 0;\r\n const size = sizeProp - 10 * 2; // Account for padding\r\n\r\n const dots = useMemo(() => {\r\n const dots: ReactNode[] = [];\r\n const matrix = generateMatrix(value, ecl);\r\n const cellSize = size / matrix.length;\r\n\r\n // Finder pattern positions (3 corners)\r\n const qrList = [\r\n { x: 0, y: 0 },\r\n { x: 1, y: 0 },\r\n { x: 0, y: 1 },\r\n ];\r\n\r\n // Draw rounded finder patterns\r\n qrList.forEach(({ x, y }) => {\r\n const x1 = (matrix.length - 7) * cellSize * x;\r\n const y1 = (matrix.length - 7) * cellSize * y;\r\n for (let i = 0; i < 3; i++) {\r\n dots.push(\r\n <rect\r\n key={`finder-${i}-${x}-${y}`}\r\n fill={i % 2 !== 0 ? backgroundColor : dotColor}\r\n rx={(i - 2) * -5 + (i === 0 ? 2 : 3)}\r\n ry={(i - 2) * -5 + (i === 0 ? 2 : 3)}\r\n width={cellSize * (7 - i * 2)}\r\n height={cellSize * (7 - i * 2)}\r\n x={x1 + cellSize * i}\r\n y={y1 + cellSize * i}\r\n />,\r\n );\r\n }\r\n });\r\n\r\n // Calculate center clear area\r\n const clearArenaSize = Math.floor((logoSize + 25) / cellSize);\r\n const matrixMiddleStart = matrix.length / 2 - clearArenaSize / 2;\r\n const matrixMiddleEnd = matrix.length / 2 + clearArenaSize / 2 - 1;\r\n\r\n // Draw circular dots for data modules\r\n matrix.forEach((row: number[], i: number) => {\r\n row.forEach((_: number, j: number) => {\r\n if (matrix[i][j]) {\r\n // Skip dots under finder patterns\r\n if (!((i < 7 && j < 7) || (i > matrix.length - 8 && j < 7) || (i < 7 && j > matrix.length - 8))) {\r\n // Skip center area if clearArea is true\r\n if (\r\n !clearArea ||\r\n !(\r\n i > matrixMiddleStart &&\r\n i < matrixMiddleEnd &&\r\n j > matrixMiddleStart &&\r\n j < matrixMiddleEnd\r\n )\r\n ) {\r\n dots.push(\r\n <circle\r\n key={`dot-${i}-${j}`}\r\n cx={j * cellSize + cellSize / 2}\r\n cy={i * cellSize + cellSize / 2}\r\n fill={dotColor}\r\n r={cellSize / 3}\r\n />,\r\n );\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n return dots;\r\n }, [value, ecl, size, clearArea, logoSize, dotColor, backgroundColor]);\r\n\r\n return (\r\n <svg\r\n height={size}\r\n width={size}\r\n viewBox={`0 0 ${size} ${size}`}\r\n className={styles.svgFull}\r\n style={{ maxWidth: size, maxHeight: size }}\r\n >\r\n <rect fill=\"transparent\" height={size} width={size} />\r\n {dots}\r\n </svg>\r\n );\r\n}\r\n\r\n/**\r\n * Viewfinder corner brackets SVG\r\n */\r\nfunction ViewfinderFrame({\r\n size,\r\n color = '#2D2D2D',\r\n opacity = 0.01,\r\n}: {\r\n size: number;\r\n color?: string;\r\n opacity?: number;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 283 283\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className={styles.viewfinder}\r\n >\r\n <path\r\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\"\r\n fill={color}\r\n fillOpacity={opacity}\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\ninterface CustomQRCodeContainerProps extends CustomQRCodeProps {\r\n image?: ReactNode;\r\n imageBackground?: string;\r\n className?: string;\r\n style?: CSSProperties;\r\n loading?: boolean;\r\n scanning?: boolean;\r\n error?: boolean;\r\n frameColor?: string;\r\n}\r\n\r\nexport function CustomQRCode({\r\n value,\r\n size = 280,\r\n ecl = 'M',\r\n clearArea = false,\r\n image,\r\n imageBackground = 'transparent',\r\n dotColor,\r\n backgroundColor,\r\n className,\r\n style,\r\n loading = false,\r\n scanning = true,\r\n error = false,\r\n frameColor,\r\n}: CustomQRCodeContainerProps) {\r\n const showPlaceholder = loading || !value;\r\n\r\n const resolvedBackground = backgroundColor || '#ffffff';\r\n const resolvedDotColor = dotColor || '#000000';\r\n const resolvedFrameColor = error ? '#FF0000' : frameColor || '#2D2D2D';\r\n const frameOpacity = error ? 0.56 : 0.01;\r\n\r\n return (\r\n <div\r\n className={`${styles.container} ${className || ''}`}\r\n style={{\r\n width: size,\r\n height: size,\r\n ...style,\r\n }}\r\n >\r\n {/* Viewfinder corner brackets */}\r\n <ViewfinderFrame size={size} color={resolvedFrameColor} opacity={frameOpacity} />\r\n\r\n {/* QR Content Area */}\r\n <div\r\n className={styles.contentArea}\r\n style={{ background: resolvedBackground }}\r\n data-error={error}\r\n >\r\n {/* Gradient glow background */}\r\n <div className={styles.glow} data-error={error} />\r\n\r\n {/* Shine scanning effect */}\r\n {scanning && !showPlaceholder && !error && (\r\n <div className={styles.shine} />\r\n )}\r\n\r\n {/* QR Code or placeholder */}\r\n <div className={styles.qrWrapper}>\r\n {showPlaceholder ? (\r\n <QRPlaceholder size={size} dotColor={resolvedDotColor} backgroundColor={resolvedBackground} />\r\n ) : (\r\n <>\r\n <QRCodeSVG\r\n value={value}\r\n size={size - 40}\r\n ecl={ecl}\r\n clearArea={clearArea || !!image}\r\n dotColor={resolvedDotColor}\r\n backgroundColor={resolvedBackground}\r\n />\r\n {image && (\r\n <div\r\n className={styles.logoWrapper}\r\n style={{\r\n width: '28%',\r\n height: '28%',\r\n background: imageBackground || resolvedBackground,\r\n }}\r\n >\r\n {image}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction QRPlaceholder({\r\n size,\r\n dotColor,\r\n backgroundColor,\r\n}: {\r\n size: number;\r\n dotColor: string;\r\n backgroundColor: string;\r\n}) {\r\n return (\r\n <div className={styles.placeholderContainer} style={{ width: size - 40, height: size - 40 }}>\r\n {/* Dot pattern background */}\r\n <div\r\n className={styles.placeholderPattern}\r\n style={{\r\n backgroundImage: `radial-gradient(${dotColor} 41%, transparent 41%)`,\r\n }}\r\n />\r\n\r\n {/* Corner finder pattern placeholders */}\r\n {[\r\n { top: 0, left: 0 },\r\n { top: 0, right: 0 },\r\n { bottom: 0, left: 0 },\r\n ].map((pos, i) => (\r\n <span\r\n key={i}\r\n className={styles.cornerSquare}\r\n style={{\r\n ...pos,\r\n background: dotColor,\r\n }}\r\n />\r\n ))}\r\n\r\n {/* Center area */}\r\n <div\r\n className={styles.centerArea}\r\n style={{\r\n background: backgroundColor,\r\n boxShadow: `0 0 0 7px ${backgroundColor}`,\r\n }}\r\n />\r\n\r\n {/* Loading spinner */}\r\n <div className={styles.loaderWrapper}>\r\n <div\r\n className={styles.spinner}\r\n style={{ color: `${dotColor}40` }}\r\n />\r\n <span className={styles.loadingText} style={{ color: `${dotColor}70` }}>\r\n Generating QR code...\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nCustomQRCode.displayName = 'CustomQRCode';","import { CustomQRCode } from \"./CustomQRCode\";\r\n\r\nexport default CustomQRCode;","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\";\r\nexport default Spinner;","'use client';\r\n\r\nimport * as React from 'react';\r\nimport { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';\r\nimport styles from './Collapsible.module.css';\r\n\r\nconst Collapsible = BaseCollapsible.Root;\r\nconst CollapsibleTrigger = React.forwardRef<\r\n HTMLButtonElement,\r\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Trigger>\r\n>(({ className, ...props }, ref) => (\r\n <BaseCollapsible.Trigger\r\n ref={ref}\r\n className={`${styles.trigger} ${className || ''}`}\r\n {...props}\r\n />\r\n));\r\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\r\n\r\nconst CollapsibleContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentPropsWithoutRef<typeof BaseCollapsible.Panel>\r\n>(({ className, ...props }, ref) => (\r\n <BaseCollapsible.Panel\r\n ref={ref}\r\n className={`${styles.content} ${className || ''}`}\r\n {...props}\r\n />\r\n));\r\nCollapsibleContent.displayName = 'CollapsibleContent';\r\n\r\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };","import { useState } from 'react';\r\nimport styles from './Avatar.module.css';\r\nimport { Wallet } from 'lucide-react';\r\ninterface AvatarProps {\r\n height?: number | string;\r\n width?: number | string;\r\n src?: string;\r\n alt?: string;\r\n theme?: 'light' | 'dark';\r\n}\r\nexport function Avatar({\r\n height,\r\n width,\r\n src,\r\n alt,\r\n theme = 'light',\r\n}: AvatarProps) {\r\n const [hasError, setHasError] = useState(false);\r\n return (\r\n <div className={styles.avatar} data-theme={theme}>\r\n {src && !hasError ? (\r\n <img\r\n height={height}\r\n width={width}\r\n src={src}\r\n alt={alt || \"Avatar\"}\r\n onError={() => setHasError(true)}\r\n />\r\n ) : (\r\n <div className={styles.fallback} style={{ height, width }}>\r\n <Wallet />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Avatar } from './Avatar';\r\n\r\nexport default Avatar;","import WalletModal from \"./WalletModal\"\r\nexport default WalletModal;"],"mappings":"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","names":["Wallet","X","useState","styles","React","styles","jsx","Button_default","styles","jsx","jsxs","dots","jsx","Spinner_default","React","styles","jsx","styles","jsx","clsx","Fragment","jsx","jsxs","useState","styles","X","Button_default","Spinner_default","Wallet","WalletModal_default"]}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
:where(.dialogContent) {
|
|
2
|
+
max-width: 28rem !important;
|
|
3
|
+
border-radius: 1.5rem !important;
|
|
4
|
+
padding: 1.5rem;
|
|
5
|
+
|
|
6
|
+
--icon-bg-color: #f4f4f5;
|
|
7
|
+
--icon-border-color: #e4e4e7;
|
|
8
|
+
--icon-hover-bg-color: #e4e4e7;
|
|
9
|
+
--icon-hover-fg-color: #09090b;
|
|
10
|
+
|
|
11
|
+
--wc-tooltip-bg-color: #27272a;
|
|
12
|
+
--wc-tooltip-fg-color: #f4f4f5;
|
|
13
|
+
|
|
14
|
+
--recent-badge-bg: #f4f4f5;
|
|
15
|
+
--recent-badge-fg: #71717a;
|
|
16
|
+
--recent-badge-border: #e4e4e7;
|
|
17
|
+
|
|
18
|
+
--wallet-button-bg: #f4f4f5;
|
|
19
|
+
--wallet-button-fg: #09090b;
|
|
20
|
+
--wallet-button-border: #e4e4e7;
|
|
21
|
+
--muted-foreground: #71717a;
|
|
22
|
+
}
|
|
23
|
+
:where(.dialogContent[data-theme="dark"]) {
|
|
24
|
+
--icon-bg-color: #27272a;
|
|
25
|
+
--icon-border-color: #3f3f46;
|
|
26
|
+
--icon-hover-bg-color: #3f3f46;
|
|
27
|
+
--icon-hover-fg-color: #fafafa;
|
|
28
|
+
|
|
29
|
+
--wc-tooltip-bg-color: #3f3f46;
|
|
30
|
+
--wc-tooltip-fg-color: #fafafa;
|
|
31
|
+
|
|
32
|
+
--recent-badge-bg: #27272a;
|
|
33
|
+
--recent-badge-fg: #a1a1aa;
|
|
34
|
+
--recent-badge-border: #3f3f46;
|
|
35
|
+
|
|
36
|
+
--wallet-button-bg: #27272a;
|
|
37
|
+
--wallet-button-fg: #fafafa;
|
|
38
|
+
--wallet-button-border: #27272a;
|
|
39
|
+
--muted-foreground: #a1a1aa;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* header */
|
|
43
|
+
:where(.dialogHeader) {
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-content: space-between;
|
|
47
|
+
position: relative;
|
|
48
|
+
}
|
|
49
|
+
:where(.dialogTitle) {
|
|
50
|
+
font-size: 1.125rem;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
flex: 1;
|
|
53
|
+
text-align: center;
|
|
54
|
+
}
|
|
55
|
+
:where(.iconButton) {
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
height: 2rem;
|
|
60
|
+
width: 2rem;
|
|
61
|
+
padding: 0.5rem;
|
|
62
|
+
border-radius: 16px;
|
|
63
|
+
|
|
64
|
+
cursor: pointer;
|
|
65
|
+
transition: all 0.2s;
|
|
66
|
+
|
|
67
|
+
background-color: var(--icon-bg-color);
|
|
68
|
+
border: 1px solid var(--icon-border-color);
|
|
69
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
70
|
+
color: inherit;
|
|
71
|
+
}
|
|
72
|
+
:where(.iconButton:hover) {
|
|
73
|
+
background-color: var(--icon-hover-bg-color);
|
|
74
|
+
color: var(--icon-hover-fg-color);
|
|
75
|
+
}
|
|
76
|
+
:where(.iconButton svg) {
|
|
77
|
+
height: 0.75rem;
|
|
78
|
+
width: 0.75rem;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:where(.walletsContainer) {
|
|
82
|
+
display: flex;
|
|
83
|
+
width: 100%;
|
|
84
|
+
flex-direction: column;
|
|
85
|
+
align-items: center;
|
|
86
|
+
padding: 0.5rem 0;
|
|
87
|
+
gap: 1rem;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* wallet connect flow */
|
|
91
|
+
:where(.tooltipBubble) {
|
|
92
|
+
background-color: var(--wc-tooltip-bg-color);
|
|
93
|
+
color: var(--wc-tooltip-fg-color);
|
|
94
|
+
font-size: 0.75rem;
|
|
95
|
+
padding: 0.25rem 0.5rem;
|
|
96
|
+
border-radius: 0.5rem;
|
|
97
|
+
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
|
|
98
|
+
display: flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
gap: 0.25rem;
|
|
101
|
+
}
|
|
102
|
+
:where(.tooltipIconWrapper) {
|
|
103
|
+
display: flex;
|
|
104
|
+
position: relative;
|
|
105
|
+
justify-content: center;
|
|
106
|
+
}
|
|
107
|
+
:where(.tooltipIcon) {
|
|
108
|
+
display: inline-block;
|
|
109
|
+
width: 1.25rem;
|
|
110
|
+
height: 1.25rem;
|
|
111
|
+
color: #3b99fc;
|
|
112
|
+
}
|
|
113
|
+
:where(.tooltipCaret) {
|
|
114
|
+
position: absolute;
|
|
115
|
+
top: 100%;
|
|
116
|
+
width: 1em;
|
|
117
|
+
height: 1em;
|
|
118
|
+
background-color: var(--wc-tooltip-bg-color);
|
|
119
|
+
transform: rotate(45deg);
|
|
120
|
+
margin-top: -0.25rem;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* --- QR Code Area --- */
|
|
125
|
+
:where(.qrWrapper) {
|
|
126
|
+
display: flex;
|
|
127
|
+
justify-content: center;
|
|
128
|
+
width: 100%;
|
|
129
|
+
}
|
|
130
|
+
:where(.copyButton) {
|
|
131
|
+
width: auto;
|
|
132
|
+
border-radius: 12px;
|
|
133
|
+
transition: all 200ms ease;
|
|
134
|
+
|
|
135
|
+
display: inline-flex;
|
|
136
|
+
align-items: center;
|
|
137
|
+
justify-content: center;
|
|
138
|
+
|
|
139
|
+
cursor: pointer;
|
|
140
|
+
border: 1px solid #3f3f46;
|
|
141
|
+
}
|
|
142
|
+
:where(.copyButton:active) {
|
|
143
|
+
transform: scale(0.98);
|
|
144
|
+
}
|
|
145
|
+
:where(.icon) {
|
|
146
|
+
width: 1rem;
|
|
147
|
+
height: 1rem;
|
|
148
|
+
margin-right: 0.5rem;
|
|
149
|
+
}
|
|
150
|
+
:where(.successIcon) {
|
|
151
|
+
color: #22c55e;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* detecting wallets */
|
|
155
|
+
:where(.detectingWallets) {
|
|
156
|
+
display: flex;
|
|
157
|
+
gap: 0.5rem;
|
|
158
|
+
width: 100%;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* allwallets list */
|
|
164
|
+
:where(.allWallets) {
|
|
165
|
+
display: flex;
|
|
166
|
+
width: 100%;
|
|
167
|
+
gap: 0.5rem;
|
|
168
|
+
flex-direction: column;
|
|
169
|
+
}
|
|
170
|
+
:where(.allWallets > div) {
|
|
171
|
+
display: flex;
|
|
172
|
+
width: 100%;
|
|
173
|
+
gap: 0.5rem;
|
|
174
|
+
align-items: center;
|
|
175
|
+
justify-content: center;
|
|
176
|
+
}
|
|
177
|
+
:where(.seprator) {
|
|
178
|
+
height: 1px;
|
|
179
|
+
width: 100%;
|
|
180
|
+
background-color: var(--icon-border-color);
|
|
181
|
+
margin: 0.5rem 0;
|
|
182
|
+
}
|
|
183
|
+
:where(.Collapsible) {
|
|
184
|
+
display: flex;
|
|
185
|
+
flex-direction: column;
|
|
186
|
+
width: 100%;
|
|
187
|
+
gap: 0.5rem;
|
|
188
|
+
}
|
|
189
|
+
:where(.hiddenExpand) {
|
|
190
|
+
border: 1px solid var(--wallet-button-border) !important;
|
|
191
|
+
background-color: var(--wallet-button-bg) !important;
|
|
192
|
+
color: var(--wallet-button-fg) !important;
|
|
193
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05) !important;
|
|
194
|
+
font-size: 0.875rem;
|
|
195
|
+
font-weight: 600;
|
|
196
|
+
font-family: var(--font-inter, inherit);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* wallet button */
|
|
200
|
+
:where(.walletButton) {
|
|
201
|
+
height: auto;
|
|
202
|
+
justify-content: space-between;
|
|
203
|
+
border-radius: 1rem;
|
|
204
|
+
}
|
|
205
|
+
:where(.textContainer) {
|
|
206
|
+
display: flex;
|
|
207
|
+
flex-direction: column;
|
|
208
|
+
align-items: flex-start;
|
|
209
|
+
flex: 1;
|
|
210
|
+
gap: 0.25rem;
|
|
211
|
+
}
|
|
212
|
+
:where(.nameRow) {
|
|
213
|
+
display: flex;
|
|
214
|
+
align-items: center;
|
|
215
|
+
gap: 0.5rem;
|
|
216
|
+
font-weight: 600;
|
|
217
|
+
}
|
|
218
|
+
:where(.recentBadge) {
|
|
219
|
+
font-size: 0.75rem;
|
|
220
|
+
padding: 0.1rem 0.4rem;
|
|
221
|
+
border-radius: 4px;
|
|
222
|
+
background-color: var(--recent-badge-bg);
|
|
223
|
+
color: var(--recent-badge-fg);
|
|
224
|
+
border: 1px solid var(--recent-badge-border);
|
|
225
|
+
font-weight: 500;
|
|
226
|
+
}
|
|
227
|
+
:where(.statusText) {
|
|
228
|
+
font-size: 0.75rem;
|
|
229
|
+
color: var(--muted-foreground, #71717a);
|
|
230
|
+
}
|
|
231
|
+
:where(.statusText[data-type="error"]) {
|
|
232
|
+
color: #ef4444;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* --- Right Side: Icon,Spinner and Avatar --- */
|
|
236
|
+
:where(.iconContainer) {
|
|
237
|
+
display: flex;
|
|
238
|
+
align-items: center;
|
|
239
|
+
gap: 0.5rem;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
:where(.hiddenWalletGrid) {
|
|
243
|
+
display: grid;
|
|
244
|
+
grid-template-columns: repeat(2, 1fr);
|
|
245
|
+
gap: 0.25rem;
|
|
246
|
+
width: fit-content;
|
|
247
|
+
}
|
|
248
|
+
:where(.hiddenWalletIconWrapper) {
|
|
249
|
+
position: relative;
|
|
250
|
+
height: 1.125rem;
|
|
251
|
+
width: 1.125rem;
|
|
252
|
+
overflow: hidden;
|
|
253
|
+
border-radius: 50%;
|
|
254
|
+
border: 1px solid var(--border-color, #e4e4e7);
|
|
255
|
+
background-color: var(--bg-muted, #f4f4f5);
|
|
256
|
+
}
|
|
257
|
+
:where(.hiddenWalletIconWrapper > img) {
|
|
258
|
+
height: 100%;
|
|
259
|
+
width: 100%;
|
|
260
|
+
object-fit: cover;
|
|
261
|
+
display: block;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* --- Unavailable / Not Ready Section --- */
|
|
265
|
+
:where(.sectionHeader) {
|
|
266
|
+
font-size: 0.875rem; /* text-sm */
|
|
267
|
+
font-weight: 500;
|
|
268
|
+
color: var(--muted-foreground, #71717a);
|
|
269
|
+
padding: 0 0.25rem; /* px-1 */
|
|
270
|
+
margin-bottom: 0.5rem;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
:where(.unavailableRow) {
|
|
274
|
+
display: flex;
|
|
275
|
+
align-items: center;
|
|
276
|
+
justify-content: space-between;
|
|
277
|
+
padding: 1rem; /* p-4 */
|
|
278
|
+
width: 100%;
|
|
279
|
+
border-radius: 16px;
|
|
280
|
+
|
|
281
|
+
/* Theme Colors */
|
|
282
|
+
background-color: var(--bg-background, #ffffff);
|
|
283
|
+
border: 1px solid var(--border-color, #e4e4e7);
|
|
284
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); /* shadow-xs */
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* Text Container inside Unavailable Row */
|
|
288
|
+
:where(.walletInfo) {
|
|
289
|
+
display: flex;
|
|
290
|
+
align-items: center;
|
|
291
|
+
gap: 0.75rem; /* gap-3 */
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
:where(.unavailableLabel) {
|
|
295
|
+
font-size: 0.75rem; /* text-xs */
|
|
296
|
+
color: var(--muted-foreground, #71717a);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/* Install Button (Ghost) */
|
|
300
|
+
:where(.installButton) {
|
|
301
|
+
height: 2rem; /* h-8 */
|
|
302
|
+
padding: 0 0.5rem; /* px-2 */
|
|
303
|
+
color: var(--muted-foreground, #71717a);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
:where(.installButton:hover) {
|
|
307
|
+
background-color: var(--bg-secondary, #f4f4f5);
|
|
308
|
+
color: var(--fg-foreground, #09090b);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* --- Empty State (No Wallets) --- */
|
|
312
|
+
:where(.emptyStateContainer) {
|
|
313
|
+
display: flex;
|
|
314
|
+
flex-direction: column;
|
|
315
|
+
align-items: center;
|
|
316
|
+
|
|
317
|
+
border-radius: 0.5rem;
|
|
318
|
+
border: 1px dashed var(--border-color, #e4e4e7);
|
|
319
|
+
padding: 2rem;
|
|
320
|
+
text-align: center;
|
|
321
|
+
}
|
|
322
|
+
:where(.emptyStateIcon) {
|
|
323
|
+
height: 3rem;
|
|
324
|
+
width: 3rem;
|
|
325
|
+
color: var(--muted-foreground, #71717a);
|
|
326
|
+
margin-bottom: 0.75rem;
|
|
327
|
+
}
|
|
328
|
+
:where(.emptyStateTitle) {
|
|
329
|
+
font-weight: 600;
|
|
330
|
+
margin-bottom: 0.5rem;
|
|
331
|
+
}
|
|
332
|
+
:where(.emptyStateDesc) {
|
|
333
|
+
font-size: 0.875rem;
|
|
334
|
+
color: var(--muted-foreground, #71717a);
|
|
335
|
+
margin-bottom: 1.5rem;
|
|
336
|
+
}
|
|
337
|
+
:where(.emptyStateActions) {
|
|
338
|
+
display: flex;
|
|
339
|
+
gap: 0.5rem;
|
|
340
|
+
justify-content: center;
|
|
341
|
+
}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type Network = 'mainnet' | 'devnet' | 'testnet' | 'localnet';
|
|
4
|
+
type RpcMap = Record<Network, string[]>;
|
|
5
|
+
|
|
6
|
+
type SolanaWrapperProps = {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** * Name of your app (displayed in wallet connection modals)
|
|
9
|
+
* @default "Solana Kit"
|
|
10
|
+
*/
|
|
11
|
+
appName?: string;
|
|
12
|
+
/** * URL of your app (used for deep linking)
|
|
13
|
+
*/
|
|
14
|
+
appUrl?: string;
|
|
15
|
+
/** * Automatically connect to the last used wallet on load.
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
autoConnect?: boolean;
|
|
19
|
+
/** * Enable mobile wallets (e.g. Phantom on iOS/Android)
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
enableMobile?: boolean;
|
|
23
|
+
/** * Enable WalletConnect support
|
|
24
|
+
* @default true
|
|
25
|
+
*/
|
|
26
|
+
walletConnect?: boolean;
|
|
27
|
+
/** * List of default RPC endpoints mapped by network
|
|
28
|
+
* @default DEFAULT_RPCS
|
|
29
|
+
*/
|
|
30
|
+
defaultRpcList?: RpcMap;
|
|
31
|
+
/** * The default RPC endpoint to use if none is selected
|
|
32
|
+
* @default DEFAULT_RPCS.mainnet[0]
|
|
33
|
+
*/
|
|
34
|
+
defaultRpcUrl?: string;
|
|
35
|
+
/** * LocalStorage key for saving custom RPC list
|
|
36
|
+
* @default 'all-rpc-urls'
|
|
37
|
+
*/
|
|
38
|
+
LS_KEY_RPC_LIST?: string;
|
|
39
|
+
/** * LocalStorage key for saving default RPC endpoint
|
|
40
|
+
* @default 'curr-rpc'
|
|
41
|
+
*/
|
|
42
|
+
LS_KEY_RPC_DEFAULT?: string;
|
|
43
|
+
/** * LocalStorage key for saving selected cluster
|
|
44
|
+
* @default 'solana-cluster'
|
|
45
|
+
*/
|
|
46
|
+
LS_KEY_CLUSTER?: string;
|
|
47
|
+
/** * Persist cluster selection in LocalStorage
|
|
48
|
+
* @default true
|
|
49
|
+
*/
|
|
50
|
+
persistClusterSelection?: boolean;
|
|
51
|
+
/** * Maximum number of retries for RPC requests
|
|
52
|
+
* @default 3
|
|
53
|
+
*/
|
|
54
|
+
MAX_RPC_RETRIES?: number;
|
|
55
|
+
};
|
|
56
|
+
declare function SolanaWrapper(props: SolanaWrapperProps): react_jsx_runtime.JSX.Element;
|
|
57
|
+
|
|
58
|
+
interface RpcContextType {
|
|
59
|
+
rpcUrl: string;
|
|
60
|
+
setRpcUrl: (url: string) => void;
|
|
61
|
+
persistClusterSelection: boolean;
|
|
62
|
+
clusterStorageKey: string;
|
|
63
|
+
maxRPCRetries: number;
|
|
64
|
+
allRpcUrls: RpcMap;
|
|
65
|
+
addRpcUrl: (network: Network, url: string) => void;
|
|
66
|
+
removeRpcUrl: (network: Network, url: string) => void;
|
|
67
|
+
}
|
|
68
|
+
declare const useRpcProvider: () => RpcContextType;
|
|
69
|
+
|
|
70
|
+
export { SolanaWrapper, useRpcProvider };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type Network = 'mainnet' | 'devnet' | 'testnet' | 'localnet';
|
|
4
|
+
type RpcMap = Record<Network, string[]>;
|
|
5
|
+
|
|
6
|
+
type SolanaWrapperProps = {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** * Name of your app (displayed in wallet connection modals)
|
|
9
|
+
* @default "Solana Kit"
|
|
10
|
+
*/
|
|
11
|
+
appName?: string;
|
|
12
|
+
/** * URL of your app (used for deep linking)
|
|
13
|
+
*/
|
|
14
|
+
appUrl?: string;
|
|
15
|
+
/** * Automatically connect to the last used wallet on load.
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
autoConnect?: boolean;
|
|
19
|
+
/** * Enable mobile wallets (e.g. Phantom on iOS/Android)
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
enableMobile?: boolean;
|
|
23
|
+
/** * Enable WalletConnect support
|
|
24
|
+
* @default true
|
|
25
|
+
*/
|
|
26
|
+
walletConnect?: boolean;
|
|
27
|
+
/** * List of default RPC endpoints mapped by network
|
|
28
|
+
* @default DEFAULT_RPCS
|
|
29
|
+
*/
|
|
30
|
+
defaultRpcList?: RpcMap;
|
|
31
|
+
/** * The default RPC endpoint to use if none is selected
|
|
32
|
+
* @default DEFAULT_RPCS.mainnet[0]
|
|
33
|
+
*/
|
|
34
|
+
defaultRpcUrl?: string;
|
|
35
|
+
/** * LocalStorage key for saving custom RPC list
|
|
36
|
+
* @default 'all-rpc-urls'
|
|
37
|
+
*/
|
|
38
|
+
LS_KEY_RPC_LIST?: string;
|
|
39
|
+
/** * LocalStorage key for saving default RPC endpoint
|
|
40
|
+
* @default 'curr-rpc'
|
|
41
|
+
*/
|
|
42
|
+
LS_KEY_RPC_DEFAULT?: string;
|
|
43
|
+
/** * LocalStorage key for saving selected cluster
|
|
44
|
+
* @default 'solana-cluster'
|
|
45
|
+
*/
|
|
46
|
+
LS_KEY_CLUSTER?: string;
|
|
47
|
+
/** * Persist cluster selection in LocalStorage
|
|
48
|
+
* @default true
|
|
49
|
+
*/
|
|
50
|
+
persistClusterSelection?: boolean;
|
|
51
|
+
/** * Maximum number of retries for RPC requests
|
|
52
|
+
* @default 3
|
|
53
|
+
*/
|
|
54
|
+
MAX_RPC_RETRIES?: number;
|
|
55
|
+
};
|
|
56
|
+
declare function SolanaWrapper(props: SolanaWrapperProps): react_jsx_runtime.JSX.Element;
|
|
57
|
+
|
|
58
|
+
interface RpcContextType {
|
|
59
|
+
rpcUrl: string;
|
|
60
|
+
setRpcUrl: (url: string) => void;
|
|
61
|
+
persistClusterSelection: boolean;
|
|
62
|
+
clusterStorageKey: string;
|
|
63
|
+
maxRPCRetries: number;
|
|
64
|
+
allRpcUrls: RpcMap;
|
|
65
|
+
addRpcUrl: (network: Network, url: string) => void;
|
|
66
|
+
removeRpcUrl: (network: Network, url: string) => void;
|
|
67
|
+
}
|
|
68
|
+
declare const useRpcProvider: () => RpcContextType;
|
|
69
|
+
|
|
70
|
+
export { SolanaWrapper, useRpcProvider };
|