@swype-org/react-sdk 0.2.297 → 0.2.303

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
@@ -65,6 +65,7 @@ var darkTheme = {
65
65
  accent: "#B2FF93",
66
66
  accentHover: "#8FD974",
67
67
  accentText: "#1B4332",
68
+ highlight: "#B2FF93",
68
69
  success: "#0f9d73",
69
70
  successBg: "#0f2f2a",
70
71
  error: "#d46a72",
@@ -96,6 +97,7 @@ var lightTheme = {
96
97
  accent: "#B2FF93",
97
98
  accentHover: "#8FD974",
98
99
  accentText: "#1B4332",
100
+ highlight: "#B2FF93",
99
101
  success: "#0f9d73",
100
102
  successBg: "#e6f7f1",
101
103
  error: "#ce6670",
@@ -137,6 +139,8 @@ var lightThemeNew = {
137
139
  accent: "#000000",
138
140
  accentHover: "#1a1a1a",
139
141
  accentText: "#fafafa",
142
+ // Figma `accent` token (#eaff03) — the lime "0% FEES" chip.
143
+ highlight: "#eaff03",
140
144
  success: "#0f9d73",
141
145
  successBg: "#e6f7f1",
142
146
  error: "#ce6670",
@@ -8417,12 +8421,32 @@ function PrimaryButton({
8417
8421
  icon,
8418
8422
  progress,
8419
8423
  progressText,
8420
- progressPaused
8424
+ progressPaused,
8425
+ spinnerOnly
8421
8426
  }) {
8422
8427
  const { tokens } = useBlinkConfig();
8423
8428
  const inProgress = progress != null;
8424
8429
  const isDisabled = disabled || loading || inProgress;
8425
8430
  const done = inProgress && progress >= 1;
8431
+ if (spinnerOnly) {
8432
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8433
+ "button",
8434
+ {
8435
+ type: "button",
8436
+ disabled: true,
8437
+ "aria-label": "Please wait",
8438
+ style: buttonStyle2(tokens, { disabled: false, loading: true }),
8439
+ children: [
8440
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, style: inlineSpinnerStyle(tokens.accentText) }),
8441
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
8442
+ @keyframes blink-spin {
8443
+ to { transform: rotate(360deg); }
8444
+ }
8445
+ ` })
8446
+ ]
8447
+ }
8448
+ );
8449
+ }
8426
8450
  if (inProgress) {
8427
8451
  return /* @__PURE__ */ jsxRuntime.jsxs(
8428
8452
  "button",
@@ -8549,6 +8573,15 @@ var buttonStyle2 = (tokens, state) => {
8549
8573
  gap: 8
8550
8574
  };
8551
8575
  };
8576
+ var inlineSpinnerStyle = (color) => ({
8577
+ width: 20,
8578
+ height: 20,
8579
+ border: `2px solid ${color}44`,
8580
+ borderTopColor: color,
8581
+ borderRadius: "50%",
8582
+ animation: "blink-spin 0.9s linear infinite",
8583
+ flexShrink: 0
8584
+ });
8552
8585
  var iconWrapStyle = {
8553
8586
  display: "flex",
8554
8587
  alignItems: "center"
@@ -10665,269 +10698,288 @@ var avatarStyle = (tokens) => ({
10665
10698
  color: tokens.textMuted,
10666
10699
  background: "transparent"
10667
10700
  });
10668
- var LINK_ICON_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAXCAYAAACS5bYWAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAK6ADAAQAAAABAAAAFwAAAAAKDRJ/AAADIUlEQVRIDaWXMWsVQRSFX9SABgQjRFAhRV4hPAsFLQKmVDsLhaTU0p/gb7CztfAPaJnSlBYWpgiooJIIEZMiRQoLhVh4vnXP8+6+ebsz8cB5M7t37p07996ZnTcz6MZQ4pG4JJ4XT4tt/NKLPXFHfCceijl4rEHYtT42PorbYhIzybeDAU7eFjFWik0pvBa7nMYuzqbAotdFnG/gZOPp78M9NffF+YQs59UlDboh/hZ3pygQzWvimYSceZdFAonjY7QjuyYJExkYJbUosdJUtCgNMnFVjLp6HGyIRLkL6LPAm2Jbnyy9FCvEyJL2lfo9DQ6+ELfEAxHHUyCCyD+IGMdpR8w1OS3CGlplgCBYn72xgEBgEXPiJx7sLKsi/QYRYUXTHPS4dst4HL4inq2Fi2pZcI4txjAWkC2A/lfx0M4+1IOjwWTr4nFBpJnQNTmrPhHCbi7I6mXREZ5Xf/OEfkgVD4B09NVYNbDn56fk41pTnzkcqR7VsThmttLHWUrAYEWpTWR5SYst6tBgwhKwYDa3McJZUmSUpMo6Xe2bIGTjlSIudoizF4OF76Gf2+UUeSreSSjsh3fnQj+329DH2YicHRvH07eTON0GqTS8gf2c0zb0cTY6mPr29xnt0/eG5TgsRWOBOBs3FMdFKfr0cfKJaKdL7McS3cfZeMsZlViqx74POqlSCOLibjyp9nA27ji+zaWlwBFlLKlTep5at91y9mPPqD4KTOYJqREuMyWI+uitiqULTs3Hxo0fq21/bqk7h/yC+hPXs5S18A6H0T8lsmDuBlsin97jgHJaCYqv1D+IzjLJYj2A8POx2BXjbq/FEw1jjkScBFxirouUWI6+hlUgko9EB46XbNC3dOws/c8i1zN/0Ygwq+Md+CF2RepbNepfzbJ49LGH3qyIjTZwcCguiw/EBdFoXKral28GkQIf9FaKLSXzTJwWsVuS3RX/t243ZKNx3MXISlaB+mNFRMQFXgnqHyL2RYzna5QTYeqVcc5SlPf1mZ8b18Q9JRXZaIzJOM5oIdHC2HMxByyWCwy0fluPDPGXCVLj2E/iD2Rfl2nM3a3EAAAAAElFTkSuQmCC";
10701
+
10702
+ // src/deviceBiometricUnlockText.ts
10703
+ var FALLBACK = "Biometric verification";
10704
+ function getDeviceBiometricUnlockText() {
10705
+ const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10706
+ if (/iPhone|iPad|iPod/i.test(ua)) {
10707
+ return "Face ID";
10708
+ }
10709
+ if (/Android/i.test(ua)) {
10710
+ return "Fingerprint or face unlock";
10711
+ }
10712
+ if (/Windows NT/i.test(ua)) {
10713
+ return "Windows Hello";
10714
+ }
10715
+ if (/Macintosh|Mac OS X/i.test(ua)) {
10716
+ return "Touch ID";
10717
+ }
10718
+ return FALLBACK;
10719
+ }
10720
+ var CLUSTER_LOGOS = [
10721
+ METAMASK_LOGO,
10722
+ PHANTOM_LOGO,
10723
+ RABBY_LOGO,
10724
+ OKX_WALLET_LOGO,
10725
+ TRUST_WALLET_LOGO,
10726
+ BASE_LOGO
10727
+ ];
10669
10728
  function DepositOptionsScreen({
10670
- onFromWallet,
10671
10729
  onToAddress,
10672
10730
  onSignInWithBlink,
10673
10731
  onClose
10674
10732
  }) {
10675
10733
  const { tokens } = useBlinkConfig();
10676
- const headerRight = onClose ? /* @__PURE__ */ jsxRuntime.jsx(
10677
- "button",
10678
- {
10679
- type: "button",
10680
- onClick: onClose,
10681
- "aria-label": "Close",
10682
- style: closeButtonStyle2(tokens),
10683
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
10684
- "path",
10734
+ const depositLabel = `Deposit with ${getDeviceBiometricUnlockText()}`;
10735
+ return /* @__PURE__ */ jsxRuntime.jsx(ScreenLayout, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: sheetStyle, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle2, children: [
10736
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: headerRowStyle, children: [
10737
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle }),
10738
+ onClose ? /* @__PURE__ */ jsxRuntime.jsx(
10739
+ "button",
10685
10740
  {
10686
- d: "M6 6l12 12M18 6L6 18",
10687
- stroke: "currentColor",
10688
- strokeWidth: "2",
10689
- strokeLinecap: "round",
10690
- strokeLinejoin: "round"
10741
+ type: "button",
10742
+ onClick: onClose,
10743
+ "aria-label": "Close",
10744
+ style: closeButtonStyle2(tokens.bgRecessed, tokens.text),
10745
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
10746
+ "path",
10747
+ {
10748
+ d: "M6 6l12 12M18 6L6 18",
10749
+ stroke: "currentColor",
10750
+ strokeWidth: "2",
10751
+ strokeLinecap: "round",
10752
+ strokeLinejoin: "round"
10753
+ }
10754
+ ) })
10691
10755
  }
10692
- ) })
10693
- }
10694
- ) : void 0;
10695
- return /* @__PURE__ */ jsxRuntime.jsxs(
10696
- ScreenLayout,
10697
- {
10698
- footer: /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onSignInWithBlink, icon: /* @__PURE__ */ jsxRuntime.jsx(FaceIdIcon2, {}), children: "Sign in with Blink" }),
10699
- children: [
10700
- /* @__PURE__ */ jsxRuntime.jsx(
10701
- ScreenHeader,
10756
+ ) : null
10757
+ ] }),
10758
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_PASSKEY_ILLUSTRATION, alt: "", "aria-hidden": "true", style: heroStyle }),
10759
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: stackStyle, children: [
10760
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: depositPillWrapperStyle, children: [
10761
+ /* @__PURE__ */ jsxRuntime.jsxs(
10762
+ "button",
10702
10763
  {
10703
- title: "Deposit",
10704
- right: headerRight,
10705
- left: /* @__PURE__ */ jsxRuntime.jsx(
10706
- "img",
10707
- {
10708
- src: BLINK_WORDMARK,
10709
- alt: "Blink",
10710
- style: wordmarkStyle
10711
- }
10712
- )
10764
+ type: "button",
10765
+ onClick: onSignInWithBlink,
10766
+ style: depositPillStyle(tokens.accent),
10767
+ children: [
10768
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10769
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsxRuntime.jsx(
10770
+ "span",
10771
+ {
10772
+ style: clusterChipStyle(tokens.bgInput, i === CLUSTER_LOGOS.length - 1),
10773
+ children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: logo, alt: "", "aria-hidden": "true", style: clusterIconStyle })
10774
+ },
10775
+ logo
10776
+ )) })
10777
+ ]
10713
10778
  }
10714
10779
  ),
10715
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle2, children: [
10716
- /* @__PURE__ */ jsxRuntime.jsx(DepositTypeToggle, { tokens }),
10717
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle(tokens.bgCardTranslucent), children: [
10718
- /* @__PURE__ */ jsxRuntime.jsx(
10719
- SourceRow,
10720
- {
10721
- name: "Connect Wallet",
10722
- icon: /* @__PURE__ */ jsxRuntime.jsx(WalletIcon, { color: tokens.text }),
10723
- onClick: onFromWallet,
10724
- right: /* @__PURE__ */ jsxRuntime.jsx("span", { style: badgeWithArrowStyle, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 6l6 6-6 6", stroke: tokens.textMuted, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
10725
- }
10726
- ),
10727
- /* @__PURE__ */ jsxRuntime.jsx(
10728
- SourceRow,
10729
- {
10730
- name: "Address",
10731
- icon: /* @__PURE__ */ jsxRuntime.jsx(AddressIcon, { color: tokens.text }),
10732
- onClick: onToAddress
10733
- }
10734
- ),
10735
- /* @__PURE__ */ jsxRuntime.jsx(
10736
- SourceRow,
10737
- {
10738
- name: "Exchange",
10739
- icon: /* @__PURE__ */ jsxRuntime.jsx(LinkIcon, { color: tokens.textTertiary }),
10740
- disabled: true,
10741
- disabledColor: tokens.textTertiary,
10742
- right: /* @__PURE__ */ jsxRuntime.jsx(ComingSoonBadge, { tokens })
10743
- }
10744
- )
10745
- ] })
10746
- ] })
10747
- ]
10748
- }
10749
- );
10750
- }
10751
- function DepositTypeToggle({ tokens }) {
10752
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
10753
- }
10754
- function ComingSoonBadge({ tokens }) {
10755
- return /* @__PURE__ */ jsxRuntime.jsx("span", { style: comingSoonBadgeStyle(tokens.bgRecessed, tokens.textMuted), children: "Coming soon" });
10756
- }
10757
- function WalletIcon({ color }) {
10758
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10759
- /* @__PURE__ */ jsxRuntime.jsx(
10760
- "path",
10761
- {
10762
- d: "M3 9.5a3 3 0 013-3h12a3 3 0 013 3v8a3 3 0 01-3 3H6a3 3 0 01-3-3v-8z",
10763
- stroke: color,
10764
- strokeWidth: "1.6"
10765
- }
10766
- ),
10767
- /* @__PURE__ */ jsxRuntime.jsx(
10768
- "path",
10769
- {
10770
- d: "M16 4.5l-9 2",
10771
- stroke: color,
10772
- strokeWidth: "1.6",
10773
- strokeLinecap: "round"
10774
- }
10775
- ),
10776
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "17.25", cy: "13.5", r: "1.1", fill: color })
10777
- ] });
10778
- }
10779
- function AddressIcon({ color }) {
10780
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10781
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10782
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
10783
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10784
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
10785
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10786
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
10787
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10788
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10789
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
10790
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
10791
- ] });
10780
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: feesBadgeStyle(tokens.highlight, tokens.text), children: "0% FEES" })
10781
+ ] }),
10782
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: dividerRowStyle, children: [
10783
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerRuleStyle(tokens.textTertiary) }),
10784
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerLabelStyle(tokens.textTertiary), children: "OR" }),
10785
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerRuleStyle(tokens.textTertiary) })
10786
+ ] }),
10787
+ /* @__PURE__ */ jsxRuntime.jsxs(
10788
+ "button",
10789
+ {
10790
+ type: "button",
10791
+ onClick: onToAddress,
10792
+ style: manualRowStyle(tokens.bgCardTranslucent),
10793
+ children: [
10794
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: manualLabelStyle(tokens.text), children: "Send Crypto Manually" }),
10795
+ /* @__PURE__ */ jsxRuntime.jsx(QrIcon, { color: tokens.text })
10796
+ ]
10797
+ }
10798
+ )
10799
+ ] })
10800
+ ] }) }) });
10792
10801
  }
10793
- function LinkIcon({ color }) {
10794
- return /* @__PURE__ */ jsxRuntime.jsx(
10795
- "img",
10802
+ function QrIcon({ color }) {
10803
+ return /* @__PURE__ */ jsxRuntime.jsxs(
10804
+ "svg",
10796
10805
  {
10797
- src: LINK_ICON_DATA_URI,
10798
- alt: "",
10806
+ width: "24",
10807
+ height: "24",
10808
+ viewBox: "0 0 24 24",
10809
+ fill: "none",
10799
10810
  "aria-hidden": "true",
10800
- style: linkIconImageStyle(color)
10811
+ style: { flexShrink: 0 },
10812
+ children: [
10813
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10814
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
10815
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10816
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
10817
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
10818
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
10819
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10820
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
10821
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
10822
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
10823
+ ]
10801
10824
  }
10802
10825
  );
10803
10826
  }
10804
- function FaceIdIcon2() {
10805
- return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
10806
- /* @__PURE__ */ jsxRuntime.jsx(
10807
- "path",
10808
- {
10809
- d: "M3 8V6a3 3 0 013-3h2",
10810
- stroke: "currentColor",
10811
- strokeWidth: "1.6",
10812
- strokeLinecap: "round"
10813
- }
10814
- ),
10815
- /* @__PURE__ */ jsxRuntime.jsx(
10816
- "path",
10817
- {
10818
- d: "M16 3h2a3 3 0 013 3v2",
10819
- stroke: "currentColor",
10820
- strokeWidth: "1.6",
10821
- strokeLinecap: "round"
10822
- }
10823
- ),
10824
- /* @__PURE__ */ jsxRuntime.jsx(
10825
- "path",
10826
- {
10827
- d: "M21 16v2a3 3 0 01-3 3h-2",
10828
- stroke: "currentColor",
10829
- strokeWidth: "1.6",
10830
- strokeLinecap: "round"
10831
- }
10832
- ),
10833
- /* @__PURE__ */ jsxRuntime.jsx(
10834
- "path",
10835
- {
10836
- d: "M8 21H6a3 3 0 01-3-3v-2",
10837
- stroke: "currentColor",
10838
- strokeWidth: "1.6",
10839
- strokeLinecap: "round"
10840
- }
10841
- ),
10842
- /* @__PURE__ */ jsxRuntime.jsx(
10843
- "path",
10844
- {
10845
- d: "M9 10v1.5",
10846
- stroke: "currentColor",
10847
- strokeWidth: "1.6",
10848
- strokeLinecap: "round"
10849
- }
10850
- ),
10851
- /* @__PURE__ */ jsxRuntime.jsx(
10852
- "path",
10853
- {
10854
- d: "M15 10v1.5",
10855
- stroke: "currentColor",
10856
- strokeWidth: "1.6",
10857
- strokeLinecap: "round"
10858
- }
10859
- ),
10860
- /* @__PURE__ */ jsxRuntime.jsx(
10861
- "path",
10862
- {
10863
- d: "M12 10v3.5",
10864
- stroke: "currentColor",
10865
- strokeWidth: "1.6",
10866
- strokeLinecap: "round"
10867
- }
10868
- ),
10869
- /* @__PURE__ */ jsxRuntime.jsx(
10870
- "path",
10871
- {
10872
- d: "M9.5 16.25c.7.6 1.55.95 2.5.95s1.8-.35 2.5-.95",
10873
- stroke: "currentColor",
10874
- strokeWidth: "1.6",
10875
- strokeLinecap: "round"
10876
- }
10877
- )
10878
- ] });
10879
- }
10880
- var wordmarkStyle = {
10881
- height: 20,
10827
+ var sheetStyle = {
10828
+ position: "relative",
10829
+ minHeight: "100%",
10830
+ display: "flex",
10831
+ flexDirection: "column",
10832
+ boxSizing: "border-box"
10833
+ };
10834
+ var contentStyle2 = {
10835
+ display: "flex",
10836
+ flexDirection: "column",
10837
+ alignItems: "center",
10838
+ gap: 32,
10839
+ padding: "32px 8px"
10840
+ };
10841
+ var headerRowStyle = {
10842
+ display: "flex",
10843
+ alignItems: "center",
10844
+ justifyContent: "space-between",
10845
+ width: "100%",
10846
+ minHeight: 44
10847
+ };
10848
+ var wordmarkImgStyle = {
10849
+ height: 31,
10882
10850
  width: "auto",
10851
+ display: "block"
10852
+ };
10853
+ var heroStyle = {
10854
+ width: 253,
10855
+ height: 253,
10856
+ maxWidth: "100%",
10883
10857
  objectFit: "contain",
10884
10858
  display: "block"
10885
10859
  };
10886
- var contentStyle2 = {
10860
+ var stackStyle = {
10887
10861
  display: "flex",
10888
10862
  flexDirection: "column",
10889
- gap: 24,
10890
- paddingTop: 24
10863
+ gap: 16,
10864
+ width: "100%"
10891
10865
  };
10892
- var cardStyle = (bg) => ({
10866
+ var depositPillWrapperStyle = {
10867
+ position: "relative",
10868
+ width: "100%",
10869
+ height: 71
10870
+ };
10871
+ var depositPillStyle = (bg) => ({
10893
10872
  display: "flex",
10894
- flexDirection: "column",
10873
+ alignItems: "center",
10874
+ justifyContent: "space-between",
10875
+ width: "100%",
10876
+ height: 56,
10877
+ padding: "12px 12px 12px 24px",
10895
10878
  background: bg,
10879
+ border: "none",
10896
10880
  borderRadius: 28,
10897
- padding: "8px 8px 8px 20px"
10881
+ cursor: "pointer",
10882
+ boxSizing: "border-box",
10883
+ fontFamily: "inherit"
10884
+ });
10885
+ var depositPillLabelStyle = (color) => ({
10886
+ color,
10887
+ fontSize: 16,
10888
+ fontWeight: 500,
10889
+ whiteSpace: "nowrap"
10898
10890
  });
10899
- var comingSoonBadgeStyle = (bg, color) => ({
10891
+ var clusterStyle = {
10892
+ display: "inline-flex",
10893
+ alignItems: "center",
10894
+ isolation: "isolate"
10895
+ };
10896
+ var clusterChipStyle = (bg, last) => ({
10897
+ width: 32,
10898
+ height: 32,
10899
+ borderRadius: "50%",
10900
+ background: bg,
10901
+ display: "inline-flex",
10902
+ alignItems: "center",
10903
+ justifyContent: "center",
10904
+ marginRight: last ? 0 : -12,
10905
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
10906
+ flexShrink: 0
10907
+ });
10908
+ var clusterIconStyle = {
10909
+ width: 24,
10910
+ height: 24,
10911
+ borderRadius: "50%",
10912
+ objectFit: "cover",
10913
+ display: "block"
10914
+ };
10915
+ var feesBadgeStyle = (bg, color) => ({
10916
+ position: "absolute",
10917
+ left: 131,
10918
+ top: 45,
10900
10919
  display: "inline-flex",
10901
10920
  alignItems: "center",
10902
10921
  justifyContent: "center",
10903
10922
  background: bg,
10904
10923
  color,
10905
- fontSize: 10,
10924
+ fontSize: 12,
10906
10925
  fontWeight: 500,
10907
10926
  lineHeight: 1,
10908
10927
  padding: "4px 8px",
10909
- borderRadius: 8,
10910
- marginRight: 8,
10911
- whiteSpace: "nowrap"
10928
+ borderRadius: 6,
10929
+ whiteSpace: "nowrap",
10930
+ transform: "rotate(-6.75deg)",
10931
+ boxShadow: "0 2px 4px rgba(0, 0, 0, 0.16)",
10932
+ pointerEvents: "none"
10912
10933
  });
10913
- var badgeWithArrowStyle = {
10934
+ var dividerRowStyle = {
10914
10935
  display: "flex",
10915
- alignItems: "center"
10936
+ alignItems: "center",
10937
+ justifyContent: "center",
10938
+ gap: 10,
10939
+ padding: "0 16px",
10940
+ width: "100%",
10941
+ boxSizing: "border-box"
10916
10942
  };
10917
- var linkIconImageStyle = (color) => ({
10918
- width: 24,
10919
- height: 24,
10920
- objectFit: "contain",
10921
- display: "block",
10922
- opacity: color.includes("rgba") ? 0.3 : 1
10943
+ var dividerRuleStyle = (color) => ({
10944
+ flex: 1,
10945
+ height: 1,
10946
+ background: color
10923
10947
  });
10924
- var closeButtonStyle2 = (tokens) => ({
10925
- width: 40,
10926
- height: 40,
10948
+ var dividerLabelStyle = (color) => ({
10949
+ color,
10950
+ fontSize: 12,
10951
+ fontWeight: 500,
10952
+ whiteSpace: "nowrap"
10953
+ });
10954
+ var manualRowStyle = (bg) => ({
10955
+ display: "flex",
10956
+ alignItems: "center",
10957
+ gap: 8,
10958
+ width: "100%",
10959
+ height: 56,
10960
+ padding: "12px 24px",
10961
+ background: bg,
10962
+ border: "none",
10963
+ borderRadius: 28,
10964
+ cursor: "pointer",
10965
+ boxSizing: "border-box",
10966
+ fontFamily: "inherit"
10967
+ });
10968
+ var manualLabelStyle = (color) => ({
10969
+ flex: 1,
10970
+ minWidth: 0,
10971
+ color,
10972
+ fontSize: 16,
10973
+ fontWeight: 400
10974
+ });
10975
+ var closeButtonStyle2 = (bg, color) => ({
10976
+ flexShrink: 0,
10977
+ width: 44,
10978
+ height: 44,
10927
10979
  borderRadius: "50%",
10928
10980
  border: "none",
10929
- background: tokens.bgRecessed,
10930
- color: tokens.text,
10981
+ background: bg,
10982
+ color,
10931
10983
  display: "flex",
10932
10984
  alignItems: "center",
10933
10985
  justifyContent: "center",
@@ -11283,7 +11335,7 @@ function PasskeyPopupWelcomeScreen({
11283
11335
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle6, children: [
11284
11336
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockupStyle, children: [
11285
11337
  /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11286
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordmarkStyle2(tokens.text), children: "Blink" })
11338
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
11287
11339
  ] }),
11288
11340
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: illustrationFrameStyle, children: /* @__PURE__ */ jsxRuntime.jsx(
11289
11341
  "img",
@@ -11340,7 +11392,7 @@ var lockupMarkStyle = {
11340
11392
  height: 24,
11341
11393
  display: "block"
11342
11394
  };
11343
- var wordmarkStyle2 = (color) => ({
11395
+ var wordmarkStyle = (color) => ({
11344
11396
  fontSize: "1.45rem",
11345
11397
  fontWeight: 500,
11346
11398
  letterSpacing: "-0.03em",
@@ -11789,7 +11841,7 @@ function WalletPickerScreen({
11789
11841
  ),
11790
11842
  /* @__PURE__ */ jsxRuntime.jsx("h1", { style: titleStyle3(tokens.text), children: "Link wallet" }),
11791
11843
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle5(tokens), children: error }),
11792
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: sheetStackStyle, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: cardStyle2(tokens.bgCardTranslucent), children: showOtherWallets ? /* @__PURE__ */ jsxRuntime.jsx(
11844
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: sheetStackStyle, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: cardStyle(tokens.bgCardTranslucent), children: showOtherWallets ? /* @__PURE__ */ jsxRuntime.jsx(
11793
11845
  OtherWalletsPanel,
11794
11846
  {
11795
11847
  wallets: filteredReownWallets,
@@ -12012,7 +12064,7 @@ var sheetStackStyle = {
12012
12064
  flexDirection: "column",
12013
12065
  gap: 16
12014
12066
  };
12015
- var cardStyle2 = (bg) => ({
12067
+ var cardStyle = (bg) => ({
12016
12068
  display: "flex",
12017
12069
  flexDirection: "column",
12018
12070
  background: bg,
@@ -12165,7 +12217,7 @@ function LinkTokensScreen({
12165
12217
  {
12166
12218
  onBack,
12167
12219
  onLogout,
12168
- center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle })
12220
+ center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 })
12169
12221
  }
12170
12222
  ),
12171
12223
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle9, children: [
@@ -12231,7 +12283,7 @@ var contentStyle9 = {
12231
12283
  minHeight: 0,
12232
12284
  width: "100%"
12233
12285
  };
12234
- var wordmarkImgStyle = {
12286
+ var wordmarkImgStyle2 = {
12235
12287
  height: 22,
12236
12288
  width: "auto",
12237
12289
  display: "block",
@@ -12555,7 +12607,7 @@ function SelectDepositSourceScreen({
12555
12607
  label: "Send manually",
12556
12608
  color: tokens.text,
12557
12609
  onClick: onSendManually,
12558
- icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon, { color: tokens.text })
12610
+ icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon2, { color: tokens.text })
12559
12611
  }
12560
12612
  ),
12561
12613
  onAddProvider && /* @__PURE__ */ jsxRuntime.jsx(
@@ -12564,7 +12616,7 @@ function SelectDepositSourceScreen({
12564
12616
  label: "Link Wallet",
12565
12617
  color: tokens.text,
12566
12618
  onClick: onAddProvider,
12567
- icon: /* @__PURE__ */ jsxRuntime.jsx(WalletIcon2, {})
12619
+ icon: /* @__PURE__ */ jsxRuntime.jsx(WalletIcon, {})
12568
12620
  }
12569
12621
  )
12570
12622
  ] })
@@ -12649,12 +12701,23 @@ function ActionRow({
12649
12701
  onClick,
12650
12702
  icon
12651
12703
  }) {
12652
- return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick, style: actionRowStyle(color), children: [
12653
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: actionIconSlotStyle, children: icon }),
12654
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: actionLabelStyle, children: label })
12655
- ] });
12704
+ const [hovered, setHovered] = react.useState(false);
12705
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12706
+ "button",
12707
+ {
12708
+ type: "button",
12709
+ onClick,
12710
+ onMouseEnter: () => setHovered(true),
12711
+ onMouseLeave: () => setHovered(false),
12712
+ style: actionRowStyle(color, hovered),
12713
+ children: [
12714
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: actionIconSlotStyle, children: icon }),
12715
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: actionLabelStyle, children: label })
12716
+ ]
12717
+ }
12718
+ );
12656
12719
  }
12657
- function QrIcon({ color }) {
12720
+ function QrIcon2({ color }) {
12658
12721
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12659
12722
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12660
12723
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -12668,7 +12731,7 @@ function QrIcon({ color }) {
12668
12731
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
12669
12732
  ] });
12670
12733
  }
12671
- function WalletIcon2() {
12734
+ function WalletIcon() {
12672
12735
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12673
12736
  /* @__PURE__ */ jsxRuntime.jsx(
12674
12737
  "path",
@@ -12686,13 +12749,13 @@ function WalletIcon2() {
12686
12749
  )
12687
12750
  ] });
12688
12751
  }
12689
- var actionRowStyle = (color) => ({
12752
+ var actionRowStyle = (color, hovered) => ({
12690
12753
  display: "flex",
12691
12754
  alignItems: "center",
12692
12755
  gap: 8,
12693
12756
  width: "100%",
12694
12757
  padding: 4,
12695
- background: "transparent",
12758
+ background: hovered ? "rgba(255,255,255,0.24)" : "transparent",
12696
12759
  border: "none",
12697
12760
  borderRadius: 56,
12698
12761
  color,
@@ -12700,6 +12763,7 @@ var actionRowStyle = (color) => ({
12700
12763
  fontFamily: "inherit",
12701
12764
  textAlign: "left",
12702
12765
  outline: "none",
12766
+ transition: "background 0.15s ease",
12703
12767
  boxSizing: "border-box"
12704
12768
  });
12705
12769
  var actionIconSlotStyle = {
@@ -12874,7 +12938,7 @@ function DepositScreen({
12874
12938
  onClick: () => onDeposit(amount),
12875
12939
  disabled: !canDeposit,
12876
12940
  loading: processing,
12877
- icon: /* @__PURE__ */ jsxRuntime.jsx(FaceIdIcon3, {}),
12941
+ icon: /* @__PURE__ */ jsxRuntime.jsx(FaceIdIcon2, {}),
12878
12942
  children: "Deposit"
12879
12943
  }
12880
12944
  );
@@ -13022,7 +13086,7 @@ function DepositScreen({
13022
13086
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: redesignNoFeesStyle(tokens.text), children: "No fees" }) }),
13023
13087
  showHeroPresets && presetsRow
13024
13088
  ] }),
13025
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: bannerSlotStyle2, children: showLowFunds ? /* @__PURE__ */ jsxRuntime.jsx(
13089
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: bannerSlotStyle2, children: mobileEntryWithKeypad ? null : showLowFunds ? /* @__PURE__ */ jsxRuntime.jsx(
13026
13090
  NotificationBanner,
13027
13091
  {
13028
13092
  variant: "negative",
@@ -13044,7 +13108,7 @@ function DepositScreen({
13044
13108
  ) : error ? /* @__PURE__ */ jsxRuntime.jsx(NotificationBanner, { title: "Something went wrong", description: error }) : null })
13045
13109
  ] });
13046
13110
  }
13047
- function FaceIdIcon3() {
13111
+ function FaceIdIcon2() {
13048
13112
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
13049
13113
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 8V6a3 3 0 013-3h2", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }),
13050
13114
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 3h2a3 3 0 013 3v2", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }),
@@ -14784,30 +14848,102 @@ var closeButtonStyle5 = (bg, color) => ({
14784
14848
  padding: 0
14785
14849
  });
14786
14850
  var DELAYED_RETRY_VISIBLE_MS = 2e4;
14851
+ var SPIN_KEYFRAMES_CSS2 = `
14852
+ @keyframes blink-approving-spin {
14853
+ to { transform: rotate(360deg); }
14854
+ }`;
14787
14855
  function ApprovingInWalletScreen({
14788
14856
  tokenSymbol,
14789
14857
  chainName,
14790
14858
  step,
14791
14859
  error,
14792
- onRetry
14860
+ onRetry,
14861
+ onBack,
14862
+ onLogout
14793
14863
  }) {
14794
- const { tokens } = useBlinkConfig();
14864
+ const { tokens: t } = useBlinkConfig();
14795
14865
  const showDelayedRetry = useDelayedRetry(error == null && onRetry != null);
14796
14866
  const retryVisible = onRetry != null && (error != null || showDelayedRetry);
14797
- return /* @__PURE__ */ jsxRuntime.jsx(
14867
+ const token = tokenSymbol ?? "token";
14868
+ const steps = buildSteps(step, tokenSymbol, chainName);
14869
+ return /* @__PURE__ */ jsxRuntime.jsxs(
14798
14870
  ScreenLayout,
14799
14871
  {
14800
- footer: retryVisible ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14801
- error && /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14802
- /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetry, children: "Retry" })
14803
- ] }) : void 0,
14804
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle15, children: [
14805
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockupStyle2, children: [
14806
- /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle2 }),
14807
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordmarkStyle3(tokens.text), children: "Blink" })
14872
+ scrollableBody: false,
14873
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14874
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockBannerStyle2, children: [
14875
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsxRuntime.jsx(LockIcon3, {}) }),
14876
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
14808
14877
  ] }),
14809
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: stepsFrameStyle, children: /* @__PURE__ */ jsxRuntime.jsx(StepList, { steps: buildSteps(step, tokenSymbol, chainName), activeIndicator: "spinner", size: "lg" }) })
14810
- ] })
14878
+ retryVisible ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: retryStackStyle, children: [
14879
+ error && /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14880
+ /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetry, children: "Retry" })
14881
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { spinnerOnly: true })
14882
+ ] }),
14883
+ children: [
14884
+ /* @__PURE__ */ jsxRuntime.jsx(
14885
+ ScreenHeader,
14886
+ {
14887
+ onBack,
14888
+ onLogout,
14889
+ center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
14890
+ }
14891
+ ),
14892
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle15, children: [
14893
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle13(t.text), children: `Authorizing ${token} for passkey deposits` }),
14894
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14895
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14896
+ steps.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(ChecklistRow, { step: s }, i))
14897
+ ] })
14898
+ ] })
14899
+ ]
14900
+ }
14901
+ );
14902
+ }
14903
+ function ChecklistRow({ step }) {
14904
+ const { tokens: t } = useBlinkConfig();
14905
+ const isComplete = step.status === "complete";
14906
+ const isActive = step.status === "active";
14907
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: rowStyle6, children: [
14908
+ isComplete ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: completeBadgeStyle(t.accent), children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
14909
+ "path",
14910
+ {
14911
+ d: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z",
14912
+ fill: t.accentText
14913
+ }
14914
+ ) }) }) : isActive ? /* @__PURE__ */ jsxRuntime.jsx(RowSpinner, { color: t.accent }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: pendingBadgeStyle(t.bgRecessed) }),
14915
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: labelStyle7(isComplete || isActive ? t.text : t.textMuted), children: step.label })
14916
+ ] });
14917
+ }
14918
+ function RowSpinner({ color }) {
14919
+ const size = 24;
14920
+ const stroke = 2;
14921
+ const r = (size - stroke) / 2;
14922
+ const c = size / 2;
14923
+ const circumference = 2 * Math.PI * r;
14924
+ return /* @__PURE__ */ jsxRuntime.jsx(
14925
+ "div",
14926
+ {
14927
+ role: "status",
14928
+ "aria-label": "Loading",
14929
+ style: {
14930
+ width: size,
14931
+ height: size,
14932
+ flexShrink: 0,
14933
+ animation: "blink-approving-spin 0.9s linear infinite"
14934
+ },
14935
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
14936
+ "circle",
14937
+ {
14938
+ cx: c,
14939
+ cy: c,
14940
+ r,
14941
+ stroke: color,
14942
+ strokeWidth: stroke,
14943
+ strokeLinecap: "round",
14944
+ strokeDasharray: `${circumference * 0.25} ${circumference}`
14945
+ }
14946
+ ) })
14811
14947
  }
14812
14948
  );
14813
14949
  }
@@ -14836,50 +14972,124 @@ function useDelayedRetry(enabled) {
14836
14972
  }, [enabled]);
14837
14973
  return visible;
14838
14974
  }
14975
+ function LockIcon3() {
14976
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
14977
+ "path",
14978
+ {
14979
+ d: "M7 10V8a5 5 0 0 1 10 0v2m-12 0h14a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z",
14980
+ stroke: "currentColor",
14981
+ strokeWidth: "2",
14982
+ strokeLinecap: "round",
14983
+ strokeLinejoin: "round"
14984
+ }
14985
+ ) });
14986
+ }
14987
+ var wordmarkImgStyle3 = {
14988
+ height: 22,
14989
+ width: "auto",
14990
+ display: "block",
14991
+ pointerEvents: "none",
14992
+ userSelect: "none"
14993
+ };
14839
14994
  var contentStyle15 = {
14995
+ display: "flex",
14996
+ flexDirection: "column",
14997
+ alignItems: "center",
14998
+ gap: 16,
14999
+ paddingTop: 8,
14840
15000
  flex: 1,
14841
15001
  minHeight: 0,
15002
+ width: "100%"
15003
+ };
15004
+ var headingStyle13 = (color) => ({
15005
+ fontSize: 24,
15006
+ fontWeight: 700,
15007
+ lineHeight: "normal",
15008
+ letterSpacing: 0,
15009
+ color,
15010
+ margin: 0,
15011
+ textAlign: "center"
15012
+ });
15013
+ var cardStyle2 = (bg, radius) => ({
15014
+ background: bg,
15015
+ borderRadius: radius,
15016
+ padding: 8,
15017
+ width: "100%",
15018
+ boxSizing: "border-box",
14842
15019
  display: "flex",
14843
15020
  flexDirection: "column",
15021
+ gap: 4
15022
+ });
15023
+ var rowStyle6 = {
15024
+ display: "flex",
14844
15025
  alignItems: "center",
15026
+ gap: 16,
15027
+ padding: "12px 16px 12px 12px",
15028
+ borderRadius: 16,
14845
15029
  width: "100%",
14846
- // ScreenLayout body already applies 24px side padding; +8px here reaches the
14847
- // 32px Figma gutter, with 32px above the logo and a 32px gap to the checklist.
14848
- padding: "32px 8px 0",
14849
- gap: 32
15030
+ boxSizing: "border-box"
14850
15031
  };
14851
- var lockupStyle2 = {
14852
- display: "flex",
15032
+ var completeBadgeStyle = (color) => ({
15033
+ width: 24,
15034
+ height: 24,
15035
+ borderRadius: "50%",
15036
+ background: color,
15037
+ display: "inline-flex",
14853
15038
  alignItems: "center",
14854
- gap: 6,
15039
+ justifyContent: "center",
14855
15040
  flexShrink: 0
14856
- };
14857
- var lockupMarkStyle2 = {
15041
+ });
15042
+ var pendingBadgeStyle = (color) => ({
14858
15043
  width: 24,
14859
15044
  height: 24,
14860
- display: "block"
14861
- };
14862
- var wordmarkStyle3 = (color) => ({
14863
- fontSize: "1.45rem",
14864
- fontWeight: 500,
14865
- letterSpacing: "-0.03em",
14866
- lineHeight: 1,
15045
+ borderRadius: "50%",
15046
+ background: color,
15047
+ flexShrink: 0
15048
+ });
15049
+ var labelStyle7 = (color) => ({
15050
+ fontSize: "1rem",
15051
+ fontWeight: 400,
15052
+ lineHeight: 1.25,
14867
15053
  color
14868
15054
  });
14869
- var stepsFrameStyle = {
14870
- flex: 1,
14871
- minHeight: 0,
15055
+ var footerStackStyle4 = {
14872
15056
  display: "flex",
14873
15057
  flexDirection: "column",
14874
- alignItems: "center",
14875
- justifyContent: "center",
15058
+ gap: 16,
14876
15059
  width: "100%"
14877
15060
  };
14878
- var footerStackStyle4 = {
15061
+ var retryStackStyle = {
14879
15062
  display: "flex",
14880
15063
  flexDirection: "column",
14881
- gap: 8
15064
+ gap: 8,
15065
+ width: "100%"
14882
15066
  };
15067
+ var lockBannerStyle2 = {
15068
+ display: "flex",
15069
+ alignItems: "flex-start",
15070
+ gap: 16,
15071
+ padding: "12px 16px 12px 12px",
15072
+ borderRadius: 16,
15073
+ width: "100%",
15074
+ boxSizing: "border-box"
15075
+ };
15076
+ var lockIconWrapStyle2 = (color) => ({
15077
+ flexShrink: 0,
15078
+ width: 24,
15079
+ height: 24,
15080
+ display: "inline-flex",
15081
+ alignItems: "center",
15082
+ justifyContent: "center",
15083
+ color
15084
+ });
15085
+ var lockBannerTextStyle2 = (color) => ({
15086
+ margin: 0,
15087
+ flex: 1,
15088
+ fontSize: 12,
15089
+ fontWeight: 500,
15090
+ lineHeight: "normal",
15091
+ color
15092
+ });
14883
15093
  function ConfirmSignScreen({
14884
15094
  walletName,
14885
15095
  chainFamily,
@@ -14908,7 +15118,7 @@ function ConfirmSignScreen({
14908
15118
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onLogout }),
14909
15119
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle16, children: [
14910
15120
  logoSrc ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: 48 }),
14911
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle13(tokens.text), children: heading }),
15121
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
14912
15122
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle10(tokens.textSecondary), children: subtitle }),
14913
15123
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: successBadgeStyle(tokens), children: [
14914
15124
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: checkmarkStyle, children: "\u2713" }),
@@ -14934,7 +15144,7 @@ var logoStyle3 = {
14934
15144
  borderRadius: 14,
14935
15145
  objectFit: "contain"
14936
15146
  };
14937
- var headingStyle13 = (color) => ({
15147
+ var headingStyle14 = (color) => ({
14938
15148
  fontSize: "1.45rem",
14939
15149
  fontWeight: 700,
14940
15150
  letterSpacing: "-0.02em",
@@ -15296,10 +15506,10 @@ function GuestTokenPickerScreen({
15296
15506
  children: [
15297
15507
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15298
15508
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle17, children: [
15299
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle14(tokens.text), children: title }),
15509
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle15(tokens.text), children: title }),
15300
15510
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15301
15511
  entries2.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle11(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15302
- /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle7(tokens.textSecondary), children: "Token" }),
15512
+ /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15303
15513
  /* @__PURE__ */ jsxRuntime.jsx(
15304
15514
  "button",
15305
15515
  {
@@ -15379,7 +15589,7 @@ var contentStyle17 = {
15379
15589
  padding: "0 20px 16px",
15380
15590
  gap: 12
15381
15591
  };
15382
- var headingStyle14 = (color) => ({
15592
+ var headingStyle15 = (color) => ({
15383
15593
  fontSize: "1.25rem",
15384
15594
  fontWeight: 700,
15385
15595
  color,
@@ -15391,7 +15601,7 @@ var subtitleStyle11 = (color) => ({
15391
15601
  color,
15392
15602
  textAlign: "center"
15393
15603
  });
15394
- var labelStyle7 = (color) => ({
15604
+ var labelStyle8 = (color) => ({
15395
15605
  fontSize: "0.75rem",
15396
15606
  fontWeight: 600,
15397
15607
  color,
@@ -15524,7 +15734,7 @@ function ManualTransferFlow({
15524
15734
  screenContent = /* @__PURE__ */ jsxRuntime.jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15525
15735
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15526
15736
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle18, children: [
15527
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle15(tokens.text), children: "Manual transfer unavailable" }),
15737
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle16(tokens.text), children: "Manual transfer unavailable" }),
15528
15738
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15529
15739
  ] })
15530
15740
  ] });
@@ -15603,7 +15813,7 @@ var contentStyle18 = {
15603
15813
  paddingBottom: 24,
15604
15814
  width: "100%"
15605
15815
  };
15606
- var headingStyle15 = (color) => ({
15816
+ var headingStyle16 = (color) => ({
15607
15817
  color,
15608
15818
  fontSize: "2rem",
15609
15819
  lineHeight: 1.05,
@@ -15628,7 +15838,7 @@ function GenericLoadingShimmer() {
15628
15838
  role: "status",
15629
15839
  "aria-label": "Loading payment flow",
15630
15840
  "aria-busy": "true",
15631
- style: sheetStyle(tokens),
15841
+ style: sheetStyle2(tokens),
15632
15842
  children: [
15633
15843
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
15634
15844
  @keyframes blink-loading-shimmer {
@@ -15674,7 +15884,7 @@ function ShimmerBlock2({
15674
15884
  }
15675
15885
  );
15676
15886
  }
15677
- var sheetStyle = (tokens) => ({
15887
+ var sheetStyle2 = (tokens) => ({
15678
15888
  display: "flex",
15679
15889
  flexDirection: "column",
15680
15890
  height: "100%",
@@ -15721,12 +15931,12 @@ function buildLoginScreenProps({ flow, handlers }) {
15721
15931
  }
15722
15932
  function buildDepositOptionsScreenProps({ flow, handlers }) {
15723
15933
  return {
15724
- // "From Wallet" routes through REQUEST_LOGIN (handlers.onLogin) so the
15725
- // existing login path runs unchanged.
15726
- onFromWallet: handlers.onLogin,
15727
- // "To Address" navigates to the manual-transfer flow.
15934
+ // "Send Crypto Manually" navigates to the manual-transfer flow.
15728
15935
  onToAddress: () => handlers.onSetPhase({ step: "manual-transfer" }),
15729
- onSignInWithBlink: handlers.onLoginWithPasskey,
15936
+ // The primary CTA routes to the login screen (credential selection) rather
15937
+ // than prompting for a passkey directly, matching the connect-wallet entry
15938
+ // point. onLogin dispatches REQUEST_LOGIN → step 'login' → LoginScreen.
15939
+ onSignInWithBlink: handlers.onLogin,
15730
15940
  // Deposit-options is the root screen for the full-widget flow, so the
15731
15941
  // top-right (X) closes the widget through the same `onBack` the host
15732
15942
  // provides. Falling back to `undefined` hides the close button when the
@@ -15818,7 +16028,8 @@ function buildApprovingInWalletScreenProps({
15818
16028
  chainName: setupToken?.chainName ?? null,
15819
16029
  step,
15820
16030
  error: flow.state.error || remote.authExecutorError,
15821
- onRetry: handlers.onRetryAuthorization
16031
+ onRetry: handlers.onRetryAuthorization,
16032
+ onLogout: flow.isDesktop ? handlers.onLogout : void 0
15822
16033
  };
15823
16034
  }
15824
16035
  function buildLinkTokensScreenProps({
@@ -19580,25 +19791,6 @@ function BlinkPaymentInner({
19580
19791
  ) });
19581
19792
  }
19582
19793
 
19583
- // src/deviceBiometricUnlockText.ts
19584
- var FALLBACK = "Biometric verification";
19585
- function getDeviceBiometricUnlockText() {
19586
- const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
19587
- if (/iPhone|iPad|iPod/i.test(ua)) {
19588
- return "Face ID";
19589
- }
19590
- if (/Android/i.test(ua)) {
19591
- return "Fingerprint or face unlock";
19592
- }
19593
- if (/Windows NT/i.test(ua)) {
19594
- return "Windows Hello";
19595
- }
19596
- if (/Macintosh|Mac OS X/i.test(ua)) {
19597
- return "Touch ID";
19598
- }
19599
- return FALLBACK;
19600
- }
19601
-
19602
19794
  exports.ACCOUNT_SWITCH_CONFLICT_MESSAGE = ACCOUNT_SWITCH_CONFLICT_MESSAGE;
19603
19795
  exports.AdvancedSourceScreen = AdvancedSourceScreen;
19604
19796
  exports.ApprovingInWalletScreen = ApprovingInWalletScreen;
@@ -19615,6 +19807,7 @@ exports.BlinkPayment = BlinkPayment;
19615
19807
  exports.BlinkProvider = BlinkProvider;
19616
19808
  exports.ConfirmSignScreen = ConfirmSignScreen;
19617
19809
  exports.DepositCompleteScreen = DepositCompleteScreen;
19810
+ exports.DepositOptionsScreen = DepositOptionsScreen;
19618
19811
  exports.DepositScreen = DepositScreen;
19619
19812
  exports.DepositTransferStatusScreen = DepositTransferStatusScreen;
19620
19813
  exports.GuestTokenPickerScreen = GuestTokenPickerScreen;