decane-connect-kit 2.28.0 → 2.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -5601,6 +5601,7 @@ var tokens = {
5601
5601
  accent: "#F5C800",
5602
5602
  accentHover: "#D4A800",
5603
5603
  accentText: "#0D0D0B",
5604
+ accentInk: "#7A5F00",
5604
5605
  badgeEvm: "#1A1917",
5605
5606
  badgeEvmText: "#F5C800",
5606
5607
  badgeSolana: "#F5C800",
@@ -5621,6 +5622,7 @@ var tokens = {
5621
5622
  accent: "#F5C800",
5622
5623
  accentHover: "#FFE04D",
5623
5624
  accentText: "#0D0D0B",
5625
+ accentInk: "#F5C800",
5624
5626
  badgeEvm: "#F5C800",
5625
5627
  badgeEvmText: "#0D0D0B",
5626
5628
  badgeSolana: "#1A1917",
@@ -5646,6 +5648,7 @@ var CSS_VARS = {
5646
5648
  --dc-accent: ${tokens.light.accent};
5647
5649
  --dc-accent-hover: ${tokens.light.accentHover};
5648
5650
  --dc-accent-text: ${tokens.light.accentText};
5651
+ --dc-accent-ink: ${tokens.light.accentInk};
5649
5652
  --dc-badge-evm: ${tokens.light.badgeEvm};
5650
5653
  --dc-badge-evm-text: ${tokens.light.badgeEvmText};
5651
5654
  --dc-badge-sol: ${tokens.light.badgeSolana};
@@ -5667,6 +5670,7 @@ var CSS_VARS = {
5667
5670
  --dc-accent: ${tokens.dark.accent};
5668
5671
  --dc-accent-hover: ${tokens.dark.accentHover};
5669
5672
  --dc-accent-text: ${tokens.dark.accentText};
5673
+ --dc-accent-ink: ${tokens.dark.accentInk};
5670
5674
  --dc-badge-evm: ${tokens.dark.badgeEvm};
5671
5675
  --dc-badge-evm-text: ${tokens.dark.badgeEvmText};
5672
5676
  --dc-badge-sol: ${tokens.dark.badgeSolana};
@@ -5828,6 +5832,54 @@ function XLogo({ size = 14 }) {
5828
5832
  /* @__PURE__ */ import_react.default.createElement("path", { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" })
5829
5833
  );
5830
5834
  }
5835
+ var line = {
5836
+ fill: "none",
5837
+ stroke: "currentColor",
5838
+ strokeWidth: 1.8,
5839
+ strokeLinecap: "round",
5840
+ strokeLinejoin: "round"
5841
+ };
5842
+ function GoogleMark({ size = 18 }) {
5843
+ return /* @__PURE__ */ import_react.default.createElement("svg", { width: size, height: size, viewBox: "0 0 48 48", "aria-hidden": "true", style: { flexShrink: 0 } }, /* @__PURE__ */ import_react.default.createElement("path", { fill: "#EA4335", d: "M24 9.5c3.5 0 6 1.5 7.4 2.8l5.4-5.3C33.5 3.9 29.2 2 24 2 15.4 2 8 7 4.7 14.2l6.3 4.9C12.6 13.4 17.8 9.5 24 9.5z" }), /* @__PURE__ */ import_react.default.createElement("path", { fill: "#4285F4", d: "M46 24.5c0-1.6-.1-2.8-.4-4H24v7.5h12.6c-.3 2.2-1.7 5.5-4.9 7.7l6.1 4.7C41.5 37 46 31.4 46 24.5z" }), /* @__PURE__ */ import_react.default.createElement("path", { fill: "#FBBC05", d: "M11 29.1a13.9 13.9 0 0 1 0-10l-6.3-4.9A22 22 0 0 0 2 24c0 3.5.8 6.9 2.4 9.8L11 29.1z" }), /* @__PURE__ */ import_react.default.createElement("path", { fill: "#34A853", d: "M24 46c5.9 0 10.9-2 14.5-5.4l-6.1-4.7c-1.7 1.2-4 2-8.4 2-6.2 0-11.4-4-13.1-9.6l-6.3 4.9C7.9 40.9 15.3 46 24 46z" }));
5844
+ }
5845
+ function MailIcon({ size = 18 }) {
5846
+ 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("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2.5" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "m3.5 7 8.5 6 8.5-6" }));
5847
+ }
5848
+ function PhoneIcon({ size = 18 }) {
5849
+ 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("rect", { x: "7", y: "2.5", width: "10", height: "19", rx: "2.5" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M11 18h2" }));
5850
+ }
5851
+ function ChatIcon({ size = 18 }) {
5852
+ 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 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v7a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.2a.6.6 0 0 1-1-.5V16A2.5 2.5 0 0 1 4 13.5z" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8.5 9h7M8.5 12.5h4.5" }));
5853
+ }
5854
+ function KeyIcon({ size = 18 }) {
5855
+ 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: "8", cy: "12", r: "4" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 12h9M18 12v3M15 12v2.5" }));
5856
+ }
5857
+ function UserIcon({ size = 18 }) {
5858
+ 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: "12", cy: "8.5", r: "3.8" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M4.5 20a7.5 7.5 0 0 1 15 0" }));
5859
+ }
5860
+ function CopyIcon({ size = 15 }) {
5861
+ 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("rect", { x: "8.5", y: "8.5", width: "12", height: "12", rx: "2.5" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M15.5 8.5V6A2.5 2.5 0 0 0 13 3.5H6A2.5 2.5 0 0 0 3.5 6v7A2.5 2.5 0 0 0 6 15.5h2.5" }));
5862
+ }
5863
+ function CheckIcon({ size = 15 }) {
5864
+ 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: "m5 12.5 4.5 4.5L19 7.5" }));
5865
+ }
5866
+ function CloseIcon({ size = 16 }) {
5867
+ 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: "M6 6l12 12M18 6 6 18" }));
5868
+ }
5869
+ function ChevronIcon({ size = 16, open = false }) {
5870
+ return /* @__PURE__ */ import_react.default.createElement(
5871
+ "svg",
5872
+ {
5873
+ width: size,
5874
+ height: size,
5875
+ viewBox: "0 0 24 24",
5876
+ ...line,
5877
+ "aria-hidden": "true",
5878
+ style: { flexShrink: 0, transition: "transform .2s", transform: open ? "rotate(180deg)" : "none" }
5879
+ },
5880
+ /* @__PURE__ */ import_react.default.createElement("path", { d: "m6 9 6 6 6-6" })
5881
+ );
5882
+ }
5831
5883
 
5832
5884
  // src/ui/WalletSelector.tsx
5833
5885
  var FONT_URL = "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap";
@@ -6891,33 +6943,6 @@ function downloadJson(data, filename) {
6891
6943
  a.click();
6892
6944
  URL.revokeObjectURL(url);
6893
6945
  }
