decane-connect-kit 2.29.0 → 2.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -5551,8 +5551,8 @@ async function deriveAddressesFromShares(a, b) {
5551
5551
  init_errors();
5552
5552
 
5553
5553
  // src/ui/WalletSelector.tsx
5554
- var import_react2 = __toESM(require("react"), 1);
5555
- var import_react_dom = require("react-dom");
5554
+ var import_react3 = __toESM(require("react"), 1);
5555
+ var import_react_dom2 = require("react-dom");
5556
5556
 
5557
5557
  // src/ui/styles.ts
5558
5558
  var tokens = {
@@ -5880,1047 +5880,23 @@ function ChevronIcon({ size = 16, open = false }) {
5880
5880
  /* @__PURE__ */ import_react.default.createElement("path", { d: "m6 9 6 6 6-6" })
5881
5881
  );
5882
5882
  }
5883
-
5884
- // src/ui/WalletSelector.tsx
5885
- var FONT_URL = "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap";
5886
- function injectTokens(theme) {
5887
- let resolved;
5888
- if (theme === "auto") {
5889
- resolved = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
5890
- } else {
5891
- resolved = theme;
5892
- }
5893
- let styleEl = document.getElementById("decane-tokens");
5894
- if (!styleEl) {
5895
- styleEl = document.createElement("style");
5896
- styleEl.id = "decane-tokens";
5897
- document.head.appendChild(styleEl);
5898
- }
5899
- styleEl.textContent = `:root { ${CSS_VARS[resolved]} }`;
5883
+ function ArrowLeftIcon({ size = 16 }) {
5884
+ return /* @__PURE__ */ import_react.default.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", ...line, "aria-hidden": "true", style: { flexShrink: 0 } }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M19 12H5M11 6l-6 6 6 6" }));
5900
5885
  }
5901
- function injectFont() {
5902
- if (document.getElementById("decane-font")) return;
5903
- const link = document.createElement("link");
5904
- link.id = "decane-font";
5905
- link.rel = "stylesheet";
5906
- link.href = FONT_URL;
5907
- document.head.appendChild(link);
5886
+ function WalletLineIcon({ size = 18 }) {
5887
+ return /* @__PURE__ */ import_react.default.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", ...line, "aria-hidden": "true", style: { flexShrink: 0 } }, /* @__PURE__ */ import_react.default.createElement("path", { d: "M4 7.5A2.5 2.5 0 0 1 6.5 5H18a1 1 0 0 1 1 1v2" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M4 7.5v9A2.5 2.5 0 0 0 6.5 19H19a1 1 0 0 0 1-1v-9a1 1 0 0 0-1-1H6.5A2.5 2.5 0 0 1 4 7.5z" }), /* @__PURE__ */ import_react.default.createElement("circle", { cx: "16", cy: "13.5", r: "1", fill: "currentColor", stroke: "none" }));
5908
5888
  }
