@swype-org/react-sdk 0.2.311 → 0.2.315

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
@@ -7,6 +7,7 @@ var wagmi = require('wagmi');
7
7
  var chains = require('wagmi/chains');
8
8
  var connectors = require('wagmi/connectors');
9
9
  var reactQuery = require('@tanstack/react-query');
10
+ var react$1 = require('@fingerprint/react');
10
11
  var jsxRuntime = require('react/jsx-runtime');
11
12
  var core = require('@wagmi/core');
12
13
  var viem = require('viem');
@@ -994,6 +995,12 @@ function bridgedWalletsToConnectors(wallets, staticRdns = /* @__PURE__ */ new Se
994
995
  }
995
996
  var BLINK_PRIVY_APP_ID = "cmlil87uv004n0ck0blwumwek";
996
997
  var BLINK_WC_PROJECT_ID = "f6c60234412f94ef9108dc8f67f4362c";
998
+ var BLINK_FINGERPRINT_API_KEY = "nr4FvTsZ6M5z2141FqrM";
999
+ var BLINK_FINGERPRINT_REGION = "us";
1000
+ function FingerprintVisitorPing() {
1001
+ react$1.useVisitorData({ immediate: true });
1002
+ return null;
1003
+ }
997
1004
  function buildStaticConnectors() {
998
1005
  return [
999
1006
  // `unstable_shimAsyncInject` covers wallets whose content scripts wire
@@ -1088,25 +1095,33 @@ function BlinkProvider({
1088
1095
  }),
1089
1096
  [apiBaseUrl, theme, resolvedMinTransferAmountUsd, depositAmount, setDepositAmount, enableFullWidget, isMobileApp]
1090
1097
  );
1091
- return /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsxRuntime.jsx(wagmi.WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsxRuntime.jsx(
1092
- reactAuth.PrivyProvider,
1093
- {
1094
- appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1095
- config: {
1096
- appearance: {
1097
- theme: getThemeBase(theme),
1098
- accentColor: getTheme(theme).accent
1099
- },
1100
- intl: {
1101
- defaultCountry: "US"
1102
- },
1103
- embeddedWallets: {
1104
- showWalletUIs: false
1098
+ return (
1099
+ // Outermost wrapper: loads the Fingerprint browser agent once per
1100
+ // provider mount, independent of wagmi/privy/query state. Visitor data
1101
+ // collection starts here; no hook is exposed yet (see SDK barrel).
1102
+ /* @__PURE__ */ jsxRuntime.jsxs(react$1.FingerprintProvider, { apiKey: BLINK_FINGERPRINT_API_KEY, region: BLINK_FINGERPRINT_REGION, children: [
1103
+ /* @__PURE__ */ jsxRuntime.jsx(FingerprintVisitorPing, {}),
1104
+ /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsxRuntime.jsx(wagmi.WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsxRuntime.jsx(
1105
+ reactAuth.PrivyProvider,
1106
+ {
1107
+ appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1108
+ config: {
1109
+ appearance: {
1110
+ theme: getThemeBase(theme),
1111
+ accentColor: getTheme(theme).accent
1112
+ },
1113
+ intl: {
1114
+ defaultCountry: "US"
1115
+ },
1116
+ embeddedWallets: {
1117
+ showWalletUIs: false
1118
+ }
1119
+ },
1120
+ children: /* @__PURE__ */ jsxRuntime.jsx(BlinkContext.Provider, { value, children })
1105
1121
  }
1106
- },
1107
- children: /* @__PURE__ */ jsxRuntime.jsx(BlinkContext.Provider, { value, children })
1108
- }
1109
- ) }) });
1122
+ ) }) })
1123
+ ] })
1124
+ );
1110
1125
  }
1111
1126
  function useBlinkConfig() {
1112
1127
  const ctx = react.useContext(BlinkContext);
@@ -1763,6 +1778,8 @@ function screenForPhase(phase) {
1763
1778
  return "manual-transfer";
1764
1779
  case "login":
1765
1780
  return "login";
1781
+ case "welcome-back":
1782
+ return "welcome-back";
1766
1783
  case "deposit-options":
1767
1784
  return "deposit-options";
1768
1785
  case "wallet-picker":
@@ -7545,6 +7562,9 @@ function deriveFreshPhase(state) {
7545
7562
  if (state.loadingData && state.activeCredentialId != null) {
7546
7563
  return { step: "data-loading" };
7547
7564
  }
7565
+ if (state.enableFullWidget && state.authenticatedOnOpen && !state.welcomeBackAcknowledged && state.activeCredentialId != null && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
7566
+ return { step: "welcome-back" };
7567
+ }
7548
7568
  if (state.activeCredentialId != null && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
7549
7569
  return { step: "wallet-picker", reason: "link" };
7550
7570
  }
@@ -7624,7 +7644,9 @@ function createInitialState(config) {
7624
7644
  guestWalletDeeplinksPreparing: false,
7625
7645
  amountTooLow: null,
7626
7646
  enableFullWidget: config.enableFullWidget ?? false,
7627
- requireAmountEntry: config.depositAmount == null
7647
+ requireAmountEntry: config.depositAmount == null,
7648
+ authenticatedOnOpen: false,
7649
+ welcomeBackAcknowledged: false
7628
7650
  };
7629
7651
  }
7630
7652
  function clearAuthenticatedSessionState(state) {
@@ -7662,7 +7684,9 @@ function clearAuthenticatedSessionState(state) {
7662
7684
  setupDepositToken: null,
7663
7685
  guestWalletPrepared: null,
7664
7686
  guestWalletDeeplinksPreparing: false,
7665
- amountTooLow: null
7687
+ amountTooLow: null,
7688
+ authenticatedOnOpen: false,
7689
+ welcomeBackAcknowledged: false
7666
7690
  };
7667
7691
  }
7668
7692
  function paymentReducer(state, action) {
@@ -7991,6 +8015,8 @@ function applyAction(state, action) {
7991
8015
  };
7992
8016
  case "CANCEL_LOGIN_REQUEST":
7993
8017
  return { ...state, loginRequested: false, error: null };
8018
+ case "ACKNOWLEDGE_WELCOME_BACK":
8019
+ return { ...state, welcomeBackAcknowledged: true };
7994
8020
  case "SET_ERROR":
7995
8021
  return { ...state, error: action.error };
7996
8022
  case "AMOUNT_TOO_LOW":
@@ -8088,7 +8114,13 @@ function applyAction(state, action) {
8088
8114
  ...state,
8089
8115
  privyReady: action.ready,
8090
8116
  privyAuthenticated: action.authenticated,
8091
- ...action.authenticated ? { loginRequested: false } : {}
8117
+ ...action.authenticated ? { loginRequested: false } : {},
8118
+ // Latch "already authenticated when the flow opened" exactly once, on
8119
+ // the ready: false → true transition that carries an existing session.
8120
+ // A user who opens logged-out and signs in mid-session never hits this
8121
+ // branch (ready was already true), so the flag stays false and they
8122
+ // skip WelcomeBackScreen.
8123
+ ...!state.privyReady && action.ready && action.authenticated ? { authenticatedOnOpen: true } : {}
8092
8124
  };
8093
8125
  case "SYNC_AMOUNT":
8094
8126
  return {
@@ -10527,6 +10559,69 @@ var copyIconCircleStyle = (bgRecessed) => ({
10527
10559
  justifyContent: "center",
10528
10560
  width: 48
10529
10561
  });
10562
+ function FitText({
10563
+ children,
10564
+ maxFontSize,
10565
+ minFontSize,
10566
+ color,
10567
+ fontWeight = 500
10568
+ }) {
10569
+ const containerRef = react.useRef(null);
10570
+ const textRef = react.useRef(null);
10571
+ const [fontSize, setFontSize] = react.useState(maxFontSize);
10572
+ react.useLayoutEffect(() => {
10573
+ const container = containerRef.current;
10574
+ const text = textRef.current;
10575
+ if (!container || !text) return void 0;
10576
+ const fit = () => {
10577
+ let size = maxFontSize;
10578
+ text.style.fontSize = `${size}px`;
10579
+ while (size > minFontSize && text.scrollWidth > container.clientWidth) {
10580
+ size -= 1;
10581
+ text.style.fontSize = `${size}px`;
10582
+ }
10583
+ setFontSize(size);
10584
+ };
10585
+ fit();
10586
+ const observer = new ResizeObserver(fit);
10587
+ observer.observe(container);
10588
+ return () => observer.disconnect();
10589
+ }, [children, maxFontSize, minFontSize]);
10590
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ref: containerRef, style: containerStyle8, children: /* @__PURE__ */ jsxRuntime.jsx("span", { ref: textRef, style: { ...textStyle2(color, fontWeight), fontSize }, children }) });
10591
+ }
10592
+ var containerStyle8 = {
10593
+ flex: 1,
10594
+ minWidth: 0,
10595
+ overflow: "hidden",
10596
+ display: "flex",
10597
+ alignItems: "center"
10598
+ };
10599
+ var textStyle2 = (color, fontWeight) => ({
10600
+ whiteSpace: "nowrap",
10601
+ overflow: "hidden",
10602
+ textOverflow: "ellipsis",
10603
+ color,
10604
+ fontWeight
10605
+ });
10606
+
10607
+ // src/deviceBiometricUnlockText.ts
10608
+ var FALLBACK = "Biometric verification";
10609
+ function getDeviceBiometricUnlockText() {
10610
+ const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10611
+ if (/iPhone|iPad|iPod/i.test(ua)) {
10612
+ return "Face ID";
10613
+ }
10614
+ if (/Android/i.test(ua)) {
10615
+ return "Fingerprint or face unlock";
10616
+ }
10617
+ if (/Windows NT/i.test(ua)) {
10618
+ return "Windows Hello";
10619
+ }
10620
+ if (/Macintosh|Mac OS X/i.test(ua)) {
10621
+ return "Touch ID";
10622
+ }
10623
+ return FALLBACK;
10624
+ }
10530
10625
  function LoginScreen({
10531
10626
  onLoginWithPasskey,
10532
10627
  onSignupWithPasskey,
@@ -10616,8 +10711,11 @@ function PasskeyInfoCard({ tokens }) {
10616
10711
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoRowStyle, children: [
10617
10712
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: tokens.text, flexShrink: 0, paddingTop: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(FaceIdIcon, { size: 24 }) }),
10618
10713
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoRowTextStyle, children: [
10619
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: infoRowTitleStyle(tokens.text), children: "Deposit with FaceID" }),
10620
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: infoRowSubtitleStyle(tokens.text), children: "Once you try it, you won't go back" })
10714
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoRowTitleStyle(tokens.text), children: [
10715
+ "Deposit with ",
10716
+ getDeviceBiometricUnlockText()
10717
+ ] }),
10718
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: infoRowSubtitleStyle(tokens.text), children: "Everywhere Blink is enabled" })
10621
10719
  ] })