6894
- function CopyButton({ value }) {
6895
- const [copied, setCopied] = (0, import_react3.useState)(false);
6896
- async function copy() {
6897
- await navigator.clipboard.writeText(value).catch(() => {
6898
- });
6899
- setCopied(true);
6900
- setTimeout(() => setCopied(false), 1500);
6901
- }
6902
- return /* @__PURE__ */ import_react3.default.createElement(
6903
- "button",
6904
- {
6905
- onClick: copy,
6906
- style: {
6907
- background: "none",
6908
- border: "none",
6909
- cursor: "pointer",
6910
- color: copied ? "var(--dc-accent)" : "var(--dc-text-muted)",
6911
- fontSize: 11,
6912
- fontFamily: "inherit",
6913
- padding: "2px 6px",
6914
- borderRadius: 5,
6915
- transition: "color 0.15s"
6916
- }
6917
- },
6918
- copied ? "\u2713" : "copy"
6919
- );
6920
- }
6921
6946
  function useBalance(kind, address, chain, rpcUrls) {
6922
6947
  const [state, setState] = (0, import_react3.useState)({ loading: false, value: null, symbol: kind === "evm" ? "ETH" : "SOL" });
6923
6948
  (0, import_react3.useEffect)(() => {
@@ -6935,6 +6960,117 @@ function useBalance(kind, address, chain, rpcUrls) {
6935
6960
  }, [kind, address, chain, rpcUrls]);
6936
6961
  return state;
6937
6962
  }
6963
+ var MODAL_CSS = `
6964
+ .dcm-card { position: relative; width: 100%; max-width: 380px; max-height: calc(100vh - 32px); overflow-y: auto;
6965
+ background: var(--dc-bg); color: var(--dc-text); border: 1px solid var(--dc-border); border-radius: 24px;
6966
+ box-shadow: 0 24px 64px -12px rgba(0,0,0,.35), 0 2px 8px rgba(0,0,0,.08);
6967
+ animation: dcm-in .22s cubic-bezier(.2,.8,.2,1); box-sizing: border-box; }
6968
+ .dcm-card *, .dcm-card *::before, .dcm-card *::after { box-sizing: border-box; }
6969
+ @keyframes dcm-in { from { opacity: 0; transform: translateY(8px) scale(.985); } to { opacity: 1; transform: none; } }
6970
+ @keyframes dcm-fade { from { opacity: 0; } to { opacity: 1; } }
6971
+ @media (prefers-reduced-motion: reduce) { .dcm-card, .dcm-backdrop { animation: none !important; } }
6972
+ .dcm-backdrop { position: absolute; inset: 0; background: var(--dc-bg-overlay);
6973
+ backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); animation: dcm-fade .2s ease; }
6974
+ .dcm-icon-btn { position: absolute; top: 14px; width: 32px; height: 32px; border-radius: 10px; border: 0;
6975
+ background: transparent; color: var(--dc-text-muted); cursor: pointer; display: grid; place-items: center;
6976
+ padding: 0; transition: background .15s, color .15s; z-index: 1; }
6977
+ .dcm-icon-btn:hover { background: var(--dc-surface-hover); color: var(--dc-text); }
6978
+ .dcm-body { padding: 32px 24px 20px; display: flex; flex-direction: column; align-items: center; gap: 14px; text-align: center; }
6979
+ .dcm-title { margin: 4px 0 0; font-size: 20px; font-weight: 600; letter-spacing: -0.02em; line-height: 1.25; color: var(--dc-text); }
6980
+ .dcm-sub { margin: -6px 0 2px; font-size: 13.5px; line-height: 1.5; color: var(--dc-text-secondary); overflow-wrap: anywhere; }
6981
+ .dcm-sub b { color: var(--dc-text); font-weight: 600; }
6982
+ .dcm-methods { width: 100%; display: grid; gap: 8px; margin-top: 4px; }
6983
+ .dcm-method { width: 100%; height: 48px; display: flex; align-items: center; gap: 12px; padding: 0 14px;
6984
+ border-radius: 14px; border: 1px solid var(--dc-border); background: var(--dc-surface); color: var(--dc-text);
6985
+ font-weight: 500; font-size: 14.5px; line-height: 1; font-family: inherit; cursor: pointer; text-align: left;
6986
+ transition: border-color .15s, background .15s; }
6987
+ .dcm-method:hover:not(:disabled) { border-color: var(--dc-text-muted); background: var(--dc-surface-hover); }
6988
+ .dcm-method:disabled { opacity: .6; cursor: default; }
6989
+ .dcm-method:focus-visible, .dcm-primary:focus-visible, .dcm-link:focus-visible, .dcm-icon-btn:focus-visible,
6990
+ .dcm-ghost:focus-visible, .dcm-copy:focus-visible { outline: 2px solid var(--dc-accent); outline-offset: 2px; }
6991
+ .dcm-method > svg { color: var(--dc-text-secondary); }
6992
+ .dcm-method-input { cursor: text; padding-right: 6px; }
6993
+ .dcm-method-input:focus-within { border-color: var(--dc-accent); }
6994
+ .dcm-method-input input { flex: 1; min-width: 0; height: 100%; border: 0; outline: 0; background: transparent;
6995
+ color: var(--dc-text); font-family: inherit; font-size: 14.5px; padding: 0; }
6996
+ .dcm-method-input input::placeholder { color: var(--dc-text-muted); }
6997
+ .dcm-submit { height: 34px; padding: 0 12px; border-radius: 10px; border: 0; background: transparent;
6998
+ color: var(--dc-accent-ink); font-weight: 600; font-size: 13.5px; line-height: 1; font-family: inherit; cursor: pointer; transition: background .15s; }
6999
+ .dcm-submit:hover:not(:disabled) { background: var(--dc-surface-hover); }
7000
+ .dcm-submit:disabled { color: var(--dc-text-muted); cursor: default; }
7001
+ .dcm-form { width: 100%; display: grid; gap: 10px; margin-top: 4px; }
7002
+ .dcm-field { width: 100%; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--dc-border);
7003
+ background: var(--dc-surface); color: var(--dc-text); font-family: inherit; font-size: 15px; outline: none;
7004
+ transition: border-color .15s, box-shadow .15s; }
7005
+ .dcm-field::placeholder { color: var(--dc-text-muted); }
7006
+ .dcm-field:focus { border-color: var(--dc-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--dc-accent) 22%, transparent); }
7007
+ .dcm-code { height: 56px; text-align: center; font-family: var(--dc-font-mono); font-size: 24px; letter-spacing: .45em; padding-left: calc(14px + .45em); }
7008
+ .dcm-primary { width: 100%; height: 48px; border-radius: 14px; border: 0; background: var(--dc-accent); color: var(--dc-accent-text);
7009
+ font-weight: 600; font-size: 14.5px; line-height: 1; font-family: inherit; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px;
7010
+ transition: background .15s, opacity .15s; }
7011
+ .dcm-primary:hover:not(:disabled) { background: var(--dc-accent-hover); }
7012
+ .dcm-primary:disabled { opacity: .55; cursor: default; }
7013
+ .dcm-ghost { height: 44px; padding: 0 16px; border-radius: 12px; border: 1px solid var(--dc-border); background: transparent;
7014
+ color: var(--dc-text); font-weight: 500; font-size: 14px; line-height: 1; font-family: inherit; cursor: pointer; transition: background .15s, border-color .15s; white-space: nowrap; }
7015
+ .dcm-ghost:hover:not(:disabled) { background: var(--dc-surface-hover); border-color: var(--dc-text-muted); }
7016
+ .dcm-ghost:disabled { opacity: .55; cursor: default; }
7017
+ .dcm-link { border: 0; background: transparent; color: var(--dc-accent-ink); font-weight: 500; font-size: 13.5px; line-height: 1.4; font-family: inherit;
7018
+ cursor: pointer; padding: 4px; border-radius: 6px; }
7019
+ .dcm-link:hover { text-decoration: underline; text-underline-offset: 3px; }
7020
+ .dcm-badge { width: 52px; height: 52px; border-radius: 16px; display: grid; place-items: center;
7021
+ background: var(--dc-surface); border: 1px solid var(--dc-border); color: var(--dc-text); }
7022
+ .dcm-error { margin: 0; width: 100%; font-size: 13px; line-height: 1.45; color: var(--dc-danger); overflow-wrap: anywhere; }
7023
+ .dcm-protected { width: 100%; display: flex; align-items: center; justify-content: center; gap: 6px;
7024
+ margin-top: 6px; padding-top: 14px; border-top: 1px solid var(--dc-border); font-size: 12.5px; color: var(--dc-text-muted); }
7025
+ .dcm-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; }
7026
+ .dcm-status i { width: 7px; height: 7px; border-radius: 50%; display: block; }
7027
+ .dcm-addresses { width: 100%; border: 1px solid var(--dc-border); border-radius: 16px; overflow: hidden; text-align: left; }
7028
+ .dcm-address { display: flex; align-items: center; gap: 12px; padding: 12px 14px; background: var(--dc-surface); }
7029
+ .dcm-address + .dcm-address { border-top: 1px solid var(--dc-border); }
7030
+ .dcm-address-main { flex: 1; min-width: 0; display: grid; gap: 3px; }
7031
+ .dcm-address-main span { font-size: 13px; color: var(--dc-text-secondary); }
7032
+ .dcm-address-main code { font-family: var(--dc-font-mono); font-size: 13px; color: var(--dc-text); }
7033
+ .dcm-balance { font-family: var(--dc-font-mono); font-size: 13px; color: var(--dc-text); white-space: nowrap; }
7034
+ .dcm-copy { width: 30px; height: 30px; border-radius: 9px; border: 0; background: transparent; color: var(--dc-text-muted);
7035
+ display: grid; place-items: center; cursor: pointer; padding: 0; transition: background .15s, color .15s; }
7036
+ .dcm-copy:hover { background: var(--dc-surface-hover); color: var(--dc-text); }
7037
+ .dcm-panel { width: 100%; border: 1px solid var(--dc-border); border-radius: 16px; text-align: left; overflow: hidden; }
7038
+ .dcm-panel-head { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 13px 14px;
7039
+ border: 0; background: var(--dc-surface); color: var(--dc-text); font-weight: 500; font-size: 14px; line-height: 1; font-family: inherit; cursor: pointer; }
7040
+ .dcm-panel-head:hover { background: var(--dc-surface-hover); }
7041
+ .dcm-panel-head svg { color: var(--dc-text-muted); }
7042
+ .dcm-panel-body { padding: 14px; border-top: 1px solid var(--dc-border); display: grid; gap: 10px; }
7043
+ .dcm-note { margin: 0; font-size: 13px; line-height: 1.5; color: var(--dc-text-secondary); }
7044
+ .dcm-warn { padding: 12px; border-radius: 12px; font-size: 13px; line-height: 1.5;
7045
+ background: color-mix(in srgb, var(--dc-danger) 9%, transparent); border: 1px solid color-mix(in srgb, var(--dc-danger) 30%, transparent); color: var(--dc-text); }
7046
+ .dcm-warn strong { display: block; margin-bottom: 2px; color: var(--dc-danger); font-weight: 600; }
7047
+ .dcm-check { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--dc-text); cursor: pointer; }
7048
+ .dcm-check input { width: 16px; height: 16px; margin: 0; accent-color: var(--dc-accent); }
7049
+ .dcm-row { display: flex; gap: 8px; width: 100%; }
7050
+ .dcm-row > .dcm-primary { flex: 1; height: 44px; border-radius: 12px; }
7051
+ .dcm-actions { width: 100%; display: flex; gap: 8px; }
7052
+ .dcm-actions > * { flex: 1; }
7053
+ `;
7054
+ function injectModalCss() {
7055
+ if (document.getElementById("decane-modal-css")) return;
7056
+ const el = document.createElement("style");
7057
+ el.id = "decane-modal-css";
7058
+ el.textContent = MODAL_CSS;
7059
+ document.head.appendChild(el);
7060
+ }
7061
+ function shortAddress(a, head = 6, tail = 4) {
7062
+ return a.length > head + tail + 1 ? `${a.slice(0, head)}\u2026${a.slice(-tail)}` : a;
7063
+ }
7064
+ function CopyButton({ value, label }) {
7065
+ const [copied, setCopied] = (0, import_react3.useState)(false);
7066
+ async function copy() {
7067
+ await navigator.clipboard.writeText(value).catch(() => {
7068
+ });
7069
+ setCopied(true);
7070
+ setTimeout(() => setCopied(false), 1500);
7071
+ }
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));
7073
+ }
6938
7074
  function AddressRow({
6939
7075
  label,
6940
7076
  address,
@@ -6943,14 +7079,10 @@ function AddressRow({
6943
7079
  rpcUrls
6944
7080
  }) {
6945
7081
  const balance = useBalance(kind, address, chain, rpcUrls);
6946
- const short = `${address.slice(0, 8)}\u2026${address.slice(-6)}`;
6947
- return /* @__PURE__ */ import_react3.default.createElement("div", { style: {
6948
- background: "var(--dc-surface)",
6949
- border: "1px solid var(--dc-border)",
6950
- borderRadius: 10,
6951
- padding: "10px 14px",
6952
- marginBottom: 8
6953
- } }, /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 5 } }, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 10, fontWeight: 700, color: "var(--dc-text-muted)", letterSpacing: "0.06em", textTransform: "uppercase" } }, label), /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 11, fontFamily: "monospace", color: "var(--dc-text)" } }, balance.loading ? "\u2026" : `${formatBalanceDisplay(balance.value)} ${balance.symbol}`)), /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 13, fontFamily: "monospace", color: "var(--dc-text)", letterSpacing: "0.02em" } }, short), /* @__PURE__ */ import_react3.default.createElement(CopyButton, { value: address })));
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 }));
7083
+ }
7084
+ 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 }));
6954
7086
  }