5909
- function WalletRow({ wallet, onClick }) {
5910
- const [hovered, setHovered] = (0, import_react2.useState)(false);
5911
- const [focused, setFocused] = (0, import_react2.useState)(false);
5912
- return /* @__PURE__ */ import_react2.default.createElement(
5913
- "button",
5914
- {
5915
- onClick,
5916
- onMouseEnter: () => setHovered(true),
5917
- onMouseLeave: () => setHovered(false),
5918
- onFocus: () => setFocused(true),
5919
- onBlur: () => setFocused(false),
5920
- style: {
5921
- display: "flex",
5922
- alignItems: "center",
5923
- gap: 12,
5924
- width: "100%",
5925
- padding: "11px 14px",
5926
- background: hovered ? "var(--dc-surface-hover)" : "transparent",
5927
- border: focused ? "1px solid var(--dc-border-accent)" : "1px solid transparent",
5928
- borderRadius: 10,
5929
- cursor: "pointer",
5930
- textAlign: "left",
5931
- transition: "background 0.12s, border-color 0.12s",
5932
- outline: "none",
5933
- fontFamily: "inherit"
5934
- }
5935
- },
5936
- /* @__PURE__ */ import_react2.default.createElement(WalletIcon, { src: wallet.icon || void 0, name: wallet.name, size: 38 }),
5937
- /* @__PURE__ */ import_react2.default.createElement("span", { style: { flex: 1, fontSize: 14, fontWeight: 600, color: "var(--dc-text)", letterSpacing: "-0.01em" } }, wallet.name),
5938
- /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: wallet.chainSupport, size: 16 }),
5939
- /* @__PURE__ */ import_react2.default.createElement(
5940
- "svg",
5941
- {
5942
- width: "14",
5943
- height: "14",
5944
- viewBox: "0 0 14 14",
5945
- fill: "none",
5946
- style: { color: hovered ? "var(--dc-text-secondary)" : "var(--dc-text-muted)", flexShrink: 0, transition: "color 0.12s" }
5947
- },
5948
- /* @__PURE__ */ import_react2.default.createElement("path", { d: "M5 2.5L9.5 7L5 11.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })
5949
- )
5950
- );
5951
- }
5952
- function FilterTab({ label, active, onClick }) {
5953
- const [hovered, setHovered] = (0, import_react2.useState)(false);
5954
- return /* @__PURE__ */ import_react2.default.createElement(
5955
- "button",
5956
- {
5957
- onClick,
5958
- onMouseEnter: () => setHovered(true),
5959
- onMouseLeave: () => setHovered(false),
5960
- style: {
5961
- flex: 1,
5962
- padding: "6px 8px",
5963
- borderRadius: 8,
5964
- border: active ? "1px solid var(--dc-border-accent)" : "1px solid transparent",
5965
- background: active ? "rgba(245,200,0,0.1)" : hovered ? "var(--dc-surface-hover)" : "transparent",
5966
- color: active ? "var(--dc-accent)" : "var(--dc-text-muted)",
5967
- fontSize: 11,
5968
- fontWeight: 700,
5969
- letterSpacing: "0.04em",
5970
- textTransform: "uppercase",
5971
- cursor: "pointer",
5972
- transition: "all 0.12s",
5973
- fontFamily: "inherit",
5974
- outline: "none"
5975
- }
5976
- },
5977
- label
5978
- );
5979
- }
5980
- function ChainOption({ label, description, badges, onClick }) {
5981
- const [hovered, setHovered] = (0, import_react2.useState)(false);
5982
- return /* @__PURE__ */ import_react2.default.createElement(
5983
- "button",
5984
- {
5985
- onClick,
5986
- onMouseEnter: () => setHovered(true),
5987
- onMouseLeave: () => setHovered(false),
5988
- style: {
5989
- display: "flex",
5990
- flexDirection: "column",
5991
- alignItems: "flex-start",
5992
- gap: 6,
5993
- width: "100%",
5994
- padding: "14px 16px",
5995
- background: hovered ? "var(--dc-surface-hover)" : "var(--dc-surface)",
5996
- border: hovered ? "1px solid var(--dc-border-accent)" : "1px solid var(--dc-border)",
5997
- borderRadius: 12,
5998
- cursor: "pointer",
5999
- textAlign: "left",
6000
- transition: "all 0.12s",
6001
- fontFamily: "inherit",
6002
- outline: "none"
6003
- }
6004
- },
6005
- badges,
6006
- /* @__PURE__ */ import_react2.default.createElement("span", { style: { fontSize: 13, fontWeight: 700, color: "var(--dc-text)" } }, label),
6007
- /* @__PURE__ */ import_react2.default.createElement("span", { style: { fontSize: 11, color: "var(--dc-text-muted)", lineHeight: 1.4 } }, description)
6008
- );
5889
+ function SearchIcon({ size = 16 }) {
5890
+ return /* @__PURE__ */ import_react.default.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", ...line, "aria-hidden": "true", style: { flexShrink: 0 } }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "11", cy: "11", r: "6.5" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "m20 20-4.2-4.2" }));
6009
5891
  }
6010
- function hasSocialMode(mode) {
6011
- return mode === "all" || mode === "social" || mode === "evm+social" || mode === "solana+social" || mode === "tron+social" || mode === "evm+tron+social";
6012
- }
6013
- function WalletSelector({
6014
- provider,
6015
- open,
6016
- onClose,
6017
- onConnect,
6018
- theme = "auto",
6019
- networks = "all",
6020
- mode = "wallets",
6021
- socialAuthMethods = ["google", "email"],
6022
- onGoogleSignIn,
6023
- onKingsChatSignIn,
6024
- onXSignIn,
6025
- onEmailStart,
6026
- onEmailVerify,
6027
- onPhoneStart,
6028
- onPhoneVerify,
6029
- customAuthLabel,
6030
- onCustomAuthSignIn,
6031
- canUsePasskey = false,
6032
- passkeyAddress = null,
6033
- onPasskeySignIn
6034
- }) {
6035
- const showSocial = hasSocialMode(mode);
6036
- const showWallets = mode !== "social";
6037
- const [view, setView] = (0, import_react2.useState)(showSocial ? "social" : "wallets");
6038
- const [search, setSearch] = (0, import_react2.useState)("");
6039
- const [filter, setFilter] = (0, import_react2.useState)("all");
6040
- const [pendingWallet, setPendingWallet] = (0, import_react2.useState)(null);
6041
- const [emailStep, setEmailStep] = (0, import_react2.useState)("input");
6042
- const [emailVal, setEmailVal] = (0, import_react2.useState)("");
6043
- const [codeVal, setCodeVal] = (0, import_react2.useState)("");
6044
- const [phoneStep, setPhoneStep] = (0, import_react2.useState)("input");
6045
- const [phoneVal, setPhoneVal] = (0, import_react2.useState)("");
6046
- const [phoneCode, setPhoneCode] = (0, import_react2.useState)("");
6047
- const [socialLoad, setSocialLoad] = (0, import_react2.useState)(false);
6048
- const [socialErr, setSocialErr] = (0, import_react2.useState)("");
6049
- const [showOtherMethods, setShowOtherMethods] = (0, import_react2.useState)(false);
6050
- const passkeyFirst = canUsePasskey && !!onPasskeySignIn && !showOtherMethods;
6051
- (0, import_react2.useEffect)(() => {
6052
- if (!open) return;
6053
- injectFont();
6054
- injectTokens(theme);
6055
- if (theme !== "auto") return;
6056
- const mq = window.matchMedia("(prefers-color-scheme: dark)");
6057
- const handler = () => injectTokens("auto");
6058
- mq.addEventListener("change", handler);
6059
- return () => mq.removeEventListener("change", handler);
6060
- }, [open, theme]);
6061
- (0, import_react2.useEffect)(() => {
6062
- if (!open) {
6063
- setSearch("");
6064
- setFilter("all");
6065
- setPendingWallet(null);
6066
- setView(showSocial ? "social" : "wallets");
6067
- setEmailStep("input");
6068
- setEmailVal("");
6069
- setCodeVal("");
6070
- setSocialErr("");
6071
- setShowOtherMethods(false);
6072
- return;
6073
- }
6074
- return () => {
6075
- document.getElementById("decane-tokens")?.remove();
6076
- };
6077
- }, [open, showWallets]);
6078
- async function handlePasskeySignIn() {
6079
- if (!onPasskeySignIn) return;
6080
- setSocialLoad(true);
6081
- setSocialErr("");
6082
- try {
6083
- await onPasskeySignIn();
6084
- } catch (e) {
6085
- const err = e;
6086
- if (err?.name !== "UserCancelledError") {
6087
- setSocialErr(err?.message ?? "Passkey sign-in failed");
6088
- setShowOtherMethods(true);
6089
- }
6090
- setSocialLoad(false);
6091
- }
6092
- }
6093
- async function handlePasskeyClick() {
6094
- void handlePasskeySignIn();
6095
- }
6096
- async function handleGoogleClick() {
6097
- if (!onGoogleSignIn) return;
6098
- setSocialLoad(true);
6099
- setSocialErr("");
6100
- try {
6101
- await onGoogleSignIn();
6102
- } catch (e) {
6103
- setSocialErr(e.message);
6104
- setSocialLoad(false);
6105
- }
6106
- }
6107
- async function handleKingsChatClick() {
6108
- if (!onKingsChatSignIn) return;
6109
- setSocialLoad(true);
6110
- setSocialErr("");
6111
- try {
6112
- await onKingsChatSignIn();
6113
- } catch (e) {
6114
- setSocialErr(e.message);
6115
- } finally {
6116
- setSocialLoad(false);
6117
- }
6118
- }
6119
- async function handleXClick() {
6120
- if (!onXSignIn) return;
6121
- setSocialLoad(true);
6122
- setSocialErr("");
6123
- try {
6124
- await onXSignIn();
6125
- } catch (e) {
6126
- setSocialErr(e.message);
6127
- setSocialLoad(false);
6128
- }
6129
- }
6130
- async function handleCustomAuthClick() {
6131
- if (!onCustomAuthSignIn) return;
6132
- setSocialLoad(true);
6133
- setSocialErr("");
6134
- try {
6135
- await onCustomAuthSignIn();
6136
- } catch (e) {
6137
- setSocialErr(e.message);
6138
- setSocialLoad(false);
6139
- }
6140
- }
6141
- async function handleEmailStart(e) {
6142
- e.preventDefault();
6143
- if (!onEmailStart) return;
6144
- setSocialLoad(true);
6145
- setSocialErr("");
6146
- try {
6147
- await onEmailStart(emailVal);
6148
- setEmailStep("code");
6149
- } catch (e2) {
6150
- setSocialErr(e2.message);
6151
- } finally {
6152
- setSocialLoad(false);
6153
- }
6154
- }
6155
- async function handleEmailVerify(e) {
6156
- e.preventDefault();
6157
- if (!onEmailVerify) return;
6158
- setSocialLoad(true);
6159
- setSocialErr("");
6160
- try {
6161
- await onEmailVerify(emailVal, codeVal);
6162
- } catch (e2) {
6163
- setSocialErr(e2.message);
6164
- } finally {
6165
- setSocialLoad(false);
6166
- }
6167
- }
6168
- async function handlePhoneStart(e) {
6169
- e.preventDefault();
6170
- if (!onPhoneStart) return;
6171
- setSocialLoad(true);
6172
- setSocialErr("");
6173
- try {
6174
- await onPhoneStart(phoneVal);
6175
- setPhoneStep("code");
6176
- } catch (e2) {
6177
- setSocialErr(e2.message);
6178
- } finally {
6179
- setSocialLoad(false);
6180
- }
6181
- }
6182
- async function handlePhoneVerify(e) {
6183
- e.preventDefault();
6184
- if (!onPhoneVerify) return;
6185
- setSocialLoad(true);
6186
- setSocialErr("");
6187
- try {
6188
- await onPhoneVerify(phoneVal, phoneCode);
6189
- } catch (e2) {
6190
- setSocialErr(e2.message);
6191
- } finally {
6192
- setSocialLoad(false);
6193
- }
6194
- }
6195
- const handleKey = (0, import_react2.useCallback)(
6196
- (e) => {
6197
- if (e.key === "Escape") {
6198
- if (pendingWallet) {
6199
- setPendingWallet(null);
6200
- } else {
6201
- onClose();
6202
- }
6203
- }
6204
- },
6205
- [onClose, pendingWallet]
6206
- );
6207
- (0, import_react2.useEffect)(() => {
6208
- if (!open) return;
6209
- document.addEventListener("keydown", handleKey);
6210
- return () => document.removeEventListener("keydown", handleKey);
6211
- }, [open, handleKey]);
6212
- if (!open) return null;
6213
- const q = search.toLowerCase();
6214
- const networkWallets = provider.wallets.filter((w) => {
6215
- const cs = w.chainSupport;
6216
- if (networks === "evm") return cs.includes("evm");
6217
- if (networks === "solana") return cs.includes("solana");
6218
- if (networks === "tron") return cs.includes("tron");
6219
- if (networks === "bitcoin") return cs.includes("bitcoin");
6220
- return true;
6221
- });
6222
- const baseWallets = filter === "evm" ? networkWallets.filter((w) => w.chainSupport.includes("evm")) : filter === "solana" ? networkWallets.filter((w) => w.chainSupport.includes("solana")) : filter === "tron" ? networkWallets.filter((w) => w.chainSupport.includes("tron")) : filter === "bitcoin" ? networkWallets.filter((w) => w.chainSupport.includes("bitcoin")) : networkWallets;
6223
- const filtered = q ? baseWallets.filter((w) => w.name.toLowerCase().includes(q)) : baseWallets;
6224
- function handleWalletClick(wallet) {
6225
- const cs = wallet.chainSupport;
6226
- const isMulti = cs.length >= 2;
6227
- if (isMulti && networks === "all") {
6228
- setPendingWallet(wallet);
6229
- } else {
6230
- const preference = networks === "evm" ? "evm" : networks === "solana" ? "solana" : networks === "tron" ? "tron" : networks === "bitcoin" ? "bitcoin" : void 0;
6231
- onConnect(wallet, preference);
6232
- onClose();
6233
- }
6234
- }
6235
- function handleChainChoice(preference) {
6236
- if (!pendingWallet) return;
6237
- onConnect(pendingWallet, preference);
6238
- onClose();
6239
- }
6240
- const modal = /* @__PURE__ */ import_react2.default.createElement(
6241
- "div",
6242
- {
6243
- role: "dialog",
6244
- "aria-modal": "true",
6245
- "aria-label": "Connect wallet",
6246
- style: {
6247
- position: "fixed",
6248
- inset: 0,
6249
- zIndex: 9999,
6250
- display: "flex",
6251
- alignItems: "center",
6252
- justifyContent: "center",
6253
- padding: "16px",
6254
- // Same fallback chain as SocialWalletModal — without it, this modal
6255
- // drops to the browser default serif whenever the token block hasn't
6256
- // been injected, while the social modal still lands on system-ui.
6257
- fontFamily: "var(--dc-font-sans, system-ui, sans-serif)"
6258
- }
6259
- },
6260
- /* @__PURE__ */ import_react2.default.createElement(
6261
- "div",
6262
- {
6263
- onClick: () => {
6264
- if (pendingWallet) {
6265
- setPendingWallet(null);
6266
- } else {
6267
- onClose();
6268
- }
6269
- },
6270
- style: {
6271
- position: "absolute",
6272
- inset: 0,
6273
- background: "var(--dc-bg-overlay)",
6274
- backdropFilter: "blur(8px)",
6275
- WebkitBackdropFilter: "blur(8px)"
6276
- }
6277
- }
6278
- ),
6279
- /* @__PURE__ */ import_react2.default.createElement(
6280
- "div",
6281
- {
6282
- style: {
6283
- position: "relative",
6284
- background: "var(--dc-bg)",
6285
- border: "1px solid var(--dc-border)",
6286
- borderRadius: 20,
6287
- width: "100%",
6288
- maxWidth: 400,
6289
- maxHeight: "85vh",
6290
- display: "flex",
6291
- flexDirection: "column",
6292
- boxShadow: "0 24px 64px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04)",
6293
- overflow: "hidden"
6294
- }
6295
- },
6296
- /* @__PURE__ */ import_react2.default.createElement(
6297
- "div",
6298
- {
6299
- style: {
6300
- height: 2,
6301
- background: "linear-gradient(90deg, transparent, var(--dc-accent) 30%, var(--dc-accent) 70%, transparent)"
6302
- }
6303
- }
6304
- ),
6305
- pendingWallet ? (
6306
- /* ── Chain picker step ───────────────────────────────────────── */
6307
- /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("div", { style: { padding: "18px 20px 16px", display: "flex", alignItems: "center", gap: 10 } }, /* @__PURE__ */ import_react2.default.createElement(
6308
- "button",
6309
- {
6310
- onClick: () => setPendingWallet(null),
6311
- "aria-label": "Back",
6312
- style: {
6313
- background: "var(--dc-surface)",
6314
- border: "1px solid var(--dc-border)",
6315
- borderRadius: 8,
6316
- width: 28,
6317
- height: 28,
6318
- display: "flex",
6319
- alignItems: "center",
6320
- justifyContent: "center",
6321
- cursor: "pointer",
6322
- color: "var(--dc-text-muted)",
6323
- flexShrink: 0,
6324
- fontFamily: "inherit",
6325
- padding: 0
6326
- }
6327
- },
6328
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" }, /* @__PURE__ */ import_react2.default.createElement("path", { d: "M7.5 2L3 6l4.5 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }))
6329
- ), /* @__PURE__ */ import_react2.default.createElement("h2", { style: { margin: 0, fontSize: 16, fontWeight: 800, color: "var(--dc-text)", letterSpacing: "-0.02em" } }, "Choose networks"), /* @__PURE__ */ import_react2.default.createElement(
6330
- "button",
6331
- {
6332
- onClick: onClose,
6333
- "aria-label": "Close",
6334
- style: {
6335
- marginLeft: "auto",
6336
- background: "var(--dc-surface)",
6337
- border: "1px solid var(--dc-border)",
6338
- borderRadius: 8,
6339
- width: 28,
6340
- height: 28,
6341
- display: "flex",
6342
- alignItems: "center",
6343
- justifyContent: "center",
6344
- cursor: "pointer",
6345
- color: "var(--dc-text-muted)",
6346
- flexShrink: 0,
6347
- fontFamily: "inherit",
6348
- padding: 0
6349
- }
6350
- },
6351
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" }, /* @__PURE__ */ import_react2.default.createElement("path", { d: "M1.5 1.5L10.5 10.5M10.5 1.5L1.5 10.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }))
6352
- )), /* @__PURE__ */ import_react2.default.createElement(
6353
- "div",
6354
- {
6355
- style: {
6356
- margin: "0 20px 16px",
6357
- padding: "12px 14px",
6358
- background: "var(--dc-surface)",
6359
- border: "1px solid var(--dc-border)",
6360
- borderRadius: 12,
6361
- display: "flex",
6362
- alignItems: "center",
6363
- gap: 12
6364
- }
6365
- },
6366
- /* @__PURE__ */ import_react2.default.createElement(WalletIcon, { src: pendingWallet.icon || void 0, name: pendingWallet.name, size: 36 }),
6367
- /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", { style: { fontSize: 14, fontWeight: 700, color: "var(--dc-text)" } }, pendingWallet.name), /* @__PURE__ */ import_react2.default.createElement("div", { style: { fontSize: 11, color: "var(--dc-text-muted)", marginTop: 2 } }, "Multi-chain wallet detected"))
6368
- ), /* @__PURE__ */ import_react2.default.createElement("div", { style: { padding: "0 12px 20px", display: "flex", flexDirection: "column", gap: 8 } }, pendingWallet.chainSupport.includes("evm") && /* @__PURE__ */ import_react2.default.createElement(
6369
- ChainOption,
6370
- {
6371
- label: "EVM networks",
6372
- description: "Connect your Ethereum-compatible address only",
6373
- badges: /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: ["evm"], size: 18 }),
6374
- onClick: () => handleChainChoice("evm")
6375
- }
6376
- ), pendingWallet.chainSupport.includes("solana") && /* @__PURE__ */ import_react2.default.createElement(
6377
- ChainOption,
6378
- {
6379
- label: "Solana network",
6380
- description: "Connect your Solana address only",
6381
- badges: /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: ["solana"], size: 18 }),
6382
- onClick: () => handleChainChoice("solana")
6383
- }
6384
- ), pendingWallet.chainSupport.includes("tron") && /* @__PURE__ */ import_react2.default.createElement(
6385
- ChainOption,
6386
- {
6387
- label: "Tron network",
6388
- description: "Connect your Tron address only",
6389
- badges: /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: ["tron"], size: 18 }),
6390
- onClick: () => handleChainChoice("tron")
6391
- }
6392
- ), pendingWallet.chainSupport.includes("bitcoin") && /* @__PURE__ */ import_react2.default.createElement(
6393
- ChainOption,
6394
- {
6395
- label: "Bitcoin network",
6396
- description: "Connect your Bitcoin address only",
6397
- badges: /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: ["bitcoin"], size: 18 }),
6398
- onClick: () => handleChainChoice("bitcoin")
6399
- }
6400
- ), /* @__PURE__ */ import_react2.default.createElement(
6401
- ChainOption,
6402
- {
6403
- label: "All networks",
6404
- description: "Connect all supported addresses together",
6405
- badges: /* @__PURE__ */ import_react2.default.createElement(ChainIconStack, { support: pendingWallet.chainSupport, size: 18 }),
6406
- onClick: () => handleChainChoice(void 0)
6407
- }
6408
- )))
6409
- ) : (
6410
- /* ── Wallet list / Social sign-in ────────────────────────────── */
6411
- /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("div", { style: { padding: "18px 20px 0" } }, /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 14 } }, /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("h2", { style: { margin: 0, fontSize: 17, fontWeight: 800, color: "var(--dc-text)", letterSpacing: "-0.02em", lineHeight: 1.2 } }, view === "social" ? "Sign in" : "Connect wallet"), view === "wallets" && networkWallets.length > 0 && /* @__PURE__ */ import_react2.default.createElement("p", { style: { margin: "3px 0 0", fontSize: 12, color: "var(--dc-text-muted)" } }, networkWallets.length, " wallet", networkWallets.length !== 1 ? "s" : "", " detected")), /* @__PURE__ */ import_react2.default.createElement(
6412
- "button",
6413
- {
6414
- onClick: onClose,
6415
- "aria-label": "Close",
6416
- style: {
6417
- background: "var(--dc-surface)",
6418
- border: "1px solid var(--dc-border)",
6419
- cursor: "pointer",
6420
- padding: 0,
6421
- width: 28,
6422
- height: 28,
6423
- borderRadius: 8,
6424
- display: "flex",
6425
- alignItems: "center",
6426
- justifyContent: "center",
6427
- color: "var(--dc-text-muted)",
6428
- flexShrink: 0,
6429
- transition: "background 0.12s, color 0.12s",
6430
- fontFamily: "inherit"
6431
- },
6432
- onMouseEnter: (e) => {
6433
- e.currentTarget.style.background = "var(--dc-surface-hover)";
6434
- e.currentTarget.style.color = "var(--dc-text)";
6435
- },
6436
- onMouseLeave: (e) => {
6437
- e.currentTarget.style.background = "var(--dc-surface)";
6438
- e.currentTarget.style.color = "var(--dc-text-muted)";
6439
- }
6440
- },
6441
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" }, /* @__PURE__ */ import_react2.default.createElement("path", { d: "M1.5 1.5L10.5 10.5M10.5 1.5L1.5 10.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }))
6442
- )), showWallets && showSocial && /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", gap: 4, marginBottom: 14, background: "var(--dc-surface)", borderRadius: 10, padding: 3 } }, ["social", "wallets"].map((v) => /* @__PURE__ */ import_react2.default.createElement(
6443
- "button",
6444
- {
6445
- key: v,
6446
- onClick: () => setView(v),
6447
- style: {
6448
- flex: 1,
6449
- padding: "7px 0",
6450
- borderRadius: 8,
6451
- border: "none",
6452
- background: view === v ? "var(--dc-bg)" : "transparent",
6453
- color: view === v ? "var(--dc-text)" : "var(--dc-text-muted)",
6454
- fontSize: 13,
6455
- fontWeight: view === v ? 700 : 500,
6456
- cursor: "pointer",
6457
- fontFamily: "inherit",
6458
- boxShadow: view === v ? "0 1px 4px rgba(0,0,0,0.2)" : "none",
6459
- transition: "all 0.15s"
6460
- }
6461
- },
6462
- v === "wallets" ? "Wallet" : "Sign in"
6463
- ))), view === "wallets" && networks === "all" && /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", gap: 4, marginBottom: 10 } }, /* @__PURE__ */ import_react2.default.createElement(FilterTab, { label: "All", active: filter === "all", onClick: () => setFilter("all") }), /* @__PURE__ */ import_react2.default.createElement(FilterTab, { label: "EVM", active: filter === "evm", onClick: () => setFilter("evm") }), /* @__PURE__ */ import_react2.default.createElement(FilterTab, { label: "Solana", active: filter === "solana", onClick: () => setFilter("solana") }), provider.tronWallets && provider.tronWallets.length > 0 && /* @__PURE__ */ import_react2.default.createElement(FilterTab, { label: "Tron", active: filter === "tron", onClick: () => setFilter("tron") }), provider.bitcoinWallets && provider.bitcoinWallets.length > 0 && /* @__PURE__ */ import_react2.default.createElement(FilterTab, { label: "Bitcoin", active: filter === "bitcoin", onClick: () => setFilter("bitcoin") })), view === "wallets" && /* @__PURE__ */ import_react2.default.createElement("div", { style: { position: "relative", marginBottom: 10 } }, /* @__PURE__ */ import_react2.default.createElement(
6464
- "svg",
6465
- {
6466
- width: "14",
6467
- height: "14",
6468
- viewBox: "0 0 14 14",
6469
- fill: "none",
6470
- style: { position: "absolute", left: 10, top: "50%", transform: "translateY(-50%)", color: "var(--dc-text-muted)", pointerEvents: "none" }
6471
- },
6472
- /* @__PURE__ */ import_react2.default.createElement("circle", { cx: "6", cy: "6", r: "4", stroke: "currentColor", strokeWidth: "1.4" }),
6473
- /* @__PURE__ */ import_react2.default.createElement("path", { d: "M9.5 9.5L12 12", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" })
6474
- ), /* @__PURE__ */ import_react2.default.createElement(
6475
- "input",
6476
- {
6477
- type: "text",
6478
- placeholder: "Search wallets\u2026",
6479
- value: search,
6480
- onChange: (e) => setSearch(e.target.value),
6481
- style: {
6482
- width: "100%",
6483
- background: "var(--dc-surface)",
6484
- border: "1px solid var(--dc-border)",
6485
- borderRadius: 10,
6486
- color: "var(--dc-text)",
6487
- fontSize: 13,
6488
- padding: "8px 12px 8px 32px",
6489
- outline: "none",
6490
- fontFamily: "var(--dc-font-sans, system-ui, sans-serif)",
6491
- transition: "border-color 0.15s",
6492
- boxSizing: "border-box"
6493
- },
6494
- onFocus: (e) => {
6495
- e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6496
- },
6497
- onBlur: (e) => {
6498
- e.currentTarget.style.borderColor = "var(--dc-border)";
6499
- }
6500
- }
6501
- ))), view === "social" && /* @__PURE__ */ import_react2.default.createElement("div", { style: { padding: "4px 20px 24px", display: "flex", flexDirection: "column", gap: 10 } }, socialErr && /* @__PURE__ */ import_react2.default.createElement("div", { style: { background: "rgba(204,51,0,0.1)", border: "1px solid var(--dc-danger)", borderRadius: 8, padding: "9px 12px", fontSize: 12, color: "var(--dc-danger)" } }, socialErr), passkeyFirst && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(
6502
- "button",
6503
- {
6504
- onClick: handlePasskeyClick,
6505
- disabled: socialLoad,
6506
- style: {
6507
- display: "flex",
6508
- alignItems: "center",
6509
- justifyContent: "center",
6510
- gap: 10,
6511
- width: "100%",
6512
- padding: "13px 16px",
6513
- background: "var(--dc-accent)",
6514
- border: "none",
6515
- borderRadius: 10,
6516
- cursor: socialLoad ? "not-allowed" : "pointer",
6517
- color: "var(--dc-accent-text)",
6518
- fontSize: 14,
6519
- fontWeight: 700,
6520
- fontFamily: "inherit",
6521
- opacity: socialLoad ? 0.6 : 1
6522
- }
6523
- },
6524
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "17", height: "17", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }, /* @__PURE__ */ import_react2.default.createElement("circle", { cx: "12", cy: "8", r: "4" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M6 21v-1a4 4 0 0 1 4-4h1" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M17 15v6M14.5 18h5" })),
6525
- socialLoad ? "Verifying\u2026" : "Continue with passkey"
6526
- ), passkeyAddress && /* @__PURE__ */ import_react2.default.createElement("div", { style: { textAlign: "center", fontSize: 12, color: "var(--dc-text-muted)" } }, "Resuming ", passkeyAddress.slice(0, 6), "\u2026", passkeyAddress.slice(-4)), /* @__PURE__ */ import_react2.default.createElement(
6527
- "button",
6528
- {
6529
- onClick: () => {
6530
- setShowOtherMethods(true);
6531
- setSocialErr("");
6532
- },
6533
- disabled: socialLoad,
6534
- style: {
6535
- background: "none",
6536
- border: "none",
6537
- padding: "6px 0",
6538
- color: "var(--dc-text-muted)",
6539
- fontSize: 12.5,
6540
- cursor: socialLoad ? "not-allowed" : "pointer",
6541
- fontFamily: "inherit",
6542
- textDecoration: "underline",
6543
- textUnderlineOffset: 3
6544
- }
6545
- },
6546
- "Use a different account"
6547
- )), !passkeyFirst && socialAuthMethods.includes("google") && /* @__PURE__ */ import_react2.default.createElement(
6548
- "button",
6549
- {
6550
- onClick: handleGoogleClick,
6551
- disabled: socialLoad,
6552
- style: {
6553
- display: "flex",
6554
- alignItems: "center",
6555
- justifyContent: "center",
6556
- gap: 10,
6557
- width: "100%",
6558
- padding: "11px 16px",
6559
- background: "var(--dc-surface)",
6560
- border: "1px solid var(--dc-border)",
6561
- borderRadius: 10,
6562
- cursor: socialLoad ? "not-allowed" : "pointer",
6563
- fontSize: 14,
6564
- fontWeight: 600,
6565
- color: "var(--dc-text)",
6566
- fontFamily: "inherit",
6567
- transition: "border-color 0.12s, background 0.12s",
6568
- opacity: socialLoad ? 0.6 : 1
6569
- },
6570
- onMouseEnter: (e) => {
6571
- if (!socialLoad) e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6572
- },
6573
- onMouseLeave: (e) => {
6574
- e.currentTarget.style.borderColor = "var(--dc-border)";
6575
- }
6576
- },
6577
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none" }, /* @__PURE__ */ import_react2.default.createElement("path", { d: "M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.875 2.684-6.615z", fill: "#4285F4" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M9 18c2.43 0 4.467-.806 5.956-2.18l-2.908-2.259c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 0 0 9 18z", fill: "#34A853" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M3.964 10.71A5.41 5.41 0 0 1 3.682 9c0-.593.102-1.17.282-1.71V4.958H.957A8.996 8.996 0 0 0 0 9c0 1.452.348 2.827.957 4.042l3.007-2.332z", fill: "#FBBC05" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 0 0 .957 4.958L3.964 6.29C4.672 4.163 6.656 3.58 9 3.58z", fill: "#EA4335" })),
6578
- socialLoad ? "Redirecting\u2026" : "Continue with Google"
6579
- ), !passkeyFirst && socialAuthMethods.includes("kingschat") && onKingsChatSignIn && /* @__PURE__ */ import_react2.default.createElement(
6580
- "button",
6581
- {
6582
- onClick: handleKingsChatClick,
6583
- disabled: socialLoad,
6584
- style: {
6585
- display: "flex",
6586
- alignItems: "center",
6587
- justifyContent: "center",
6588
- gap: 10,
6589
- width: "100%",
6590
- padding: "11px 16px",
6591
- background: "var(--dc-surface)",
6592
- border: "1px solid var(--dc-border)",
6593
- borderRadius: 10,
6594
- cursor: socialLoad ? "not-allowed" : "pointer",
6595
- fontSize: 14,
6596
- fontWeight: 600,
6597
- color: "var(--dc-text)",
6598
- fontFamily: "inherit",
6599
- transition: "border-color 0.12s, background 0.12s",
6600
- opacity: socialLoad ? 0.6 : 1
6601
- },
6602
- onMouseEnter: (e) => {
6603
- if (!socialLoad) e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6604
- },
6605
- onMouseLeave: (e) => {
6606
- e.currentTarget.style.borderColor = "var(--dc-border)";
6607
- }
6608
- },
6609
- /* @__PURE__ */ import_react2.default.createElement("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true" }, /* @__PURE__ */ import_react2.default.createElement("circle", { cx: "9", cy: "9", r: "9", fill: "var(--dc-accent)" }), /* @__PURE__ */ import_react2.default.createElement("path", { d: "M5.5 4.5h1.9v3.6l3.1-3.6h2.3l-3.3 3.8 3.5 5.2h-2.3l-2.5-3.8-.8.9v2.9H5.5V4.5z", fill: "var(--dc-accent-text)" })),
6610
- socialLoad ? "Waiting for KingsChat\u2026" : "Continue with KingsChat"
6611
- ), !passkeyFirst && socialAuthMethods.includes("x") && onXSignIn && /* @__PURE__ */ import_react2.default.createElement(
6612
- "button",
6613
- {
6614
- onClick: handleXClick,
6615
- disabled: socialLoad,
6616
- style: {
6617
- display: "flex",
6618
- alignItems: "center",
6619
- justifyContent: "center",
6620
- gap: 10,
6621
- width: "100%",
6622
- padding: "11px 16px",
6623
- background: "var(--dc-surface)",
6624
- border: "1px solid var(--dc-border)",
6625
- borderRadius: 10,
6626
- cursor: socialLoad ? "not-allowed" : "pointer",
6627
- fontSize: 14,
6628
- fontWeight: 600,
6629
- color: "var(--dc-text)",
6630
- fontFamily: "inherit",
6631
- transition: "border-color 0.12s, background 0.12s",
6632
- opacity: socialLoad ? 0.6 : 1
6633
- },
6634
- onMouseEnter: (e) => {
6635
- if (!socialLoad) e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6636
- },
6637
- onMouseLeave: (e) => {
6638
- e.currentTarget.style.borderColor = "var(--dc-border)";
6639
- }
6640
- },
6641
- /* @__PURE__ */ import_react2.default.createElement(XLogo, { size: 16 }),
6642
- socialLoad ? "Redirecting\u2026" : "Continue with X"
6643
- ), !passkeyFirst && socialAuthMethods.includes("google") && socialAuthMethods.includes("email") && /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 10 } }, /* @__PURE__ */ import_react2.default.createElement("div", { style: { flex: 1, height: 1, background: "var(--dc-border)" } }), /* @__PURE__ */ import_react2.default.createElement("span", { style: { fontSize: 11, color: "var(--dc-text-muted)", whiteSpace: "nowrap" } }, "or continue with email"), /* @__PURE__ */ import_react2.default.createElement("div", { style: { flex: 1, height: 1, background: "var(--dc-border)" } })), !passkeyFirst && socialAuthMethods.includes("email") && (emailStep === "input" ? /* @__PURE__ */ import_react2.default.createElement("form", { onSubmit: handleEmailStart, style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement(
6644
- "input",
6645
- {
6646
- type: "email",
6647
- placeholder: "your@email.com",
6648
- value: emailVal,
6649
- onChange: (e) => setEmailVal(e.target.value),
6650
- required: true,
6651
- style: {
6652
- width: "100%",
6653
- padding: "10px 12px",
6654
- background: "var(--dc-surface)",
6655
- border: "1px solid var(--dc-border)",
6656
- borderRadius: 10,
6657
- color: "var(--dc-text)",
6658
- fontSize: 13,
6659
- fontFamily: "inherit",
6660
- outline: "none",
6661
- boxSizing: "border-box"
6662
- },
6663
- onFocus: (e) => {
6664
- e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6665
- },
6666
- onBlur: (e) => {
6667
- e.currentTarget.style.borderColor = "var(--dc-border)";
6668
- }
6669
- }
6670
- ), /* @__PURE__ */ import_react2.default.createElement(
6671
- "button",
6672
- {
6673
- type: "submit",
6674
- disabled: socialLoad || !emailVal,
6675
- style: {
6676
- width: "100%",
6677
- padding: "10px 16px",
6678
- background: "var(--dc-accent)",
6679
- color: "var(--dc-accent-text)",
6680
- border: "none",
6681
- borderRadius: 10,
6682
- fontSize: 14,
6683
- fontWeight: 700,
6684
- cursor: socialLoad ? "not-allowed" : "pointer",
6685
- fontFamily: "inherit",
6686
- opacity: socialLoad || !emailVal ? 0.6 : 1
6687
- }
6688
- },
6689
- socialLoad ? "Sending\u2026" : "Send code"
6690
- )) : /* @__PURE__ */ import_react2.default.createElement("form", { onSubmit: handleEmailVerify, style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement("p", { style: { margin: 0, fontSize: 12, color: "var(--dc-text-muted)", textAlign: "center" } }, "Code sent to ", /* @__PURE__ */ import_react2.default.createElement("strong", { style: { color: "var(--dc-text)" } }, emailVal)), /* @__PURE__ */ import_react2.default.createElement(
6691
- "input",
6692
- {
6693
- type: "text",
6694
- placeholder: "6-digit code",
6695
- value: codeVal,
6696
- onChange: (e) => setCodeVal(e.target.value.replace(/\D/g, "").slice(0, 6)),
6697
- autoFocus: true,
6698
- required: true,
6699
- style: {
6700
- width: "100%",
6701
- padding: "10px 12px",
6702
- background: "var(--dc-surface)",
6703
- border: "1px solid var(--dc-border)",
6704
- borderRadius: 10,
6705
- color: "var(--dc-text)",
6706
- fontSize: 20,
6707
- fontFamily: "monospace",
6708
- letterSpacing: 8,
6709
- textAlign: "center",
6710
- outline: "none",
6711
- boxSizing: "border-box"
6712
- },
6713
- onFocus: (e) => {
6714
- e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6715
- },
6716
- onBlur: (e) => {
6717
- e.currentTarget.style.borderColor = "var(--dc-border)";
6718
- }
6719
- }
6720
- ), /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement(
6721
- "button",
6722
- {
6723
- type: "button",
6724
- onClick: () => {
6725
- setEmailStep("input");
6726
- setCodeVal("");
6727
- setSocialErr("");
6728
- },
6729
- style: {
6730
- flex: 1,
6731
- padding: "9px 0",
6732
- background: "transparent",
6733
- border: "1px solid var(--dc-border)",
6734
- borderRadius: 10,
6735
- color: "var(--dc-text-muted)",
6736
- fontSize: 13,
6737
- cursor: "pointer",
6738
- fontFamily: "inherit"
6739
- }
6740
- },
6741
- "Back"
6742
- ), /* @__PURE__ */ import_react2.default.createElement(
6743
- "button",
6744
- {
6745
- type: "submit",
6746
- disabled: socialLoad || codeVal.length < 6,
6747
- style: {
6748
- flex: 2,
6749
- padding: "9px 0",
6750
- background: "var(--dc-accent)",
6751
- color: "var(--dc-accent-text)",
6752
- border: "none",
6753
- borderRadius: 10,
6754
- fontSize: 13,
6755
- fontWeight: 700,
6756
- cursor: socialLoad || codeVal.length < 6 ? "not-allowed" : "pointer",
6757
- fontFamily: "inherit",
6758
- opacity: socialLoad || codeVal.length < 6 ? 0.6 : 1
6759
- }
6760
- },
6761
- socialLoad ? "Verifying\u2026" : "Verify"
6762
- )))), !passkeyFirst && socialAuthMethods.includes("phone") && onPhoneStart && onPhoneVerify && (phoneStep === "input" ? /* @__PURE__ */ import_react2.default.createElement("form", { onSubmit: handlePhoneStart, style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement(
6763
- "input",
6764
- {
6765
- type: "tel",
6766
- placeholder: "+234 801 234 5678",
6767
- value: phoneVal,
6768
- onChange: (e) => setPhoneVal(e.target.value),
6769
- required: true,
6770
- style: {
6771
- width: "100%",
6772
- padding: "10px 12px",
6773
- background: "var(--dc-surface)",
6774
- border: "1px solid var(--dc-border)",
6775
- borderRadius: 10,
6776
- color: "var(--dc-text)",
6777
- fontSize: 13,
6778
- fontFamily: "inherit",
6779
- outline: "none",
6780
- boxSizing: "border-box"
6781
- },
6782
- onFocus: (e) => {
6783
- e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6784
- },
6785
- onBlur: (e) => {
6786
- e.currentTarget.style.borderColor = "var(--dc-border)";
6787
- }
6788
- }
6789
- ), /* @__PURE__ */ import_react2.default.createElement(
6790
- "button",
6791
- {
6792
- type: "submit",
6793
- disabled: socialLoad || !phoneVal,
6794
- style: {
6795
- width: "100%",
6796
- padding: "10px 16px",
6797
- background: "var(--dc-accent)",
6798
- color: "var(--dc-accent-text)",
6799
- border: "none",
6800
- borderRadius: 10,
6801
- fontSize: 14,
6802
- fontWeight: 700,
6803
- cursor: socialLoad ? "not-allowed" : "pointer",
6804
- fontFamily: "inherit",
6805
- opacity: socialLoad || !phoneVal ? 0.6 : 1
6806
- }
6807
- },
6808
- socialLoad ? "Sending\u2026" : "Send code"
6809
- )) : /* @__PURE__ */ import_react2.default.createElement("form", { onSubmit: handlePhoneVerify, style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement("p", { style: { margin: 0, fontSize: 12, color: "var(--dc-text-muted)", textAlign: "center" } }, "Code sent to ", /* @__PURE__ */ import_react2.default.createElement("strong", { style: { color: "var(--dc-text)" } }, phoneVal)), /* @__PURE__ */ import_react2.default.createElement(
6810
- "input",
6811
- {
6812
- type: "text",
6813
- inputMode: "numeric",
6814
- placeholder: "6-digit code",
6815
- value: phoneCode,
6816
- onChange: (e) => setPhoneCode(e.target.value.replace(/\D/g, "").slice(0, 6)),
6817
- autoFocus: true,
6818
- required: true,
6819
- style: {
6820
- width: "100%",
6821
- padding: "10px 12px",
6822
- background: "var(--dc-surface)",
6823
- border: "1px solid var(--dc-border)",
6824
- borderRadius: 10,
6825
- color: "var(--dc-text)",
6826
- fontSize: 20,
6827
- fontFamily: "monospace",
6828
- letterSpacing: 8,
6829
- textAlign: "center",
6830
- outline: "none",
6831
- boxSizing: "border-box"
6832
- },
6833
- onFocus: (e) => {
6834
- e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6835
- },
6836
- onBlur: (e) => {
6837
- e.currentTarget.style.borderColor = "var(--dc-border)";
6838
- }
6839
- }
6840
- ), /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react2.default.createElement(
6841
- "button",
6842
- {
6843
- type: "button",
6844
- onClick: () => {
6845
- setPhoneStep("input");
6846
- setPhoneCode("");
6847
- setSocialErr("");
6848
- },
6849
- style: {
6850
- flex: 1,
6851
- padding: "9px 0",
6852
- background: "transparent",
6853
- border: "1px solid var(--dc-border)",
6854
- borderRadius: 10,
6855
- color: "var(--dc-text-muted)",
6856
- fontSize: 13,
6857
- cursor: "pointer",
6858
- fontFamily: "inherit"
6859
- }
6860
- },
6861
- "Back"
6862
- ), /* @__PURE__ */ import_react2.default.createElement(
6863
- "button",
6864
- {
6865
- type: "submit",
6866
- disabled: socialLoad || phoneCode.length < 6,
6867
- style: {
6868
- flex: 2,
6869
- padding: "9px 0",
6870
- background: "var(--dc-accent)",
6871
- color: "var(--dc-accent-text)",
6872
- border: "none",
6873
- borderRadius: 10,
6874
- fontSize: 13,
6875
- fontWeight: 700,
6876
- cursor: socialLoad || phoneCode.length < 6 ? "not-allowed" : "pointer",
6877
- fontFamily: "inherit",
6878
- opacity: socialLoad || phoneCode.length < 6 ? 0.6 : 1
6879
- }
6880
- },
6881
- socialLoad ? "Verifying\u2026" : "Verify"
6882
- )))), !passkeyFirst && customAuthLabel && onCustomAuthSignIn && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, (socialAuthMethods.includes("google") || socialAuthMethods.includes("email")) && /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 10 } }, /* @__PURE__ */ import_react2.default.createElement("div", { style: { flex: 1, height: 1, background: "var(--dc-border)" } }), /* @__PURE__ */ import_react2.default.createElement("span", { style: { fontSize: 11, color: "var(--dc-text-muted)", whiteSpace: "nowrap" } }, "or"), /* @__PURE__ */ import_react2.default.createElement("div", { style: { flex: 1, height: 1, background: "var(--dc-border)" } })), /* @__PURE__ */ import_react2.default.createElement(
6883
- "button",
6884
- {
6885
- onClick: handleCustomAuthClick,
6886
- disabled: socialLoad,
6887
- style: {
6888
- display: "flex",
6889
- alignItems: "center",
6890
- justifyContent: "center",
6891
- gap: 10,
6892
- width: "100%",
6893
- padding: "11px 16px",
6894
- background: "var(--dc-surface)",
6895
- border: "1px solid var(--dc-border)",
6896
- borderRadius: 10,
6897
- cursor: socialLoad ? "not-allowed" : "pointer",
6898
- fontSize: 14,
6899
- fontWeight: 600,
6900
- color: "var(--dc-text)",
6901
- fontFamily: "inherit",
6902
- transition: "border-color 0.12s, background 0.12s",
6903
- opacity: socialLoad ? 0.6 : 1
6904
- },
6905
- onMouseEnter: (e) => {
6906
- if (!socialLoad) e.currentTarget.style.borderColor = "var(--dc-border-accent)";
6907
- },
6908
- onMouseLeave: (e) => {
6909
- e.currentTarget.style.borderColor = "var(--dc-border)";
6910
- }
6911
- },
6912
- socialLoad ? "Connecting\u2026" : customAuthLabel
6913
- ))), view === "wallets" && /* @__PURE__ */ import_react2.default.createElement("div", { style: { overflowY: "auto", flex: 1, padding: "0 12px 20px" } }, filtered.length > 0 ? /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 2 } }, filtered.map((w) => /* @__PURE__ */ import_react2.default.createElement(WalletRow, { key: w.id, wallet: w, onClick: () => handleWalletClick(w) }))) : /* @__PURE__ */ import_react2.default.createElement("div", { style: { textAlign: "center", padding: "32px 16px", color: "var(--dc-text-muted)", fontSize: 13 } }, q ? `No wallets matching "${q}"` : "No wallets detected")), view === "wallets" && /* @__PURE__ */ import_react2.default.createElement("div", { style: { padding: "10px 20px 14px", borderTop: "1px solid var(--dc-border)", textAlign: "center", fontSize: 11, color: "var(--dc-text-muted)" } }, "Don't see your wallet? Make sure it's installed and unlocked"))
6914
- )
6915
- )
6916
- );
6917
- return (0, import_react_dom.createPortal)(modal, document.body);
5892
+ function ChevronRightIcon({ size = 16 }) {
5893
+ return /* @__PURE__ */ import_react.default.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", ...line, "aria-hidden": "true", style: { flexShrink: 0 } }, /* @__PURE__ */ import_react.default.createElement("path", { d: "m9 6 6 6-6 6" }));
6918
5894
  }