10622
10720
  ] })
10623
10721
  ] });
@@ -10755,25 +10853,6 @@ var avatarStyle = (tokens) => ({
10755
10853
  color: tokens.textMuted,
10756
10854
  background: "transparent"
10757
10855
  });
10758
-
10759
- // src/deviceBiometricUnlockText.ts
10760
- var FALLBACK = "Biometric verification";
10761
- function getDeviceBiometricUnlockText() {
10762
- const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10763
- if (/iPhone|iPad|iPod/i.test(ua)) {
10764
- return "Face ID";
10765
- }
10766
- if (/Android/i.test(ua)) {
10767
- return "Fingerprint or face unlock";
10768
- }
10769
- if (/Windows NT/i.test(ua)) {
10770
- return "Windows Hello";
10771
- }
10772
- if (/Macintosh|Mac OS X/i.test(ua)) {
10773
- return "Touch ID";
10774
- }
10775
- return FALLBACK;
10776
- }
10777
10856
  var CLUSTER_LOGOS = [
10778
10857
  METAMASK_LOGO,
10779
10858
  PHANTOM_LOGO,
@@ -10822,7 +10901,7 @@ function DepositOptionsScreen({
10822
10901
  onClick: onSignInWithBlink,
10823
10902
  style: depositPillStyle(tokens.accent),
10824
10903
  children: [
10825
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10904
+ /* @__PURE__ */ jsxRuntime.jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
10826
10905
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsxRuntime.jsx(
10827
10906
  "span",
10828
10907
  {
@@ -10929,6 +11008,7 @@ var depositPillStyle = (bg) => ({
10929
11008
  display: "flex",
10930
11009
  alignItems: "center",
10931
11010
  justifyContent: "space-between",
11011
+ gap: 8,
10932
11012
  width: "100%",
10933
11013
  height: 56,
10934
11014
  padding: "12px 12px 12px 24px",
@@ -10939,16 +11019,11 @@ var depositPillStyle = (bg) => ({
10939
11019
  boxSizing: "border-box",
10940
11020
  fontFamily: "inherit"
10941
11021
  });
10942
- var depositPillLabelStyle = (color) => ({
10943
- color,
10944
- fontSize: 16,
10945
- fontWeight: 500,
10946
- whiteSpace: "nowrap"
10947
- });
10948
11022
  var clusterStyle = {
10949
11023
  display: "inline-flex",
10950
11024
  alignItems: "center",
10951
- isolation: "isolate"
11025
+ isolation: "isolate",
11026
+ flexShrink: 0
10952
11027
  };
10953
11028
  var clusterChipStyle = (bg, last) => ({
10954
11029
  width: 32,
@@ -11043,102 +11118,391 @@ var closeButtonStyle2 = (bg, color) => ({
11043
11118
  cursor: "pointer",
11044
11119
  padding: 0
11045
11120
  });
11046
- function BlinkErrorScreen({
11047
- title,
11048
- message,
11049
- retryLabel,
11050
- onRetry,
11121
+ var CLUSTER_LOGOS2 = [
11122
+ METAMASK_LOGO,
11123
+ PHANTOM_LOGO,
11124
+ RABBY_LOGO,
11125
+ OKX_WALLET_LOGO,
11126
+ TRUST_WALLET_LOGO,
11127
+ BASE_LOGO
11128
+ ];
11129
+ function WelcomeBackScreen({
11130
+ onToAddress,
11131
+ onComplete,
11051
11132
  onClose
11052
11133
  }) {
11053
11134
  const { tokens } = useBlinkConfig();
11054
- const headerRight = onClose ? /* @__PURE__ */ jsxRuntime.jsx(
11055
- "button",
11056
- {
11057
- type: "button",
11058
- onClick: onClose,
11059
- "aria-label": "Close",
11060
- style: closeButtonStyle3(tokens),
11061
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
11062
- "path",
11135
+ const depositLabel = `Deposit with ${getDeviceBiometricUnlockText()}`;
11136
+ return /* @__PURE__ */ jsxRuntime.jsx(ScreenLayout, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: sheetStyle2, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle3, children: [
11137
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: headerRowStyle2, children: [
11138
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 }),
11139
+ onClose ? /* @__PURE__ */ jsxRuntime.jsx(
11140
+ "button",
11063
11141
  {
11064
- d: "M6 6l12 12M18 6L6 18",
11065
- stroke: "currentColor",
11066
- strokeWidth: "2",
11067
- strokeLinecap: "round",
11068
- strokeLinejoin: "round"
11142
+ type: "button",
11143
+ onClick: onClose,
11144
+ "aria-label": "Close",
11145
+ style: closeButtonStyle3(tokens.bgRecessed, tokens.text),
11146
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
11147
+ "path",
11148
+ {
11149
+ d: "M6 6l12 12M18 6L6 18",
11150
+ stroke: "currentColor",
11151
+ strokeWidth: "2",
11152
+ strokeLinecap: "round",
11153
+ strokeLinejoin: "round"
11154
+ }
11155
+ ) })
11069
11156
  }
11070
- ) })
11071
- }
11072
- ) : void 0;
11073
- const showRetry = retryLabel != null && onRetry != null;
11157
+ ) : null
11158
+ ] }),
11159
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_PASSKEY_ILLUSTRATION, alt: "", "aria-hidden": "true", style: heroStyle2 }),
11160
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: stackStyle2, children: [
11161
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: depositPillWrapperStyle2, children: [
11162
+ /* @__PURE__ */ jsxRuntime.jsxs(
11163
+ "button",
11164
+ {
11165
+ type: "button",
11166
+ onClick: onComplete,
11167
+ style: depositFrameStyle(tokens.highlight),
11168
+ children: [
11169
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: completeSetupBandStyle(tokens.text), children: "Complete setup" }),
11170
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: depositPillStyle2(tokens.accent), children: [
11171
+ /* @__PURE__ */ jsxRuntime.jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
11172
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: clusterStyle2, children: CLUSTER_LOGOS2.map((logo, i) => /* @__PURE__ */ jsxRuntime.jsx(
11173
+ "span",
11174
+ {
11175
+ style: clusterChipStyle2(tokens.bgInput, i === CLUSTER_LOGOS2.length - 1),
11176
+ children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: logo, alt: "", "aria-hidden": "true", style: clusterIconStyle2 })
11177
+ },
11178
+ logo
11179
+ )) })
11180
+ ] })
11181
+ ]
11182
+ }
11183
+ ),
11184
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: feesBadgeStyle2(tokens.highlight, tokens.text), children: "0% FEES" })
11185
+ ] }),
11186
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: dividerRowStyle2, children: [
11187
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerRuleStyle2(tokens.textTertiary) }),
11188
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerLabelStyle2(tokens.textTertiary), children: "OR" }),
11189
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: dividerRuleStyle2(tokens.textTertiary) })
11190
+ ] }),
11191
+ /* @__PURE__ */ jsxRuntime.jsxs(
11192
+ "button",
11193
+ {
11194
+ type: "button",
11195
+ onClick: onToAddress,
11196
+ style: manualRowStyle2(tokens.bgCardTranslucent),
11197
+ children: [
11198
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: manualLabelStyle2(tokens.text), children: "Send Crypto Manually" }),
11199
+ /* @__PURE__ */ jsxRuntime.jsx(QrIcon2, { color: tokens.text })
11200
+ ]
11201
+ }
11202
+ )
11203
+ ] })
11204
+ ] }) }) });
11205
+ }
11206
+ function QrIcon2({ color }) {
11074
11207
  return /* @__PURE__ */ jsxRuntime.jsxs(
11075
- ScreenLayout,
11208
+ "svg",
11076
11209
  {
11077
- footer: showRetry ? /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onRetry, children: retryLabel }) : void 0,
11210
+ width: "24",
11211
+ height: "24",
11212
+ viewBox: "0 0 24 24",
11213
+ fill: "none",
11214
+ "aria-hidden": "true",
11215
+ style: { flexShrink: 0 },
11078
11216
  children: [
11079
- /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { right: headerRight }),
11080
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle3, children: [
11081
- /* @__PURE__ */ jsxRuntime.jsx(
11082
- "img",
11083
- {
11084
- src: BLINK_ERROR_ILLUSTRATION,
11085
- alt: "",
11086
- "aria-hidden": "true",
11087
- style: illustrationStyle2
11088
- }
11089
- ),
11090
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11091
- message && /* @__PURE__ */ jsxRuntime.jsx("p", { style: messageStyle(tokens.text), children: message })
11092
- ] })
11217
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11218
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
11219
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11220
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
11221
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11222
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
11223
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
11224
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
11225
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
11226
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
11093
11227
  ]
