@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.
Files changed (35) hide show
  1. package/dist/Avatar.module-P7KEBP7R.module.css +42 -0
  2. package/dist/Button.module-7TPMDOJN.module.css +145 -0
  3. package/dist/Collapsible.module-NXSN3MGI.module.css +24 -0
  4. package/dist/ConnectButton.d.mts +14 -0
  5. package/dist/ConnectButton.d.ts +14 -0
  6. package/dist/ConnectButton.js +1248 -0
  7. package/dist/ConnectButton.js.map +1 -0
  8. package/dist/ConnectButton.mjs +1216 -0
  9. package/dist/ConnectButton.mjs.map +1 -0
  10. package/dist/ConnectButton.module-UWQKSVTP.module.css +8 -0
  11. package/dist/CustomQRCode.module-FOXENMZG.module.css +176 -0
  12. package/dist/Dialog.module-HCRT743N.module.css +136 -0
  13. package/dist/Menu.module-GV627ZLI.module.css +79 -0
  14. package/dist/Spinner.module-G7GUQJZJ.module.css +16 -0
  15. package/dist/WalletDropdown.d.mts +14 -0
  16. package/dist/WalletDropdown.d.ts +14 -0
  17. package/dist/WalletDropdown.js +346 -0
  18. package/dist/WalletDropdown.js.map +1 -0
  19. package/dist/WalletDropdown.mjs +314 -0
  20. package/dist/WalletDropdown.mjs.map +1 -0
  21. package/dist/WalletDropdown.module-342MM7XM.module.css +220 -0
  22. package/dist/WalletModal.d.mts +13 -0
  23. package/dist/WalletModal.d.ts +13 -0
  24. package/dist/WalletModal.js +838 -0
  25. package/dist/WalletModal.js.map +1 -0
  26. package/dist/WalletModal.mjs +806 -0
  27. package/dist/WalletModal.mjs.map +1 -0
  28. package/dist/WalletModal.module-PVV5PRXU.module.css +341 -0
  29. package/dist/index.d.mts +70 -0
  30. package/dist/index.d.ts +70 -0
  31. package/dist/index.js +242 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/index.mjs +222 -0
  34. package/dist/index.mjs.map +1 -0
  35. package/package.json +70 -0