6919
5895
 
6920
5896
  // src/ui/SocialWalletModal.tsx
6921
- var import_react3 = __toESM(require("react"), 1);
6922
- var import_react_dom2 = require("react-dom");
6923
- function injectTokens2(theme) {
5897
+ var import_react2 = __toESM(require("react"), 1);
5898
+ var import_react_dom = require("react-dom");
5899
+ function injectTokens(theme) {
6924
5900
  const resolved = theme === "auto" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : theme;
6925
5901
  let el = document.getElementById("decane-tokens");
6926
5902
  if (!el) {
@@ -6944,8 +5920,8 @@ function downloadJson(data, filename) {
6944
5920
  URL.revokeObjectURL(url);
6945
5921
  }
6946
5922
  function useBalance(kind, address, chain, rpcUrls) {
6947
- const [state, setState] = (0, import_react3.useState)({ loading: false, value: null, symbol: kind === "evm" ? "ETH" : "SOL" });
6948
- (0, import_react3.useEffect)(() => {
5923
+ const [state, setState] = (0, import_react2.useState)({ loading: false, value: null, symbol: kind === "evm" ? "ETH" : "SOL" });
5924
+ (0, import_react2.useEffect)(() => {
6949
5925
  if (!address || !chain) return;
6950
5926
  let cancelled = false;
6951
5927
  setState((s) => ({ ...s, loading: true }));
@@ -7049,6 +6025,33 @@ var MODAL_CSS = `
7049
6025
  .dcm-row { display: flex; gap: 8px; width: 100%; }
7050
6026
  .dcm-row > .dcm-primary { flex: 1; height: 44px; border-radius: 12px; }
7051
6027
  .dcm-actions { width: 100%; display: flex; gap: 8px; }
6028
+ .dcm-or { width: 100%; display: flex; align-items: center; gap: 10px; font-size: 12.5px; color: var(--dc-text-muted); }
6029
+ .dcm-or::before, .dcm-or::after { content: ""; flex: 1; height: 1px; background: var(--dc-border); }
6030
+ .dcm-method .dcm-trail { margin-left: auto; display: inline-flex; align-items: center; gap: 8px; color: var(--dc-text-muted); font-size: 12.5px; font-weight: 500; }
6031
+ .dcm-stack { display: inline-flex; }
6032
+ .dcm-stack img, .dcm-stack span { width: 22px; height: 22px; border-radius: 7px; border: 2px solid var(--dc-surface); margin-left: -7px; object-fit: cover; background: var(--dc-surface-hover); }
6033
+ .dcm-stack > :first-child { margin-left: 0; }
6034
+ .dcm-method:hover:not(:disabled) .dcm-stack img { border-color: var(--dc-surface-hover); }
6035
+ .dcm-wallet-img { width: 26px; height: 26px; border-radius: 8px; object-fit: cover; flex-shrink: 0; }
6036
+ .dcm-list { width: 100%; display: grid; gap: 8px; max-height: min(380px, 50vh); overflow-y: auto; padding: 2px; margin: -2px; }
6037
+ .dcm-pills { width: 100%; display: flex; gap: 4px; padding: 4px; border-radius: 12px; background: var(--dc-surface); border: 1px solid var(--dc-border); }
6038
+ .dcm-pills button { flex: 1; height: 30px; border: 0; border-radius: 9px; background: transparent; color: var(--dc-text-secondary);
6039
+ font-family: inherit; font-size: 13px; font-weight: 500; cursor: pointer; transition: background .15s, color .15s; }
6040
+ .dcm-pills button:hover { color: var(--dc-text); }
6041
+ .dcm-pills button[aria-pressed="true"] { background: var(--dc-bg); color: var(--dc-text); box-shadow: 0 1px 3px rgba(0,0,0,.12); }
6042
+ .dcm-search { position: relative; width: 100%; }
6043
+ .dcm-search svg { position: absolute; left: 13px; top: 50%; transform: translateY(-50%); color: var(--dc-text-muted); pointer-events: none; }
6044
+ .dcm-search .dcm-field { padding: 10px 14px 10px 38px; font-size: 14px; }
6045
+ .dcm-empty { width: 100%; padding: 28px 12px; font-size: 13.5px; color: var(--dc-text-muted); }
6046
+ .dcm-option { width: 100%; display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-radius: 14px; border: 1px solid var(--dc-border);
6047
+ background: var(--dc-surface); color: var(--dc-text); font-family: inherit; text-align: left; cursor: pointer; transition: border-color .15s, background .15s; }
6048
+ .dcm-option:hover { border-color: var(--dc-text-muted); background: var(--dc-surface-hover); }
6049
+ .dcm-option:focus-visible, .dcm-pills button:focus-visible { outline: 2px solid var(--dc-accent); outline-offset: 2px; }
6050
+ .dcm-option-icons { width: 64px; flex-shrink: 0; display: flex; }
6051
+ .dcm-option-text { flex: 1; min-width: 0; }
6052
+ .dcm-option b { display: block; font-size: 14.5px; font-weight: 500; }
6053
+ .dcm-option small { display: block; margin-top: 2px; font-size: 12.5px; line-height: 1.4; color: var(--dc-text-secondary); }
6054
+ .dcm-option > svg { color: var(--dc-text-muted); }
7052
6055
  .dcm-actions > * { flex: 1; }
7053
6056
  `;
7054
6057
  function injectModalCss() {
@@ -7062,14 +6065,14 @@ function shortAddress(a, head = 6, tail = 4) {
7062
6065
  return a.length > head + tail + 1 ? `${a.slice(0, head)}\u2026${a.slice(-tail)}` : a;
7063
6066
  }
7064
6067
  function CopyButton({ value, label }) {
7065
- const [copied, setCopied] = (0, import_react3.useState)(false);
6068
+ const [copied, setCopied] = (0, import_react2.useState)(false);
7066
6069
  async function copy() {
7067
6070
  await navigator.clipboard.writeText(value).catch(() => {
7068
6071
  });
7069
6072
  setCopied(true);
7070
6073
  setTimeout(() => setCopied(false), 1500);
7071
6074
  }
7072
- return /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-copy", onClick: copy, "aria-label": copied ? "Copied" : `Copy ${label} address`, title: copied ? "Copied" : "Copy address" }, copied ? /* @__PURE__ */ import_react3.default.createElement(CheckIcon, null) : /* @__PURE__ */ import_react3.default.createElement(CopyIcon, null));
6075
+ return /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-copy", onClick: copy, "aria-label": copied ? "Copied" : `Copy ${label} address`, title: copied ? "Copied" : "Copy address" }, copied ? /* @__PURE__ */ import_react2.default.createElement(CheckIcon, null) : /* @__PURE__ */ import_react2.default.createElement(CopyIcon, null));
7073
6076
  }
7074
6077
  function AddressRow({
7075
6078
  label,
@@ -7079,10 +6082,10 @@ function AddressRow({
7079
6082
  rpcUrls
7080
6083
  }) {
7081
6084
  const balance = useBalance(kind, address, chain, rpcUrls);
7082
- return /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-address" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-address-main" }, /* @__PURE__ */ import_react3.default.createElement("span", null, label), /* @__PURE__ */ import_react3.default.createElement("code", { title: address }, shortAddress(address, 8, 6))), /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-balance" }, balance.loading ? "\u2026" : `${formatBalanceDisplay(balance.value)} ${balance.symbol}`), /* @__PURE__ */ import_react3.default.createElement(CopyButton, { value: address, label }));
6085
+ return /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-address" }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-address-main" }, /* @__PURE__ */ import_react2.default.createElement("span", null, label), /* @__PURE__ */ import_react2.default.createElement("code", { title: address }, shortAddress(address, 8, 6))), /* @__PURE__ */ import_react2.default.createElement("span", { className: "dcm-balance" }, balance.loading ? "\u2026" : `${formatBalanceDisplay(balance.value)} ${balance.symbol}`), /* @__PURE__ */ import_react2.default.createElement(CopyButton, { value: address, label }));
7083
6086
  }
7084
6087
  function ProtectedBy() {
7085
- return /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-protected" }, /* @__PURE__ */ import_react3.default.createElement("span", null, "Protected by"), /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 14, muted: true }), /* @__PURE__ */ import_react3.default.createElement(DecaneWordmark, { size: 12, muted: true }));
6088
+ return /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-protected" }, /* @__PURE__ */ import_react2.default.createElement("span", null, "Protected by"), /* @__PURE__ */ import_react2.default.createElement(DecaneMark, { size: 14, muted: true }), /* @__PURE__ */ import_react2.default.createElement(DecaneWordmark, { size: 12, muted: true }));
7086
6089
  }
7087
6090
  function SignInView({
7088
6091
  onGoogleSignIn,
@@ -7098,23 +6101,24 @@ function SignInView({
7098
6101
  onCustomAuthSignIn,
7099
6102
  canUsePasskey,
7100
6103
  passkeyAddress,
7101
- onPasskeySignIn
6104
+ onPasskeySignIn,
6105
+ extra
7102
6106
  }) {
7103
- const [googleLoading, setGoogleLoading] = (0, import_react3.useState)(false);
7104
- const [kingsChatLoading, setKingsChatLoading] = (0, import_react3.useState)(false);
7105
- const [xLoading, setXLoading] = (0, import_react3.useState)(false);
7106
- const [email, setEmail] = (0, import_react3.useState)("");
7107
- const [code, setCode] = (0, import_react3.useState)("");
7108
- const [emailSent, setEmailSent] = (0, import_react3.useState)(false);
7109
- const [emailLoading, setEmailLoading] = (0, import_react3.useState)(false);
7110
- const [phone, setPhone] = (0, import_react3.useState)("");
7111
- const [phoneCode, setPhoneCode] = (0, import_react3.useState)("");
7112
- const [phoneSent, setPhoneSent] = (0, import_react3.useState)(false);
7113
- const [phoneLoading, setPhoneLoading] = (0, import_react3.useState)(false);
7114
- const [customLoading, setCustomLoading] = (0, import_react3.useState)(false);
7115
- const [passkeyLoading, setPasskeyLoading] = (0, import_react3.useState)(false);
7116
- const [showOtherMethods, setShowOtherMethods] = (0, import_react3.useState)(false);
7117
- const [error, setError] = (0, import_react3.useState)("");
6107
+ const [googleLoading, setGoogleLoading] = (0, import_react2.useState)(false);
6108
+ const [kingsChatLoading, setKingsChatLoading] = (0, import_react2.useState)(false);
6109
+ const [xLoading, setXLoading] = (0, import_react2.useState)(false);
6110
+ const [email, setEmail] = (0, import_react2.useState)("");
6111
+ const [code, setCode] = (0, import_react2.useState)("");
6112
+ const [emailSent, setEmailSent] = (0, import_react2.useState)(false);
6113
+ const [emailLoading, setEmailLoading] = (0, import_react2.useState)(false);
6114
+ const [phone, setPhone] = (0, import_react2.useState)("");
6115
+ const [phoneCode, setPhoneCode] = (0, import_react2.useState)("");
6116
+ const [phoneSent, setPhoneSent] = (0, import_react2.useState)(false);
6117
+ const [phoneLoading, setPhoneLoading] = (0, import_react2.useState)(false);
6118
+ const [customLoading, setCustomLoading] = (0, import_react2.useState)(false);
6119
+ const [passkeyLoading, setPasskeyLoading] = (0, import_react2.useState)(false);
6120
+ const [showOtherMethods, setShowOtherMethods] = (0, import_react2.useState)(false);
6121
+ const [error, setError] = (0, import_react2.useState)("");
7118
6122
  const passkeyFirst = !!canUsePasskey && !!onPasskeySignIn && !showOtherMethods;
7119
6123
  const busy = googleLoading || kingsChatLoading || xLoading || customLoading || emailLoading || phoneLoading;
7120
6124
  async function handlePasskey() {
@@ -7236,19 +6240,19 @@ function SignInView({
7236
6240
  setPhoneCode("");
7237
6241
  setError("");
7238
6242
  }
7239
- const errorLine = error ? /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-error", role: "alert" }, error) : null;
6243
+ const errorLine = error ? /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-error", role: "alert" }, error) : null;
7240
6244
  if (passkeyFirst) {
7241
- return /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-badge" }, /* @__PURE__ */ import_react3.default.createElement(KeyIcon, { size: 22 })), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, "Welcome back"), /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-sub" }, passkeyAddress ? /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, "Unlock ", /* @__PURE__ */ import_react3.default.createElement("b", null, shortAddress(passkeyAddress)), " with your passkey.") : "Unlock your wallet with your passkey."), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handlePasskey, disabled: passkeyLoading }, passkeyLoading ? "Waiting for passkey\u2026" : "Continue with passkey"), errorLine, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-link", onClick: () => {
6245
+ return /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-badge" }, /* @__PURE__ */ import_react2.default.createElement(KeyIcon, { size: 22 })), /* @__PURE__ */ import_react2.default.createElement("h2", { className: "dcm-title" }, "Welcome back"), /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-sub" }, passkeyAddress ? /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, "Unlock ", /* @__PURE__ */ import_react2.default.createElement("b", null, shortAddress(passkeyAddress)), " with your passkey.") : "Unlock your wallet with your passkey."), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handlePasskey, disabled: passkeyLoading }, passkeyLoading ? "Waiting for passkey\u2026" : "Continue with passkey"), errorLine, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-link", onClick: () => {
7242
6246
  setError("");
7243
6247
  setShowOtherMethods(true);
7244
- } }, "Use another sign-in method"), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
6248
+ } }, "Use another sign-in method"), /* @__PURE__ */ import_react2.default.createElement(ProtectedBy, null));
7245
6249
  }