11094
11228
  }
11095
11229
  );
11096
11230
  }
11231
+ var sheetStyle2 = {
11232
+ position: "relative",
11233
+ minHeight: "100%",
11234
+ display: "flex",
11235
+ flexDirection: "column",
11236
+ boxSizing: "border-box"
11237
+ };
11097
11238
  var contentStyle3 = {
11098
- textAlign: "center",
11099
- flex: 1,
11100
11239
  display: "flex",
11101
11240
  flexDirection: "column",
11102
11241
  alignItems: "center",
11103
- justifyContent: "center",
11104
- gap: 16
11242
+ gap: 32,
11243
+ padding: "32px 8px"
11105
11244
  };
11106
- var illustrationStyle2 = {
11107
- width: 200,
11108
- height: 200,
11245
+ var headerRowStyle2 = {
11246
+ display: "flex",
11247
+ alignItems: "center",
11248
+ justifyContent: "space-between",
11249
+ width: "100%",
11250
+ minHeight: 44
11251
+ };
11252
+ var wordmarkImgStyle2 = {
11253
+ height: 31,
11254
+ width: "auto",
11255
+ display: "block"
11256
+ };
11257
+ var heroStyle2 = {
11258
+ width: 220,
11259
+ height: 220,
11260
+ maxWidth: "100%",
11109
11261
  objectFit: "contain",
11110
11262
  display: "block"
11111
11263
  };
11112
- var headingStyle2 = (color) => ({
11113
- fontSize: "1.5rem",
11114
- fontWeight: 700,
11115
- lineHeight: 1.1,
11116
- letterSpacing: "-0.01em",
11117
- color,
11118
- margin: 0
11119
- });
11120
- var messageStyle = (color) => ({
11121
- fontSize: "1rem",
11122
- fontWeight: 400,
11123
- lineHeight: 1.4,
11124
- color,
11125
- margin: 0,
11126
- maxWidth: 320
11127
- });
11128
- var closeButtonStyle3 = (tokens) => ({
11129
- width: 40,
11130
- height: 40,
11131
- borderRadius: "50%",
11264
+ var stackStyle2 = {
11265
+ display: "flex",
11266
+ flexDirection: "column",
11267
+ gap: 16,
11268
+ width: "100%"
11269
+ };
11270
+ var depositPillWrapperStyle2 = {
11271
+ position: "relative",
11272
+ width: "100%",
11273
+ paddingBottom: 12
11274
+ };
11275
+ var depositFrameStyle = (bg) => ({
11276
+ display: "flex",
11277
+ flexDirection: "column",
11278
+ alignItems: "stretch",
11279
+ width: "100%",
11280
+ padding: "2px 4px 4px",
11281
+ background: bg,
11132
11282
  border: "none",
11133
- background: tokens.bgRecessed,
11134
- color: tokens.text,
11283
+ borderRadius: 32,
11284
+ cursor: "pointer",
11285
+ boxSizing: "border-box",
11286
+ fontFamily: "inherit"
11287
+ });
11288
+ var completeSetupBandStyle = (color) => ({
11135
11289
  display: "flex",
11136
11290
  alignItems: "center",
11137
11291
  justifyContent: "center",
11138
- cursor: "pointer",
11139
- padding: 0
11292
+ height: 26,
11293
+ color,
11294
+ fontSize: 13,
11295
+ fontWeight: 600,
11296
+ letterSpacing: "0.01em"
11140
11297
  });
11141
- function AmountTooLowScreen({
11298
+ var depositPillStyle2 = (bg) => ({
11299
+ display: "flex",
11300
+ alignItems: "center",
11301
+ justifyContent: "space-between",
11302
+ gap: 8,
11303
+ width: "100%",
11304
+ height: 56,
11305
+ padding: "12px 12px 12px 24px",
11306
+ background: bg,
11307
+ border: "none",
11308
+ borderRadius: 28,
11309
+ boxSizing: "border-box"
11310
+ });
11311
+ var clusterStyle2 = {
11312
+ display: "inline-flex",
11313
+ alignItems: "center",
11314
+ isolation: "isolate",
11315
+ flexShrink: 0
11316
+ };
11317
+ var clusterChipStyle2 = (bg, last) => ({
11318
+ width: 32,
11319
+ height: 32,
11320
+ borderRadius: "50%",
11321
+ background: bg,
11322
+ display: "inline-flex",
11323
+ alignItems: "center",
11324
+ justifyContent: "center",
11325
+ marginRight: last ? 0 : -12,
11326
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
11327
+ flexShrink: 0
11328
+ });
11329
+ var clusterIconStyle2 = {
11330
+ width: 24,
11331
+ height: 24,
11332
+ borderRadius: "50%",
11333
+ objectFit: "cover",
11334
+ display: "block"
11335
+ };
11336
+ var feesBadgeStyle2 = (bg, color) => ({
11337
+ position: "absolute",
11338
+ left: 131,
11339
+ top: 72,
11340
+ display: "inline-flex",
11341
+ alignItems: "center",
11342
+ justifyContent: "center",
11343
+ background: bg,
11344
+ color,
11345
+ fontSize: 12,
11346
+ fontWeight: 500,
11347
+ lineHeight: 1,
11348
+ padding: "4px 8px",
11349
+ borderRadius: 6,
11350
+ whiteSpace: "nowrap",
11351
+ transform: "rotate(-6.75deg)",
11352
+ boxShadow: "0 2px 4px rgba(0, 0, 0, 0.16)",
11353
+ pointerEvents: "none"
11354
+ });
11355
+ var dividerRowStyle2 = {
11356
+ display: "flex",
11357
+ alignItems: "center",
11358
+ justifyContent: "center",
11359
+ gap: 10,
11360
+ padding: "0 16px",
11361
+ width: "100%",
11362
+ boxSizing: "border-box"
11363
+ };
11364
+ var dividerRuleStyle2 = (color) => ({
11365
+ flex: 1,
11366
+ height: 1,
11367
+ background: color
11368
+ });
11369
+ var dividerLabelStyle2 = (color) => ({
11370
+ color,
11371
+ fontSize: 12,
11372
+ fontWeight: 500,
11373
+ whiteSpace: "nowrap"
11374
+ });
11375
+ var manualRowStyle2 = (bg) => ({
11376
+ display: "flex",
11377
+ alignItems: "center",
11378
+ gap: 8,
11379
+ width: "100%",
11380
+ height: 56,
11381
+ padding: "12px 24px",
11382
+ background: bg,
11383
+ border: "none",
11384
+ borderRadius: 28,
11385
+ cursor: "pointer",
11386
+ boxSizing: "border-box",
11387
+ fontFamily: "inherit"
11388
+ });
11389
+ var manualLabelStyle2 = (color) => ({
11390
+ flex: 1,
11391
+ minWidth: 0,
11392
+ color,
11393
+ fontSize: 16,
11394
+ fontWeight: 400
11395
+ });
11396
+ var closeButtonStyle3 = (bg, color) => ({
11397
+ flexShrink: 0,
11398
+ width: 44,
11399
+ height: 44,
11400
+ borderRadius: "50%",
11401
+ border: "none",
11402
+ background: bg,
11403
+ color,
11404
+ display: "flex",
11405
+ alignItems: "center",
11406
+ justifyContent: "center",
11407
+ cursor: "pointer",
11408
+ padding: 0
11409
+ });
11410
+ function BlinkErrorScreen({
11411
+ title,
11412
+ message,
11413
+ retryLabel,
11414
+ onRetry,
11415
+ onClose
11416
+ }) {
11417
+ const { tokens } = useBlinkConfig();
11418
+ const headerRight = onClose ? /* @__PURE__ */ jsxRuntime.jsx(
11419
+ "button",
11420
+ {
11421
+ type: "button",
11422
+ onClick: onClose,
11423
+ "aria-label": "Close",
11424
+ style: closeButtonStyle4(tokens),
11425
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
11426
+ "path",
11427
+ {
11428
+ d: "M6 6l12 12M18 6L6 18",
11429
+ stroke: "currentColor",
11430
+ strokeWidth: "2",
11431
+ strokeLinecap: "round",
11432
+ strokeLinejoin: "round"
11433
+ }
11434
+ ) })
11435
+ }
11436
+ ) : void 0;
11437
+ const showRetry = retryLabel != null && onRetry != null;
11438
+ return /* @__PURE__ */ jsxRuntime.jsxs(
11439
+ ScreenLayout,
11440
+ {
11441
+ footer: showRetry ? /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onRetry, children: retryLabel }) : void 0,
11442
+ children: [
11443
+ /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { right: headerRight }),
11444
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle4, children: [
11445
+ /* @__PURE__ */ jsxRuntime.jsx(
11446
+ "img",
11447
+ {
11448
+ src: BLINK_ERROR_ILLUSTRATION,
11449
+ alt: "",
11450
+ "aria-hidden": "true",
11451
+ style: illustrationStyle2
11452
+ }
11453
+ ),
11454
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11455
+ message && /* @__PURE__ */ jsxRuntime.jsx("p", { style: messageStyle(tokens.text), children: message })
11456
+ ] })
11457
+ ]
11458
+ }
11459
+ );
11460
+ }
11461
+ var contentStyle4 = {
11462
+ textAlign: "center",
11463
+ flex: 1,
11464
+ display: "flex",
11465
+ flexDirection: "column",
11466
+ alignItems: "center",
11467
+ justifyContent: "center",
11468
+ gap: 16
11469
+ };
11470
+ var illustrationStyle2 = {
11471
+ width: 200,
11472
+ height: 200,
11473
+ objectFit: "contain",
11474
+ display: "block"
11475
+ };
11476
+ var headingStyle2 = (color) => ({
11477
+ fontSize: "1.5rem",
11478
+ fontWeight: 700,
11479
+ lineHeight: 1.1,
11480
+ letterSpacing: "-0.01em",
11481
+ color,
11482
+ margin: 0
11483
+ });
11484
+ var messageStyle = (color) => ({
11485
+ fontSize: "1rem",
11486
+ fontWeight: 400,
11487
+ lineHeight: 1.4,
11488
+ color,
11489
+ margin: 0,
11490
+ maxWidth: 320
11491
+ });
11492
+ var closeButtonStyle4 = (tokens) => ({
11493
+ width: 40,
11494
+ height: 40,
11495
+ borderRadius: "50%",
11496
+ border: "none",
11497
+ background: tokens.bgRecessed,
11498
+ color: tokens.text,
11499
+ display: "flex",
11500
+ alignItems: "center",
11501
+ justifyContent: "center",
11502
+ cursor: "pointer",
11503
+ padding: 0
11504
+ });
11505
+ function AmountTooLowScreen({
11142
11506
  minAmountUsd,
11143
11507
  onRetry,
11144
11508
  onClose
@@ -11207,7 +11571,7 @@ function OtpVerifyScreen({
11207
11571
  ] }),
11208
11572
  children: [
11209
11573
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
11210
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle4, children: [
11574
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle5, children: [
11211
11575
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle3(tokens.text), children: "Confirm it is you" }),
11212
11576
  /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle2(tokens.textSecondary), children: [
11213
11577
  "We sent a 6-digit code to",
@@ -11231,7 +11595,7 @@ function OtpVerifyScreen({
11231
11595
  }
11232
11596
  );
11233
11597
  }
11234
- var contentStyle4 = {
11598
+ var contentStyle5 = {
11235
11599
  textAlign: "center",
11236
11600
  display: "flex",
11237
11601
  flexDirection: "column",
@@ -11313,7 +11677,7 @@ function PasskeyScreen({
11313
11677
  ] }),
11314
11678
  children: [
11315
11679
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack, onLogout }),
11316
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle5, children: [
11680
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle6, children: [
11317
11681
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle4(tokens.text), children: "Secure your account with a passkey" }),
11318
11682
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle3(tokens.textSecondary), children: "This enables secure one-tap deposits on this device" }),
11319
11683
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle2(tokens), children: error })
@@ -11322,7 +11686,7 @@ function PasskeyScreen({
11322
11686
  }
11323
11687
  );