@@ -0,0 +1,314 @@
1
+ "use client";
2
+
3
+ // src/components/WalletDropdown/WalletDropdown.tsx
4
+ import { useEffect, useRef, useState as useState2 } from "react";
5
+ import styles3 from "./WalletDropdown.module-342MM7XM.module.css";
6
+ import { motion } from "motion/react";
7
+
8
+ // src/components/shared/Avatar/Avatar.tsx
9
+ import { useState } from "react";
10
+ import styles from "./Avatar.module-P7KEBP7R.module.css";
11
+ import { Wallet } from "lucide-react";
12
+ import { jsx } from "react/jsx-runtime";
13
+ function Avatar({
14
+ height,
15
+ width,
16
+ src,
17
+ alt,
18
+ theme = "light"
19
+ }) {
20
+ const [hasError, setHasError] = useState(false);
21
+ return /* @__PURE__ */ jsx("div", { className: styles.avatar, "data-theme": theme, children: src && !hasError ? /* @__PURE__ */ jsx(
22
+ "img",
23
+ {
24
+ height,
25
+ width,
26
+ src,
27
+ alt: alt || "Avatar",
28
+ onError: () => setHasError(true)
29
+ }
30
+ ) : /* @__PURE__ */ jsx("div", { className: styles.fallback, style: { height, width }, children: /* @__PURE__ */ jsx(Wallet, {}) }) });
31
+ }
32
+
33
+ // src/components/shared/Avatar/index.ts
34
+ var Avatar_default = Avatar;
35
+
36
+ // src/components/WalletDropdown/WalletDropdown.tsx
37
+ import { Check, ChevronLeft, Copy, Globe, LogOut, RefreshCw } from "lucide-react";
38
+
39
+ // src/components/shared/Button/Button.tsx
40
+ import * as React from "react";
41
+ import { Button as BaseButton } from "@base-ui/react/button";
42
+ import styles2 from "./Button.module-7TPMDOJN.module.css";
43
+ import { jsx as jsx2 } from "react/jsx-runtime";
44
+ var Button = React.forwardRef(
45
+ ({ className, variant = "default", size = "default", ...props }, ref) => {
46
+ return /* @__PURE__ */ jsx2(
47
+ BaseButton,
48
+ {
49
+ ref,
50
+ className: `${styles2.button} ${className || ""}`,
51
+ "data-variant": variant,
52
+ "data-size": size,
53
+ ...props
54
+ }
55
+ );
56
+ }
57
+ );
58
+ Button.displayName = "Button";
59
+ var Button_default = Button;
60
+
61
+ // src/components/shared/Button/index.ts
62
+ var Button_default2 = Button_default;
63
+
64
+ // src/components/WalletDropdown/WalletDropdown.tsx
65
+ import { address, ClusterElement, DisconnectElement, lamportsToSol, useConnectorClient } from "@solana/connector";
66
+ import { createSolanaRpc } from "@solana/kit";
67
+ import { clsx } from "clsx";
68
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
69
+ var networkColor = {
70
+ "solana:mainnet": "#00c950",
71
+ "solana:devnet": "#2b7fff",
72
+ "solana:testnet": "#f0b100",
73
+ "solana:localnet": "#ff3b3b"
74
+ };
75
+ function WalletDropdown(props) {
76
+ const client = useConnectorClient();
77
+ const { CN_ConnectButton, selectedAccount, walletIcon, walletName, theme, allowNetworkSwitch, showSolBalance } = props;
78
+ const [view, setView] = useState2("wallet");
79
+ const [copied, setCopied] = useState2(false);
80
+ const fetching = useRef(false);
81
+ const [isFetchingBalance, setIsFetchingBalance] = useState2(false);
82
+ const [solBalance, setSolBalance] = useState2(null);
83
+ const shortAddress = `${selectedAccount.slice(0, 4)}...${selectedAccount.slice(-4)}`;
84
+ async function handleCopy() {
85
+ try {
86
+ await navigator.clipboard.writeText(selectedAccount);
87
+ setCopied(true);
88
+ setTimeout(() => setCopied(false), 2e3);
89
+ } catch (error) {
90
+ setCopied(false);
91
+ console.error("Failed to copy to clipboard:", error);
92
+ }
93
+ }
94
+ async function fetchSolBalance() {
95
+ if (!client || fetching.current) return;
96
+ setIsFetchingBalance(true);
97
+ fetching.current = true;
98
+ try {
99
+ const rpcUrl = client.getRpcUrl();
100
+ const pubkey = address(selectedAccount);
101
+ if (!rpcUrl) throw new Error("No RPC endpoint configured");
102
+ const rpc = createSolanaRpc(rpcUrl);
103
+ const solLamports = (await rpc.getBalance(pubkey).send()).value || 0;
104
+ const sol = lamportsToSol(solLamports);
105
+ setSolBalance(sol);
106
+ } catch (error) {
107
+ setSolBalance(0);
108
+ } finally {
109
+ setIsFetchingBalance(false);
110
+ fetching.current = false;
111
+ }
112
+ }
113
+ useEffect(() => {
114
+ if (showSolBalance && selectedAccount && client) {
115
+ fetchSolBalance();
116
+ }
117
+ }, [selectedAccount, client, showSolBalance]);
118
+ if (view === "wallet") {
119
+ return /* @__PURE__ */ jsxs(
120
+ motion.div,
121
+ {
122
+ initial: { opacity: 0 },
123
+ animate: { opacity: 1 },
124
+ exit: { opacity: 0 },
125
+ transition: { duration: 0.2 },
126
+ className: clsx(styles3.WalletDropdown, CN_ConnectButton),
127
+ "data-theme": theme,
128
+ children: [
129
+ /* @__PURE__ */ jsxs("div", { className: styles3.Header, children: [
130
+ /* @__PURE__ */ jsxs("div", { className: styles3.addressAndAvatar, children: [
131
+ /* @__PURE__ */ jsx3(
132
+ Avatar_default,
133
+ {
134
+ width: 48,
135
+ height: 48,
136
+ src: walletIcon,
137
+ alt: walletName
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsxs("div", { className: styles3.address, children: [
141
+ /* @__PURE__ */ jsx3("span", { className: styles3.shortAddress, children: shortAddress }),
142
+ /* @__PURE__ */ jsx3("span", { className: styles3.walletName, children: walletName })
143
+ ] })
144
+ ] }),
145
+ /* @__PURE__ */ jsxs("div", { className: styles3.actions, children: [
146
+ /* @__PURE__ */ jsx3(
147
+ Button_default2,
148
+ {
149
+ type: "button",
150
+ onClick: handleCopy,
151
+ variant: "outline",
152
+ size: "icon",
153
+ className: "rounded-full",
154
+ title: copied ? "Copied!" : "Copy address",
155
+ children: copied ? /* @__PURE__ */ jsx3(Check, { className: styles3.checkIcon }) : /* @__PURE__ */ jsx3(Copy, {})
156
+ }
157
+ ),
158
+ allowNetworkSwitch && /* @__PURE__ */ jsx3(
159
+ ClusterElement,
160
+ {
161
+ render: ({ cluster }) => /* @__PURE__ */ jsxs(
162
+ Button_default2,
163
+ {
164
+ type: "button",
165
+ variant: "outline",
166
+ size: "icon",
167
+ onClick: () => setView("network"),
168
+ title: `Network: ${(cluster == null ? void 0 : cluster.label) || "Unknown"}`,
169
+ children: [
170
+ /* @__PURE__ */ jsx3(Globe, {}),
171
+ /* @__PURE__ */ jsx3(
172
+ "span",
173
+ {
174
+ className: styles3.networkIndicator,
175
+ style: { background: networkColor[(cluster == null ? void 0 : cluster.id) || "solana:mainnet"] }
176
+ }
177
+ )
178
+ ]
179
+ }
180
+ )
181
+ }
182
+ )
183
+ ] })
184
+ ] }),
185
+ showSolBalance && /* @__PURE__ */ jsxs("div", { className: styles3.balanceSection, children: [
186
+ /* @__PURE__ */ jsxs(
187
+ "div",
188
+ {
189
+ className: styles3.balanceHeader,
190
+ children: [
191
+ /* @__PURE__ */ jsx3("span", { className: styles3.balanceLabel, children: "Balance" }),
192
+ /* @__PURE__ */ jsx3(
193
+ "button",
194
+ {
195
+ onClick: () => fetchSolBalance(),
196
+ disabled: isFetchingBalance,
197
+ title: "Refresh balance",
198
+ className: styles3.refreshButton,
199
+ "data-loading": isFetchingBalance,
200
+ children: /* @__PURE__ */ jsx3(
201
+ RefreshCw,
202
+ {
203
+ className: styles3.refreshIcon
204
+ }
205
+ )
206
+ }
207
+ )
208
+ ]
209
+ }
210
+ ),
211
+ /* @__PURE__ */ jsx3("div", { className: styles3.balanceValue, children: isFetchingBalance ? /* @__PURE__ */ jsx3("div", { className: styles3.balanceLoading }) : solBalance !== null ? `${solBalance.toFixed(4)} SOL` : "-- SOL" })
212
+ ] }),
213
+ /* @__PURE__ */ jsx3(
214
+ DisconnectElement,
215
+ {
216
+ render: ({ disconnect, disconnecting }) => /* @__PURE__ */ jsxs(
217
+ Button_default2,
218
+ {
219
+ variant: "default",
220
+ className: styles3.disconnectButton,
221
+ onClick: disconnect,
222
+ disabled: disconnecting,
223
+ children: [
224
+ /* @__PURE__ */ jsx3(LogOut, { className: styles3.disconnectIcon }),
225
+ disconnecting ? "Disconnecting..." : "Disconnect"
226
+ ]
227
+ }
228
+ )
229
+ }
230
+ )
231
+ ]
232
+ }
233
+ );
234
+ }
235
+ if (view === "network") {
236
+ console.count("Network view rendered");
237
+ return /* @__PURE__ */ jsxs(
238
+ motion.div,
239
+ {
240
+ initial: { opacity: 0 },
241
+ animate: { opacity: 1 },
242
+ exit: { opacity: 0 },
243
+ transition: { duration: 0.2 },
244
+ className: clsx(styles3.WalletDropdown, CN_ConnectButton),
245
+ "data-theme": theme,
246
+ children: [
247
+ /* @__PURE__ */ jsxs("div", { className: styles3.NetworkHeader, children: [
248
+ /* @__PURE__ */ jsx3(
249
+ Button_default2,
250
+ {
251
+ type: "button",
252
+ variant: "outline",
253
+ size: "icon",
254
+ onClick: () => setView("wallet"),
255
+ title: `Network: Back to Wallet`,
256
+ className: styles3.backButton,
257
+ children: /* @__PURE__ */ jsx3(ChevronLeft, {})
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsx3("span", { children: "Network Settings" })
261
+ ] }),
262
+ /* @__PURE__ */ jsx3(
263
+ ClusterElement,
264
+ {
265
+ render: ({ cluster, clusters, setCluster }) => {
266
+ const currentClusterId = (cluster == null ? void 0 : cluster.id) || "solana:mainnet";
267
+ return /* @__PURE__ */ jsx3("div", { className: styles3.networkOptions, children: clusters.map((network, index) => {
268
+ const isSelected = currentClusterId === network.id;
269
+ return /* @__PURE__ */ jsxs(
270
+ "div",
271
+ {
272
+ role: "button",
273
+ tabIndex: 0,
274
+ onClick: () => setCluster(network.id),
275
+ onKeyDown: (e) => {
276
+ if (e.key === "Enter" || e.key === " ") {
277
+ e.preventDefault();
278
+ setCluster(network.id);
279
+ }
280
+ },
281
+ className: styles3.networkButton,
282
+ children: [
283
+ /* @__PURE__ */ jsxs("div", { className: styles3.networkName, children: [
284
+ /* @__PURE__ */ jsx3(
285
+ "span",
286
+ {
287
+ className: styles3.networkColor,
288
+ style: { background: networkColor[network.id] }
289
+ }
290
+ ),
291
+ /* @__PURE__ */ jsx3("span", { className: styles3.networkLabel, children: network.label })
292
+ ] }),
293
+ /* @__PURE__ */ jsx3("div", { className: styles3.checkMark, "data-selected": isSelected, children: isSelected && /* @__PURE__ */ jsx3(Check, {}) })
294
+ ]
295
+ },
296
+ network.id
297
+ );
298
+ }) });
299
+ }
300
+ }
301
+ )
302
+ ]
303
+ }
304
+ );
305
+ }
306
+ }
307
+ var WalletDropdown_default = WalletDropdown;
308
+
309
+ // src/components/WalletDropdown/index.ts
310
+ var WalletDropdown_default2 = WalletDropdown_default;
311
+ export {
312
+ WalletDropdown_default2 as default
313
+ };
314
+ //# sourceMappingURL=WalletDropdown.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/WalletDropdown/WalletDropdown.tsx","../src/components/shared/Avatar/Avatar.tsx","../src/components/shared/Avatar/index.ts","../src/components/shared/Button/Button.tsx","../src/components/shared/Button/index.ts","../src/components/WalletDropdown/index.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\r\nimport styles from './WalletDropdown.module.css'\r\nimport { motion } from 'motion/react';\r\nimport Avatar from '@shared/Avatar';\r\nimport { Check, ChevronLeft, Copy, Globe, LogOut, RefreshCw } from 'lucide-react';\r\nimport Button from '@shared/Button';\r\nimport { address, BalanceElement, ClusterElement, DisconnectElement, lamportsToSol, useCluster, useConnectorClient } from '@solana/connector';\r\nimport { createSolanaRpc } from '@solana/kit';\r\nimport { clsx } from 'clsx';\r\n\r\ninterface WalletDropdownProps {\r\n CN_ConnectButton?: string;\r\n selectedAccount: string;\r\n walletIcon?: string;\r\n walletName: string;\r\n theme?: 'light' | 'dark';\r\n\r\n allowNetworkSwitch?: boolean;\r\n showSolBalance?: boolean;\r\n}\r\n\r\ntype DropdownView = 'wallet' | 'network';\r\n\r\nconst networkColor: Record<string, string> = {\r\n 'solana:mainnet': '#00c950',\r\n 'solana:devnet': '#2b7fff',\r\n 'solana:testnet': '#f0b100',\r\n 'solana:localnet': '#ff3b3b',\r\n};\r\n\r\nexport function WalletDropdown(props: WalletDropdownProps) {\r\n const client = useConnectorClient();\r\n\r\n const { CN_ConnectButton, selectedAccount, walletIcon, walletName, theme, allowNetworkSwitch, showSolBalance } = props\r\n\r\n const [view, setView] = useState<DropdownView>('wallet');\r\n const [copied, setCopied] = useState(false);\r\n\r\n const fetching = useRef(false);\r\n const [isFetchingBalance, setIsFetchingBalance] = useState(false);\r\n const [solBalance, setSolBalance] = useState<number | null>(null);\r\n\r\n const shortAddress = `${selectedAccount.slice(0, 4)}...${selectedAccount.slice(-4)}`;\r\n\r\n async function handleCopy() {\r\n try {\r\n await navigator.clipboard.writeText(selectedAccount);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch (error) {\r\n setCopied(false);\r\n console.error('Failed to copy to clipboard:', error);\r\n }\r\n }\r\n\r\n async function fetchSolBalance() {\r\n if (!client || fetching.current) return;\r\n setIsFetchingBalance(true);\r\n fetching.current = true;\r\n try {\r\n const rpcUrl = client.getRpcUrl();\r\n const pubkey = address(selectedAccount);\r\n if (!rpcUrl) throw new Error('No RPC endpoint configured');\r\n const rpc = createSolanaRpc(rpcUrl);\r\n const solLamports = (await rpc.getBalance(pubkey).send()).value || 0;\r\n const sol = lamportsToSol(solLamports);\r\n setSolBalance(sol);\r\n\r\n } catch (error) {\r\n setSolBalance(0);\r\n } finally {\r\n setIsFetchingBalance(false);\r\n fetching.current = false;\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (showSolBalance && selectedAccount && client) {\r\n fetchSolBalance();\r\n }\r\n }, [selectedAccount, client, showSolBalance]);\r\n\r\n if (view === 'wallet') {\r\n return (\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className={clsx(styles.WalletDropdown, CN_ConnectButton)}\r\n data-theme={theme}\r\n >\r\n {/* Header with Avatar and Address */}\r\n <div className={styles.Header}>\r\n <div className={styles.addressAndAvatar}>\r\n <Avatar\r\n width={48}\r\n height={48}\r\n src={walletIcon}\r\n alt={walletName}\r\n />\r\n <div className={styles.address}>\r\n <span className={styles.shortAddress}>{shortAddress}</span>\r\n <span className={styles.walletName}>{walletName}</span>\r\n </div>\r\n </div>\r\n\r\n <div className={styles.actions}>\r\n <Button\r\n type=\"button\"\r\n onClick={handleCopy}\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className=\"rounded-full\"\r\n title={copied ? 'Copied!' : 'Copy address'}\r\n >\r\n {copied ?\r\n <Check className={styles.checkIcon} /> :\r\n <Copy />\r\n }\r\n </Button>\r\n\r\n {/* Network Selector Globe Button */}\r\n {allowNetworkSwitch && (\r\n <ClusterElement\r\n render={({ cluster }) => (\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => setView('network')}\r\n title={`Network: ${cluster?.label || 'Unknown'}`}\r\n >\r\n <Globe />\r\n <span\r\n className={styles.networkIndicator}\r\n style={{ background: networkColor[cluster?.id || 'solana:mainnet'] }}\r\n />\r\n </Button>\r\n )}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {showSolBalance && (\r\n <div className={styles.balanceSection}>\r\n <div\r\n className={styles.balanceHeader}\r\n >\r\n <span className={styles.balanceLabel}>Balance</span>\r\n <button\r\n onClick={() => fetchSolBalance()}\r\n disabled={isFetchingBalance}\r\n title=\"Refresh balance\"\r\n className={styles.refreshButton}\r\n data-loading={isFetchingBalance}\r\n >\r\n <RefreshCw\r\n className={styles.refreshIcon}\r\n />\r\n </button>\r\n </div>\r\n <div className={styles.balanceValue}>\r\n {isFetchingBalance ? (\r\n <div className={styles.balanceLoading} />\r\n ) : solBalance !== null ? (\r\n `${solBalance.toFixed(4)} SOL`\r\n ) : (\r\n '-- SOL'\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <DisconnectElement\r\n render={({ disconnect, disconnecting }) => (\r\n <Button\r\n variant=\"default\"\r\n className={styles.disconnectButton}\r\n onClick={disconnect}\r\n disabled={disconnecting}\r\n >\r\n <LogOut className={styles.disconnectIcon} />\r\n {disconnecting ? 'Disconnecting...' : 'Disconnect'}\r\n </Button>\r\n )}\r\n />\r\n </motion.div>\r\n )\r\n }\r\n\r\n //network switch view\r\n if (view === 'network') {\r\n console.count('Network view rendered');\r\n return (\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className={clsx(styles.WalletDropdown, CN_ConnectButton)}\r\n data-theme={theme}\r\n >\r\n {/* Header */}\r\n <div className={styles.NetworkHeader}>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => setView('wallet')}\r\n title={`Network: Back to Wallet`}\r\n className={styles.backButton}\r\n >\r\n <ChevronLeft />\r\n </Button>\r\n <span>Network Settings</span>\r\n </div>\r\n\r\n {/* Network Options */}\r\n <ClusterElement\r\n render={({ cluster, clusters, setCluster }) => {\r\n const currentClusterId = (cluster as { id?: string })?.id || 'solana:mainnet';\r\n return (\r\n <div className={styles.networkOptions}>\r\n {clusters.map((network, index) => {\r\n const isSelected = currentClusterId === network.id;\r\n return (\r\n <div\r\n key={network.id}\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={() => setCluster(network.id)}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n setCluster(network.id);\r\n }\r\n }}\r\n className={styles.networkButton}\r\n >\r\n <div className={styles.networkName}>\r\n <span\r\n className={styles.networkColor}\r\n style={{ background: networkColor[network.id] }}\r\n />\r\n <span className={styles.networkLabel}>{network.label}</span>\r\n </div>\r\n <div className={styles.checkMark} data-selected={isSelected}>\r\n {isSelected && <Check />}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n }}\r\n />\r\n </motion.div>\r\n )\r\n }\r\n}\r\n\r\nexport default WalletDropdown","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;","'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;","import WalletDropdown from './WalletDropdown';\r\n\r\n\r\nexport default WalletDropdown"],"mappings":"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","names":["useState","styles","styles","jsx","Button_default","jsx","useState","styles","Button_default","WalletDropdown_default"]}
@@ -0,0 +1,220 @@
1
+ :where(.WalletDropdown) {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 22.5rem;
5
+ padding: 1rem;
6
+ gap: 1rem;
7
+
8
+ --muted: #f5f5f5;
9
+ --muted-fg: #71717a;
10
+
11
+ --network-bg: #fafafa;
12
+ --network-border: #e5e5e5;
13
+
14
+ --balance-bg: #f4f4f5;
15
+ --balance-fg: #52525b;
16
+ --balance-loading-bg: #e4e4e7;
17
+ }
18
+ :where(.WalletDropdown[data-theme="dark"]) {
19
+ --muted: #f5f5f5;
20
+ --muted-fg: #737373;
21
+
22
+ --network-bg: #fafafa;
23
+ --network-border: #e5e5e5;
24
+
25
+ --balance-bg: #18181b;
26
+ --balance-fg: #a1a1aa;
27
+ --balance-loading-bg: #27272a;
28
+ }
29
+
30
+ /* address, avatar, copy and network button */
31
+ :where(.Header) {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ }
36
+ :where(.addressAndAvatar) {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 0.75rem;
40
+ }
41
+ :where(.address) {
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
45
+ :where(.shortAddress) {
46
+ font-size: 1rem;
47
+ font-weight: 600;
48
+ }
49
+ :where(.walletName) {
50
+ font-size: 0.875rem;
51
+ color: var(--muted-fg);
52
+ }
53
+
54
+ :where(.actions) {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 0.5rem;
58
+ }
59
+ :where(.actions svg) {
60
+ margin: auto;
61
+ width: 1rem;
62
+ height: 1rem;
63
+ }
64
+ :where(.actions .checkIcon) {
65
+ color: green;
66
+ }
67
+ :where(.actions > button) {
68
+ position: relative;
69
+ border-radius: 100%;
70
+ margin: auto;
71
+ }
72
+ :where(.networkIndicator) {
73
+ position: absolute;
74
+ bottom: -0.25rem;
75
+ right: -0.25rem;
76
+ height: 0.75rem;
77
+ width: 0.75rem;
78
+ border-radius: 100%;
79
+ }
80
+
81
+ /* balance element */
82
+ :where(.balanceSection) {
83
+ padding: 1em;
84
+ border-radius: 0.75rem;
85
+ background-color: var(--balance-bg);
86
+ gap: 0.25rem;
87
+ }
88
+ :where(.balanceHeader) {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: space-between;
92
+ }
93
+ :where(.balanceLabel) {
94
+ font-size: 0.875rem;
95
+ color: var(--balance-fg);
96
+ }
97
+ :where(.refreshButton) {
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ padding: 0.25rem;
102
+ border-radius: 0.5rem;
103
+ border: none;
104
+ background-color: var(--balance-fg);
105
+ }
106
+ :where(.refreshButton:disabled) {
107
+ opacity: 0.5;
108
+ }
109
+ :where(.refreshButton svg) {
110
+ height: 1rem;
111
+ width: 1rem;
112
+ color: var(--balance-bg);
113
+ }
114
+ :where(.refreshButton svg[data-loading="true"]) {
115
+ animation: spin 1s linear infinite;
116
+ }
117
+ :where(.balanceValue) {
118
+ font-size: 1.5rem;
119
+ font-weight: 600;
120
+ }
121
+ :where(.balanceLoading) {
122
+ height: 2rem;
123
+ width: 8rem;
124
+ background-color: var(--balance-loading-bg);
125
+ border-radius: 0.5rem;
126
+ animation: pulse 1.5s infinite;
127
+ }
128
+
129
+ /* disconnect button */
130
+ :where(.disconnectButton) {
131
+ width: 100%;
132
+ height: 2.75rem;
133
+ font-size: 1rem;
134
+ font-weight: 600;
135
+ border-radius: 0.75rem;
136
+ gap: 1em;
137
+ }
138
+ :where(.disconnectIcon) {
139
+ height: 1rem;
140
+ width: 1rem;
141
+ }
142
+
143
+ /* network switcher */
144
+ :where(.NetworkHeader) {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 0.5rem;
148
+ }
149
+ :where(.backButton) {
150
+ border-radius: 50%;
151
+ opacity: 0.75;
152
+ }
153
+ :where(.NetworkHeader span) {
154
+ font-weight: 600;
155
+ font-size: 1.125rem;
156
+ }
157
+
158
+ :where(.networkOptions) {
159
+ border-radius: 0.75rem;
160
+ background-color: #fafafa80;
161
+ overflow: hidden;
162
+ border: 1px solid var(--network-border);
163
+ background-color: var(--network-bg);
164
+ }
165
+ :where(.networkButton) {
166
+ display: flex;
167
+ width: 100%;
168
+ align-items: center;
169
+ justify-content: space-between;
170
+ padding: 1rem;
171
+ cursor: pointer;
172
+ transition: background-color 0.2s;
173
+ }
174
+ :where(.networkButton:hover) {
175
+ filter: brightness(1.1);
176
+ }
177
+ :where(.networkOptions .networkButton:not(:last-child)) {
178
+ border-bottom: 1px solid var(--network-border);
179
+ }
180
+
181
+ :where(.networkName) {
182
+ display: flex;
183
+ gap: 1em;
184
+ }
185
+ :where(.networkColor) {
186
+ height: 1em;
187
+ width: 1em;
188
+ border-radius: 100%;
189
+ }
190
+ :where(.checkMark) {
191
+ height: 1.25rem;
192
+ width: 1.25rem;
193
+ border-radius: 100%;
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ border: 1px solid var(--network-border);
198
+ transition:
199
+ background-color 0.2s,
200
+ border-color 0.2s;
201
+ }
202
+ :where(.checkMark[data-selected="true"]) {
203
+ background-color: black;
204
+ border-color: black;
205
+ }
206
+ :where(.checkMark svg) {
207
+ width: 0.75rem;
208
+ height: 0.75rem;
209
+ color: white;
210
+ }
211
+
212
+ /* animations */
213
+ @keyframes spin {
214
+ :where(from) {
215
+ transform: rotate(0deg);
216
+ }
217
+ :where(to) {
218
+ transform: rotate(360deg);
219
+ }
220
+ }
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type WalletModalProps = {
4
+ CN_Modal?: string;
5
+ theme?: 'light' | 'dark';
6
+ open: boolean;
7
+ onOpenChange: (open: boolean) => void;
8
+ walletConnectUri: string | null;
9
+ onClearWalletConnectUri: () => void;
10
+ };
11
+ declare function WalletModal(props: WalletModalProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { WalletModal as default };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type WalletModalProps = {
4
+ CN_Modal?: string;
5
+ theme?: 'light' | 'dark';
6
+ open: boolean;
7
+ onOpenChange: (open: boolean) => void;
8
+ walletConnectUri: string | null;
9
+ onClearWalletConnectUri: () => void;
10
+ };
11
+ declare function WalletModal(props: WalletModalProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { WalletModal as default };