7246
6250
  if (emailSent || phoneSent) {
7247
6251
  const isEmail = emailSent;
7248
6252
  const value = isEmail ? code : phoneCode;
7249
6253
  const setValue = isEmail ? setCode : setPhoneCode;
7250
6254
  const loading = isEmail ? emailLoading : phoneLoading;
7251
- return /* @__PURE__ */ import_react3.default.createElement("form", { className: "dcm-body", onSubmit: isEmail ? handleEmailVerify : handlePhoneVerify }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-badge" }, isEmail ? /* @__PURE__ */ import_react3.default.createElement(MailIcon, { size: 22 }) : /* @__PURE__ */ import_react3.default.createElement(PhoneIcon, { size: 22 })), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, "Enter your code"), /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-sub" }, "We sent a 6-digit code to ", /* @__PURE__ */ import_react3.default.createElement("b", null, isEmail ? email.trim() : phone.trim())), /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-form" }, /* @__PURE__ */ import_react3.default.createElement(
6255
+ return /* @__PURE__ */ import_react2.default.createElement("form", { className: "dcm-body", onSubmit: isEmail ? handleEmailVerify : handlePhoneVerify }, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-badge" }, isEmail ? /* @__PURE__ */ import_react2.default.createElement(MailIcon, { size: 22 }) : /* @__PURE__ */ import_react2.default.createElement(PhoneIcon, { size: 22 })), /* @__PURE__ */ import_react2.default.createElement("h2", { className: "dcm-title" }, "Enter your code"), /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-sub" }, "We sent a 6-digit code to ", /* @__PURE__ */ import_react2.default.createElement("b", null, isEmail ? email.trim() : phone.trim())), /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-form" }, /* @__PURE__ */ import_react2.default.createElement(
7252
6256
  "input",