6955
7087
  function SignInView({
6956
7088
  onGoogleSignIn,
@@ -6984,6 +7116,7 @@ function SignInView({
6984
7116
  const [showOtherMethods, setShowOtherMethods] = (0, import_react3.useState)(false);
6985
7117
  const [error, setError] = (0, import_react3.useState)("");
6986
7118
  const passkeyFirst = !!canUsePasskey && !!onPasskeySignIn && !showOtherMethods;
7119
+ const busy = googleLoading || kingsChatLoading || xLoading || customLoading || emailLoading || phoneLoading;
6987
7120
  async function handlePasskey() {
6988
7121
  if (!onPasskeySignIn) return;
6989
7122
  setError("");
@@ -7037,7 +7170,7 @@ function SignInView({
7037
7170
  setError("");
7038
7171
  setEmailLoading(true);
7039
7172
  try {
7040
- await onEmailStart(email);
7173
+ await onEmailStart(email.trim());
7041
7174
  setEmailSent(true);
7042
7175
  } catch (e2) {
7043
7176
  setError(e2.message);
@@ -7050,7 +7183,7 @@ function SignInView({
7050
7183
  setError("");
7051
7184
  setEmailLoading(true);
7052
7185
  try {
7053
- await onEmailVerify(email, code);
7186
+ await onEmailVerify(email.trim(), code);
7054
7187
  } catch (e2) {
7055
7188
  setError(e2.message);
7056
7189
  } finally {
@@ -7063,7 +7196,7 @@ function SignInView({
7063
7196
  setError("");
7064
7197
  setPhoneLoading(true);
7065
7198
  try {
7066
- await onPhoneStart(phone);
7199
+ await onPhoneStart(phone.trim());
7067
7200
  setPhoneSent(true);
7068
7201
  } catch (e2) {
7069
7202
  setError(e2.message);
@@ -7077,7 +7210,7 @@ function SignInView({
7077
7210
  setError("");
7078
7211
  setPhoneLoading(true);
7079
7212
  try {
7080
- await onPhoneVerify(phone, phoneCode);
7213
+ await onPhoneVerify(phone.trim(), phoneCode);
7081
7214
  } catch (e2) {
7082
7215
  setError(e2.message);
7083
7216
  } finally {
@@ -7096,226 +7229,67 @@ function SignInView({
7096
7229
  setCustomLoading(false);
7097
7230
  }
7098
7231
  }
7099
- const inputStyle = {
7100
- width: "100%",
7101
- background: "var(--dc-surface)",
7102
- border: "1px solid var(--dc-border)",
7103
- borderRadius: 8,
7104
- color: "var(--dc-text)",
7105
- padding: "9px 12px",
7106
- fontSize: 13,
7107
- outline: "none",
7108
- fontFamily: "inherit",
7109
- boxSizing: "border-box"
7110
- };
7111
- return /* @__PURE__ */ import_react3.default.createElement("div", { style: { padding: "0 16px 16px" } }, resumeHint && !passkeyFirst && /* @__PURE__ */ import_react3.default.createElement("div", { style: { fontSize: 12, color: "var(--dc-text-muted)", marginBottom: 12, textAlign: "center" } }, "Welcome back \u2014 sign in again to resume ", resumeHint), passkeyFirst && /* @__PURE__ */ import_react3.default.createElement("div", null, /* @__PURE__ */ import_react3.default.createElement("div", { style: { fontSize: 12, color: "var(--dc-text-muted)", marginBottom: 12, textAlign: "center" } }, "Welcome back \u2014 unlock to resume", passkeyAddress ? ` ${passkeyAddress.slice(0, 6)}\u2026${passkeyAddress.slice(-4)}` : ""), /* @__PURE__ */ import_react3.default.createElement(
7112
- "button",
7113
- {
7114
- onClick: handlePasskey,
7115
- disabled: passkeyLoading,
7116
- style: {
7117
- width: "100%",
7118
- padding: "11px 0",
7119
- background: "var(--dc-accent)",
7120
- color: "var(--dc-accent-text)",
7121
- border: "none",
7122
- borderRadius: 10,
7123
- fontSize: 13,
7124
- fontWeight: 700,
7125
- cursor: passkeyLoading ? "not-allowed" : "pointer",
7126
- opacity: passkeyLoading ? 0.7 : 1,
7127
- fontFamily: "inherit",
7128
- display: "flex",
7129
- alignItems: "center",
7130
- justifyContent: "center",
7131
- gap: 7
7132
- }
7133
- },
7134
- passkeyLoading ? "Verifying\u2026" : "\u{1F513} Continue with passkey"
7135
- ), /* @__PURE__ */ import_react3.default.createElement(
7136
- "button",
7137
- {
7138
- onClick: () => setShowOtherMethods(true),
7139
- style: {
7140
- width: "100%",
7141
- marginTop: 10,
7142
- background: "none",
7143
- border: "none",
7144
- color: "var(--dc-text-muted)",
7145
- fontSize: 12,
7146
- cursor: "pointer",
7147
- fontFamily: "inherit"
7148
- }
7149
- },
7150
- "Use email or Google instead"
7151
- ), error && /* @__PURE__ */ import_react3.default.createElement("div", { style: { marginTop: 10, fontSize: 12, color: "var(--dc-danger, #ff5533)" } }, error)), !passkeyFirst && authMethods.includes("google") && /* @__PURE__ */ import_react3.default.createElement(
7152
- "button",
7153
- {
7154
- onClick: handleGoogle,
7155
- disabled: googleLoading,
7156
- style: {
7157
- width: "100%",
7158
- padding: "10px 0",
7159
- marginBottom: 10,
7160
- background: "var(--dc-accent)",
7161
- color: "var(--dc-accent-text)",
7162
- border: "none",
7163
- borderRadius: 10,
7164
- fontSize: 13,
7165
- fontWeight: 700,
7166
- cursor: googleLoading ? "not-allowed" : "pointer",
7167
- opacity: googleLoading ? 0.7 : 1,
7168
- fontFamily: "inherit"
7169
- }
7170
- },
7171
- googleLoading ? "Redirecting\u2026" : "Continue with Google"
7172
- ), !passkeyFirst && authMethods.includes("kingschat") && onKingsChatSignIn && /* @__PURE__ */ import_react3.default.createElement(
7173
- "button",
7174
- {
7175
- onClick: handleKingsChat,
7176
- disabled: kingsChatLoading,
7177
- style: {
7178
- width: "100%",
7179
- padding: "10px 0",
7180
- marginBottom: 10,
7181
- background: "var(--dc-surface)",
7182
- color: "var(--dc-text)",
7183
- border: "1px solid var(--dc-border)",
7184
- borderRadius: 10,
7185
- fontSize: 13,
7186
- fontWeight: 700,
7187
- cursor: kingsChatLoading ? "not-allowed" : "pointer",
7188
- opacity: kingsChatLoading ? 0.7 : 1,
7189
- fontFamily: "inherit"
7190
- }
7191
- },
7192
- kingsChatLoading ? "Waiting for KingsChat\u2026" : "Continue with KingsChat"
7193
- ), !passkeyFirst && authMethods.includes("x") && onXSignIn && /* @__PURE__ */ import_react3.default.createElement(
7194
- "button",
7195
- {
7196
- onClick: handleX,
7197
- disabled: xLoading,
7198
- style: {
7199
- width: "100%",
7200
- padding: "10px 0",
7201
- marginBottom: 10,
7202
- background: "var(--dc-surface)",
7203
- color: "var(--dc-text)",
7204
- border: "1px solid var(--dc-border)",
7205
- borderRadius: 10,
7206
- fontSize: 13,
7207
- fontWeight: 700,
7208
- cursor: xLoading ? "not-allowed" : "pointer",
7209
- opacity: xLoading ? 0.7 : 1,
7210
- fontFamily: "inherit",
7211
- display: "flex",
7212
- alignItems: "center",
7213
- justifyContent: "center",
7214
- gap: 8
7215
- }
7216
- },
7217
- /* @__PURE__ */ import_react3.default.createElement(XLogo, null),
7218
- xLoading ? "Redirecting\u2026" : "Continue with X"
7219
- ), !passkeyFirst && authMethods.includes("email") && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, authMethods.includes("google") && /* @__PURE__ */ import_react3.default.createElement("div", { style: { textAlign: "center", color: "var(--dc-text-muted)", fontSize: 12, margin: "10px 0" } }, "\u2014 or \u2014"), !emailSent ? /* @__PURE__ */ import_react3.default.createElement("form", { onSubmit: handleEmailStart, style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement(
7232
+ function backToMethods() {
7233
+ setEmailSent(false);
7234
+ setCode("");
7235
+ setPhoneSent(false);
7236
+ setPhoneCode("");
7237
+ setError("");
7238
+ }
7239
+ const errorLine = error ? /* @__PURE__ */ import_react3.default.createElement("p", { className: "dcm-error", role: "alert" }, error) : null;
7240
+ 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: () => {
7242
+ setError("");
7243
+ setShowOtherMethods(true);
7244
+ } }, "Use another sign-in method"), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
7245
+ }
7246
+ if (emailSent || phoneSent) {
7247
+ const isEmail = emailSent;
7248
+ const value = isEmail ? code : phoneCode;
7249
+ const setValue = isEmail ? setCode : setPhoneCode;
7250
+ 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(
7252
+ "input",
7253
+ {
7254
+ className: "dcm-field dcm-code",
7255
+ "aria-label": "6-digit code",
7256
+ placeholder: "000000",
7257
+ value,
7258
+ maxLength: 6,
7259
+ autoFocus: true,
7260
+ inputMode: "numeric",
7261
+ autoComplete: "one-time-code",
7262
+ onChange: (e) => setValue(e.target.value.replace(/\D/g, ""))
7263
+ }
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));
7265
+ }
7266
+ 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(
7220
7268
  "input",
7221
7269
  {
7222
7270
  type: "email",
7223
7271
  required: true,
7224
7272
  placeholder: "your@email.com",
7273
+ "aria-label": "Email address",
7274
+ autoComplete: "email",
7225
7275
  value: email,
7226
- onChange: (e) => setEmail(e.target.value),
7227
- style: { ...inputStyle, flex: 1 }
7228
- }
7229
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", disabled: emailLoading, style: {
7230
- padding: "0 16px",
7231
- background: "var(--dc-surface)",
7232
- border: "1px solid var(--dc-border)",
7233
- borderRadius: 8,
7234
- color: "var(--dc-text)",
7235
- fontSize: 13,
7236
- cursor: "pointer",
7237
- fontFamily: "inherit"
7238
- } }, emailLoading ? "\u2026" : "Send code")) : /* @__PURE__ */ import_react3.default.createElement("form", { onSubmit: handleEmailVerify, style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement(
7239
- "input",
7240
- {
7241
- placeholder: "6-digit code",
7242
- value: code,
7243
- maxLength: 6,
7244
- autoFocus: true,
7245
- onChange: (e) => setCode(e.target.value.replace(/\D/g, "")),
7246
- style: { ...inputStyle, flex: 1, letterSpacing: 4, textAlign: "center" }
7247
- }
7248
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", disabled: emailLoading, style: {
7249
- padding: "0 16px",
7250
- background: "var(--dc-accent)",
7251
- color: "var(--dc-accent-text)",
7252
- border: "none",
7253
- borderRadius: 8,
7254
- fontSize: 13,
7255
- fontWeight: 700,
7256
- cursor: "pointer",
7257
- fontFamily: "inherit"
7258
- } }, emailLoading ? "\u2026" : "Verify"))), !passkeyFirst && authMethods.includes("phone") && onPhoneStart && onPhoneVerify && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, (authMethods.includes("google") || authMethods.includes("email")) && /* @__PURE__ */ import_react3.default.createElement("div", { style: { textAlign: "center", color: "var(--dc-text-muted)", fontSize: 12, margin: "10px 0" } }, "\u2014 or \u2014"), !phoneSent ? /* @__PURE__ */ import_react3.default.createElement("form", { onSubmit: handlePhoneStart, style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement(
7276
+ onChange: (e) => setEmail(e.target.value)
7277
+ }
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(
7259
7279
  "input",
7260
7280
  {
7261
7281
  type: "tel",
7262
7282
  required: true,
7263
7283
  placeholder: "+234 801 234 5678",
7284
+ "aria-label": "Phone number",
7285
+ autoComplete: "tel",
7264
7286
  value: phone,
7265
- onChange: (e) => setPhone(e.target.value),
7266
- style: { ...inputStyle, flex: 1 }
7267
- }
7268
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", disabled: phoneLoading, style: {
7269
- padding: "0 16px",
7270
- background: "var(--dc-surface)",
7271
- border: "1px solid var(--dc-border)",
7272
- borderRadius: 8,
7273
- color: "var(--dc-text)",
7274
- fontSize: 13,
7275
- cursor: "pointer",
7276
- fontFamily: "inherit"
7277
- } }, phoneLoading ? "\u2026" : "Send code")) : /* @__PURE__ */ import_react3.default.createElement("form", { onSubmit: handlePhoneVerify, style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement(
7278
- "input",
7279
- {
7280
- placeholder: "6-digit code",
7281
- value: phoneCode,
7282
- maxLength: 6,
7283
- autoFocus: true,
7284
- inputMode: "numeric",
7285
- onChange: (e) => setPhoneCode(e.target.value.replace(/\D/g, "")),
7286
- style: { ...inputStyle, flex: 1, letterSpacing: 4, textAlign: "center" }
7287
- }
7288
- ), /* @__PURE__ */ import_react3.default.createElement("button", { type: "submit", disabled: phoneLoading, style: {
7289
- padding: "0 16px",
7290
- background: "var(--dc-accent)",
7291
- color: "var(--dc-accent-text)",
7292
- border: "none",
7293
- borderRadius: 8,
7294
- fontSize: 13,
7295
- fontWeight: 700,
7296
- cursor: "pointer",
7297
- fontFamily: "inherit"
7298
- } }, phoneLoading ? "\u2026" : "Verify"))), !passkeyFirst && customAuthLabel && onCustomAuthSignIn && /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, (authMethods.includes("google") || authMethods.includes("email")) && /* @__PURE__ */ import_react3.default.createElement("div", { style: { textAlign: "center", color: "var(--dc-text-muted)", fontSize: 12, margin: "10px 0" } }, "\u2014 or \u2014"), /* @__PURE__ */ import_react3.default.createElement(
7299
- "button",
7300
- {
7301
- onClick: handleCustomAuth,
7302
- disabled: customLoading,
7303
- style: {
7304
- width: "100%",
7305
- padding: "10px 0",
7306
- background: "var(--dc-surface)",
7307
- color: "var(--dc-text)",
7308
- border: "1px solid var(--dc-border)",
7309
- borderRadius: 10,
7310
- fontSize: 13,
7311
- fontWeight: 600,
7312
- cursor: customLoading ? "not-allowed" : "pointer",
7313
- opacity: customLoading ? 0.7 : 1,
7314
- fontFamily: "inherit"
7315
- }
7316
- },
7317
- customLoading ? "Connecting\u2026" : customAuthLabel
7318
- )), error && /* @__PURE__ */ import_react3.default.createElement("div", { style: { marginTop: 10, fontSize: 12, color: "var(--dc-danger, #ff5533)" } }, error));
7287
+ onChange: (e) => setPhone(e.target.value)
7288
+ }
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: () => {
7290
+ setError("");
7291
+ setShowOtherMethods(false);
7292
+ } }, "Use my passkey instead"), /* @__PURE__ */ import_react3.default.createElement(ProtectedBy, null));
7319
7293
  }
7320
7294
  function RecoverySection({
7321
7295
  addresses,
@@ -7366,60 +7340,34 @@ function RecoverySection({
7366
7340
  setBusy(false);
7367
7341
  }
7368
7342
  }
7369
- const inputStyle = {
7370
- width: "100%",
7371
- background: "var(--dc-bg)",
7372
- border: "1px solid var(--dc-border)",
7373
- borderRadius: 8,
7374
- color: "var(--dc-text)",
7375
- padding: "8px 10px",
7376
- fontSize: 12,
7377
- outline: "none",
7378
- fontFamily: "inherit",
7379
- boxSizing: "border-box"
7380
- };
7381
- const btnStyle = {
7382
- padding: "8px 12px",
7383
- borderRadius: 8,
7384
- fontSize: 12,
7385
- fontWeight: 700,
7386
- cursor: "pointer",
7387
- fontFamily: "inherit",
7388
- border: "none"
7389
- };
7390
- return /* @__PURE__ */ import_react3.default.createElement("div", { style: { margin: "0 16px 14px", border: "1px solid var(--dc-border)", borderRadius: 10, overflow: "hidden" } }, /* @__PURE__ */ import_react3.default.createElement(
7391
- "button",
7343
+ const passwordFields = /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(
7344
+ "input",
7392
7345
  {
7393
- onClick: () => setExpanded((v) => !v),
7394
- style: {
7395
- width: "100%",
7396
- padding: "10px 14px",
7397
- background: "var(--dc-surface)",
7398
- border: "none",
7399
- display: "flex",
7400
- alignItems: "center",
7401
- justifyContent: "space-between",
7402
- cursor: "pointer",
7403
- fontFamily: "inherit"
7404
- }
7405
- },
7406
- /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 12, fontWeight: 700, color: "var(--dc-text)" } }, "Recovery"),
7407
- /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 11, color: "var(--dc-text-muted)" } }, expanded ? "\u25B2" : "\u25BC")
7408
- ), expanded && /* @__PURE__ */ import_react3.default.createElement("div", { style: { padding: "12px 14px", borderTop: "1px solid var(--dc-border)" } }, /* @__PURE__ */ import_react3.default.createElement("p", { style: { fontSize: 11, color: "var(--dc-text-muted)", lineHeight: 1.5, margin: "0 0 10px" } }, "Save a recovery file so you can restore this wallet on a new device."), !mode && /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("button", { onClick: () => {
7346
+ className: "dcm-field",
7347
+ type: "password",
7348
+ placeholder: "Password (at least 8 characters)",
7349
+ "aria-label": "Password",
7350
+ autoComplete: "new-password",
7351
+ value: password,
7352
+ onChange: (e) => setPassword(e.target.value)
7353
+ }
7354
+ ), /* @__PURE__ */ import_react3.default.createElement(
7355
+ "input",
7356
+ {
7357
+ className: "dcm-field",
7358
+ placeholder: "Password hint (optional)",
7359
+ "aria-label": "Password hint",
7360
+ value: passwordHint,
7361
+ onChange: (e) => setPasswordHint(e.target.value)
7362
+ }
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: () => {
7409
7365
  reset();
7410
7366
  setMode("share");
7411
- }, style: { ...btnStyle, background: "var(--dc-accent)", color: "var(--dc-accent-text)" } }, "Generate recovery-share file"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: () => {
7367
+ } }, "Download recovery-share file"), /* @__PURE__ */ import_react3.default.createElement("button", { type: "button", className: "dcm-ghost", onClick: () => {
7412
7368
  reset();
7413
7369
  setMode("portable");
7414
- }, style: { ...btnStyle, background: "transparent", border: "1px solid var(--dc-border)", color: "var(--dc-text)" } }, "Generate full recovery file")), mode === "share" && /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("p", { style: { fontSize: 11, color: "var(--dc-text-muted)", margin: 0 } }, "One share \u2014 useless alone, safe to keep in a password manager or cloud drive. Generating a new one invalidates any previous recovery-share file."), /* @__PURE__ */ import_react3.default.createElement("input", { type: "password", placeholder: "Password (min 8 chars)", value: password, onChange: (e) => setPassword(e.target.value), style: inputStyle }), /* @__PURE__ */ import_react3.default.createElement("input", { placeholder: "Password hint (optional)", value: passwordHint, onChange: (e) => setPasswordHint(e.target.value), style: inputStyle }), error && /* @__PURE__ */ import_react3.default.createElement("div", { style: { fontSize: 11, color: "var(--dc-danger, #ff5533)" } }, error), /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("button", { onClick: handleGenerate, disabled: busy, style: { ...btnStyle, flex: 1, background: "var(--dc-accent)", color: "var(--dc-accent-text)" } }, busy ? "Generating\u2026" : "Generate & download"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: reset, style: { ...btnStyle, background: "transparent", border: "1px solid var(--dc-border)", color: "var(--dc-text-muted)" } }, "Cancel"))), mode === "portable" && /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7415
- background: "rgba(255,85,51,0.08)",
7416
- border: "1px solid rgba(255,85,51,0.3)",
7417
- borderRadius: 8,
7418
- padding: "8px 10px",
7419
- fontSize: 11,
7420
- color: "#ff9977",
7421
- lineHeight: 1.5
7422
- } }, /* @__PURE__ */ import_react3.default.createElement("strong", { style: { display: "block", marginBottom: 3, color: "#ff5533" } }, "This file controls your wallet"), "Contains two shares \u2014 file plus password gives complete control. Keep it offline, not a cloud drive. This also invalidates your current recovery-share file."), /* @__PURE__ */ import_react3.default.createElement("label", { style: { display: "flex", alignItems: "center", gap: 6, fontSize: 11, color: "var(--dc-text)" } }, /* @__PURE__ */ import_react3.default.createElement("input", { type: "checkbox", checked: confirmed, onChange: (e) => setConfirmed(e.target.checked), style: { width: "auto" } }), "I understand this is a bearer secret"), /* @__PURE__ */ import_react3.default.createElement("input", { type: "password", placeholder: "Password (min 8 chars)", value: password, onChange: (e) => setPassword(e.target.value), style: inputStyle }), /* @__PURE__ */ import_react3.default.createElement("input", { placeholder: "Password hint (optional)", value: passwordHint, onChange: (e) => setPasswordHint(e.target.value), style: inputStyle }), error && /* @__PURE__ */ import_react3.default.createElement("div", { style: { fontSize: 11, color: "var(--dc-danger, #ff5533)" } }, error), /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("button", { onClick: handleGenerate, disabled: busy || !confirmed, style: { ...btnStyle, flex: 1, background: "var(--dc-accent)", color: "var(--dc-accent-text)" } }, busy ? "Generating\u2026" : "Generate & download"), /* @__PURE__ */ import_react3.default.createElement("button", { onClick: reset, style: { ...btnStyle, background: "transparent", border: "1px solid var(--dc-border)", color: "var(--dc-text-muted)" } }, "Cancel"))), result && /* @__PURE__ */ import_react3.default.createElement("div", { style: { marginTop: 10, fontSize: 11, color: "var(--dc-text-muted)", lineHeight: 1.5 } }, result.kind === "share" ? "Recovery-share file" : "Full recovery file", " downloaded \u2014 share set is now version ", result.version, ". Any previous recovery file no longer works.")));
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.")));
7423
7371
  }