11324
11688
  }
11325
- var contentStyle5 = {
11689
+ var contentStyle6 = {
11326
11690
  textAlign: "center",
11327
11691
  flex: 1,
11328
11692
  display: "flex",
@@ -11389,7 +11753,7 @@ function PasskeyPopupWelcomeScreen({
11389
11753
  ) }),
11390
11754
  children: [
11391
11755
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack, onLogout }),
11392
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle6, children: [
11756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle7, children: [
11393
11757
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockupStyle, children: [
11394
11758
  /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11395
11759
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
@@ -11429,7 +11793,7 @@ function PasskeyIcon() {
11429
11793
  )
11430
11794
  ] });
11431
11795
  }
11432
- var contentStyle6 = {
11796
+ var contentStyle7 = {
11433
11797
  flex: 1,
11434
11798
  minHeight: 0,
11435
11799
  display: "flex",
@@ -11505,7 +11869,7 @@ function VerifyPasskeyScreen({
11505
11869
  ] }),
11506
11870
  children: [
11507
11871
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
11508
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle7, children: [
11872
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle8, children: [
11509
11873
  /* @__PURE__ */ jsxRuntime.jsx(IconCircle, { variant: "accent", size: 64, children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "36", height: "36", viewBox: "0 0 24 24", fill: "none", children: [
11510
11874
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "3", stroke: tokens.accent, strokeWidth: "1.5", strokeDasharray: "3 2" }),
11511
11875
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "10", r: "1", fill: tokens.accent }),
@@ -11521,7 +11885,7 @@ function VerifyPasskeyScreen({
11521
11885
  }
11522
11886
  );
11523
11887
  }
11524
- var contentStyle7 = {
11888
+ var contentStyle8 = {
11525
11889
  textAlign: "center",
11526
11890
  flex: 1,
11527
11891
  display: "flex",
@@ -12218,6 +12582,260 @@ var errorBannerStyle5 = (tokens) => ({
12218
12582
  marginBottom: 14,
12219
12583
  lineHeight: 1.5
12220
12584
  });
12585
+ function ManualTransferPasskeyScreen({
12586
+ onCreatePasskey,
12587
+ onNoThanks,
12588
+ amountUsd,
12589
+ loading = false,
12590
+ error,
12591
+ onBack,
12592
+ onClose
12593
+ }) {
12594
+ const { tokens } = useBlinkConfig();
12595
+ const title = "Deposit complete";
12596
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: containerStyle9(tokens), children: [
12597
+ onBack && /* @__PURE__ */ jsxRuntime.jsx(
12598
+ "button",
12599
+ {
12600
+ type: "button",
12601
+ onClick: onBack,
12602
+ "aria-label": "Go back",
12603
+ style: { ...navButtonStyle(tokens.bgRecessed, tokens.text), left: 16 },
12604
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
12605
+ "path",
12606
+ {
12607
+ d: "M15 18l-6-6 6-6",
12608
+ stroke: "currentColor",
12609
+ strokeWidth: "2",
12610
+ strokeLinecap: "round",
12611
+ strokeLinejoin: "round"
12612
+ }
12613
+ ) })
12614
+ }
12615
+ ),
12616
+ onClose && /* @__PURE__ */ jsxRuntime.jsx(
12617
+ "button",
12618
+ {
12619
+ type: "button",
12620
+ onClick: onClose,
12621
+ "aria-label": "Close",
12622
+ style: { ...navButtonStyle(tokens.bgRecessed, tokens.text), right: 16 },
12623
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
12624
+ "path",
12625
+ {
12626
+ d: "M6 6l12 12M18 6L6 18",
12627
+ stroke: "currentColor",
12628
+ strokeWidth: "2",
12629
+ strokeLinecap: "round",
12630
+ strokeLinejoin: "round"
12631
+ }
12632
+ ) })
12633
+ }
12634
+ ),
12635
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle9, children: [
12636
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: heroStyle3, children: [
12637
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: titleStyle4(tokens.text), children: title }),
12638
+ /* @__PURE__ */ jsxRuntime.jsx(
12639
+ "img",
12640
+ {
12641
+ src: BLINK_PASSKEY_ILLUSTRATION,
12642
+ alt: "",
12643
+ "aria-hidden": "true",
12644
+ style: illustrationStyle3
12645
+ }
12646
+ ),
12647
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoCardStyle2(tokens.bgCardTranslucent), children: [
12648
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: tokens.text, flexShrink: 0, paddingTop: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(FaceIdIcon, { size: 24 }) }),
12649
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoTextStyle, children: [
12650
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoTitleStyle(tokens.text), children: [
12651
+ "Deposit with ",
12652
+ getDeviceBiometricUnlockText(),
12653
+ " next time"
12654
+ ] }),
12655
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: infoSubtitleStyle(tokens.text), children: [
12656
+ "Deposit with ",
12657
+ getDeviceBiometricUnlockText(),
12658
+ " \u2014 your wallet stays sealed"
12659
+ ] })
12660
+ ] })
12661
+ ] }),
12662
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle6(tokens), children: error })
12663
+ ] }),
12664
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle2, children: [
12665
+ /* @__PURE__ */ jsxRuntime.jsx(
12666
+ "button",
12667
+ {
12668
+ type: "button",
12669
+ onClick: onCreatePasskey,
12670
+ disabled: loading,
12671
+ style: ctaStyle(tokens, loading),
12672
+ children: "Create passkey"
12673
+ }
12674
+ ),
12675
+ /* @__PURE__ */ jsxRuntime.jsx(
12676
+ "button",
12677
+ {
12678
+ type: "button",
12679
+ onClick: onNoThanks,
12680
+ disabled: loading,
12681
+ style: noThanksStyle(tokens.text, loading),
12682
+ children: "No thanks"
12683
+ }
12684
+ )
12685
+ ] })
12686
+ ] })
12687
+ ] });
12688
+ }
12689
+ var containerStyle9 = (tokens) => ({
12690
+ position: "relative",
12691
+ display: "flex",
12692
+ flexDirection: "column",
12693
+ width: "100%",
12694
+ maxWidth: 420,
12695
+ height: "100%",
12696
+ margin: "0 auto",
12697
+ overflow: "hidden",
12698
+ borderRadius: tokens.radiusLg,
12699
+ background: tokens.bgCard,
12700
+ backdropFilter: "blur(16px)",
12701
+ WebkitBackdropFilter: "blur(16px)",
12702
+ fontFamily: tokens.fontFamily,
12703
+ boxSizing: "border-box"
12704
+ });
12705
+ var contentStyle9 = {
12706
+ flex: 1,
12707
+ minHeight: 0,
12708
+ display: "flex",
12709
+ flexDirection: "column",
12710
+ justifyContent: "space-between",
12711
+ alignItems: "center",
12712
+ padding: "72px 32px 32px",
12713
+ gap: 24,
12714
+ boxSizing: "border-box"
12715
+ };
12716
+ var heroStyle3 = {
12717
+ flex: 1,
12718
+ minHeight: 0,
12719
+ display: "flex",
12720
+ flexDirection: "column",
12721
+ justifyContent: "center",
12722
+ alignItems: "center",
12723
+ gap: 16,
12724
+ width: "100%"
12725
+ };
12726
+ var titleStyle4 = (color) => ({
12727
+ margin: 0,
12728
+ color,
12729
+ fontSize: 24,
12730
+ fontWeight: 700,
12731
+ lineHeight: 1.05,
12732
+ letterSpacing: 0,
12733
+ textAlign: "center"
12734
+ });
12735
+ var illustrationStyle3 = {
12736
+ width: 160,
12737
+ height: 160,
12738
+ objectFit: "contain",
12739
+ display: "block"
12740
+ };
12741
+ var infoCardStyle2 = (bg) => ({
12742
+ display: "flex",
12743
+ gap: 12,
12744
+ alignItems: "flex-start",
12745
+ width: "100%",
12746
+ padding: 20,
12747
+ borderRadius: 24,
12748
+ background: bg,
12749
+ boxSizing: "border-box"
12750
+ });
12751
+ var infoTextStyle = {
12752
+ display: "flex",
12753
+ flexDirection: "column",
12754
+ gap: 4,
12755
+ flex: 1,
12756
+ minWidth: 0,
12757
+ paddingTop: 2
12758
+ };
12759
+ var infoTitleStyle = (color) => ({
12760
+ color,
12761
+ fontSize: 16,
12762
+ fontWeight: 700,
12763
+ lineHeight: 1.2
12764
+ });
12765
+ var infoSubtitleStyle = (color) => ({
12766
+ color,
12767
+ fontSize: 16,
12768
+ fontWeight: 400,
12769
+ lineHeight: 1.2
12770
+ });
12771
+ var footerStackStyle2 = {
12772
+ display: "flex",
12773
+ flexDirection: "column",
12774
+ gap: 8,
12775
+ width: "100%"
12776
+ };
12777
+ var ctaStyle = (tokens, disabled) => ({
12778
+ display: "flex",
12779
+ alignItems: "center",
12780
+ justifyContent: "center",
12781
+ width: "100%",
12782
+ height: 56,
12783
+ padding: "4px 24px",
12784
+ border: "none",
12785
+ borderRadius: 48,
12786
+ background: `linear-gradient(180deg, ${tokens.accent}, ${tokens.accentHover})`,
12787
+ color: tokens.accentText,
12788
+ fontSize: 16,
12789
+ fontWeight: 700,
12790
+ fontFamily: "inherit",
12791
+ cursor: disabled ? "default" : "pointer",
12792
+ opacity: disabled ? 0.5 : 1,
12793
+ transition: "opacity 0.15s ease",
12794
+ boxSizing: "border-box"
12795
+ });
12796
+ var noThanksStyle = (color, disabled) => ({
12797
+ width: "100%",
12798
+ height: 56,
12799
+ padding: "0 16px",
12800
+ background: "transparent",
12801
+ color,
12802
+ border: "none",
12803
+ borderRadius: 48,
12804
+ fontSize: 16,
12805
+ fontWeight: 400,
12806
+ fontFamily: "inherit",
12807
+ cursor: disabled ? "not-allowed" : "pointer",
12808
+ opacity: disabled ? 0.5 : 1,
12809
+ transition: "opacity 0.15s ease"
12810
+ });
12811
+ var navButtonStyle = (bg, color) => ({
12812
+ position: "absolute",
12813
+ top: 16,
12814
+ zIndex: 1,
12815
+ width: 44,
12816
+ height: 44,
12817
+ border: "none",
12818
+ borderRadius: 40,
12819
+ background: bg,
12820
+ color,
12821
+ display: "flex",
12822
+ alignItems: "center",
12823
+ justifyContent: "center",
12824
+ cursor: "pointer",
12825
+ padding: 0
12826
+ });
12827
+ var errorBannerStyle6 = (tokens) => ({
12828
+ width: "100%",
12829
+ borderRadius: 16,
12830
+ padding: "11px 14px",
12831
+ background: tokens.errorBg,
12832
+ border: `1px solid ${tokens.error}66`,
12833
+ color: tokens.error,
12834
+ fontSize: "0.84rem",
12835
+ lineHeight: 1.5,
12836
+ textAlign: "left",
12837
+ boxSizing: "border-box"
12838
+ });
12221
12839
  var SHIMMER_ROWS = 3;