7253
6257
  {
7254
6258
  className: "dcm-field dcm-code",
@@ -7261,10 +6265,10 @@ function SignInView({
7261
6265
  autoComplete: "one-time-code",
7262
6266
  onChange: (e) => setValue(e.target.value.replace(/\D/g, ""))
7263
6267
  }
7264
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", className: "dcm-primary", disabled: loading || value.length < 6 }, loading ? "Verifying\u2026" : "Continue")), errorLine, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-link", onClick: backToMethods }, "Use a different method"), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
6268
+ ), /* @__PURE__ */ import_react2.default.createElement("button", { type: "submit", className: "dcm-primary", disabled: loading || value.length < 6 }, loading ? "Verifying\u2026" : "Continue")), errorLine, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-link", onClick: backToMethods }, "Use a different method"), /* @__PURE__ */ import_react2.default.createElement(ProtectedBy, null));
7265
6269
  }
7266
6270
  const showPhone = authMethods.includes("phone") && !!onPhoneStart && !!onPhoneVerify;
7267
- return /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 44 }), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, resumeHint ? "Welcome back" : "Log in or sign up"), resumeHint && /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-sub" }, "Sign in again to resume ", resumeHint, "."), /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-methods" }, authMethods.includes("google") && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleGoogle, disabled: busy }, /* @__PURE__ */ import_react3.default.createElement(GoogleMark, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement("span", null, googleLoading ? "Redirecting to Google\u2026" : "Google")), authMethods.includes("email") && /* @__PURE__ */ import_react3.default.createElement("form", { className: "dcm-method dcm-method-input", onSubmit: handleEmailStart }, /* @__PURE__ */ import_react3.default.createElement(MailIcon, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement(
6271
+ return /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react2.default.createElement(DecaneMark, { size: 44 }), /* @__PURE__ */ import_react2.default.createElement("h2", { className: "dcm-title" }, resumeHint ? "Welcome back" : "Log in or sign up"), resumeHint && /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-sub" }, "Sign in again to resume ", resumeHint, "."), /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-methods" }, authMethods.includes("google") && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleGoogle, disabled: busy }, /* @__PURE__ */ import_react2.default.createElement(GoogleMark, { size: 18 }), /* @__PURE__ */ import_react2.default.createElement("span", null, googleLoading ? "Redirecting to Google\u2026" : "Google")), authMethods.includes("email") && /* @__PURE__ */ import_react2.default.createElement("form", { className: "dcm-method dcm-method-input", onSubmit: handleEmailStart }, /* @__PURE__ */ import_react2.default.createElement(MailIcon, { size: 18 }), /* @__PURE__ */ import_react2.default.createElement(
7268
6272
  "input",
7269
6273
  {
7270
6274
  type: "email",
@@ -7275,7 +6279,7 @@ function SignInView({
7275
6279
  value: email,
7276
6280
  onChange: (e) => setEmail(e.target.value)
7277
6281
  }
7278
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", className: "dcm-submit", disabled: busy || !email.trim() }, emailLoading ? "Sending\u2026" : "Submit")), showPhone && /* @__PURE__ */ import_react3.default.createElement("form", { className: "dcm-method dcm-method-input", onSubmit: handlePhoneStart }, /* @__PURE__ */ import_react3.default.createElement(PhoneIcon, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement(
6282
+ ), /* @__PURE__ */ import_react2.default.createElement("button", { type: "submit", className: "dcm-submit", disabled: busy || !email.trim() }, emailLoading ? "Sending\u2026" : "Submit")), showPhone && /* @__PURE__ */ import_react2.default.createElement("form", { className: "dcm-method dcm-method-input", onSubmit: handlePhoneStart }, /* @__PURE__ */ import_react2.default.createElement(PhoneIcon, { size: 18 }), /* @__PURE__ */ import_react2.default.createElement(
7279
6283
  "input",
7280
6284
  {
7281
6285
  type: "tel",
@@ -7286,24 +6290,24 @@ function SignInView({
7286
6290
  value: phone,
7287
6291
  onChange: (e) => setPhone(e.target.value)
7288
6292
  }
7289
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", className: "dcm-submit", disabled: busy || !phone.trim() }, phoneLoading ? "Sending\u2026" : "Submit")), authMethods.includes("x") && onXSignIn && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleX, disabled: busy }, /* @__PURE__ */ import_react3.default.createElement(XLogo, { size: 16 }), /* @__PURE__ */ import_react3.default.createElement("span", null, xLoading ? "Redirecting to X\u2026" : "X")), authMethods.includes("kingschat") && onKingsChatSignIn && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleKingsChat, disabled: busy }, /* @__PURE__ */ import_react3.default.createElement(ChatIcon, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement("span", null, kingsChatLoading ? "Waiting for KingsChat\u2026" : "KingsChat")), customAuthLabel && onCustomAuthSignIn && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleCustomAuth, disabled: busy }, /* @__PURE__ */ import_react3.default.createElement(UserIcon, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement("span", null, customLoading ? "Connecting\u2026" : customAuthLabel))), errorLine, canUsePasskey && onPasskeySignIn && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-link", onClick: () => {
6293
+ ), /* @__PURE__ */ import_react2.default.createElement("button", { type: "submit", className: "dcm-submit", disabled: busy || !phone.trim() }, phoneLoading ? "Sending\u2026" : "Submit")), authMethods.includes("x") && onXSignIn && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleX, disabled: busy }, /* @__PURE__ */ import_react2.default.createElement(XLogo, { size: 16 }), /* @__PURE__ */ import_react2.default.createElement("span", null, xLoading ? "Redirecting to X\u2026" : "X")), authMethods.includes("kingschat") && onKingsChatSignIn && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleKingsChat, disabled: busy }, /* @__PURE__ */ import_react2.default.createElement(ChatIcon, { size: 18 }), /* @__PURE__ */ import_react2.default.createElement("span", null, kingsChatLoading ? "Waiting for KingsChat\u2026" : "KingsChat")), customAuthLabel && onCustomAuthSignIn && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-method", onClick: handleCustomAuth, disabled: busy }, /* @__PURE__ */ import_react2.default.createElement(UserIcon, { size: 18 }), /* @__PURE__ */ import_react2.default.createElement("span", null, customLoading ? "Connecting\u2026" : customAuthLabel))), extra, errorLine, canUsePasskey && onPasskeySignIn && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-link", onClick: () => {
7290
6294
  setError("");
7291
6295
  setShowOtherMethods(false);
7292
- } }, "Use my passkey instead"), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
6296
+ } }, "Use my passkey instead"), /* @__PURE__ */ import_react2.default.createElement(ProtectedBy, null));
7293
6297
  }
