@swype-org/react-sdk 0.2.312 → 0.2.316

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,16 +10559,60 @@ 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
+ });
10530
10606
 
10531
10607
  // src/deviceBiometricUnlockText.ts
10532
- var FALLBACK = "Biometric verification";
10608
+ var FALLBACK = "Passkey";
10533
10609
  function getDeviceBiometricUnlockText() {
10534
10610
  const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10535
10611
  if (/iPhone|iPad|iPod/i.test(ua)) {
10536
10612
  return "Face ID";
10537
10613
  }
10538
10614
  if (/Android/i.test(ua)) {
10539
- return "Fingerprint or face unlock";
10615
+ return "Fingerprint or Face";
10540
10616
  }
10541
10617
  if (/Windows NT/i.test(ua)) {
10542
10618
  return "Windows Hello";
@@ -10825,7 +10901,7 @@ function DepositOptionsScreen({
10825
10901
  onClick: onSignInWithBlink,
10826
10902
  style: depositPillStyle(tokens.accent),
10827
10903
  children: [
10828
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10904
+ /* @__PURE__ */ jsxRuntime.jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
10829
10905
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsxRuntime.jsx(
10830
10906
  "span",
10831
10907
  {
@@ -10932,6 +11008,7 @@ var depositPillStyle = (bg) => ({
10932
11008
  display: "flex",
10933
11009
  alignItems: "center",
10934
11010
  justifyContent: "space-between",
11011
+ gap: 8,
10935
11012
  width: "100%",
10936
11013
  height: 56,
10937
11014
  padding: "12px 12px 12px 24px",
@@ -10942,16 +11019,11 @@ var depositPillStyle = (bg) => ({
10942
11019
  boxSizing: "border-box",
10943
11020
  fontFamily: "inherit"
10944
11021
  });
10945
- var depositPillLabelStyle = (color) => ({
10946
- color,
10947
- fontSize: 16,
10948
- fontWeight: 500,
10949
- whiteSpace: "nowrap"
10950
- });
10951
11022
  var clusterStyle = {
10952
11023
  display: "inline-flex",
10953
11024
  alignItems: "center",
10954
- isolation: "isolate"
11025
+ isolation: "isolate",
11026
+ flexShrink: 0
10955
11027
  };
10956
11028
  var clusterChipStyle = (bg, last) => ({
10957
11029
  width: 32,
@@ -11046,117 +11118,406 @@ var closeButtonStyle2 = (bg, color) => ({
11046
11118
  cursor: "pointer",
11047
11119
  padding: 0
11048
11120
  });
11049
- function BlinkErrorScreen({
11050
- title,
11051
- message,
11052
- retryLabel,
11053
- 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,
11054
11132
  onClose
11055
11133
  }) {
11056
11134
  const { tokens } = useBlinkConfig();
11057
- const headerRight = onClose ? /* @__PURE__ */ jsxRuntime.jsx(
11058
- "button",
11059
- {
11060
- type: "button",
11061
- onClick: onClose,
11062
- "aria-label": "Close",
11063
- style: closeButtonStyle3(tokens),
11064
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
11065
- "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",
11066
11141
  {
11067
- d: "M6 6l12 12M18 6L6 18",
11068
- stroke: "currentColor",
11069
- strokeWidth: "2",
11070
- strokeLinecap: "round",
11071
- 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
+ ) })
11072
11156
  }
11073
- ) })
11074
- }
11075
- ) : void 0;
11076
- 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 }) {
11077
11207
  return /* @__PURE__ */ jsxRuntime.jsxs(
11078
- ScreenLayout,
11208
+ "svg",
11079
11209
  {
11080
- 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 },
11081
11216
  children: [
11082
- /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { right: headerRight }),
11083
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle3, children: [
11084
- /* @__PURE__ */ jsxRuntime.jsx(
11085
- "img",
11086
- {
11087
- src: BLINK_ERROR_ILLUSTRATION,
11088
- alt: "",
11089
- "aria-hidden": "true",
11090
- style: illustrationStyle2
11091
- }
11092
- ),
11093
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11094
- message && /* @__PURE__ */ jsxRuntime.jsx("p", { style: messageStyle(tokens.text), children: message })
11095
- ] })
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 })
11096
11227
  ]
11097
11228
  }
11098
11229
  );
11099
11230
  }
11231
+ var sheetStyle2 = {
11232
+ position: "relative",
11233
+ minHeight: "100%",
11234
+ display: "flex",
11235
+ flexDirection: "column",
11236
+ boxSizing: "border-box"
11237
+ };
11100
11238
  var contentStyle3 = {
11101
- textAlign: "center",
11102
- flex: 1,
11103
11239
  display: "flex",
11104
11240
  flexDirection: "column",
11105
11241
  alignItems: "center",
11106
- justifyContent: "center",
11107
- gap: 16
11242
+ gap: 32,
11243
+ padding: "32px 8px"
11108
11244
  };
11109
- var illustrationStyle2 = {
11110
- width: 200,
11111
- 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%",
11112
11261
  objectFit: "contain",
11113
11262
  display: "block"
11114
11263
  };