7424
7372
  function SocialWalletModal({
7425
7373
  open,
@@ -7430,6 +7378,7 @@ function SocialWalletModal({
7430
7378
  onDisconnect,
7431
7379
  onGoogleSignIn,
7432
7380
  onKingsChatSignIn,
7381
+ onXSignIn,
7433
7382
  onEmailStart,
7434
7383
  onEmailVerify,
7435
7384
  onPhoneStart,
@@ -7448,9 +7397,11 @@ function SocialWalletModal({
7448
7397
  const [timer, setTimer] = (0, import_react3.useState)("");
7449
7398
  const [unlocking, setUnlocking] = (0, import_react3.useState)(false);
7450
7399
  const [disconnecting, setDisconnecting] = (0, import_react3.useState)(false);
7400
+ const [actionError, setActionError] = (0, import_react3.useState)("");
7451
7401
  (0, import_react3.useEffect)(() => {
7452
7402
  if (!open) return;
7453
7403
  injectTokens2(theme);
7404
+ injectModalCss();
7454
7405
  if (theme !== "auto") return;
7455
7406
  const mq = window.matchMedia("(prefers-color-scheme: dark)");
7456
7407
  const h = () => injectTokens2("auto");
@@ -7477,17 +7428,23 @@ function SocialWalletModal({
7477
7428
  if (!open) return null;
7478
7429
  async function handleUnlock() {
7479
7430
  setUnlocking(true);
7431
+ setActionError("");
7480
7432
  try {
7481
7433
  await onUnlock();
7434
+ } catch (e) {
7435
+ setActionError(e.message);
7482
7436
  } finally {
7483
7437
  setUnlocking(false);
7484
7438
  }
7485
7439
  }
7486
7440
  async function handleDisconnect() {
7487
7441
  setDisconnecting(true);
7442
+ setActionError("");
7488
7443
  try {
7489
7444
  await onDisconnect();
7490
7445
  onClose();
7446
+ } catch (e) {
7447
+ setActionError(e.message);
7491
7448
  } finally {
7492
7449
  setDisconnecting(false);
7493
7450
  }
@@ -7495,12 +7452,13 @@ function SocialWalletModal({
7495
7452
  const evmChain = chains?.find((c) => c.startsWith("evm:")) ?? "evm:11155111";
7496
7453
  const solChain = chains?.find((c) => c.startsWith("solana:")) ?? "solana:mainnet";
7497
7454
  const showSignIn = !socialAuth.addresses || socialAuth.needsReconnect;
7455
+ const unlocked = socialAuth.isUnlocked;
7498
7456
  const modal = /* @__PURE__ */ import_react3.default.createElement(
7499
7457
  "div",
7500
7458
  {
7501
7459
  role: "dialog",
7502
7460
  "aria-modal": "true",
7503
- "aria-label": "Social wallet",
7461
+ "aria-label": showSignIn ? "Log in or sign up" : "Your wallet",
7504
7462
  style: {
7505
7463
  position: "fixed",
7506
7464
  inset: 0,
@@ -7509,63 +7467,17 @@ function SocialWalletModal({
7509
7467
  alignItems: "center",
7510
7468
  justifyContent: "center",
7511
7469
  padding: 16,
7512
- fontFamily: "var(--dc-font-sans, system-ui, sans-serif)"
7470
+ fontFamily: "var(--dc-font-sans, system-ui, sans-serif)",
7471
+ WebkitFontSmoothing: "antialiased"
7513
7472
  }
7514
7473
  },
7515
- /* @__PURE__ */ import_react3.default.createElement(
7516
- "div",
7517
- {
7518
- onClick: onClose,
7519
- style: {
7520
- position: "absolute",
7521
- inset: 0,
7522
- background: "var(--dc-bg-overlay)",
7523
- backdropFilter: "blur(8px)",
7524
- WebkitBackdropFilter: "blur(8px)"
7525
- }
7526
- }
7527
- ),
7528
- /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7529
- position: "relative",
7530
- background: "var(--dc-bg)",
7531
- border: "1px solid var(--dc-border)",
7532
- borderRadius: 20,
7533
- width: "100%",
7534
- maxWidth: 380,
7535
- maxHeight: "90vh",
7536
- overflowY: "auto",
7537
- boxShadow: "0 24px 64px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04)"
7538
- } }, /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7539
- height: 2,
7540
- position: "sticky",
7541
- top: 0,
7542
- zIndex: 1,
7543
- background: "linear-gradient(90deg, transparent, var(--dc-accent) 30%, var(--dc-accent) 70%, transparent)"
7544
- } }), /* @__PURE__ */ import_react3.default.createElement("div", { style: { padding: "18px 20px 16px", display: "flex", alignItems: "center", gap: 11 } }, /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 38 }), /* @__PURE__ */ import_react3.default.createElement("div", { style: { flex: 1 } }, /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", alignItems: "baseline", gap: 6 } }, /* @__PURE__ */ import_react3.default.createElement(DecaneWordmark, { size: 15 }), /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 13, fontWeight: 700, color: "var(--dc-text-muted)", letterSpacing: "-0.01em" } }, "wallet")), /* @__PURE__ */ import_react3.default.createElement("div", { style: { fontSize: 11, color: "var(--dc-text-muted)", marginTop: 2 } }, "Non-custodial \xB7 key split three ways")), /* @__PURE__ */ import_react3.default.createElement(
7545
- "button",
7546
- {
7547
- onClick: onClose,
7548
- style: {
7549
- background: "var(--dc-surface)",
7550
- border: "1px solid var(--dc-border)",
7551
- borderRadius: 8,
7552
- width: 28,
7553
- height: 28,
7554
- cursor: "pointer",
7555
- display: "flex",
7556
- alignItems: "center",
7557
- justifyContent: "center",
7558
- color: "var(--dc-text-muted)",
7559
- flexShrink: 0,
7560
- padding: 0
7561
- }
7562
- },
7563
- /* @__PURE__ */ import_react3.default.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none" }, /* @__PURE__ */ import_react3.default.createElement("path", { d: "M1.5 1.5L10.5 10.5M10.5 1.5L1.5 10.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }))
7564
- )), showSignIn ? /* @__PURE__ */ import_react3.default.createElement(
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(
7565
7476
  SignInView,
7566
7477
  {
7567
7478
  onGoogleSignIn,
7568
7479
  onKingsChatSignIn,
7480
+ onXSignIn,
7569
7481
  onEmailStart,
7570
7482
  onEmailVerify,
7571
7483
  onPhoneStart,
@@ -7578,86 +7490,22 @@ function SocialWalletModal({
7578
7490
  passkeyAddress,
7579
7491
  onPasskeySignIn
7580
7492
  }
7581
- ) : /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7582
- margin: "0 16px 14px",
7583
- padding: "8px 14px",
7584
- background: socialAuth.isUnlocked ? "rgba(18,183,106,0.08)" : "rgba(245,200,0,0.08)",
7585
- border: `1px solid ${socialAuth.isUnlocked ? "rgba(18,183,106,0.2)" : "rgba(245,200,0,0.2)"}`,
7586
- borderRadius: 10,
7587
- display: "flex",
7588
- alignItems: "center",
7589
- justifyContent: "space-between"
7590
- } }, /* @__PURE__ */ import_react3.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: 8 } }, /* @__PURE__ */ import_react3.default.createElement("span", { style: {
7591
- width: 7,
7592
- height: 7,
7593
- borderRadius: "50%",
7594
- flexShrink: 0,
7595
- background: socialAuth.isUnlocked ? "#12b76a" : "var(--dc-accent)",
7596
- boxShadow: `0 0 6px ${socialAuth.isUnlocked ? "#12b76a" : "var(--dc-accent)"}`
7597
- } }), /* @__PURE__ */ import_react3.default.createElement("span", { style: {
7598
- fontSize: 12,
7599
- fontWeight: 700,
7600
- color: socialAuth.isUnlocked ? "#12b76a" : "var(--dc-accent)"
7601
- } }, socialAuth.isUnlocked ? "Unlocked" : "Locked")), socialAuth.isUnlocked && timer && /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 11, color: "var(--dc-text-muted)", fontFamily: "monospace" } }, "expires ", timer)), /* @__PURE__ */ import_react3.default.createElement("div", { style: { padding: "0 16px 14px" } }, socialAuth.addresses?.evm && /* @__PURE__ */ import_react3.default.createElement(AddressRow, { label: "EVM (Ethereum, Base, \u2026)", 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 })), socialAuth.isUnlocked && /* @__PURE__ */ import_react3.default.createElement(
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(
7494
+ "span",
7495
+ {
7496
+ className: "dcm-status",
7497
+ style: { color: unlocked ? "#12b76a" : "var(--dc-accent-ink)", marginTop: -8 }
7498
+ },
7499
+ /* @__PURE__ */ import_react3.default.createElement("i", { style: { background: unlocked ? "#12b76a" : "var(--dc-accent)" } }),
7500
+ 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(
7602
7502
  RecoverySection,
7603
7503
  {
7604
7504
  addresses: socialAuth.addresses,
7605
7505
  onRotateShares,
7606
7506
  onExportPortableBackup
7607
7507
  }
7608
- ), /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7609
- padding: "14px 16px",
7610
- borderTop: "1px solid var(--dc-border)",
7611
- display: "flex",
7612
- gap: 8
7613
- } }, !socialAuth.isUnlocked && /* @__PURE__ */ import_react3.default.createElement(
7614
- "button",
7615
- {
7616
- onClick: handleUnlock,
7617
- disabled: unlocking,
7618
- style: {
7619
- flex: 1,
7620
- padding: "10px 0",
7621
- background: "var(--dc-accent)",
7622
- color: "var(--dc-accent-text)",
7623
- border: "none",
7624
- borderRadius: 10,
7625
- fontSize: 13,
7626
- fontWeight: 700,
7627
- cursor: unlocking ? "not-allowed" : "pointer",
7628
- fontFamily: "inherit",
7629
- opacity: unlocking ? 0.7 : 1
7630
- }
7631
- },
7632
- unlocking ? "Unlocking\u2026" : "\u{1F513} Unlock wallet"
7633
- ), /* @__PURE__ */ import_react3.default.createElement(
7634
- "button",
7635
- {
7636
- onClick: handleDisconnect,
7637
- disabled: disconnecting,
7638
- style: {
7639
- flex: socialAuth.isUnlocked ? 1 : 0,
7640
- padding: "10px 16px",
7641
- background: "transparent",
7642
- border: "1px solid var(--dc-border)",
7643
- borderRadius: 10,
7644
- color: "var(--dc-text-muted)",
7645
- fontSize: 13,
7646
- cursor: disconnecting ? "not-allowed" : "pointer",
7647
- fontFamily: "inherit",
7648
- opacity: disconnecting ? 0.7 : 1,
7649
- whiteSpace: "nowrap"
7650
- }
7651
- },
7652
- disconnecting ? "Signing out\u2026" : "Sign out"
7653
- ))), /* @__PURE__ */ import_react3.default.createElement("div", { style: {
7654
- padding: "11px 16px",
7655
- borderTop: "1px solid var(--dc-border)",
7656
- display: "flex",
7657
- alignItems: "center",
7658
- justifyContent: "center",
7659
- gap: 6
7660
- } }, /* @__PURE__ */ import_react3.default.createElement("span", { style: { fontSize: 10.5, color: "var(--dc-text-muted)", letterSpacing: "0.02em" } }, "Secured by"), /* @__PURE__ */ import_react3.default.createElement(DecaneMark, { size: 13, muted: true }), /* @__PURE__ */ import_react3.default.createElement(DecaneWordmark, { size: 11, muted: true })))
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)))
7661
7509
  );
7662
7510
  return (0, import_react_dom2.createPortal)(modal, document.body);
7663
7511
  }