7294
6298
  function RecoverySection({
7295
6299
  addresses,
7296
6300
  onRotateShares,
7297
6301
  onExportPortableBackup
7298
6302
  }) {
7299
- const [expanded, setExpanded] = (0, import_react3.useState)(false);
7300
- const [mode, setMode] = (0, import_react3.useState)(null);
7301
- const [password, setPassword] = (0, import_react3.useState)("");
7302
- const [passwordHint, setPasswordHint] = (0, import_react3.useState)("");
7303
- const [confirmed, setConfirmed] = (0, import_react3.useState)(false);
7304
- const [busy, setBusy] = (0, import_react3.useState)(false);
7305
- const [result, setResult] = (0, import_react3.useState)(null);
7306
- const [error, setError] = (0, import_react3.useState)("");
6303
+ const [expanded, setExpanded] = (0, import_react2.useState)(false);
6304
+ const [mode, setMode] = (0, import_react2.useState)(null);
6305
+ const [password, setPassword] = (0, import_react2.useState)("");
6306
+ const [passwordHint, setPasswordHint] = (0, import_react2.useState)("");
6307
+ const [confirmed, setConfirmed] = (0, import_react2.useState)(false);
6308
+ const [busy, setBusy] = (0, import_react2.useState)(false);
6309
+ const [result, setResult] = (0, import_react2.useState)(null);
6310
+ const [error, setError] = (0, import_react2.useState)("");
7307
6311
  function reset() {
7308
6312
  setMode(null);
7309
6313
  setPassword("");
@@ -7340,7 +6344,7 @@ function RecoverySection({
7340
6344
  setBusy(false);
7341
6345
  }
7342
6346
  }
7343
- const passwordFields = /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(
6347
+ const passwordFields = /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(
7344
6348
  "input",
7345
6349
  {
7346
6350
  className: "dcm-field",
@@ -7351,7 +6355,7 @@ function RecoverySection({
7351
6355
  value: password,
7352
6356
  onChange: (e) => setPassword(e.target.value)
7353
6357
  }
7354
- ), /* @__PURE__ */ import_react3.default.createElement(
6358
+ ), /* @__PURE__ */ import_react2.default.createElement(
7355
6359
  "input",
7356
6360
  {
7357
6361
  className: "dcm-field",
@@ -7360,14 +6364,14 @@ function RecoverySection({
7360
6364
  value: passwordHint,
7361
6365
  onChange: (e) => setPasswordHint(e.target.value)
7362
6366
  }
7363
- ), error && /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-error", role: "alert" }, error));
7364
- return /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-panel" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-panel-head", onClick: () => setExpanded((v) => !v), "aria-expanded": expanded }, /* @__PURE__ */ import_react3.default.createElement("span", null, "Recovery file"), /* @__PURE__ */ import_react3.default.createElement(ChevronIcon, { open: expanded })), expanded && /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-panel-body" }, !mode && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-note" }, "Save a recovery file so you can restore this wallet on a new device."), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-primary", style: { height: 44, borderRadius: 12 }, onClick: () => {
6367
+ ), error && /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-error", role: "alert" }, error));
6368
+ return /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-panel" }, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-panel-head", onClick: () => setExpanded((v) => !v), "aria-expanded": expanded }, /* @__PURE__ */ import_react2.default.createElement("span", null, "Recovery file"), /* @__PURE__ */ import_react2.default.createElement(ChevronIcon, { open: expanded })), expanded && /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-panel-body" }, !mode && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-note" }, "Save a recovery file so you can restore this wallet on a new device."), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-primary", style: { height: 44, borderRadius: 12 }, onClick: () => {
7365
6369
  reset();