11115
- var headingStyle2 = (color) => ({
11116
- fontSize: "1.5rem",
11117
- fontWeight: 700,
11118
- lineHeight: 1.1,
11119
- letterSpacing: "-0.01em",
11120
- color,
11121
- margin: 0
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,
11282
+ border: "none",
11283
+ borderRadius: 32,
11284
+ cursor: "pointer",
11285
+ boxSizing: "border-box",
11286
+ fontFamily: "inherit"
11122
11287
  });
11123
- var messageStyle = (color) => ({
11124
- fontSize: "1rem",
11125
- fontWeight: 400,
11126
- lineHeight: 1.4,
11288
+ var completeSetupBandStyle = (color) => ({
11289
+ display: "flex",
11290
+ alignItems: "center",
11291
+ justifyContent: "center",
11292
+ height: 26,
11127
11293
  color,
11128
- margin: 0,
11129
- maxWidth: 320
11294
+ fontSize: 13,
11295
+ fontWeight: 600,
11296
+ letterSpacing: "0.01em"
11130
11297
  });
11131
- var closeButtonStyle3 = (tokens) => ({
11132
- width: 40,
11133
- height: 40,
11134
- borderRadius: "50%",
11135
- border: "none",
11136
- background: tokens.bgRecessed,
11137
- color: tokens.text,
11298
+ var depositPillStyle2 = (bg) => ({
11138
11299
  display: "flex",
11139
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",
11140
11324
  justifyContent: "center",
11141
- cursor: "pointer",
11142
- padding: 0
11325
+ marginRight: last ? 0 : -12,
11326
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
11327
+ flexShrink: 0
11143
11328
  });
11144
- function AmountTooLowScreen({
11145
- minAmountUsd,
11146
- onRetry,
11147
- onClose
11148
- }) {
11149
- return /* @__PURE__ */ jsxRuntime.jsx(
11150
- BlinkErrorScreen,
11151
- {
11152
- title: "Amount too low",
11153
- message: `The minimum payment amount is $${minAmountUsd.toFixed(2)}.`,
11154
- retryLabel: onRetry ? "Try Again" : void 0,
11155
- onRetry,
11156
- onClose
11157
- }
11158
- );
11159
- }
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({
11506
+ minAmountUsd,
11507
+ onRetry,
11508
+ onClose
11509
+ }) {
11510
+ return /* @__PURE__ */ jsxRuntime.jsx(
11511
+ BlinkErrorScreen,
11512
+ {
11513
+ title: "Amount too low",
11514
+ message: `The minimum payment amount is $${minAmountUsd.toFixed(2)}.`,
11515
+ retryLabel: onRetry ? "Try Again" : void 0,
11516
+ onRetry,
11517
+ onClose
11518
+ }
11519
+ );
11520
+ }
11160
11521
  var RESEND_COOLDOWN_SECONDS = 30;
11161
11522
  function OtpVerifyScreen({
11162
11523
  maskedIdentifier,
@@ -11210,7 +11571,7 @@ function OtpVerifyScreen({
11210
11571
  ] }),
11211
11572
  children: [
11212
11573
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
11213
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle4, children: [
11574
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle5, children: [
11214
11575
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle3(tokens.text), children: "Confirm it is you" }),
11215
11576
  /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle2(tokens.textSecondary), children: [
11216
11577
  "We sent a 6-digit code to",
@@ -11234,7 +11595,7 @@ function OtpVerifyScreen({
11234
11595
  }
11235
11596
  );
11236
11597
  }
11237
- var contentStyle4 = {
11598
+ var contentStyle5 = {
11238
11599
  textAlign: "center",
11239
11600
  display: "flex",
11240
11601
  flexDirection: "column",
@@ -11316,7 +11677,7 @@ function PasskeyScreen({
11316
11677
  ] }),
11317
11678
  children: [
11318
11679
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack, onLogout }),
11319
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle5, children: [
11680
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle6, children: [
11320
11681
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle4(tokens.text), children: "Secure your account with a passkey" }),
11321
11682
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: subtitleStyle3(tokens.textSecondary), children: "This enables secure one-tap deposits on this device" }),
11322
11683
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle2(tokens), children: error })
@@ -11325,7 +11686,7 @@ function PasskeyScreen({
11325
11686
  }
11326
11687
  );
11327
11688
  }
11328
- var contentStyle5 = {
11689
+ var contentStyle6 = {
11329
11690
  textAlign: "center",
11330
11691
  flex: 1,
11331
11692
  display: "flex",
@@ -11392,7 +11753,7 @@ function PasskeyPopupWelcomeScreen({
11392
11753
  ) }),
11393
11754
  children: [
11394
11755
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack, onLogout }),
11395
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle6, children: [
11756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle7, children: [
11396
11757
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockupStyle, children: [
11397
11758
  /* @__PURE__ */ jsxRuntime.jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11398
11759
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
@@ -11432,7 +11793,7 @@ function PasskeyIcon() {
11432
11793
  )
11433
11794
  ] });
11434
11795
  }