12222
12840
  function LinkTokensScreen({
12223
12841
  entries: entries2,
@@ -12240,7 +12858,7 @@ function LinkTokensScreen({
12240
12858
  ScreenLayout,
12241
12859
  {
12242
12860
  scrollableBody: false,
12243
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle2, children: [
12861
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
12244
12862
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockBannerStyle, children: [
12245
12863
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: lockIconWrapStyle(t.text), children: /* @__PURE__ */ jsxRuntime.jsx(LockIcon2, {}) }),
12246
12864
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: lockBannerTextStyle(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -12274,11 +12892,11 @@ function LinkTokensScreen({
12274
12892
  {
12275
12893
  onBack,
12276
12894
  onLogout,
12277
- center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 })
12895
+ center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
12278
12896
  }
12279
12897
  ),
12280
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle9, children: [
12281
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle7(t.text), children: "Pick your asset for passkey deposits" }),
12898
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle10, children: [
12899
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle6(t.text), children: "Pick your asset for passkey deposits" }),
12282
12900
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
12283
12901
  showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs(
12284
12902
  "div",
@@ -12330,7 +12948,7 @@ function LockIcon2() {
12330
12948
  }
12331
12949
  ) });
12332
12950
  }
12333
- var contentStyle9 = {
12951
+ var contentStyle10 = {
12334
12952
  display: "flex",
12335
12953
  flexDirection: "column",
12336
12954
  alignItems: "center",
@@ -12340,14 +12958,14 @@ var contentStyle9 = {
12340
12958
  minHeight: 0,
12341
12959
  width: "100%"
12342
12960
  };
12343
- var wordmarkImgStyle2 = {
12961
+ var wordmarkImgStyle3 = {
12344
12962
  height: 22,
12345
12963
  width: "auto",
12346
12964
  display: "block",
12347
12965
  pointerEvents: "none",
12348
12966
  userSelect: "none"
12349
12967
  };
12350
- var headingStyle7 = (color) => ({
12968
+ var headingStyle6 = (color) => ({
12351
12969
  fontSize: 24,
12352
12970
  fontWeight: 700,
12353
12971
  lineHeight: "normal",
@@ -12415,7 +13033,7 @@ var bannerSlotStyle = {
12415
13033
  justifyContent: "center",
12416
13034
  width: "100%"
12417
13035
  };
12418
- var footerStackStyle2 = {
13036
+ var footerStackStyle3 = {
12419
13037
  display: "flex",
12420
13038
  flexDirection: "column",
12421
13039
  gap: 16,
@@ -12451,7 +13069,7 @@ function DepositCompleteScreen({ amount }) {
12451
13069
  const { tokens } = useBlinkConfig();
12452
13070
  return /* @__PURE__ */ jsxRuntime.jsxs(ScreenLayout, { children: [
12453
13071
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, {}),
12454
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle10, children: [
13072
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle11, children: [
12455
13073
  /* @__PURE__ */ jsxRuntime.jsx(
12456
13074
  "img",
12457
13075
  {
@@ -12461,12 +13079,12 @@ function DepositCompleteScreen({ amount }) {
12461
13079
  style: illustrationStyle4
12462
13080
  }
12463
13081
  ),
12464
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle8(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
12465
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle6(tokens.textSecondary), children: "You\u2019re all set for one-tap deposits now. Next time, just use your passkey." })
13082
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle7(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
13083
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle5(tokens.textSecondary), children: "You\u2019re all set for one-tap deposits now. Next time, just use your passkey." })
12466
13084
  ] })
12467
13085
  ] });
12468
13086
  }
12469
- var contentStyle10 = {
13087
+ var contentStyle11 = {
12470
13088
  flex: 1,
12471
13089
  display: "flex",
12472
13090
  flexDirection: "column",
@@ -12482,7 +13100,7 @@ var illustrationStyle4 = {
12482
13100
  objectFit: "contain",
12483
13101
  display: "block"
12484
13102
  };
12485
- var headingStyle8 = (color) => ({
13103
+ var headingStyle7 = (color) => ({
12486
13104
  fontSize: "2rem",
12487
13105
  fontWeight: 700,
12488
13106
  lineHeight: 1.05,
@@ -12490,7 +13108,7 @@ var headingStyle8 = (color) => ({
12490
13108
  color,
12491
13109
  margin: 0
12492
13110
  });
12493
- var subtitleStyle6 = (color) => ({
13111
+ var subtitleStyle5 = (color) => ({
12494
13112
  fontSize: "1rem",
12495
13113
  color,
12496
13114
  margin: 0,
@@ -12623,7 +13241,7 @@ function SelectDepositSourceScreen({
12623
13241
  footer,
12624
13242
  children: [
12625
13243
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { title: "Select source", onBack: onBack ?? onDone, onLogout }),
12626
- /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "select-deposit-source-scroll-content", style: contentStyle11, children: [
13244
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "select-deposit-source-scroll-content", style: contentStyle12, children: [
12627
13245
  orderedAccounts.map((account) => {
12628
13246
  const authRows = authorized.filter((opt) => rowAccountId(opt) === account.id);
12629
13247
  const reqRows = requiresAuth.filter((opt) => rowAccountId(opt) === account.id);
@@ -12666,7 +13284,7 @@ function SelectDepositSourceScreen({
12666
13284
  label: "Send manually",
12667
13285
  color: tokens.text,
12668
13286
  onClick: onSendManually,
12669
- icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon2, { color: tokens.text })
13287
+ icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon3, { color: tokens.text })
12670
13288
  }
12671
13289
  ),
12672
13290
  onAddProvider && /* @__PURE__ */ jsxRuntime.jsx(
@@ -12684,7 +13302,7 @@ function SelectDepositSourceScreen({
12684
13302
  }
12685
13303
  );
12686
13304
  }
12687
- var contentStyle11 = {
13305
+ var contentStyle12 = {
12688
13306
  display: "flex",
12689
13307
  flexDirection: "column",
12690
13308
  gap: 8,
@@ -12776,7 +13394,7 @@ function ActionRow({
12776
13394
  }
12777
13395
  );
12778
13396
  }
12779
- function QrIcon2({ color }) {
13397
+ function QrIcon3({ color }) {
12780
13398
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12781
13399
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12782
13400
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -13474,7 +14092,7 @@ function SuccessScreen({
13474
14092
  type: "button",
13475
14093
  onClick: onDone,
13476
14094
  "aria-label": "Close",
13477
- style: closeButtonStyle4(tokens),
14095
+ style: closeButtonStyle5(tokens),
13478
14096
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
13479
14097
  "path",
13480
14098
  {
@@ -13509,7 +14127,7 @@ function SuccessScreen({
13509
14127
  style: illustrationStyle5
13510
14128
  }
13511
14129
  ),
13512
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle9(tokens.text), children: "You\u2019re all set" })
14130
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle8(tokens.text), children: "You\u2019re all set" })
13513
14131
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: screenContentStyle, children: [
13514
14132
  /* @__PURE__ */ jsxRuntime.jsx(IconCircle, { variant: "error", size: 64, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z", fill: tokens.error }) }) }),
13515
14133
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: failureHeadingStyle(tokens.text), children: "Transfer failed" }),
@@ -13518,7 +14136,7 @@ function SuccessScreen({
13518
14136
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: summaryLabelStyle(tokens.textMuted), children: "From" }),
13519
14137
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: summaryValueStyle(tokens.text), children: sourceName })
13520
14138
  ] }) }),
13521
- !sourceName && merchantName && /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle7(tokens.textSecondary), children: [
14139
+ !sourceName && merchantName && /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle6(tokens.textSecondary), children: [
13522
14140
  "to ",
13523
14141
  merchantName,
13524
14142
  " \u2014 $",
@@ -13544,7 +14162,7 @@ var illustrationStyle5 = {
13544
14162
  objectFit: "contain",
13545
14163
  display: "block"
13546
14164
  };
13547
- var headingStyle9 = (color) => ({
14165
+ var headingStyle8 = (color) => ({
13548
14166
  fontSize: "2rem",
13549
14167
  fontWeight: 700,
13550
14168
  lineHeight: 1.05,
@@ -13559,7 +14177,7 @@ var screenContentStyle = {
13559
14177
  alignItems: "center",
13560
14178
  paddingTop: 16
13561
14179
  };
13562
- var subtitleStyle7 = (color) => ({
14180
+ var subtitleStyle6 = (color) => ({
13563
14181
  fontSize: "0.9rem",
13564
14182
  color,
13565
14183
  margin: "0 0 28px",
@@ -13609,7 +14227,7 @@ var returnMessageStyle = (color) => ({
13609
14227
  margin: "0 0 4px",
13610
14228
  lineHeight: 1.5
13611
14229
  });
13612
- var closeButtonStyle4 = (tokens) => ({
14230
+ var closeButtonStyle5 = (tokens) => ({
13613
14231
  width: 40,
13614
14232
  height: 40,
13615
14233
  borderRadius: "50%",
@@ -13654,7 +14272,7 @@ function SelectSourceScreen({
13654
14272
  onLogout
13655
14273
  }
13656
14274
  ),
13657
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle8(tokens.textMuted), children: "Choose which chain and token to pay from." }),
14275
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle7(tokens.textMuted), children: "Choose which chain and token to pay from." }),
13658
14276
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle5(tokens.textSecondary), children: "Chain" }),
13659
14277
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: optionListStyle, children: choices.map((chain) => {
13660
14278
  const isSelected = chain.chainName === selectedChainName;
@@ -13716,7 +14334,7 @@ function SelectSourceScreen({
13716
14334
  }
13717
14335
  );
13718
14336
  }
13719
- var subtitleStyle8 = (color) => ({
14337
+ var subtitleStyle7 = (color) => ({
13720
14338
  fontSize: "0.85rem",
13721
14339
  color,
13722
14340
  margin: "0 0 20px",
@@ -13858,8 +14476,8 @@ function AdvancedSourceScreen({
13858
14476
  right: /* @__PURE__ */ jsxRuntime.jsx("span", { style: advancedBadgeStyle(tokens.accent), children: "Advanced" })
13859
14477
  }
13860
14478
  ),
13861
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle10(tokens.text), children: "Set up One-Tap deposits" }),
13862
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle9(tokens.textSecondary), children: "Select a token source for your One-Tap deposits." }),
14479
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle9(tokens.text), children: "Set up One-Tap deposits" }),
14480
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle8(tokens.textSecondary), children: "Select a token source for your One-Tap deposits." }),
13863
14481
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle6(tokens.textSecondary), children: "Select tokens to approve" }),
13864
14482
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: chainListStyle, children: choices.map((chain) => {
13865
14483
  const isExpanded = expandedChain === chain.chainName;
@@ -13922,14 +14540,14 @@ var advancedBadgeStyle = (color) => ({
13922
14540
  padding: "3px 10px",
13923
14541
  letterSpacing: "0.02em"
13924
14542
  });
13925
- var headingStyle10 = (color) => ({
14543
+ var headingStyle9 = (color) => ({
13926
14544
  fontSize: "1.3rem",
13927
14545
  fontWeight: 700,
13928
14546
  letterSpacing: "-0.02em",
13929
14547
  color,
13930
14548
  margin: "8px 0 4px"
13931
14549
  });
13932
- var subtitleStyle9 = (color) => ({
14550
+ var subtitleStyle8 = (color) => ({
13933
14551
  fontSize: "0.86rem",
13934
14552
  color,
13935
14553
  margin: "0 0 20px",
@@ -14063,8 +14681,8 @@ function TransferStatusLayout({
14063
14681
  footer: showRetry && onRetry ? /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetry, children: retryLabel }) : void 0,
14064
14682
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: wrapperStyle, children: [
14065
14683
  onLogout && /* @__PURE__ */ jsxRuntime.jsx("div", { style: menuOverlayStyle, children: /* @__PURE__ */ jsxRuntime.jsx(SettingsMenu, { onLogout }) }),
14066
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle12, children: [
14067
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle11(tokens.text), children: heading }),
14684
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle13, children: [
14685
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle10(tokens.text), children: heading }),
14068
14686
  visibleError && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle7(tokens), children: visibleError }),
14069
14687
  children
14070
14688
  ] })
@@ -14141,7 +14759,7 @@ var menuOverlayStyle = {
14141
14759
  right: 0,
14142
14760
  zIndex: 1
14143
14761
  };
14144
- var contentStyle12 = {
14762
+ var contentStyle13 = {
14145
14763
  flex: 1,
14146
14764
  display: "flex",
14147
14765
  flexDirection: "column",
@@ -14151,7 +14769,7 @@ var contentStyle12 = {
14151
14769
  padding: "32px 0",
14152
14770
  width: "100%"
14153
14771
  };
14154
- var headingStyle11 = (color) => ({
14772
+ var headingStyle10 = (color) => ({
14155
14773
  fontSize: "1.5rem",
14156
14774
  fontWeight: 700,
14157
14775
  lineHeight: "normal",
@@ -14258,7 +14876,7 @@ function DepositAddressScreen({
14258
14876
  ) : void 0
14259
14877
  }
14260
14878
  ),
14261
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle13, children: [
14879
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle14, children: [
14262
14880
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: depositTitleStyle(tokens.text), children: "Deposit Address" }),
14263
14881
  qrReady && session && selectedOption ? /* @__PURE__ */ jsxRuntime.jsx(
14264
14882
  DepositQrCode,
@@ -14353,7 +14971,7 @@ var FeeRow = react.memo(function FeeRow2({
14353
14971
  }) {
14354
14972
  return /* @__PURE__ */ jsxRuntime.jsx("p", { style: bodyStyle3(color), children: feeCopy2 });
14355
14973
  });
14356
- var contentStyle13 = {
14974
+ var contentStyle14 = {
14357
14975
  alignItems: "center",
14358
14976
  display: "flex",
14359
14977
  flex: 1,
@@ -14585,7 +15203,7 @@ function OpenWalletScreen({
14585
15203
  return /* @__PURE__ */ jsxRuntime.jsxs(
14586
15204
  ScreenLayout,
14587
15205
  {
14588
- footer: error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
15206
+ footer: error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14589
15207
  /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14590
15208
  onRetryAuthorization && /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetryAuthorization, children: "Retry" })
14591
15209
  ] }) : void 0,
@@ -14603,7 +15221,7 @@ function OpenWalletScreen({
14603
15221
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: desktopContentStyle, children: [
14604
15222
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: primaryClusterStyle, children: [
14605
15223
  logoBlock,
14606
- /* @__PURE__ */ jsxRuntime.jsxs("h2", { style: headingStyle12(tokens.text), children: [
15224
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { style: headingStyle11(tokens.text), children: [
14607
15225
  "Setting up ",
14608
15226
  displayName,
14609
15227
  "\u2026"
@@ -14635,7 +15253,7 @@ function OpenWalletScreen({
14635
15253
  return /* @__PURE__ */ jsxRuntime.jsxs(
14636
15254
  ScreenLayout,
14637
15255
  {
14638
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
15256
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14639
15257
  error && /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14640
15258
  /* @__PURE__ */ jsxRuntime.jsxs(
14641
15259
  SecondaryButton,
@@ -14666,7 +15284,7 @@ function OpenWalletScreen({
14666
15284
  {
14667
15285
  type: "button",
14668
15286
  onClick: onLogout,
14669
- style: closeButtonStyle5(tokens.bgRecessed, tokens.text),
15287
+ style: closeButtonStyle6(tokens.bgRecessed, tokens.text),
14670
15288
  "aria-label": "Close",
14671
15289
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
14672
15290
  "path",
@@ -14708,7 +15326,7 @@ function useDelayedStatusRetry(enabled, deeplinkUri) {
14708
15326
  }, [deeplinkUri, enabled]);
14709
15327
  return visible;
14710
15328
  }
14711
- var contentStyle14 = {
15329
+ var contentStyle15 = {
14712
15330
  flex: 1,
14713
15331
  display: "flex",
14714
15332
  flexDirection: "column",
@@ -14718,7 +15336,7 @@ var contentStyle14 = {
14718
15336
  gap: 12
14719
15337
  };
14720
15338
  var desktopContentStyle = {
14721
- ...contentStyle14,
15339
+ ...contentStyle15,
14722
15340
  gap: 32
14723
15341
  };
14724
15342
  var primaryClusterStyle = {
@@ -14728,7 +15346,7 @@ var primaryClusterStyle = {
14728
15346
  textAlign: "center",
14729
15347
  gap: 12
14730
15348
  };
14731
- var footerStackStyle3 = {
15349
+ var footerStackStyle4 = {
14732
15350
  display: "flex",
14733
15351
  flexDirection: "column",
14734
15352
  gap: 8
@@ -14777,7 +15395,7 @@ var reownLogoStyle = {
14777
15395
  borderRadius: "50%",
14778
15396
  objectFit: "cover"
14779
15397
  };
14780
- var headingStyle12 = (color) => ({
15398
+ var headingStyle11 = (color) => ({
14781
15399
  fontSize: "1.5rem",
14782
15400
  fontWeight: 700,
14783
15401
  lineHeight: 1.1,
@@ -14893,7 +15511,7 @@ var mobileBodyStyle = (color) => ({
14893
15511
  margin: 0,
14894
15512
  maxWidth: 350
14895
15513
  });
14896
- var closeButtonStyle5 = (bg, color) => ({
15514
+ var closeButtonStyle6 = (bg, color) => ({
14897
15515
  width: 44,
14898
15516
  height: 44,
14899
15517
  borderRadius: "50%",
@@ -14929,7 +15547,7 @@ function ApprovingInWalletScreen({
14929
15547
  ScreenLayout,
14930
15548
  {
14931
15549
  scrollableBody: false,
14932
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
15550
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle5, children: [
14933
15551
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockBannerStyle2, children: [
14934
15552
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsxRuntime.jsx(LockIcon3, {}) }),
14935
15553
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -14945,11 +15563,11 @@ function ApprovingInWalletScreen({
14945
15563
  {
14946
15564
  onBack,
14947
15565
  onLogout,
14948
- center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
15566
+ center: /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle4 })
14949
15567
  }
14950
15568
  ),
14951
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle15, children: [
14952
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle13(t.text), children: `Authorizing ${token} for passkey deposits` }),
15569
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle16, children: [
15570
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle12(t.text), children: `Authorizing ${token} for passkey deposits` }),
14953
15571
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14954
15572
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14955
15573
  steps.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(ChecklistRow, { step: s }, i))
@@ -15043,14 +15661,14 @@ function LockIcon3() {
15043
15661
  }
15044
15662
  ) });
15045
15663
  }
15046
- var wordmarkImgStyle3 = {
15664
+ var wordmarkImgStyle4 = {
15047
15665
  height: 22,
15048
15666
  width: "auto",
15049
15667
  display: "block",
15050
15668
  pointerEvents: "none",
15051
15669
  userSelect: "none"
15052
15670
  };
15053
- var contentStyle15 = {
15671
+ var contentStyle16 = {
15054
15672
  display: "flex",
15055
15673
  flexDirection: "column",
15056
15674
  alignItems: "center",
@@ -15060,7 +15678,7 @@ var contentStyle15 = {
15060
15678
  minHeight: 0,
15061
15679
  width: "100%"
15062
15680
  };
15063
- var headingStyle13 = (color) => ({
15681
+ var headingStyle12 = (color) => ({
15064
15682
  fontSize: 24,
15065
15683
  fontWeight: 700,
15066
15684
  lineHeight: "normal",
@@ -15111,7 +15729,7 @@ var labelStyle7 = (color) => ({
15111
15729
  lineHeight: 1.25,
15112
15730
  color
15113
15731
  });
15114
- var footerStackStyle4 = {
15732
+ var footerStackStyle5 = {
15115
15733
  display: "flex",
15116
15734
  flexDirection: "column",
15117
15735
  gap: 16,
@@ -15175,10 +15793,10 @@ function ConfirmSignScreen({
15175
15793
  ] }),
15176
15794
  children: [
15177
15795
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onLogout }),
15178
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle16, children: [
15796
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle17, children: [
15179
15797
  logoSrc ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: 48 }),
15180
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
15181
- /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle10(tokens.textSecondary), children: subtitle }),
15798
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle13(tokens.text), children: heading }),
15799
+ /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle9(tokens.textSecondary), children: subtitle }),
15182
15800
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: successBadgeStyle(tokens), children: [
15183
15801
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: checkmarkStyle, children: "\u2713" }),
15184
15802
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: badge })
@@ -15188,7 +15806,7 @@ function ConfirmSignScreen({
15188
15806
  }
15189
15807
  );
15190
15808
  }
15191
- var contentStyle16 = {
15809
+ var contentStyle17 = {
15192
15810
  flex: 1,
15193
15811
  display: "flex",
15194
15812
  flexDirection: "column",
@@ -15203,14 +15821,14 @@ var logoStyle3 = {
15203
15821
  borderRadius: 14,
15204
15822
  objectFit: "contain"
15205
15823
  };
15206
- var headingStyle14 = (color) => ({
15824
+ var headingStyle13 = (color) => ({
15207
15825
  fontSize: "1.45rem",
15208
15826
  fontWeight: 700,
15209
15827
  letterSpacing: "-0.02em",
15210
15828
  color,
15211
15829
  margin: "20px 0 8px"
15212
15830
  });
15213
- var subtitleStyle10 = (color) => ({
15831
+ var subtitleStyle9 = (color) => ({
15214
15832
  fontSize: "0.9rem",
15215
15833
  color,
15216
15834
  margin: "0 0 24px",
@@ -15567,10 +16185,10 @@ function GuestTokenPickerScreen({
15567
16185
  ] }),
15568
16186
  children: [
15569
16187
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15570
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle17, children: [
15571
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle15(tokens.text), children: title }),
16188
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle18, children: [
16189
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle14(tokens.text), children: title }),
15572
16190
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15573
- entries2.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle11(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16191
+ entries2.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle10(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15574
16192
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15575
16193
  /* @__PURE__ */ jsxRuntime.jsx(
15576
16194
  "button",
@@ -15644,21 +16262,21 @@ function TokenRow({
15644
16262
  ] })
15645
16263
  ] });
15646
16264
  }
15647
- var contentStyle17 = {
16265
+ var contentStyle18 = {
15648
16266
  flex: 1,
15649
16267
  display: "flex",
15650
16268
  flexDirection: "column",
15651
16269
  padding: "0 20px 16px",
15652
16270
  gap: 12
15653
16271
  };
15654
- var headingStyle15 = (color) => ({
16272
+ var headingStyle14 = (color) => ({
15655
16273
  fontSize: "1.25rem",
15656
16274
  fontWeight: 700,
15657
16275
  color,
15658
16276
  margin: "0 0 8px",
15659
16277
  textAlign: "center"
15660
16278
  });
15661
- var subtitleStyle11 = (color) => ({
16279
+ var subtitleStyle10 = (color) => ({
15662
16280
  fontSize: "0.9rem",
15663
16281
  color,
15664
16282
  textAlign: "center"
@@ -15752,6 +16370,7 @@ var errorBannerStyle8 = (themeTokens) => ({
15752
16370
  });
15753
16371
  function ManualTransferFlow({
15754
16372
  hasMerchantAuthorization,
16373
+ authenticated = false,
15755
16374
  onCreatePasskey,
15756
16375
  createPasskeyLoading = false,
15757
16376
  createPasskeyError = null,
@@ -15795,8 +16414,8 @@ function ManualTransferFlow({
15795
16414
  if (!hasMerchantAuthorization) {
15796
16415
  screenContent = /* @__PURE__ */ jsxRuntime.jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15797
16416
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15798
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle18, children: [
15799
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle16(tokens.text), children: "Manual transfer unavailable" }),
16417
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle19, children: [
16418
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle15(tokens.text), children: "Manual transfer unavailable" }),
15800
16419
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15801
16420
  ] })
15802
16421
  ] });
@@ -15830,7 +16449,19 @@ function ManualTransferFlow({
15830
16449
  );
15831
16450
  } else if (screen === "deposit-complete") {
15832
16451
  const transferAmount = Number(session?.deliveredAmountUsd ?? session?.minAmountUsd ?? 0);
15833
- screenContent = /* @__PURE__ */ jsxRuntime.jsx(
16452
+ const showPasskeyUpsell = !authenticated && !passkeyCreated;
16453
+ screenContent = showPasskeyUpsell ? /* @__PURE__ */ jsxRuntime.jsx(
16454
+ ManualTransferPasskeyScreen,
16455
+ {
16456
+ onCreatePasskey: onCreatePasskey ?? (() => void 0),
16457
+ onNoThanks: onDismiss ?? onLogout ?? (() => void 0),
16458
+ amountUsd: transferAmount,
16459
+ loading: createPasskeyLoading,
16460
+ error: createPasskeyError,
16461
+ onBack,
16462
+ onClose: onDismiss ?? onLogout
16463
+ }
16464
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
15834
16465
  SuccessScreen,
15835
16466
  {
15836
16467
  amount: transferAmount,
@@ -15839,7 +16470,7 @@ function ManualTransferFlow({
15839
16470
  onDone: onDismiss,
15840
16471
  onLogout
15841
16472
  }
15842
- ) ;
16473
+ );
15843
16474
  } else if (screen === "deposit-failed") {
15844
16475
  screenContent = /* @__PURE__ */ jsxRuntime.jsx(
15845
16476
  BlinkErrorScreen,
@@ -15864,7 +16495,7 @@ function ManualTransferFlow({
15864
16495
  }
15865
16496
  return screenContent;
15866
16497
  }
15867
- var contentStyle18 = {
16498
+ var contentStyle19 = {
15868
16499
  alignItems: "center",
15869
16500
  display: "flex",
15870
16501
  flex: 1,
@@ -15875,7 +16506,7 @@ var contentStyle18 = {
15875
16506
  paddingBottom: 24,
15876
16507
  width: "100%"
15877
16508
  };
15878
- var headingStyle16 = (color) => ({
16509
+ var headingStyle15 = (color) => ({
15879
16510
  color,
15880
16511
  fontSize: "2rem",
15881
16512
  lineHeight: 1.05,
@@ -15900,7 +16531,7 @@ function GenericLoadingShimmer() {
15900
16531
  role: "status",
15901
16532
  "aria-label": "Loading payment flow",
15902
16533
  "aria-busy": "true",
15903
- style: sheetStyle2(tokens),
16534
+ style: sheetStyle3(tokens),
15904
16535
  children: [
15905
16536
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
15906
16537
  @keyframes blink-loading-shimmer {
@@ -15946,7 +16577,7 @@ function ShimmerBlock2({
15946
16577
  }
15947
16578
  );
15948
16579
  }
15949
- var sheetStyle2 = (tokens) => ({
16580
+ var sheetStyle3 = (tokens) => ({
15950
16581
  display: "flex",
15951
16582
  flexDirection: "column",
15952
16583
  height: "100%",
@@ -16007,6 +16638,19 @@ function buildDepositOptionsScreenProps({ flow, handlers }) {
16007
16638
  onClose: flow.isMobileApp ? void 0 : flow.onBack
16008
16639
  };
16009
16640
  }
16641
+ function buildWelcomeBackScreenProps({ flow, handlers }) {
16642
+ return {
16643
+ // "Complete setup & Deposit" advances the returning user to the wallet
16644
+ // picker (ACKNOWLEDGE_WELCOME_BACK releases the welcome-back derivation).
16645
+ onComplete: handlers.onAcknowledgeWelcomeBack,
16646
+ // "Send Crypto Manually" enters the manual-transfer flow, same target as
16647
+ // the logged-in source sheet's "Send manually" row.
16648
+ onToAddress: () => handlers.onSetPhase({ step: "manual-transfer" }),
16649
+ // Inside a native mobile in-app browser the host chrome handles dismissal,
16650
+ // so suppress the in-screen (X) close button.
16651
+ onClose: flow.isMobileApp ? void 0 : flow.onBack
16652
+ };
16653
+ }
16010
16654
  function buildWalletPickerScreenProps({
16011
16655
  flow,
16012
16656
  handlers
@@ -16427,6 +17071,7 @@ function StepRendererContent({
16427
17071
  ManualTransferFlow,
16428
17072
  {
16429
17073
  hasMerchantAuthorization: flow.merchantAuthorization != null,
17074
+ authenticated: flow.authenticated,
16430
17075
  onCreatePasskey: handlers.onSignupWithPasskey,
16431
17076
  createPasskeyLoading: flow.passkeyLoading,
16432
17077
  createPasskeyError: flow.state.error,
@@ -16441,6 +17086,8 @@ function StepRendererContent({
16441
17086
  return /* @__PURE__ */ jsxRuntime.jsx(LoginScreen, { ...buildLoginScreenProps(input) });
16442
17087
  case "deposit-options":
16443
17088
  return /* @__PURE__ */ jsxRuntime.jsx(DepositOptionsScreen, { ...buildDepositOptionsScreenProps(input) });
17089
+ case "welcome-back":
17090
+ return /* @__PURE__ */ jsxRuntime.jsx(WelcomeBackScreen, { ...buildWelcomeBackScreenProps(input) });
16444
17091
  case "wallet-picker":
16445
17092
  return /* @__PURE__ */ jsxRuntime.jsx(WalletPickerScreen, { ...buildWalletPickerScreenProps(input) });
16446
17093
  case "open-wallet":
@@ -19767,6 +20414,7 @@ function BlinkPaymentInner({
19767
20414
  onCommitTokenAuthorization: provider.handleCommitTokenAuthorization,
19768
20415
  onLogin: () => dispatch({ type: "REQUEST_LOGIN" }),
19769
20416
  onCancelLogin: () => dispatch({ type: "CANCEL_LOGIN_REQUEST" }),
20417
+ onAcknowledgeWelcomeBack: () => dispatch({ type: "ACKNOWLEDGE_WELCOME_BACK" }),
19770
20418
  onSetDepositToken: handleSetDepositToken,
19771
20419
  onConfirmSetupDeposit: handleConfirmSetupDeposit,
19772
20420
  onAmountInput: (value) => dispatch({ type: "SET_AMOUNT_INPUT", value }),
@@ -19884,6 +20532,7 @@ exports.InfoBanner = InfoBanner;
19884
20532
  exports.LOGIN_KEY_ILLUSTRATION = LOGIN_KEY_ILLUSTRATION;
19885
20533
  exports.LinkTokensScreen = LinkTokensScreen;
19886
20534
  exports.LoginScreen = LoginScreen;
20535
+ exports.ManualTransferPasskeyScreen = ManualTransferPasskeyScreen;
19887
20536
  exports.OpenWalletScreen = OpenWalletScreen;
19888
20537
  exports.OtpVerifyScreen = OtpVerifyScreen;
19889
20538
  exports.OutlineButton = OutlineButton;
@@ -19905,6 +20554,7 @@ exports.SuccessScreen = SuccessScreen;
19905
20554
  exports.TokenPickerScreen = TokenPickerScreen;
19906
20555
  exports.VerifyPasskeyScreen = VerifyPasskeyScreen;
19907
20556
  exports.WalletPickerScreen = WalletPickerScreen;
20557
+ exports.WelcomeBackScreen = WelcomeBackScreen;
19908
20558
  exports.appendDebug = appendDebug;
19909
20559
  exports.blinkApi = api_exports;
19910
20560
  exports.clearDebugEntries = clearDebugEntries;