7366
6370
  setMode("share");
7367
- } }, "Download recovery-share file"), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: () => {
6371
+ } }, "Download recovery-share file"), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: () => {
7368
6372
  reset();
7369
6373
  setMode("portable");
7370
- } }, "Download full recovery file")), mode === "share" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-note" }, "One share. It is useless on its own, so a password manager or cloud drive is a fine place for it. A new file replaces any previous recovery-share file."), passwordFields, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-row" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handleGenerate, disabled: busy }, busy ? "Preparing\u2026" : "Download"), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: reset }, "Cancel"))), mode === "portable" && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-warn" }, /* @__PURE__ */ import_react3.default.createElement("strong", null, "This file controls your wallet"), "It holds two shares, so the file plus its password is full control. Keep it offline, not in a cloud drive. It also replaces your current recovery-share file."), /* @__PURE__ */ import_react3.default.createElement("label", { className: "dcm-check" }, /* @__PURE__ */ import_react3.default.createElement("input", { type: "checkbox", checked: confirmed, onChange: (e) => setConfirmed(e.target.checked) }), "I understand anyone with this file and password controls the wallet"), passwordFields, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-row" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handleGenerate, disabled: busy || !confirmed }, busy ? "Preparing\u2026" : "Download"), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: reset }, "Cancel"))), result && /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-note" }, result.kind === "share" ? "Recovery-share file" : "Full recovery file", " downloaded. The share set is now version ", result.version, ", and any earlier recovery file no longer works.")));
6374
+ } }, "Download full recovery file")), mode === "share" && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-note" }, "One share. It is useless on its own, so a password manager or cloud drive is a fine place for it. A new file replaces any previous recovery-share file."), passwordFields, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-row" }, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handleGenerate, disabled: busy }, busy ? "Preparing\u2026" : "Download"), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: reset }, "Cancel"))), mode === "portable" && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-warn" }, /* @__PURE__ */ import_react2.default.createElement("strong", null, "This file controls your wallet"), "It holds two shares, so the file plus its password is full control. Keep it offline, not in a cloud drive. It also replaces your current recovery-share file."), /* @__PURE__ */ import_react2.default.createElement("label", { className: "dcm-check" }, /* @__PURE__ */ import_react2.default.createElement("input", { type: "checkbox", checked: confirmed, onChange: (e) => setConfirmed(e.target.checked) }), "I understand anyone with this file and password controls the wallet"), passwordFields, /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-row" }, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-primary", onClick: handleGenerate, disabled: busy || !confirmed }, busy ? "Preparing\u2026" : "Download"), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: reset }, "Cancel"))), result && /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-note" }, result.kind === "share" ? "Recovery-share file" : "Full recovery file", " downloaded. The share set is now version ", result.version, ", and any earlier recovery file no longer works.")));
7371
6375
  }