11435
- var contentStyle6 = {
11796
+ var contentStyle7 = {
11436
11797
  flex: 1,
11437
11798
  minHeight: 0,
11438
11799
  display: "flex",
@@ -11508,7 +11869,7 @@ function VerifyPasskeyScreen({
11508
11869
  ] }),
11509
11870
  children: [
11510
11871
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
11511
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle7, children: [
11872
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle8, children: [
11512
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: [
11513
11874
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "3", stroke: tokens.accent, strokeWidth: "1.5", strokeDasharray: "3 2" }),
11514
11875
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "10", r: "1", fill: tokens.accent }),
@@ -11524,7 +11885,7 @@ function VerifyPasskeyScreen({
11524
11885
  }
11525
11886
  );
11526
11887
  }
11527
- var contentStyle7 = {
11888
+ var contentStyle8 = {
11528
11889
  textAlign: "center",
11529
11890
  flex: 1,
11530
11891
  display: "flex",
@@ -12221,6 +12582,260 @@ var errorBannerStyle5 = (tokens) => ({
12221
12582
  marginBottom: 14,
12222
12583
  lineHeight: 1.5
12223
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
+ });
12224
12839
  var SHIMMER_ROWS = 3;
12225
12840
  function LinkTokensScreen({
12226
12841
  entries: entries2,
@@ -12243,7 +12858,7 @@ function LinkTokensScreen({
12243
12858
  ScreenLayout,
12244
12859
  {
12245
12860
  scrollableBody: false,
12246
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle2, children: [
12861
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
12247
12862
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockBannerStyle, children: [
12248
12863
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: lockIconWrapStyle(t.text), children: /* @__PURE__ */ jsxRuntime.jsx(LockIcon2, {}) }),
12249
12864
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: lockBannerTextStyle(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -12277,11 +12892,11 @@ function LinkTokensScreen({
12277
12892
  {
12278
12893
  onBack,
12279
12894
  onLogout,
12280
- 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 })
12281
12896
  }
12282
12897
  ),
12283
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle9, children: [
12284
- /* @__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" }),
12285
12900
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
12286
12901
  showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs(
12287
12902
  "div",
@@ -12333,7 +12948,7 @@ function LockIcon2() {
12333
12948
  }
12334
12949
  ) });
12335
12950
  }
12336
- var contentStyle9 = {
12951
+ var contentStyle10 = {
12337
12952
  display: "flex",
12338
12953
  flexDirection: "column",
12339
12954
  alignItems: "center",
@@ -12343,14 +12958,14 @@ var contentStyle9 = {
12343
12958
  minHeight: 0,
12344
12959
  width: "100%"
12345
12960
  };
12346
- var wordmarkImgStyle2 = {
12961
+ var wordmarkImgStyle3 = {
12347
12962
  height: 22,
12348
12963
  width: "auto",
12349
12964
  display: "block",
12350
12965
  pointerEvents: "none",
12351
12966
  userSelect: "none"
12352
12967
  };
12353
- var headingStyle7 = (color) => ({
12968
+ var headingStyle6 = (color) => ({
12354
12969
  fontSize: 24,
12355
12970
  fontWeight: 700,
12356
12971
  lineHeight: "normal",
@@ -12418,7 +13033,7 @@ var bannerSlotStyle = {
12418
13033
  justifyContent: "center",
12419
13034
  width: "100%"
12420
13035
  };
12421
- var footerStackStyle2 = {
13036
+ var footerStackStyle3 = {
12422
13037
  display: "flex",
12423
13038
  flexDirection: "column",
12424
13039
  gap: 16,
@@ -12454,7 +13069,7 @@ function DepositCompleteScreen({ amount }) {
12454
13069
  const { tokens } = useBlinkConfig();
12455
13070
  return /* @__PURE__ */ jsxRuntime.jsxs(ScreenLayout, { children: [
12456
13071
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, {}),
12457
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle10, children: [
13072
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle11, children: [
12458
13073
  /* @__PURE__ */ jsxRuntime.jsx(
12459
13074
  "img",
12460
13075
  {
@@ -12464,12 +13079,12 @@ function DepositCompleteScreen({ amount }) {
12464
13079
  style: illustrationStyle4
12465
13080
  }
12466
13081
  ),
12467
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle8(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
12468
- /* @__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." })
12469
13084
  ] })
12470
13085
  ] });
12471
13086
  }
12472
- var contentStyle10 = {
13087
+ var contentStyle11 = {
12473
13088
  flex: 1,
12474
13089
  display: "flex",
12475
13090
  flexDirection: "column",
@@ -12485,7 +13100,7 @@ var illustrationStyle4 = {
12485
13100
  objectFit: "contain",
12486
13101
  display: "block"
12487
13102
  };
12488
- var headingStyle8 = (color) => ({
13103
+ var headingStyle7 = (color) => ({
12489
13104
  fontSize: "2rem",
12490
13105
  fontWeight: 700,
12491
13106
  lineHeight: 1.05,
@@ -12493,7 +13108,7 @@ var headingStyle8 = (color) => ({
12493
13108
  color,
12494
13109
  margin: 0
12495
13110
  });
12496
- var subtitleStyle6 = (color) => ({
13111
+ var subtitleStyle5 = (color) => ({
12497
13112
  fontSize: "1rem",
12498
13113
  color,
12499
13114
  margin: 0,
@@ -12626,7 +13241,7 @@ function SelectDepositSourceScreen({
12626
13241
  footer,
12627
13242
  children: [
12628
13243
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { title: "Select source", onBack: onBack ?? onDone, onLogout }),
12629
- /* @__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: [
12630
13245
  orderedAccounts.map((account) => {
12631
13246
  const authRows = authorized.filter((opt) => rowAccountId(opt) === account.id);
12632
13247
  const reqRows = requiresAuth.filter((opt) => rowAccountId(opt) === account.id);
@@ -12669,7 +13284,7 @@ function SelectDepositSourceScreen({
12669
13284
  label: "Send manually",
12670
13285
  color: tokens.text,
12671
13286
  onClick: onSendManually,
12672
- icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon2, { color: tokens.text })
13287
+ icon: /* @__PURE__ */ jsxRuntime.jsx(QrIcon3, { color: tokens.text })
12673
13288
  }
12674
13289
  ),
12675
13290
  onAddProvider && /* @__PURE__ */ jsxRuntime.jsx(
@@ -12687,7 +13302,7 @@ function SelectDepositSourceScreen({
12687
13302
  }
12688
13303
  );
12689
13304
  }
12690
- var contentStyle11 = {
13305
+ var contentStyle12 = {
12691
13306
  display: "flex",
12692
13307
  flexDirection: "column",
12693
13308
  gap: 8,
@@ -12779,7 +13394,7 @@ function ActionRow({
12779
13394
  }
12780
13395
  );
12781
13396
  }
12782
- function QrIcon2({ color }) {
13397
+ function QrIcon3({ color }) {
12783
13398
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12784
13399
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12785
13400
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -13477,7 +14092,7 @@ function SuccessScreen({
13477
14092
  type: "button",
13478
14093
  onClick: onDone,
13479
14094
  "aria-label": "Close",
13480
- style: closeButtonStyle4(tokens),
14095
+ style: closeButtonStyle5(tokens),
13481
14096
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
13482
14097
  "path",
13483
14098
  {
@@ -13512,7 +14127,7 @@ function SuccessScreen({
13512
14127
  style: illustrationStyle5
13513
14128
  }
13514
14129
  ),
13515
- /* @__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" })
13516
14131
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: screenContentStyle, children: [
13517
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 }) }) }),
13518
14133
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: failureHeadingStyle(tokens.text), children: "Transfer failed" }),
@@ -13521,7 +14136,7 @@ function SuccessScreen({
13521
14136
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: summaryLabelStyle(tokens.textMuted), children: "From" }),
13522
14137
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: summaryValueStyle(tokens.text), children: sourceName })
13523
14138
  ] }) }),
13524
- !sourceName && merchantName && /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle7(tokens.textSecondary), children: [
14139
+ !sourceName && merchantName && /* @__PURE__ */ jsxRuntime.jsxs("p", { style: subtitleStyle6(tokens.textSecondary), children: [
13525
14140
  "to ",
13526
14141
  merchantName,
13527
14142
  " \u2014 $",
@@ -13547,7 +14162,7 @@ var illustrationStyle5 = {
13547
14162
  objectFit: "contain",
13548
14163
  display: "block"
13549
14164
  };
13550
- var headingStyle9 = (color) => ({
14165
+ var headingStyle8 = (color) => ({
13551
14166
  fontSize: "2rem",
13552
14167
  fontWeight: 700,
13553
14168
  lineHeight: 1.05,
@@ -13562,7 +14177,7 @@ var screenContentStyle = {
13562
14177
  alignItems: "center",
13563
14178
  paddingTop: 16
13564
14179
  };
13565
- var subtitleStyle7 = (color) => ({
14180
+ var subtitleStyle6 = (color) => ({
13566
14181
  fontSize: "0.9rem",
13567
14182
  color,
13568
14183
  margin: "0 0 28px",
@@ -13612,7 +14227,7 @@ var returnMessageStyle = (color) => ({
13612
14227
  margin: "0 0 4px",
13613
14228
  lineHeight: 1.5
13614
14229
  });
13615
- var closeButtonStyle4 = (tokens) => ({
14230
+ var closeButtonStyle5 = (tokens) => ({
13616
14231
  width: 40,
13617
14232
  height: 40,
13618
14233
  borderRadius: "50%",
@@ -13657,7 +14272,7 @@ function SelectSourceScreen({
13657
14272
  onLogout
13658
14273
  }
13659
14274
  ),
13660
- /* @__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." }),
13661
14276
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle5(tokens.textSecondary), children: "Chain" }),
13662
14277
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: optionListStyle, children: choices.map((chain) => {
13663
14278
  const isSelected = chain.chainName === selectedChainName;
@@ -13719,7 +14334,7 @@ function SelectSourceScreen({
13719
14334
  }
13720
14335
  );
13721
14336
  }
13722
- var subtitleStyle8 = (color) => ({
14337
+ var subtitleStyle7 = (color) => ({
13723
14338
  fontSize: "0.85rem",
13724
14339
  color,
13725
14340
  margin: "0 0 20px",
@@ -13861,8 +14476,8 @@ function AdvancedSourceScreen({
13861
14476
  right: /* @__PURE__ */ jsxRuntime.jsx("span", { style: advancedBadgeStyle(tokens.accent), children: "Advanced" })
13862
14477
  }
13863
14478
  ),
13864
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle10(tokens.text), children: "Set up One-Tap deposits" }),
13865
- /* @__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." }),
13866
14481
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle6(tokens.textSecondary), children: "Select tokens to approve" }),
13867
14482
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: chainListStyle, children: choices.map((chain) => {
13868
14483
  const isExpanded = expandedChain === chain.chainName;
@@ -13925,14 +14540,14 @@ var advancedBadgeStyle = (color) => ({
13925
14540
  padding: "3px 10px",
13926
14541
  letterSpacing: "0.02em"
13927
14542
  });
13928
- var headingStyle10 = (color) => ({
14543
+ var headingStyle9 = (color) => ({
13929
14544
  fontSize: "1.3rem",
13930
14545
  fontWeight: 700,
13931
14546
  letterSpacing: "-0.02em",
13932
14547
  color,
13933
14548
  margin: "8px 0 4px"
13934
14549
  });
13935
- var subtitleStyle9 = (color) => ({
14550
+ var subtitleStyle8 = (color) => ({
13936
14551
  fontSize: "0.86rem",
13937
14552
  color,
13938
14553
  margin: "0 0 20px",
@@ -14066,8 +14681,8 @@ function TransferStatusLayout({
14066
14681
  footer: showRetry && onRetry ? /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetry, children: retryLabel }) : void 0,
14067
14682
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: wrapperStyle, children: [
14068
14683
  onLogout && /* @__PURE__ */ jsxRuntime.jsx("div", { style: menuOverlayStyle, children: /* @__PURE__ */ jsxRuntime.jsx(SettingsMenu, { onLogout }) }),
14069
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle12, children: [
14070
- /* @__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 }),
14071
14686
  visibleError && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle7(tokens), children: visibleError }),
14072
14687
  children
14073
14688
  ] })
@@ -14144,7 +14759,7 @@ var menuOverlayStyle = {
14144
14759
  right: 0,
14145
14760
  zIndex: 1
14146
14761
  };
14147
- var contentStyle12 = {
14762
+ var contentStyle13 = {
14148
14763
  flex: 1,
14149
14764
  display: "flex",
14150
14765
  flexDirection: "column",
@@ -14154,7 +14769,7 @@ var contentStyle12 = {
14154
14769
  padding: "32px 0",
14155
14770
  width: "100%"
14156
14771
  };
14157
- var headingStyle11 = (color) => ({
14772
+ var headingStyle10 = (color) => ({
14158
14773
  fontSize: "1.5rem",
14159
14774
  fontWeight: 700,
14160
14775
  lineHeight: "normal",
@@ -14261,7 +14876,7 @@ function DepositAddressScreen({
14261
14876
  ) : void 0
14262
14877
  }
14263
14878
  ),
14264
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle13, children: [
14879
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle14, children: [
14265
14880
  /* @__PURE__ */ jsxRuntime.jsx("h2", { style: depositTitleStyle(tokens.text), children: "Deposit Address" }),
14266
14881
  qrReady && session && selectedOption ? /* @__PURE__ */ jsxRuntime.jsx(
14267
14882
  DepositQrCode,
@@ -14356,7 +14971,7 @@ var FeeRow = react.memo(function FeeRow2({
14356
14971
  }) {
14357
14972
  return /* @__PURE__ */ jsxRuntime.jsx("p", { style: bodyStyle3(color), children: feeCopy2 });
14358
14973
  });
14359
- var contentStyle13 = {
14974
+ var contentStyle14 = {
14360
14975
  alignItems: "center",
14361
14976
  display: "flex",
14362
14977
  flex: 1,
@@ -14588,7 +15203,7 @@ function OpenWalletScreen({
14588
15203
  return /* @__PURE__ */ jsxRuntime.jsxs(
14589
15204
  ScreenLayout,
14590
15205
  {
14591
- footer: error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
15206
+ footer: error ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14592
15207
  /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14593
15208
  onRetryAuthorization && /* @__PURE__ */ jsxRuntime.jsx(OutlineButton, { onClick: onRetryAuthorization, children: "Retry" })
14594
15209
  ] }) : void 0,
@@ -14606,7 +15221,7 @@ function OpenWalletScreen({
14606
15221
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: desktopContentStyle, children: [
14607
15222
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: primaryClusterStyle, children: [
14608
15223
  logoBlock,
14609
- /* @__PURE__ */ jsxRuntime.jsxs("h2", { style: headingStyle12(tokens.text), children: [
15224
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { style: headingStyle11(tokens.text), children: [
14610
15225
  "Setting up ",
14611
15226
  displayName,
14612
15227
  "\u2026"
@@ -14638,7 +15253,7 @@ function OpenWalletScreen({
14638
15253
  return /* @__PURE__ */ jsxRuntime.jsxs(
14639
15254
  ScreenLayout,
14640
15255
  {
14641
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle3, children: [
15256
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
14642
15257
  error && /* @__PURE__ */ jsxRuntime.jsx(InfoBanner, { children: error }),
14643
15258
  /* @__PURE__ */ jsxRuntime.jsxs(
14644
15259
  SecondaryButton,
@@ -14669,7 +15284,7 @@ function OpenWalletScreen({
14669
15284
  {
14670
15285
  type: "button",
14671
15286
  onClick: onLogout,
14672
- style: closeButtonStyle5(tokens.bgRecessed, tokens.text),
15287
+ style: closeButtonStyle6(tokens.bgRecessed, tokens.text),
14673
15288
  "aria-label": "Close",
14674
15289
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
14675
15290
  "path",
@@ -14711,7 +15326,7 @@ function useDelayedStatusRetry(enabled, deeplinkUri) {
14711
15326
  }, [deeplinkUri, enabled]);
14712
15327
  return visible;
14713
15328
  }
14714
- var contentStyle14 = {
15329
+ var contentStyle15 = {
14715
15330
  flex: 1,
14716
15331
  display: "flex",
14717
15332
  flexDirection: "column",
@@ -14721,7 +15336,7 @@ var contentStyle14 = {
14721
15336
  gap: 12
14722
15337
  };
14723
15338
  var desktopContentStyle = {
14724
- ...contentStyle14,
15339
+ ...contentStyle15,
14725
15340
  gap: 32
14726
15341
  };
14727
15342
  var primaryClusterStyle = {
@@ -14731,7 +15346,7 @@ var primaryClusterStyle = {
14731
15346
  textAlign: "center",
14732
15347
  gap: 12
14733
15348
  };
14734
- var footerStackStyle3 = {
15349
+ var footerStackStyle4 = {
14735
15350
  display: "flex",
14736
15351
  flexDirection: "column",
14737
15352
  gap: 8
@@ -14780,7 +15395,7 @@ var reownLogoStyle = {
14780
15395
  borderRadius: "50%",
14781
15396
  objectFit: "cover"
14782
15397
  };
14783
- var headingStyle12 = (color) => ({
15398
+ var headingStyle11 = (color) => ({
14784
15399
  fontSize: "1.5rem",
14785
15400
  fontWeight: 700,
14786
15401
  lineHeight: 1.1,
@@ -14896,7 +15511,7 @@ var mobileBodyStyle = (color) => ({
14896
15511
  margin: 0,
14897
15512
  maxWidth: 350
14898
15513
  });
14899
- var closeButtonStyle5 = (bg, color) => ({
15514
+ var closeButtonStyle6 = (bg, color) => ({
14900
15515
  width: 44,
14901
15516
  height: 44,
14902
15517
  borderRadius: "50%",
@@ -14932,7 +15547,7 @@ function ApprovingInWalletScreen({
14932
15547
  ScreenLayout,
14933
15548
  {
14934
15549
  scrollableBody: false,
14935
- footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle4, children: [
15550
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: footerStackStyle5, children: [
14936
15551
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: lockBannerStyle2, children: [
14937
15552
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsxRuntime.jsx(LockIcon3, {}) }),
14938
15553
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -14948,11 +15563,11 @@ function ApprovingInWalletScreen({
14948
15563
  {
14949
15564
  onBack,
14950
15565
  onLogout,
14951
- 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 })
14952
15567
  }
14953
15568
  ),
14954
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle15, children: [
14955
- /* @__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` }),
14956
15571
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14957
15572
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14958
15573
  steps.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(ChecklistRow, { step: s }, i))
@@ -15046,14 +15661,14 @@ function LockIcon3() {
15046
15661
  }
15047
15662
  ) });
15048
15663
  }
15049
- var wordmarkImgStyle3 = {
15664
+ var wordmarkImgStyle4 = {
15050
15665
  height: 22,
15051
15666
  width: "auto",
15052
15667
  display: "block",
15053
15668
  pointerEvents: "none",
15054
15669
  userSelect: "none"
15055
15670
  };
15056
- var contentStyle15 = {
15671
+ var contentStyle16 = {
15057
15672
  display: "flex",
15058
15673
  flexDirection: "column",
15059
15674
  alignItems: "center",
@@ -15063,7 +15678,7 @@ var contentStyle15 = {
15063
15678
  minHeight: 0,
15064
15679
  width: "100%"
15065
15680
  };
15066
- var headingStyle13 = (color) => ({
15681
+ var headingStyle12 = (color) => ({
15067
15682
  fontSize: 24,
15068
15683
  fontWeight: 700,
15069
15684
  lineHeight: "normal",
@@ -15114,7 +15729,7 @@ var labelStyle7 = (color) => ({
15114
15729
  lineHeight: 1.25,
15115
15730
  color
15116
15731
  });
15117
- var footerStackStyle4 = {
15732
+ var footerStackStyle5 = {
15118
15733
  display: "flex",
15119
15734
  flexDirection: "column",
15120
15735
  gap: 16,
@@ -15178,10 +15793,10 @@ function ConfirmSignScreen({
15178
15793
  ] }),
15179
15794
  children: [
15180
15795
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onLogout }),
15181
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle16, children: [
15796
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle17, children: [
15182
15797
  logoSrc ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsxRuntime.jsx(Spinner, { size: 48 }),
15183
- /* @__PURE__ */ jsxRuntime.jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
15184
- /* @__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 }),
15185
15800
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: successBadgeStyle(tokens), children: [
15186
15801
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: checkmarkStyle, children: "\u2713" }),
15187
15802
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: badge })
@@ -15191,7 +15806,7 @@ function ConfirmSignScreen({
15191
15806
  }
15192
15807
  );
15193
15808
  }
15194
- var contentStyle16 = {
15809
+ var contentStyle17 = {
15195
15810
  flex: 1,
15196
15811
  display: "flex",
15197
15812
  flexDirection: "column",
@@ -15206,14 +15821,14 @@ var logoStyle3 = {
15206
15821
  borderRadius: 14,
15207
15822
  objectFit: "contain"
15208
15823
  };
15209
- var headingStyle14 = (color) => ({
15824
+ var headingStyle13 = (color) => ({
15210
15825
  fontSize: "1.45rem",
15211
15826
  fontWeight: 700,
15212
15827
  letterSpacing: "-0.02em",
15213
15828
  color,
15214
15829
  margin: "20px 0 8px"
15215
15830
  });
15216
- var subtitleStyle10 = (color) => ({
15831
+ var subtitleStyle9 = (color) => ({
15217
15832
  fontSize: "0.9rem",
15218
15833
  color,
15219
15834
  margin: "0 0 24px",
@@ -15570,10 +16185,10 @@ function GuestTokenPickerScreen({
15570
16185
  ] }),
15571
16186
  children: [
15572
16187
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15573
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle17, children: [
15574
- /* @__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 }),
15575
16190
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15576
- 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: [
15577
16192
  /* @__PURE__ */ jsxRuntime.jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15578
16193
  /* @__PURE__ */ jsxRuntime.jsx(
15579
16194
  "button",
@@ -15647,21 +16262,21 @@ function TokenRow({
15647
16262
  ] })
15648
16263
  ] });
15649
16264
  }
15650
- var contentStyle17 = {
16265
+ var contentStyle18 = {
15651
16266
  flex: 1,
15652
16267
  display: "flex",
15653
16268
  flexDirection: "column",
15654
16269
  padding: "0 20px 16px",
15655
16270
  gap: 12
15656
16271
  };
15657
- var headingStyle15 = (color) => ({
16272
+ var headingStyle14 = (color) => ({
15658
16273
  fontSize: "1.25rem",
15659
16274
  fontWeight: 700,
15660
16275
  color,
15661
16276
  margin: "0 0 8px",
15662
16277
  textAlign: "center"
15663
16278
  });
15664
- var subtitleStyle11 = (color) => ({
16279
+ var subtitleStyle10 = (color) => ({
15665
16280
  fontSize: "0.9rem",
15666
16281
  color,
15667
16282
  textAlign: "center"
@@ -15755,6 +16370,7 @@ var errorBannerStyle8 = (themeTokens) => ({
15755
16370
  });
15756
16371
  function ManualTransferFlow({
15757
16372
  hasMerchantAuthorization,
16373
+ authenticated = false,
15758
16374
  onCreatePasskey,
15759
16375
  createPasskeyLoading = false,
15760
16376
  createPasskeyError = null,
@@ -15798,8 +16414,8 @@ function ManualTransferFlow({
15798
16414
  if (!hasMerchantAuthorization) {
15799
16415
  screenContent = /* @__PURE__ */ jsxRuntime.jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15800
16416
  /* @__PURE__ */ jsxRuntime.jsx(ScreenHeader, { onBack }),
15801
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: contentStyle18, children: [
15802
- /* @__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" }),
15803
16419
  /* @__PURE__ */ jsxRuntime.jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15804
16420
  ] })
15805
16421
  ] });
@@ -15833,7 +16449,19 @@ function ManualTransferFlow({
15833
16449
  );
15834
16450
  } else if (screen === "deposit-complete") {
15835
16451
  const transferAmount = Number(session?.deliveredAmountUsd ?? session?.minAmountUsd ?? 0);
15836
- 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(
15837
16465
  SuccessScreen,
15838
16466
  {
15839
16467
  amount: transferAmount,
@@ -15842,7 +16470,7 @@ function ManualTransferFlow({
15842
16470
  onDone: onDismiss,
15843
16471
  onLogout
15844
16472
  }
15845
- ) ;
16473
+ );
15846
16474
  } else if (screen === "deposit-failed") {
15847
16475
  screenContent = /* @__PURE__ */ jsxRuntime.jsx(
15848
16476
  BlinkErrorScreen,
@@ -15867,7 +16495,7 @@ function ManualTransferFlow({
15867
16495
  }
15868
16496
  return screenContent;
15869
16497
  }
15870
- var contentStyle18 = {
16498
+ var contentStyle19 = {
15871
16499
  alignItems: "center",
15872
16500
  display: "flex",
15873
16501
  flex: 1,
@@ -15878,7 +16506,7 @@ var contentStyle18 = {
15878
16506
  paddingBottom: 24,
15879
16507
  width: "100%"
15880
16508
  };
15881
- var headingStyle16 = (color) => ({
16509
+ var headingStyle15 = (color) => ({
15882
16510
  color,
15883
16511
  fontSize: "2rem",
15884
16512
  lineHeight: 1.05,
@@ -15903,7 +16531,7 @@ function GenericLoadingShimmer() {
15903
16531
  role: "status",
15904
16532
  "aria-label": "Loading payment flow",
15905
16533
  "aria-busy": "true",
15906
- style: sheetStyle2(tokens),
16534
+ style: sheetStyle3(tokens),
15907
16535
  children: [
15908
16536
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
15909
16537
  @keyframes blink-loading-shimmer {
@@ -15949,7 +16577,7 @@ function ShimmerBlock2({
15949
16577
  }
15950
16578
  );
15951
16579
  }
15952
- var sheetStyle2 = (tokens) => ({
16580
+ var sheetStyle3 = (tokens) => ({
15953
16581
  display: "flex",
15954
16582
  flexDirection: "column",
15955
16583
  height: "100%",
@@ -16010,6 +16638,19 @@ function buildDepositOptionsScreenProps({ flow, handlers }) {
16010
16638
  onClose: flow.isMobileApp ? void 0 : flow.onBack
16011
16639
  };
16012
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
+ }
16013
16654
  function buildWalletPickerScreenProps({
16014
16655
  flow,
16015
16656
  handlers
@@ -16430,6 +17071,7 @@ function StepRendererContent({
16430
17071
  ManualTransferFlow,
16431
17072
  {
16432
17073
  hasMerchantAuthorization: flow.merchantAuthorization != null,
17074
+ authenticated: flow.authenticated,
16433
17075
  onCreatePasskey: handlers.onSignupWithPasskey,
16434
17076
  createPasskeyLoading: flow.passkeyLoading,
16435
17077
  createPasskeyError: flow.state.error,
@@ -16444,6 +17086,8 @@ function StepRendererContent({
16444
17086
  return /* @__PURE__ */ jsxRuntime.jsx(LoginScreen, { ...buildLoginScreenProps(input) });
16445
17087
  case "deposit-options":
16446
17088
  return /* @__PURE__ */ jsxRuntime.jsx(DepositOptionsScreen, { ...buildDepositOptionsScreenProps(input) });
17089
+ case "welcome-back":
17090
+ return /* @__PURE__ */ jsxRuntime.jsx(WelcomeBackScreen, { ...buildWelcomeBackScreenProps(input) });
16447
17091
  case "wallet-picker":
16448
17092
  return /* @__PURE__ */ jsxRuntime.jsx(WalletPickerScreen, { ...buildWalletPickerScreenProps(input) });
16449
17093
  case "open-wallet":
@@ -19770,6 +20414,7 @@ function BlinkPaymentInner({
19770
20414
  onCommitTokenAuthorization: provider.handleCommitTokenAuthorization,
19771
20415
  onLogin: () => dispatch({ type: "REQUEST_LOGIN" }),
19772
20416
  onCancelLogin: () => dispatch({ type: "CANCEL_LOGIN_REQUEST" }),
20417
+ onAcknowledgeWelcomeBack: () => dispatch({ type: "ACKNOWLEDGE_WELCOME_BACK" }),
19773
20418
  onSetDepositToken: handleSetDepositToken,
19774
20419
  onConfirmSetupDeposit: handleConfirmSetupDeposit,
19775
20420
  onAmountInput: (value) => dispatch({ type: "SET_AMOUNT_INPUT", value }),
@@ -19887,6 +20532,7 @@ exports.InfoBanner = InfoBanner;
19887
20532
  exports.LOGIN_KEY_ILLUSTRATION = LOGIN_KEY_ILLUSTRATION;
19888
20533
  exports.LinkTokensScreen = LinkTokensScreen;
19889
20534
  exports.LoginScreen = LoginScreen;
20535
+ exports.ManualTransferPasskeyScreen = ManualTransferPasskeyScreen;
19890
20536
  exports.OpenWalletScreen = OpenWalletScreen;
19891
20537
  exports.OtpVerifyScreen = OtpVerifyScreen;
19892
20538
  exports.OutlineButton = OutlineButton;
@@ -19908,6 +20554,7 @@ exports.SuccessScreen = SuccessScreen;
19908
20554
  exports.TokenPickerScreen = TokenPickerScreen;
19909
20555
  exports.VerifyPasskeyScreen = VerifyPasskeyScreen;
19910
20556
  exports.WalletPickerScreen = WalletPickerScreen;
20557
+ exports.WelcomeBackScreen = WelcomeBackScreen;
19911
20558
  exports.appendDebug = appendDebug;
19912
20559
  exports.blinkApi = api_exports;
19913
20560
  exports.clearDebugEntries = clearDebugEntries;