7372
6376
  function SocialWalletModal({
7373
6377
  open,
@@ -7394,21 +6398,21 @@ function SocialWalletModal({
7394
6398
  rpcUrls,
7395
6399
  chains
7396
6400
  }) {
7397
- const [timer, setTimer] = (0, import_react3.useState)("");
7398
- const [unlocking, setUnlocking] = (0, import_react3.useState)(false);
7399
- const [disconnecting, setDisconnecting] = (0, import_react3.useState)(false);
7400
- const [actionError, setActionError] = (0, import_react3.useState)("");
7401
- (0, import_react3.useEffect)(() => {
6401
+ const [timer, setTimer] = (0, import_react2.useState)("");
6402
+ const [unlocking, setUnlocking] = (0, import_react2.useState)(false);
6403
+ const [disconnecting, setDisconnecting] = (0, import_react2.useState)(false);
6404
+ const [actionError, setActionError] = (0, import_react2.useState)("");
6405
+ (0, import_react2.useEffect)(() => {
7402
6406
  if (!open) return;
7403
- injectTokens2(theme);
6407
+ injectTokens(theme);
7404
6408
  injectModalCss();
7405
6409
  if (theme !== "auto") return;
7406
6410
  const mq = window.matchMedia("(prefers-color-scheme: dark)");
7407
- const h = () => injectTokens2("auto");
6411
+ const h = () => injectTokens("auto");
7408
6412
  mq.addEventListener("change", h);
7409
6413
  return () => mq.removeEventListener("change", h);
7410
6414
  }, [open, theme]);
7411
- (0, import_react3.useEffect)(() => {
6415
+ (0, import_react2.useEffect)(() => {
7412
6416
  if (!socialAuth.sessionExpiresAt) {
7413
6417
  setTimer("");
7414
6418
  return;
@@ -7417,10 +6421,10 @@ function SocialWalletModal({
7417
6421
  const id = setInterval(() => setTimer(countdown(socialAuth.sessionExpiresAt)), 1e3);
7418
6422
  return () => clearInterval(id);
7419
6423
  }, [socialAuth.sessionExpiresAt]);
7420
- const handleKey = (0, import_react3.useCallback)((e) => {
6424
+ const handleKey = (0, import_react2.useCallback)((e) => {
7421
6425
  if (e.key === "Escape") onClose();
7422
6426
  }, [onClose]);
7423
- (0, import_react3.useEffect)(() => {
6427
+ (0, import_react2.useEffect)(() => {
7424
6428
  if (!open) return;
7425
6429
  document.addEventListener("keydown", handleKey);
7426
6430
  return () => document.removeEventListener("keydown", handleKey);
@@ -7453,7 +6457,7 @@ function SocialWalletModal({
7453
6457
  const solChain = chains?.find((c) => c.startsWith("solana:")) ?? "solana:mainnet";
7454
6458
  const showSignIn = !socialAuth.addresses || socialAuth.needsReconnect;
7455
6459
  const unlocked = socialAuth.isUnlocked;
7456
- const modal = /* @__PURE__ */ import_react3.default.createElement(
6460
+ const modal = /* @__PURE__ */ import_react2.default.createElement(
7457
6461
  "div",
7458
6462
  {
7459
6463
  role: "dialog",
@@ -7471,8 +6475,8 @@ function SocialWalletModal({
7471
6475
  WebkitFontSmoothing: "antialiased"
7472
6476
  }
7473
6477
  },
7474
- /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-backdrop", onClick: onClose }),
7475
- /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-card" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-icon-btn", style: { right: 14 }, onClick: onClose, "aria-label": "Close" }, /* @__PURE__ */ import_react3.default.createElement(CloseIcon, null)), showSignIn ? /* @__PURE__ */ import_react3.default.createElement(
6478
+ /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-backdrop", onClick: onClose }),
6479
+ /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-card" }, /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-icon-btn", style: { right: 14 }, onClick: onClose, "aria-label": "Close" }, /* @__PURE__ */ import_react2.default.createElement(CloseIcon, null)), showSignIn ? /* @__PURE__ */ import_react2.default.createElement(
7476
6480
  SignInView,
7477
6481
  {
7478
6482
  onGoogleSignIn,
@@ -7490,22 +6494,238 @@ function SocialWalletModal({
7490
6494
  passkeyAddress,
7491
6495
  onPasskeySignIn
7492
6496
  }
7493
- ) : /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 44 }), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, "Your wallet"), /* @__PURE__ */ import_react3.default.createElement(
6497
+ ) : /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react2.default.createElement(DecaneMark, { size: 44 }), /* @__PURE__ */ import_react2.default.createElement("h2", { className: "dcm-title" }, "Your wallet"), /* @__PURE__ */ import_react2.default.createElement(
7494
6498
  "span",
7495
6499
  {
7496
6500
  className: "dcm-status",
7497
6501
  style: { color: unlocked ? "#12b76a" : "var(--dc-accent-ink)", marginTop: -8 }
7498
6502
  },
7499
- /* @__PURE__ */ import_react3.default.createElement("i", { style: { background: unlocked ? "#12b76a" : "var(--dc-accent)" } }),
6503
+ /* @__PURE__ */ import_react2.default.createElement("i", { style: { background: unlocked ? "#12b76a" : "var(--dc-accent)" } }),
7500
6504
  unlocked ? timer ? `Unlocked, expires in ${timer}` : "Unlocked" : "Locked"
7501
- ), (socialAuth.addresses?.evm || socialAuth.addresses?.solana) && /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-addresses" }, socialAuth.addresses?.evm && /* @__PURE__ */ import_react3.default.createElement(AddressRow, { label: "Ethereum and EVM", address: socialAuth.addresses.evm, kind: "evm", chain: evmChain, rpcUrls }), socialAuth.addresses?.solana && /* @__PURE__ */ import_react3.default.createElement(AddressRow, { label: "Solana", address: socialAuth.addresses.solana, kind: "solana", chain: solChain, rpcUrls })), unlocked && /* @__PURE__ */ import_react3.default.createElement(
6505
+ ), (socialAuth.addresses?.evm || socialAuth.addresses?.solana) && /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-addresses" }, socialAuth.addresses?.evm && /* @__PURE__ */ import_react2.default.createElement(AddressRow, { label: "Ethereum and EVM", address: socialAuth.addresses.evm, kind: "evm", chain: evmChain, rpcUrls }), socialAuth.addresses?.solana && /* @__PURE__ */ import_react2.default.createElement(AddressRow, { label: "Solana", address: socialAuth.addresses.solana, kind: "solana", chain: solChain, rpcUrls })), unlocked && /* @__PURE__ */ import_react2.default.createElement(
7502
6506
  RecoverySection,
7503
6507
  {
7504
6508
  addresses: socialAuth.addresses,
7505
6509
  onRotateShares,
7506
6510
  onExportPortableBackup
7507
6511
  }
7508
- ), actionError && /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-error", role: "alert" }, actionError), /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-actions" }, !unlocked && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-primary", style: { height: 44, borderRadius: 12 }, onClick: handleUnlock, disabled: unlocking }, unlocking ? "Unlocking\u2026" : "Unlock wallet"), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: handleDisconnect, disabled: disconnecting }, disconnecting ? "Signing out\u2026" : "Sign out")), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null)))
6512
+ ), actionError && /* @__PURE__ */ import_react2.default.createElement("p", { className: "dcm-error", role: "alert" }, actionError), /* @__PURE__ */ import_react2.default.createElement("div", { className: "dcm-actions" }, !unlocked && /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-primary", style: { height: 44, borderRadius: 12 }, onClick: handleUnlock, disabled: unlocking }, unlocking ? "Unlocking\u2026" : "Unlock wallet"), /* @__PURE__ */ import_react2.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: handleDisconnect, disabled: disconnecting }, disconnecting ? "Signing out\u2026" : "Sign out")), /* @__PURE__ */ import_react2.default.createElement(ProtectedBy, null)))
6513
+ );
6514
+ return (0, import_react_dom.createPortal)(modal, document.body);
6515
+ }
6516
+
6517
+ // src/ui/WalletSelector.tsx
6518
+ var FONT_URL = "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap";
6519
+ function injectTokens2(theme) {
6520
+ let resolved;
6521
+ if (theme === "auto") {
6522
+ resolved = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
6523
+ } else {
6524
+ resolved = theme;
6525
+ }
6526
+ let styleEl = document.getElementById("decane-tokens");
6527
+ if (!styleEl) {
6528
+ styleEl = document.createElement("style");
6529
+ styleEl.id = "decane-tokens";
6530
+ document.head.appendChild(styleEl);
6531
+ }
6532
+ styleEl.textContent = `:root { ${CSS_VARS[resolved]} }`;
6533
+ }
6534
+ function injectFont() {
6535
+ if (document.getElementById("decane-font")) return;
6536
+ const link = document.createElement("link");
6537
+ link.id = "decane-font";
6538
+ link.rel = "stylesheet";
6539
+ link.href = FONT_URL;
6540
+ document.head.appendChild(link);
6541
+ }
6542
+ function hasSocialMode(mode) {
6543
+ return mode === "all" || mode === "social" || mode === "evm+social" || mode === "solana+social" || mode === "tron+social" || mode === "evm+tron+social";
6544
+ }
6545
+ var NETWORK_LABEL = {
6546
+ evm: "EVM networks",
6547
+ solana: "Solana",
6548
+ tron: "Tron",
6549
+ bitcoin: "Bitcoin"
6550
+ };
6551
+ function WalletSelector({
6552
+ provider,
6553
+ open,
6554
+ onClose,
6555
+ onConnect,
6556
+ theme = "auto",
6557
+ networks = "all",
6558
+ mode = "wallets",
6559
+ socialAuthMethods = ["google", "email"],
6560
+ onGoogleSignIn,
6561
+ onKingsChatSignIn,
6562
+ onXSignIn,
6563
+ onEmailStart,
6564
+ onEmailVerify,
6565
+ onPhoneStart,
6566
+ onPhoneVerify,
6567
+ customAuthLabel,
6568
+ onCustomAuthSignIn,
6569
+ canUsePasskey = false,
6570
+ passkeyAddress = null,
6571
+ onPasskeySignIn
6572
+ }) {
6573
+ const showSocial = hasSocialMode(mode);
6574
+ const showWallets = mode !== "social";
6575
+ const [view, setView] = (0, import_react3.useState)(showSocial ? "social" : "wallets");
6576
+ const [search, setSearch] = (0, import_react3.useState)("");
6577
+ const [filter, setFilter] = (0, import_react3.useState)("all");
6578
+ const [pendingWallet, setPendingWallet] = (0, import_react3.useState)(null);
6579
+ const [session, setSession] = (0, import_react3.useState)(0);
6580
+ (0, import_react3.useEffect)(() => {
6581
+ if (!open) return;
6582
+ injectFont();
6583
+ injectTokens2(theme);
6584
+ injectModalCss();
6585
+ if (theme !== "auto") return;
6586
+ const mq = window.matchMedia("(prefers-color-scheme: dark)");
6587
+ const handler = () => injectTokens2("auto");
6588
+ mq.addEventListener("change", handler);
6589
+ return () => mq.removeEventListener("change", handler);
6590
+ }, [open, theme]);
6591
+ (0, import_react3.useEffect)(() => {
6592
+ if (!open) {
6593
+ setSearch("");
6594
+ setFilter("all");
6595
+ setPendingWallet(null);
6596
+ setView(showSocial ? "social" : "wallets");
6597
+ setSession((n) => n + 1);
6598
+ return;
6599
+ }
6600
+ return () => {
6601
+ document.getElementById("decane-tokens")?.remove();
6602
+ };
6603
+ }, [open, showWallets, showSocial]);
6604
+ const handleKey = (0, import_react3.useCallback)(
6605
+ (e) => {
6606
+ if (e.key !== "Escape") return;
6607
+ if (pendingWallet) setPendingWallet(null);
6608
+ else onClose();
6609
+ },
6610
+ [onClose, pendingWallet]
6611
+ );
6612
+ (0, import_react3.useEffect)(() => {
6613
+ if (!open) return;
6614
+ document.addEventListener("keydown", handleKey);
6615
+ return () => document.removeEventListener("keydown", handleKey);
6616
+ }, [open, handleKey]);
6617
+ if (!open) return null;
6618
+ const q = search.trim().toLowerCase();
6619
+ const networkWallets = provider.wallets.filter((w) => {
6620
+ const cs = w.chainSupport;
6621
+ if (networks === "evm") return cs.includes("evm");
6622
+ if (networks === "solana") return cs.includes("solana");
6623
+ if (networks === "tron") return cs.includes("tron");
6624
+ if (networks === "bitcoin") return cs.includes("bitcoin");
6625
+ return true;
6626
+ });
6627
+ const baseWallets = filter === "all" ? networkWallets : networkWallets.filter((w) => w.chainSupport.includes(filter));
6628
+ const filtered = q ? baseWallets.filter((w) => w.name.toLowerCase().includes(q)) : baseWallets;
6629
+ const filters = [
6630
+ { id: "all", label: "All" },
6631
+ { id: "evm", label: "EVM" },
6632
+ { id: "solana", label: "Solana" },
6633
+ ...provider.tronWallets?.length ? [{ id: "tron", label: "Tron" }] : [],
6634
+ ...provider.bitcoinWallets?.length ? [{ id: "bitcoin", label: "Bitcoin" }] : []
6635
+ ];
6636
+ function handleWalletClick(wallet) {
6637
+ const cs = wallet.chainSupport;
6638
+ const isMulti = cs.length >= 2;
6639
+ if (isMulti && networks === "all") {
6640
+ setPendingWallet(wallet);
6641
+ } else {
6642
+ const preference = networks === "evm" ? "evm" : networks === "solana" ? "solana" : networks === "tron" ? "tron" : networks === "bitcoin" ? "bitcoin" : void 0;
6643
+ onConnect(wallet, preference);
6644
+ onClose();
6645
+ }
6646
+ }
6647
+ function handleChainChoice(preference) {
6648
+ if (!pendingWallet) return;
6649
+ onConnect(pendingWallet, preference);
6650
+ onClose();
6651
+ }
6652
+ const signInMethods = socialAuthMethods.filter(
6653
+ (m) => m === "google" ? !!onGoogleSignIn : m === "email" ? !!onEmailStart && !!onEmailVerify : true
6654
+ );
6655
+ const noop = async () => {
6656
+ };
6657
+ const noopStart = async () => ({ codeRequired: true });
6658
+ const walletEntry = showWallets ? /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-or" }, "or"), /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-methods", style: { marginTop: 0 } }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-method", onClick: () => setView("wallets") }, /* @__PURE__ */ import_react3.default.createElement(WalletLineIcon, { size: 18 }), /* @__PURE__ */ import_react3.default.createElement("span", null, "Continue with a wallet"), /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-trail" }, networkWallets.length > 0 && /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-stack", "aria-label": `${networkWallets.length} detected` }, networkWallets.slice(0, 3).map(
6659
+ (w) => w.icon ? /* @__PURE__ */ import_react3.default.createElement("img", { key: w.id, src: w.icon, alt: "" }) : /* @__PURE__ */ import_react3.default.createElement("span", { key: w.id })
6660
+ )), /* @__PURE__ */ import_react3.default.createElement(ChevronRightIcon, null))))) : null;
6661
+ const closeButton = /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-icon-btn", style: { right: 14 }, onClick: onClose, "aria-label": "Close" }, /* @__PURE__ */ import_react3.default.createElement(CloseIcon, null));
6662
+ let body;
6663
+ if (pendingWallet) {
6664
+ const support = pendingWallet.chainSupport;
6665
+ body = /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-body" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-icon-btn", style: { left: 14 }, onClick: () => setPendingWallet(null), "aria-label": "Back" }, /* @__PURE__ */ import_react3.default.createElement(ArrowLeftIcon, null)), closeButton, /* @__PURE__ */ import_react3.default.createElement(WalletIcon, { src: pendingWallet.icon || void 0, name: pendingWallet.name, size: 52 }), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, "Choose networks"), /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-sub" }, pendingWallet.name, " works on more than one network. Pick what to connect."), /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-methods" }, /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-option", onClick: () => handleChainChoice(void 0) }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-option-icons" }, /* @__PURE__ */ import_react3.default.createElement(ChainIconStack, { support, size: 20 })), /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-option-text" }, /* @__PURE__ */ import_react3.default.createElement("b", null, "All networks"), /* @__PURE__ */ import_react3.default.createElement("small", null, "Every address this wallet has")), /* @__PURE__ */ import_react3.default.createElement(ChevronRightIcon, null)), support.map((c) => /* @__PURE__ */ import_react3.default.createElement("button", { key: c, type: "button", className: "dcm-option", onClick: () => handleChainChoice(c) }, /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-option-icons" }, /* @__PURE__ */ import_react3.default.createElement(ChainIconStack, { support: [c], size: 20 })), /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-option-text" }, /* @__PURE__ */ import_react3.default.createElement("b", null, NETWORK_LABEL[c] ?? c), /* @__PURE__ */ import_react3.default.createElement("small", null, "Only your ", c === "evm" ? "Ethereum-compatible" : NETWORK_LABEL[c] ?? c, " address")), /* @__PURE__ */ import_react3.default.createElement(ChevronRightIcon, null)))), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
6666
+ } else if (view === "wallets") {
6667
+ body = /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-body" }, showSocial && /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-icon-btn", style: { left: 14 }, onClick: () => setView("social"), "aria-label": "Back to sign-in" }, /* @__PURE__ */ import_react3.default.createElement(ArrowLeftIcon, null)), closeButton, /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 44 }), /* @__PURE__ */ import_react3.default.createElement("h2", { className: "dcm-title" }, "Connect a wallet"), /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-sub" }, networkWallets.length ? `${networkWallets.length} wallet${networkWallets.length === 1 ? "" : "s"} found in this browser` : "No wallets found in this browser"), networks === "all" && networkWallets.length > 0 && filters.length > 1 && /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-pills", role: "group", "aria-label": "Filter by network" }, filters.map((f) => /* @__PURE__ */ import_react3.default.createElement("button", { key: f.id, type: "button", "aria-pressed": filter === f.id, onClick: () => setFilter(f.id) }, f.label))), networkWallets.length > 5 && /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-search" }, /* @__PURE__ */ import_react3.default.createElement(SearchIcon, null), /* @__PURE__ */ import_react3.default.createElement(
6668
+ "input",
6669
+ {
6670
+ className: "dcm-field",
6671
+ type: "text",
6672
+ placeholder: "Search wallets",
6673
+ "aria-label": "Search wallets",
6674
+ value: search,
6675
+ onChange: (e) => setSearch(e.target.value)
6676
+ }
6677
+ )), filtered.length > 0 ? /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-list" }, filtered.map((w) => /* @__PURE__ */ import_react3.default.createElement("button", { key: w.id, type: "button", className: "dcm-method", onClick: () => handleWalletClick(w) }, /* @__PURE__ */ import_react3.default.createElement(WalletIcon, { src: w.icon || void 0, name: w.name, size: 26 }), /* @__PURE__ */ import_react3.default.createElement("span", null, w.name), /* @__PURE__ */ import_react3.default.createElement("span", { className: "dcm-trail" }, /* @__PURE__ */ import_react3.default.createElement(ChainIconStack, { support: w.chainSupport, size: 16 }), /* @__PURE__ */ import_react3.default.createElement(ChevronRightIcon, null))))) : /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-empty" }, q ? `No wallets match "${search.trim()}".` : networkWallets.length ? "No wallets for this network." : "Install a wallet extension, or unlock the one you have, then reopen this window."), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
6678
+ } else {
6679
+ body = /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, closeButton, /* @__PURE__ */ import_react3.default.createElement(
6680
+ SignInView,
6681
+ {
6682
+ key: session,
6683
+ onGoogleSignIn: onGoogleSignIn ?? noop,
6684
+ onKingsChatSignIn,
6685
+ onXSignIn,
6686
+ onEmailStart: onEmailStart ?? noopStart,
6687
+ onEmailVerify: onEmailVerify ?? noop,
6688
+ onPhoneStart,
6689
+ onPhoneVerify,
6690
+ authMethods: signInMethods,
6691
+ customAuthLabel,
6692
+ onCustomAuthSignIn,
6693
+ canUsePasskey,
6694
+ passkeyAddress,
6695
+ onPasskeySignIn,
6696
+ extra: walletEntry
6697
+ }
6698
+ ));
6699
+ }
6700
+ const modal = /* @__PURE__ */ import_react3.default.createElement(
6701
+ "div",
6702
+ {
6703
+ role: "dialog",
6704
+ "aria-modal": "true",
6705
+ "aria-label": pendingWallet ? "Choose networks" : view === "wallets" ? "Connect a wallet" : "Log in or sign up",
6706
+ style: {
6707
+ position: "fixed",
6708
+ inset: 0,
6709
+ zIndex: 9999,
6710
+ display: "flex",
6711
+ alignItems: "center",
6712
+ justifyContent: "center",
6713
+ padding: "16px",
6714
+ // Same fallback chain as SocialWalletModal — without it, this modal
6715
+ // drops to the browser default serif whenever the token block hasn't
6716
+ // been injected, while the social modal still lands on system-ui.
6717
+ fontFamily: "var(--dc-font-sans, system-ui, sans-serif)",
6718
+ WebkitFontSmoothing: "antialiased"
6719
+ }
6720
+ },
6721
+ /* @__PURE__ */ import_react3.default.createElement(
6722
+ "div",
6723
+ {
6724
+ className: "dcm-backdrop",
6725
+ onClick: () => pendingWallet ? setPendingWallet(null) : onClose()
6726
+ }
6727
+ ),
6728
+ /* @__PURE__ */ import_react3.default.createElement("div", { className: "dcm-card" }, body)
7509
6729
  );
7510
6730
  return (0, import_react_dom2.createPortal)(modal, document.body);
7511
6731
  }