@swype-org/react-sdk 0.2.312 → 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.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { Buffer } from 'buffer';
2
- import { createContext, forwardRef, memo, useContext, useState, useEffect, useRef, useCallback, useMemo, useSyncExternalStore, useReducer, Component } from 'react';
2
+ import { createContext, forwardRef, memo, useContext, useState, useEffect, useRef, useCallback, useMemo, useSyncExternalStore, useReducer, useLayoutEffect, Component } from 'react';
3
3
  import { PrivyProvider, usePrivy, useLoginWithPasskey, useSignupWithPasskey } from '@privy-io/react-auth';
4
4
  import { WagmiProvider, useConfig, useConnect, useSwitchChain, createConfig, http, useAccount } from 'wagmi';
5
5
  import { mainnet, arbitrum, base, polygon, bsc, megaeth, monad, hyperliquid, baseSepolia } from 'wagmi/chains';
6
6
  import { injected, coinbaseWallet } from 'wagmi/connectors';
7
7
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
8
+ import { FingerprintProvider, useVisitorData } from '@fingerprint/react';
8
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
10
  import { getAccount, reconnect, disconnect, getWalletClient, getConnectors } from '@wagmi/core';
10
11
  import { encodeFunctionData, recoverTypedDataAddress, decodeAbiParameters } from 'viem';
@@ -970,6 +971,12 @@ function bridgedWalletsToConnectors(wallets, staticRdns = /* @__PURE__ */ new Se
970
971
  }
971
972
  var BLINK_PRIVY_APP_ID = "cmlil87uv004n0ck0blwumwek";
972
973
  var BLINK_WC_PROJECT_ID = "f6c60234412f94ef9108dc8f67f4362c";
974
+ var BLINK_FINGERPRINT_API_KEY = "nr4FvTsZ6M5z2141FqrM";
975
+ var BLINK_FINGERPRINT_REGION = "us";
976
+ function FingerprintVisitorPing() {
977
+ useVisitorData({ immediate: true });
978
+ return null;
979
+ }
973
980
  function buildStaticConnectors() {
974
981
  return [
975
982
  // `unstable_shimAsyncInject` covers wallets whose content scripts wire
@@ -1064,25 +1071,33 @@ function BlinkProvider({
1064
1071
  }),
1065
1072
  [apiBaseUrl, theme, resolvedMinTransferAmountUsd, depositAmount, setDepositAmount, enableFullWidget, isMobileApp]
1066
1073
  );
1067
- return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsx(WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsx(
1068
- PrivyProvider,
1069
- {
1070
- appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1071
- config: {
1072
- appearance: {
1073
- theme: getThemeBase(theme),
1074
- accentColor: getTheme(theme).accent
1075
- },
1076
- intl: {
1077
- defaultCountry: "US"
1078
- },
1079
- embeddedWallets: {
1080
- showWalletUIs: false
1074
+ return (
1075
+ // Outermost wrapper: loads the Fingerprint browser agent once per
1076
+ // provider mount, independent of wagmi/privy/query state. Visitor data
1077
+ // collection starts here; no hook is exposed yet (see SDK barrel).
1078
+ /* @__PURE__ */ jsxs(FingerprintProvider, { apiKey: BLINK_FINGERPRINT_API_KEY, region: BLINK_FINGERPRINT_REGION, children: [
1079
+ /* @__PURE__ */ jsx(FingerprintVisitorPing, {}),
1080
+ /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsx(WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsx(
1081
+ PrivyProvider,
1082
+ {
1083
+ appId: privyAppId ?? BLINK_PRIVY_APP_ID,
1084
+ config: {
1085
+ appearance: {
1086
+ theme: getThemeBase(theme),
1087
+ accentColor: getTheme(theme).accent
1088
+ },
1089
+ intl: {
1090
+ defaultCountry: "US"
1091
+ },
1092
+ embeddedWallets: {
1093
+ showWalletUIs: false
1094
+ }
1095
+ },
1096
+ children: /* @__PURE__ */ jsx(BlinkContext.Provider, { value, children })
1081
1097
  }
1082
- },
1083
- children: /* @__PURE__ */ jsx(BlinkContext.Provider, { value, children })
1084
- }
1085
- ) }) });
1098
+ ) }) })
1099
+ ] })
1100
+ );
1086
1101
  }
1087
1102
  function useBlinkConfig() {
1088
1103
  const ctx = useContext(BlinkContext);
@@ -1739,6 +1754,8 @@ function screenForPhase(phase) {
1739
1754
  return "manual-transfer";
1740
1755
  case "login":
1741
1756
  return "login";
1757
+ case "welcome-back":
1758
+ return "welcome-back";
1742
1759
  case "deposit-options":
1743
1760
  return "deposit-options";
1744
1761
  case "wallet-picker":
@@ -7521,6 +7538,9 @@ function deriveFreshPhase(state) {
7521
7538
  if (state.loadingData && state.activeCredentialId != null) {
7522
7539
  return { step: "data-loading" };
7523
7540
  }
7541
+ if (state.enableFullWidget && state.authenticatedOnOpen && !state.welcomeBackAcknowledged && state.activeCredentialId != null && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
7542
+ return { step: "welcome-back" };
7543
+ }
7524
7544
  if (state.activeCredentialId != null && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
7525
7545
  return { step: "wallet-picker", reason: "link" };
7526
7546
  }
@@ -7600,7 +7620,9 @@ function createInitialState(config) {
7600
7620
  guestWalletDeeplinksPreparing: false,
7601
7621
  amountTooLow: null,
7602
7622
  enableFullWidget: config.enableFullWidget ?? false,
7603
- requireAmountEntry: config.depositAmount == null
7623
+ requireAmountEntry: config.depositAmount == null,
7624
+ authenticatedOnOpen: false,
7625
+ welcomeBackAcknowledged: false
7604
7626
  };
7605
7627
  }
7606
7628
  function clearAuthenticatedSessionState(state) {
@@ -7638,7 +7660,9 @@ function clearAuthenticatedSessionState(state) {
7638
7660
  setupDepositToken: null,
7639
7661
  guestWalletPrepared: null,
7640
7662
  guestWalletDeeplinksPreparing: false,
7641
- amountTooLow: null
7663
+ amountTooLow: null,
7664
+ authenticatedOnOpen: false,
7665
+ welcomeBackAcknowledged: false
7642
7666
  };
7643
7667
  }
7644
7668
  function paymentReducer(state, action) {
@@ -7967,6 +7991,8 @@ function applyAction(state, action) {
7967
7991
  };
7968
7992
  case "CANCEL_LOGIN_REQUEST":
7969
7993
  return { ...state, loginRequested: false, error: null };
7994
+ case "ACKNOWLEDGE_WELCOME_BACK":
7995
+ return { ...state, welcomeBackAcknowledged: true };
7970
7996
  case "SET_ERROR":
7971
7997
  return { ...state, error: action.error };
7972
7998
  case "AMOUNT_TOO_LOW":
@@ -8064,7 +8090,13 @@ function applyAction(state, action) {
8064
8090
  ...state,
8065
8091
  privyReady: action.ready,
8066
8092
  privyAuthenticated: action.authenticated,
8067
- ...action.authenticated ? { loginRequested: false } : {}
8093
+ ...action.authenticated ? { loginRequested: false } : {},
8094
+ // Latch "already authenticated when the flow opened" exactly once, on
8095
+ // the ready: false → true transition that carries an existing session.
8096
+ // A user who opens logged-out and signs in mid-session never hits this
8097
+ // branch (ready was already true), so the flag stays false and they
8098
+ // skip WelcomeBackScreen.
8099
+ ...!state.privyReady && action.ready && action.authenticated ? { authenticatedOnOpen: true } : {}
8068
8100
  };
8069
8101
  case "SYNC_AMOUNT":
8070
8102
  return {
@@ -10503,6 +10535,50 @@ var copyIconCircleStyle = (bgRecessed) => ({
10503
10535
  justifyContent: "center",
10504
10536
  width: 48
10505
10537
  });
10538
+ function FitText({
10539
+ children,
10540
+ maxFontSize,
10541
+ minFontSize,
10542
+ color,
10543
+ fontWeight = 500
10544
+ }) {
10545
+ const containerRef = useRef(null);
10546
+ const textRef = useRef(null);
10547
+ const [fontSize, setFontSize] = useState(maxFontSize);
10548
+ useLayoutEffect(() => {
10549
+ const container = containerRef.current;
10550
+ const text = textRef.current;
10551
+ if (!container || !text) return void 0;
10552
+ const fit = () => {
10553
+ let size = maxFontSize;
10554
+ text.style.fontSize = `${size}px`;
10555
+ while (size > minFontSize && text.scrollWidth > container.clientWidth) {
10556
+ size -= 1;
10557
+ text.style.fontSize = `${size}px`;
10558
+ }
10559
+ setFontSize(size);
10560
+ };
10561
+ fit();
10562
+ const observer = new ResizeObserver(fit);
10563
+ observer.observe(container);
10564
+ return () => observer.disconnect();
10565
+ }, [children, maxFontSize, minFontSize]);
10566
+ return /* @__PURE__ */ jsx("span", { ref: containerRef, style: containerStyle8, children: /* @__PURE__ */ jsx("span", { ref: textRef, style: { ...textStyle2(color, fontWeight), fontSize }, children }) });
10567
+ }
10568
+ var containerStyle8 = {
10569
+ flex: 1,
10570
+ minWidth: 0,
10571
+ overflow: "hidden",
10572
+ display: "flex",
10573
+ alignItems: "center"
10574
+ };
10575
+ var textStyle2 = (color, fontWeight) => ({
10576
+ whiteSpace: "nowrap",
10577
+ overflow: "hidden",
10578
+ textOverflow: "ellipsis",
10579
+ color,
10580
+ fontWeight
10581
+ });
10506
10582
 
10507
10583
  // src/deviceBiometricUnlockText.ts
10508
10584
  var FALLBACK = "Biometric verification";
@@ -10801,7 +10877,7 @@ function DepositOptionsScreen({
10801
10877
  onClick: onSignInWithBlink,
10802
10878
  style: depositPillStyle(tokens.accent),
10803
10879
  children: [
10804
- /* @__PURE__ */ jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10880
+ /* @__PURE__ */ jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
10805
10881
  /* @__PURE__ */ jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsx(
10806
10882
  "span",
10807
10883
  {
@@ -10908,6 +10984,7 @@ var depositPillStyle = (bg) => ({
10908
10984
  display: "flex",
10909
10985
  alignItems: "center",
10910
10986
  justifyContent: "space-between",
10987
+ gap: 8,
10911
10988
  width: "100%",
10912
10989
  height: 56,
10913
10990
  padding: "12px 12px 12px 24px",
@@ -10918,16 +10995,11 @@ var depositPillStyle = (bg) => ({
10918
10995
  boxSizing: "border-box",
10919
10996
  fontFamily: "inherit"
10920
10997
  });
10921
- var depositPillLabelStyle = (color) => ({
10922
- color,
10923
- fontSize: 16,
10924
- fontWeight: 500,
10925
- whiteSpace: "nowrap"
10926
- });
10927
10998
  var clusterStyle = {
10928
10999
  display: "inline-flex",
10929
11000
  alignItems: "center",
10930
- isolation: "isolate"
11001
+ isolation: "isolate",
11002
+ flexShrink: 0
10931
11003
  };
10932
11004
  var clusterChipStyle = (bg, last) => ({
10933
11005
  width: 32,
@@ -11022,117 +11094,406 @@ var closeButtonStyle2 = (bg, color) => ({
11022
11094
  cursor: "pointer",
11023
11095
  padding: 0
11024
11096
  });
11025
- function BlinkErrorScreen({
11026
- title,
11027
- message,
11028
- retryLabel,
11029
- onRetry,
11097
+ var CLUSTER_LOGOS2 = [
11098
+ METAMASK_LOGO,
11099
+ PHANTOM_LOGO,
11100
+ RABBY_LOGO,
11101
+ OKX_WALLET_LOGO,
11102
+ TRUST_WALLET_LOGO,
11103
+ BASE_LOGO
11104
+ ];
11105
+ function WelcomeBackScreen({
11106
+ onToAddress,
11107
+ onComplete,
11030
11108
  onClose
11031
11109
  }) {
11032
11110
  const { tokens } = useBlinkConfig();
11033
- const headerRight = onClose ? /* @__PURE__ */ jsx(
11034
- "button",
11035
- {
11036
- type: "button",
11037
- onClick: onClose,
11038
- "aria-label": "Close",
11039
- style: closeButtonStyle3(tokens),
11040
- children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
11041
- "path",
11111
+ const depositLabel = `Deposit with ${getDeviceBiometricUnlockText()}`;
11112
+ return /* @__PURE__ */ jsx(ScreenLayout, { children: /* @__PURE__ */ jsx("div", { style: sheetStyle2, children: /* @__PURE__ */ jsxs("div", { style: contentStyle3, children: [
11113
+ /* @__PURE__ */ jsxs("div", { style: headerRowStyle2, children: [
11114
+ /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 }),
11115
+ onClose ? /* @__PURE__ */ jsx(
11116
+ "button",
11042
11117
  {
11043
- d: "M6 6l12 12M18 6L6 18",
11044
- stroke: "currentColor",
11045
- strokeWidth: "2",
11046
- strokeLinecap: "round",
11047
- strokeLinejoin: "round"
11118
+ type: "button",
11119
+ onClick: onClose,
11120
+ "aria-label": "Close",
11121
+ style: closeButtonStyle3(tokens.bgRecessed, tokens.text),
11122
+ children: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
11123
+ "path",
11124
+ {
11125
+ d: "M6 6l12 12M18 6L6 18",
11126
+ stroke: "currentColor",
11127
+ strokeWidth: "2",
11128
+ strokeLinecap: "round",
11129
+ strokeLinejoin: "round"
11130
+ }
11131
+ ) })
11048
11132
  }
11049
- ) })
11050
- }
11051
- ) : void 0;
11052
- const showRetry = retryLabel != null && onRetry != null;
11133
+ ) : null
11134
+ ] }),
11135
+ /* @__PURE__ */ jsx("img", { src: BLINK_PASSKEY_ILLUSTRATION, alt: "", "aria-hidden": "true", style: heroStyle2 }),
11136
+ /* @__PURE__ */ jsxs("div", { style: stackStyle2, children: [
11137
+ /* @__PURE__ */ jsxs("div", { style: depositPillWrapperStyle2, children: [
11138
+ /* @__PURE__ */ jsxs(
11139
+ "button",
11140
+ {
11141
+ type: "button",
11142
+ onClick: onComplete,
11143
+ style: depositFrameStyle(tokens.highlight),
11144
+ children: [
11145
+ /* @__PURE__ */ jsx("span", { style: completeSetupBandStyle(tokens.text), children: "Complete setup" }),
11146
+ /* @__PURE__ */ jsxs("span", { style: depositPillStyle2(tokens.accent), children: [
11147
+ /* @__PURE__ */ jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
11148
+ /* @__PURE__ */ jsx("span", { style: clusterStyle2, children: CLUSTER_LOGOS2.map((logo, i) => /* @__PURE__ */ jsx(
11149
+ "span",
11150
+ {
11151
+ style: clusterChipStyle2(tokens.bgInput, i === CLUSTER_LOGOS2.length - 1),
11152
+ children: /* @__PURE__ */ jsx("img", { src: logo, alt: "", "aria-hidden": "true", style: clusterIconStyle2 })
11153
+ },
11154
+ logo
11155
+ )) })
11156
+ ] })
11157
+ ]
11158
+ }
11159
+ ),
11160
+ /* @__PURE__ */ jsx("span", { style: feesBadgeStyle2(tokens.highlight, tokens.text), children: "0% FEES" })
11161
+ ] }),
11162
+ /* @__PURE__ */ jsxs("div", { style: dividerRowStyle2, children: [
11163
+ /* @__PURE__ */ jsx("span", { style: dividerRuleStyle2(tokens.textTertiary) }),
11164
+ /* @__PURE__ */ jsx("span", { style: dividerLabelStyle2(tokens.textTertiary), children: "OR" }),
11165
+ /* @__PURE__ */ jsx("span", { style: dividerRuleStyle2(tokens.textTertiary) })
11166
+ ] }),
11167
+ /* @__PURE__ */ jsxs(
11168
+ "button",
11169
+ {
11170
+ type: "button",
11171
+ onClick: onToAddress,
11172
+ style: manualRowStyle2(tokens.bgCardTranslucent),
11173
+ children: [
11174
+ /* @__PURE__ */ jsx("span", { style: manualLabelStyle2(tokens.text), children: "Send Crypto Manually" }),
11175
+ /* @__PURE__ */ jsx(QrIcon2, { color: tokens.text })
11176
+ ]
11177
+ }
11178
+ )
11179
+ ] })
11180
+ ] }) }) });
11181
+ }
11182
+ function QrIcon2({ color }) {
11053
11183
  return /* @__PURE__ */ jsxs(
11054
- ScreenLayout,
11184
+ "svg",
11055
11185
  {
11056
- footer: showRetry ? /* @__PURE__ */ jsx(PrimaryButton, { onClick: onRetry, children: retryLabel }) : void 0,
11186
+ width: "24",
11187
+ height: "24",
11188
+ viewBox: "0 0 24 24",
11189
+ fill: "none",
11190
+ "aria-hidden": "true",
11191
+ style: { flexShrink: 0 },
11057
11192
  children: [
11058
- /* @__PURE__ */ jsx(ScreenHeader, { right: headerRight }),
11059
- /* @__PURE__ */ jsxs("div", { style: contentStyle3, children: [
11060
- /* @__PURE__ */ jsx(
11061
- "img",
11062
- {
11063
- src: BLINK_ERROR_ILLUSTRATION,
11064
- alt: "",
11065
- "aria-hidden": "true",
11066
- style: illustrationStyle2
11067
- }
11068
- ),
11069
- /* @__PURE__ */ jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11070
- message && /* @__PURE__ */ jsx("p", { style: messageStyle(tokens.text), children: message })
11071
- ] })
11193
+ /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11194
+ /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
11195
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11196
+ /* @__PURE__ */ jsx("rect", { x: "16", y: "6", width: "2", height: "2", fill: color }),
11197
+ /* @__PURE__ */ jsx("rect", { x: "3.5", y: "13.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
11198
+ /* @__PURE__ */ jsx("rect", { x: "6", y: "16", width: "2", height: "2", fill: color }),
11199
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "13.5", width: "2.5", height: "2.5", fill: color }),
11200
+ /* @__PURE__ */ jsx("rect", { x: "18", y: "13.5", width: "2.5", height: "2.5", fill: color }),
11201
+ /* @__PURE__ */ jsx("rect", { x: "13.5", y: "18", width: "2.5", height: "2.5", fill: color }),
11202
+ /* @__PURE__ */ jsx("rect", { x: "18", y: "18", width: "2.5", height: "2.5", fill: color })
11072
11203
  ]
11073
11204
  }
11074
11205
  );
11075
11206
  }
11207
+ var sheetStyle2 = {
11208
+ position: "relative",
11209
+ minHeight: "100%",
11210
+ display: "flex",
11211
+ flexDirection: "column",
11212
+ boxSizing: "border-box"
11213
+ };
11076
11214
  var contentStyle3 = {
11077
- textAlign: "center",
11078
- flex: 1,
11079
11215
  display: "flex",
11080
11216
  flexDirection: "column",
11081
11217
  alignItems: "center",
11082
- justifyContent: "center",
11083
- gap: 16
11218
+ gap: 32,
11219
+ padding: "32px 8px"
11084
11220
  };
11085
- var illustrationStyle2 = {
11086
- width: 200,
11087
- height: 200,
11221
+ var headerRowStyle2 = {
11222
+ display: "flex",
11223
+ alignItems: "center",
11224
+ justifyContent: "space-between",
11225
+ width: "100%",
11226
+ minHeight: 44
11227
+ };
11228
+ var wordmarkImgStyle2 = {
11229
+ height: 31,
11230
+ width: "auto",
11231
+ display: "block"
11232
+ };
11233
+ var heroStyle2 = {
11234
+ width: 220,
11235
+ height: 220,
11236
+ maxWidth: "100%",
11088
11237
  objectFit: "contain",
11089
11238
  display: "block"
11090
11239
  };
11091
- var headingStyle2 = (color) => ({
11092
- fontSize: "1.5rem",
11093
- fontWeight: 700,
11094
- lineHeight: 1.1,
11095
- letterSpacing: "-0.01em",
11096
- color,
11097
- margin: 0
11240
+ var stackStyle2 = {
11241
+ display: "flex",
11242
+ flexDirection: "column",
11243
+ gap: 16,
11244
+ width: "100%"
11245
+ };
11246
+ var depositPillWrapperStyle2 = {
11247
+ position: "relative",
11248
+ width: "100%",
11249
+ paddingBottom: 12
11250
+ };
11251
+ var depositFrameStyle = (bg) => ({
11252
+ display: "flex",
11253
+ flexDirection: "column",
11254
+ alignItems: "stretch",
11255
+ width: "100%",
11256
+ padding: "2px 4px 4px",
11257
+ background: bg,
11258
+ border: "none",
11259
+ borderRadius: 32,
11260
+ cursor: "pointer",
11261
+ boxSizing: "border-box",
11262
+ fontFamily: "inherit"
11098
11263
  });
11099
- var messageStyle = (color) => ({
11100
- fontSize: "1rem",
11101
- fontWeight: 400,
11102
- lineHeight: 1.4,
11264
+ var completeSetupBandStyle = (color) => ({
11265
+ display: "flex",
11266
+ alignItems: "center",
11267
+ justifyContent: "center",
11268
+ height: 26,
11103
11269
  color,
11104
- margin: 0,
11105
- maxWidth: 320
11270
+ fontSize: 13,
11271
+ fontWeight: 600,
11272
+ letterSpacing: "0.01em"
11106
11273
  });
11107
- var closeButtonStyle3 = (tokens) => ({
11108
- width: 40,
11109
- height: 40,
11110
- borderRadius: "50%",
11111
- border: "none",
11112
- background: tokens.bgRecessed,
11113
- color: tokens.text,
11274
+ var depositPillStyle2 = (bg) => ({
11114
11275
  display: "flex",
11115
11276
  alignItems: "center",
11277
+ justifyContent: "space-between",
11278
+ gap: 8,
11279
+ width: "100%",
11280
+ height: 56,
11281
+ padding: "12px 12px 12px 24px",
11282
+ background: bg,
11283
+ border: "none",
11284
+ borderRadius: 28,
11285
+ boxSizing: "border-box"
11286
+ });
11287
+ var clusterStyle2 = {
11288
+ display: "inline-flex",
11289
+ alignItems: "center",
11290
+ isolation: "isolate",
11291
+ flexShrink: 0
11292
+ };
11293
+ var clusterChipStyle2 = (bg, last) => ({
11294
+ width: 32,
11295
+ height: 32,
11296
+ borderRadius: "50%",
11297
+ background: bg,
11298
+ display: "inline-flex",
11299
+ alignItems: "center",
11116
11300
  justifyContent: "center",
11117
- cursor: "pointer",
11118
- padding: 0
11301
+ marginRight: last ? 0 : -12,
11302
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
11303
+ flexShrink: 0
11119
11304
  });
11120
- function AmountTooLowScreen({
11121
- minAmountUsd,
11122
- onRetry,
11123
- onClose
11124
- }) {
11125
- return /* @__PURE__ */ jsx(
11126
- BlinkErrorScreen,
11127
- {
11128
- title: "Amount too low",
11129
- message: `The minimum payment amount is $${minAmountUsd.toFixed(2)}.`,
11130
- retryLabel: onRetry ? "Try Again" : void 0,
11131
- onRetry,
11132
- onClose
11133
- }
11134
- );
11135
- }
11305
+ var clusterIconStyle2 = {
11306
+ width: 24,
11307
+ height: 24,
11308
+ borderRadius: "50%",
11309
+ objectFit: "cover",
11310
+ display: "block"
11311
+ };
11312
+ var feesBadgeStyle2 = (bg, color) => ({
11313
+ position: "absolute",
11314
+ left: 131,
11315
+ top: 72,
11316
+ display: "inline-flex",
11317
+ alignItems: "center",
11318
+ justifyContent: "center",
11319
+ background: bg,
11320
+ color,
11321
+ fontSize: 12,
11322
+ fontWeight: 500,
11323
+ lineHeight: 1,
11324
+ padding: "4px 8px",
11325
+ borderRadius: 6,
11326
+ whiteSpace: "nowrap",
11327
+ transform: "rotate(-6.75deg)",
11328
+ boxShadow: "0 2px 4px rgba(0, 0, 0, 0.16)",
11329
+ pointerEvents: "none"
11330
+ });
11331
+ var dividerRowStyle2 = {
11332
+ display: "flex",
11333
+ alignItems: "center",
11334
+ justifyContent: "center",
11335
+ gap: 10,
11336
+ padding: "0 16px",
11337
+ width: "100%",
11338
+ boxSizing: "border-box"
11339
+ };
11340
+ var dividerRuleStyle2 = (color) => ({
11341
+ flex: 1,
11342
+ height: 1,
11343
+ background: color
11344
+ });
11345
+ var dividerLabelStyle2 = (color) => ({
11346
+ color,
11347
+ fontSize: 12,
11348
+ fontWeight: 500,
11349
+ whiteSpace: "nowrap"
11350
+ });
11351
+ var manualRowStyle2 = (bg) => ({
11352
+ display: "flex",
11353
+ alignItems: "center",
11354
+ gap: 8,
11355
+ width: "100%",
11356
+ height: 56,
11357
+ padding: "12px 24px",
11358
+ background: bg,
11359
+ border: "none",
11360
+ borderRadius: 28,
11361
+ cursor: "pointer",
11362
+ boxSizing: "border-box",
11363
+ fontFamily: "inherit"
11364
+ });
11365
+ var manualLabelStyle2 = (color) => ({
11366
+ flex: 1,
11367
+ minWidth: 0,
11368
+ color,
11369
+ fontSize: 16,
11370
+ fontWeight: 400
11371
+ });
11372
+ var closeButtonStyle3 = (bg, color) => ({
11373
+ flexShrink: 0,
11374
+ width: 44,
11375
+ height: 44,
11376
+ borderRadius: "50%",
11377
+ border: "none",
11378
+ background: bg,
11379
+ color,
11380
+ display: "flex",
11381
+ alignItems: "center",
11382
+ justifyContent: "center",
11383
+ cursor: "pointer",
11384
+ padding: 0
11385
+ });
11386
+ function BlinkErrorScreen({
11387
+ title,
11388
+ message,
11389
+ retryLabel,
11390
+ onRetry,
11391
+ onClose
11392
+ }) {
11393
+ const { tokens } = useBlinkConfig();
11394
+ const headerRight = onClose ? /* @__PURE__ */ jsx(
11395
+ "button",
11396
+ {
11397
+ type: "button",
11398
+ onClick: onClose,
11399
+ "aria-label": "Close",
11400
+ style: closeButtonStyle4(tokens),
11401
+ children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
11402
+ "path",
11403
+ {
11404
+ d: "M6 6l12 12M18 6L6 18",
11405
+ stroke: "currentColor",
11406
+ strokeWidth: "2",
11407
+ strokeLinecap: "round",
11408
+ strokeLinejoin: "round"
11409
+ }
11410
+ ) })
11411
+ }
11412
+ ) : void 0;
11413
+ const showRetry = retryLabel != null && onRetry != null;
11414
+ return /* @__PURE__ */ jsxs(
11415
+ ScreenLayout,
11416
+ {
11417
+ footer: showRetry ? /* @__PURE__ */ jsx(PrimaryButton, { onClick: onRetry, children: retryLabel }) : void 0,
11418
+ children: [
11419
+ /* @__PURE__ */ jsx(ScreenHeader, { right: headerRight }),
11420
+ /* @__PURE__ */ jsxs("div", { style: contentStyle4, children: [
11421
+ /* @__PURE__ */ jsx(
11422
+ "img",
11423
+ {
11424
+ src: BLINK_ERROR_ILLUSTRATION,
11425
+ alt: "",
11426
+ "aria-hidden": "true",
11427
+ style: illustrationStyle2
11428
+ }
11429
+ ),
11430
+ /* @__PURE__ */ jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11431
+ message && /* @__PURE__ */ jsx("p", { style: messageStyle(tokens.text), children: message })
11432
+ ] })
11433
+ ]
11434
+ }
11435
+ );
11436
+ }
11437
+ var contentStyle4 = {
11438
+ textAlign: "center",
11439
+ flex: 1,
11440
+ display: "flex",
11441
+ flexDirection: "column",
11442
+ alignItems: "center",
11443
+ justifyContent: "center",
11444
+ gap: 16
11445
+ };
11446
+ var illustrationStyle2 = {
11447
+ width: 200,
11448
+ height: 200,
11449
+ objectFit: "contain",
11450
+ display: "block"
11451
+ };
11452
+ var headingStyle2 = (color) => ({
11453
+ fontSize: "1.5rem",
11454
+ fontWeight: 700,
11455
+ lineHeight: 1.1,
11456
+ letterSpacing: "-0.01em",
11457
+ color,
11458
+ margin: 0
11459
+ });
11460
+ var messageStyle = (color) => ({
11461
+ fontSize: "1rem",
11462
+ fontWeight: 400,
11463
+ lineHeight: 1.4,
11464
+ color,
11465
+ margin: 0,
11466
+ maxWidth: 320
11467
+ });
11468
+ var closeButtonStyle4 = (tokens) => ({
11469
+ width: 40,
11470
+ height: 40,
11471
+ borderRadius: "50%",
11472
+ border: "none",
11473
+ background: tokens.bgRecessed,
11474
+ color: tokens.text,
11475
+ display: "flex",
11476
+ alignItems: "center",
11477
+ justifyContent: "center",
11478
+ cursor: "pointer",
11479
+ padding: 0
11480
+ });
11481
+ function AmountTooLowScreen({
11482
+ minAmountUsd,
11483
+ onRetry,
11484
+ onClose
11485
+ }) {
11486
+ return /* @__PURE__ */ jsx(
11487
+ BlinkErrorScreen,
11488
+ {
11489
+ title: "Amount too low",
11490
+ message: `The minimum payment amount is $${minAmountUsd.toFixed(2)}.`,
11491
+ retryLabel: onRetry ? "Try Again" : void 0,
11492
+ onRetry,
11493
+ onClose
11494
+ }
11495
+ );
11496
+ }
11136
11497
  var RESEND_COOLDOWN_SECONDS = 30;
11137
11498
  function OtpVerifyScreen({
11138
11499
  maskedIdentifier,
@@ -11186,7 +11547,7 @@ function OtpVerifyScreen({
11186
11547
  ] }),
11187
11548
  children: [
11188
11549
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
11189
- /* @__PURE__ */ jsxs("div", { style: contentStyle4, children: [
11550
+ /* @__PURE__ */ jsxs("div", { style: contentStyle5, children: [
11190
11551
  /* @__PURE__ */ jsx("h2", { style: headingStyle3(tokens.text), children: "Confirm it is you" }),
11191
11552
  /* @__PURE__ */ jsxs("p", { style: subtitleStyle2(tokens.textSecondary), children: [
11192
11553
  "We sent a 6-digit code to",
@@ -11210,7 +11571,7 @@ function OtpVerifyScreen({
11210
11571
  }
11211
11572
  );
11212
11573
  }
11213
- var contentStyle4 = {
11574
+ var contentStyle5 = {
11214
11575
  textAlign: "center",
11215
11576
  display: "flex",
11216
11577
  flexDirection: "column",
@@ -11292,7 +11653,7 @@ function PasskeyScreen({
11292
11653
  ] }),
11293
11654
  children: [
11294
11655
  /* @__PURE__ */ jsx(ScreenHeader, { onBack, onLogout }),
11295
- /* @__PURE__ */ jsxs("div", { style: contentStyle5, children: [
11656
+ /* @__PURE__ */ jsxs("div", { style: contentStyle6, children: [
11296
11657
  /* @__PURE__ */ jsx("h2", { style: headingStyle4(tokens.text), children: "Secure your account with a passkey" }),
11297
11658
  /* @__PURE__ */ jsx("p", { style: subtitleStyle3(tokens.textSecondary), children: "This enables secure one-tap deposits on this device" }),
11298
11659
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle2(tokens), children: error })
@@ -11301,7 +11662,7 @@ function PasskeyScreen({
11301
11662
  }
11302
11663
  );
11303
11664
  }
11304
- var contentStyle5 = {
11665
+ var contentStyle6 = {
11305
11666
  textAlign: "center",
11306
11667
  flex: 1,
11307
11668
  display: "flex",
@@ -11368,7 +11729,7 @@ function PasskeyPopupWelcomeScreen({
11368
11729
  ) }),
11369
11730
  children: [
11370
11731
  /* @__PURE__ */ jsx(ScreenHeader, { onBack, onLogout }),
11371
- /* @__PURE__ */ jsxs("div", { style: contentStyle6, children: [
11732
+ /* @__PURE__ */ jsxs("div", { style: contentStyle7, children: [
11372
11733
  /* @__PURE__ */ jsxs("div", { style: lockupStyle, children: [
11373
11734
  /* @__PURE__ */ jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11374
11735
  /* @__PURE__ */ jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
@@ -11408,7 +11769,7 @@ function PasskeyIcon() {
11408
11769
  )
11409
11770
  ] });
11410
11771
  }
11411
- var contentStyle6 = {
11772
+ var contentStyle7 = {
11412
11773
  flex: 1,
11413
11774
  minHeight: 0,
11414
11775
  display: "flex",
@@ -11484,7 +11845,7 @@ function VerifyPasskeyScreen({
11484
11845
  ] }),
11485
11846
  children: [
11486
11847
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
11487
- /* @__PURE__ */ jsxs("div", { style: contentStyle7, children: [
11848
+ /* @__PURE__ */ jsxs("div", { style: contentStyle8, children: [
11488
11849
  /* @__PURE__ */ jsx(IconCircle, { variant: "accent", size: 64, children: /* @__PURE__ */ jsxs("svg", { width: "36", height: "36", viewBox: "0 0 24 24", fill: "none", children: [
11489
11850
  /* @__PURE__ */ jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "3", stroke: tokens.accent, strokeWidth: "1.5", strokeDasharray: "3 2" }),
11490
11851
  /* @__PURE__ */ jsx("circle", { cx: "9", cy: "10", r: "1", fill: tokens.accent }),
@@ -11500,7 +11861,7 @@ function VerifyPasskeyScreen({
11500
11861
  }
11501
11862
  );
11502
11863
  }
11503
- var contentStyle7 = {
11864
+ var contentStyle8 = {
11504
11865
  textAlign: "center",
11505
11866
  flex: 1,
11506
11867
  display: "flex",
@@ -12197,6 +12558,260 @@ var errorBannerStyle5 = (tokens) => ({
12197
12558
  marginBottom: 14,
12198
12559
  lineHeight: 1.5
12199
12560
  });
12561
+ function ManualTransferPasskeyScreen({
12562
+ onCreatePasskey,
12563
+ onNoThanks,
12564
+ amountUsd,
12565
+ loading = false,
12566
+ error,
12567
+ onBack,
12568
+ onClose
12569
+ }) {
12570
+ const { tokens } = useBlinkConfig();
12571
+ const title = "Deposit complete";
12572
+ return /* @__PURE__ */ jsxs("div", { style: containerStyle9(tokens), children: [
12573
+ onBack && /* @__PURE__ */ jsx(
12574
+ "button",
12575
+ {
12576
+ type: "button",
12577
+ onClick: onBack,
12578
+ "aria-label": "Go back",
12579
+ style: { ...navButtonStyle(tokens.bgRecessed, tokens.text), left: 16 },
12580
+ children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
12581
+ "path",
12582
+ {
12583
+ d: "M15 18l-6-6 6-6",
12584
+ stroke: "currentColor",
12585
+ strokeWidth: "2",
12586
+ strokeLinecap: "round",
12587
+ strokeLinejoin: "round"
12588
+ }
12589
+ ) })
12590
+ }
12591
+ ),
12592
+ onClose && /* @__PURE__ */ jsx(
12593
+ "button",
12594
+ {
12595
+ type: "button",
12596
+ onClick: onClose,
12597
+ "aria-label": "Close",
12598
+ style: { ...navButtonStyle(tokens.bgRecessed, tokens.text), right: 16 },
12599
+ children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
12600
+ "path",
12601
+ {
12602
+ d: "M6 6l12 12M18 6L6 18",
12603
+ stroke: "currentColor",
12604
+ strokeWidth: "2",
12605
+ strokeLinecap: "round",
12606
+ strokeLinejoin: "round"
12607
+ }
12608
+ ) })
12609
+ }
12610
+ ),
12611
+ /* @__PURE__ */ jsxs("div", { style: contentStyle9, children: [
12612
+ /* @__PURE__ */ jsxs("div", { style: heroStyle3, children: [
12613
+ /* @__PURE__ */ jsx("h2", { style: titleStyle4(tokens.text), children: title }),
12614
+ /* @__PURE__ */ jsx(
12615
+ "img",
12616
+ {
12617
+ src: BLINK_PASSKEY_ILLUSTRATION,
12618
+ alt: "",
12619
+ "aria-hidden": "true",
12620
+ style: illustrationStyle3
12621
+ }
12622
+ ),
12623
+ /* @__PURE__ */ jsxs("div", { style: infoCardStyle2(tokens.bgCardTranslucent), children: [
12624
+ /* @__PURE__ */ jsx("div", { style: { color: tokens.text, flexShrink: 0, paddingTop: 2 }, children: /* @__PURE__ */ jsx(FaceIdIcon, { size: 24 }) }),
12625
+ /* @__PURE__ */ jsxs("div", { style: infoTextStyle, children: [
12626
+ /* @__PURE__ */ jsxs("div", { style: infoTitleStyle(tokens.text), children: [
12627
+ "Deposit with ",
12628
+ getDeviceBiometricUnlockText(),
12629
+ " next time"
12630
+ ] }),
12631
+ /* @__PURE__ */ jsxs("div", { style: infoSubtitleStyle(tokens.text), children: [
12632
+ "Deposit with ",
12633
+ getDeviceBiometricUnlockText(),
12634
+ " \u2014 your wallet stays sealed"
12635
+ ] })
12636
+ ] })
12637
+ ] }),
12638
+ error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle6(tokens), children: error })
12639
+ ] }),
12640
+ /* @__PURE__ */ jsxs("div", { style: footerStackStyle2, children: [
12641
+ /* @__PURE__ */ jsx(
12642
+ "button",
12643
+ {
12644
+ type: "button",
12645
+ onClick: onCreatePasskey,
12646
+ disabled: loading,
12647
+ style: ctaStyle(tokens, loading),
12648
+ children: "Create passkey"
12649
+ }
12650
+ ),
12651
+ /* @__PURE__ */ jsx(
12652
+ "button",
12653
+ {
12654
+ type: "button",
12655
+ onClick: onNoThanks,
12656
+ disabled: loading,
12657
+ style: noThanksStyle(tokens.text, loading),
12658
+ children: "No thanks"
12659
+ }
12660
+ )
12661
+ ] })
12662
+ ] })
12663
+ ] });
12664
+ }
12665
+ var containerStyle9 = (tokens) => ({
12666
+ position: "relative",
12667
+ display: "flex",
12668
+ flexDirection: "column",
12669
+ width: "100%",
12670
+ maxWidth: 420,
12671
+ height: "100%",
12672
+ margin: "0 auto",
12673
+ overflow: "hidden",
12674
+ borderRadius: tokens.radiusLg,
12675
+ background: tokens.bgCard,
12676
+ backdropFilter: "blur(16px)",
12677
+ WebkitBackdropFilter: "blur(16px)",
12678
+ fontFamily: tokens.fontFamily,
12679
+ boxSizing: "border-box"
12680
+ });
12681
+ var contentStyle9 = {
12682
+ flex: 1,
12683
+ minHeight: 0,
12684
+ display: "flex",
12685
+ flexDirection: "column",
12686
+ justifyContent: "space-between",
12687
+ alignItems: "center",
12688
+ padding: "72px 32px 32px",
12689
+ gap: 24,
12690
+ boxSizing: "border-box"
12691
+ };
12692
+ var heroStyle3 = {
12693
+ flex: 1,
12694
+ minHeight: 0,
12695
+ display: "flex",
12696
+ flexDirection: "column",
12697
+ justifyContent: "center",
12698
+ alignItems: "center",
12699
+ gap: 16,
12700
+ width: "100%"
12701
+ };
12702
+ var titleStyle4 = (color) => ({
12703
+ margin: 0,
12704
+ color,
12705
+ fontSize: 24,
12706
+ fontWeight: 700,
12707
+ lineHeight: 1.05,
12708
+ letterSpacing: 0,
12709
+ textAlign: "center"
12710
+ });
12711
+ var illustrationStyle3 = {
12712
+ width: 160,
12713
+ height: 160,
12714
+ objectFit: "contain",
12715
+ display: "block"
12716
+ };
12717
+ var infoCardStyle2 = (bg) => ({
12718
+ display: "flex",
12719
+ gap: 12,
12720
+ alignItems: "flex-start",
12721
+ width: "100%",
12722
+ padding: 20,
12723
+ borderRadius: 24,
12724
+ background: bg,
12725
+ boxSizing: "border-box"
12726
+ });
12727
+ var infoTextStyle = {
12728
+ display: "flex",
12729
+ flexDirection: "column",
12730
+ gap: 4,
12731
+ flex: 1,
12732
+ minWidth: 0,
12733
+ paddingTop: 2
12734
+ };
12735
+ var infoTitleStyle = (color) => ({
12736
+ color,
12737
+ fontSize: 16,
12738
+ fontWeight: 700,
12739
+ lineHeight: 1.2
12740
+ });
12741
+ var infoSubtitleStyle = (color) => ({
12742
+ color,
12743
+ fontSize: 16,
12744
+ fontWeight: 400,
12745
+ lineHeight: 1.2
12746
+ });
12747
+ var footerStackStyle2 = {
12748
+ display: "flex",
12749
+ flexDirection: "column",
12750
+ gap: 8,
12751
+ width: "100%"
12752
+ };
12753
+ var ctaStyle = (tokens, disabled) => ({
12754
+ display: "flex",
12755
+ alignItems: "center",
12756
+ justifyContent: "center",
12757
+ width: "100%",
12758
+ height: 56,
12759
+ padding: "4px 24px",
12760
+ border: "none",
12761
+ borderRadius: 48,
12762
+ background: `linear-gradient(180deg, ${tokens.accent}, ${tokens.accentHover})`,
12763
+ color: tokens.accentText,
12764
+ fontSize: 16,
12765
+ fontWeight: 700,
12766
+ fontFamily: "inherit",
12767
+ cursor: disabled ? "default" : "pointer",
12768
+ opacity: disabled ? 0.5 : 1,
12769
+ transition: "opacity 0.15s ease",
12770
+ boxSizing: "border-box"
12771
+ });
12772
+ var noThanksStyle = (color, disabled) => ({
12773
+ width: "100%",
12774
+ height: 56,
12775
+ padding: "0 16px",
12776
+ background: "transparent",
12777
+ color,
12778
+ border: "none",
12779
+ borderRadius: 48,
12780
+ fontSize: 16,
12781
+ fontWeight: 400,
12782
+ fontFamily: "inherit",
12783
+ cursor: disabled ? "not-allowed" : "pointer",
12784
+ opacity: disabled ? 0.5 : 1,
12785
+ transition: "opacity 0.15s ease"
12786
+ });
12787
+ var navButtonStyle = (bg, color) => ({
12788
+ position: "absolute",
12789
+ top: 16,
12790
+ zIndex: 1,
12791
+ width: 44,
12792
+ height: 44,
12793
+ border: "none",
12794
+ borderRadius: 40,
12795
+ background: bg,
12796
+ color,
12797
+ display: "flex",
12798
+ alignItems: "center",
12799
+ justifyContent: "center",
12800
+ cursor: "pointer",
12801
+ padding: 0
12802
+ });
12803
+ var errorBannerStyle6 = (tokens) => ({
12804
+ width: "100%",
12805
+ borderRadius: 16,
12806
+ padding: "11px 14px",
12807
+ background: tokens.errorBg,
12808
+ border: `1px solid ${tokens.error}66`,
12809
+ color: tokens.error,
12810
+ fontSize: "0.84rem",
12811
+ lineHeight: 1.5,
12812
+ textAlign: "left",
12813
+ boxSizing: "border-box"
12814
+ });
12200
12815
  var SHIMMER_ROWS = 3;
12201
12816
  function LinkTokensScreen({
12202
12817
  entries: entries2,
@@ -12219,7 +12834,7 @@ function LinkTokensScreen({
12219
12834
  ScreenLayout,
12220
12835
  {
12221
12836
  scrollableBody: false,
12222
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle2, children: [
12837
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
12223
12838
  /* @__PURE__ */ jsxs("div", { style: lockBannerStyle, children: [
12224
12839
  /* @__PURE__ */ jsx("span", { style: lockIconWrapStyle(t.text), children: /* @__PURE__ */ jsx(LockIcon2, {}) }),
12225
12840
  /* @__PURE__ */ jsx("p", { style: lockBannerTextStyle(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -12253,11 +12868,11 @@ function LinkTokensScreen({
12253
12868
  {
12254
12869
  onBack,
12255
12870
  onLogout,
12256
- center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 })
12871
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
12257
12872
  }
12258
12873
  ),
12259
- /* @__PURE__ */ jsxs("div", { style: contentStyle9, children: [
12260
- /* @__PURE__ */ jsx("h2", { style: headingStyle7(t.text), children: "Pick your asset for passkey deposits" }),
12874
+ /* @__PURE__ */ jsxs("div", { style: contentStyle10, children: [
12875
+ /* @__PURE__ */ jsx("h2", { style: headingStyle6(t.text), children: "Pick your asset for passkey deposits" }),
12261
12876
  /* @__PURE__ */ jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
12262
12877
  showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxs(
12263
12878
  "div",
@@ -12309,7 +12924,7 @@ function LockIcon2() {
12309
12924
  }
12310
12925
  ) });
12311
12926
  }
12312
- var contentStyle9 = {
12927
+ var contentStyle10 = {
12313
12928
  display: "flex",
12314
12929
  flexDirection: "column",
12315
12930
  alignItems: "center",
@@ -12319,14 +12934,14 @@ var contentStyle9 = {
12319
12934
  minHeight: 0,
12320
12935
  width: "100%"
12321
12936
  };
12322
- var wordmarkImgStyle2 = {
12937
+ var wordmarkImgStyle3 = {
12323
12938
  height: 22,
12324
12939
  width: "auto",
12325
12940
  display: "block",
12326
12941
  pointerEvents: "none",
12327
12942
  userSelect: "none"
12328
12943
  };
12329
- var headingStyle7 = (color) => ({
12944
+ var headingStyle6 = (color) => ({
12330
12945
  fontSize: 24,
12331
12946
  fontWeight: 700,
12332
12947
  lineHeight: "normal",
@@ -12394,7 +13009,7 @@ var bannerSlotStyle = {
12394
13009
  justifyContent: "center",
12395
13010
  width: "100%"
12396
13011
  };
12397
- var footerStackStyle2 = {
13012
+ var footerStackStyle3 = {
12398
13013
  display: "flex",
12399
13014
  flexDirection: "column",
12400
13015
  gap: 16,
@@ -12430,7 +13045,7 @@ function DepositCompleteScreen({ amount }) {
12430
13045
  const { tokens } = useBlinkConfig();
12431
13046
  return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
12432
13047
  /* @__PURE__ */ jsx(ScreenHeader, {}),
12433
- /* @__PURE__ */ jsxs("div", { style: contentStyle10, children: [
13048
+ /* @__PURE__ */ jsxs("div", { style: contentStyle11, children: [
12434
13049
  /* @__PURE__ */ jsx(
12435
13050
  "img",
12436
13051
  {
@@ -12440,12 +13055,12 @@ function DepositCompleteScreen({ amount }) {
12440
13055
  style: illustrationStyle4
12441
13056
  }
12442
13057
  ),
12443
- /* @__PURE__ */ jsx("h2", { style: headingStyle8(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
12444
- /* @__PURE__ */ jsx("p", { style: subtitleStyle6(tokens.textSecondary), children: "You\u2019re all set for one-tap deposits now. Next time, just use your passkey." })
13058
+ /* @__PURE__ */ jsx("h2", { style: headingStyle7(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
13059
+ /* @__PURE__ */ jsx("p", { style: subtitleStyle5(tokens.textSecondary), children: "You\u2019re all set for one-tap deposits now. Next time, just use your passkey." })
12445
13060
  ] })
12446
13061
  ] });
12447
13062
  }
12448
- var contentStyle10 = {
13063
+ var contentStyle11 = {
12449
13064
  flex: 1,
12450
13065
  display: "flex",
12451
13066
  flexDirection: "column",
@@ -12461,7 +13076,7 @@ var illustrationStyle4 = {
12461
13076
  objectFit: "contain",
12462
13077
  display: "block"
12463
13078
  };
12464
- var headingStyle8 = (color) => ({
13079
+ var headingStyle7 = (color) => ({
12465
13080
  fontSize: "2rem",
12466
13081
  fontWeight: 700,
12467
13082
  lineHeight: 1.05,
@@ -12469,7 +13084,7 @@ var headingStyle8 = (color) => ({
12469
13084
  color,
12470
13085
  margin: 0
12471
13086
  });
12472
- var subtitleStyle6 = (color) => ({
13087
+ var subtitleStyle5 = (color) => ({
12473
13088
  fontSize: "1rem",
12474
13089
  color,
12475
13090
  margin: 0,
@@ -12602,7 +13217,7 @@ function SelectDepositSourceScreen({
12602
13217
  footer,
12603
13218
  children: [
12604
13219
  /* @__PURE__ */ jsx(ScreenHeader, { title: "Select source", onBack: onBack ?? onDone, onLogout }),
12605
- /* @__PURE__ */ jsxs("div", { "data-testid": "select-deposit-source-scroll-content", style: contentStyle11, children: [
13220
+ /* @__PURE__ */ jsxs("div", { "data-testid": "select-deposit-source-scroll-content", style: contentStyle12, children: [
12606
13221
  orderedAccounts.map((account) => {
12607
13222
  const authRows = authorized.filter((opt) => rowAccountId(opt) === account.id);
12608
13223
  const reqRows = requiresAuth.filter((opt) => rowAccountId(opt) === account.id);
@@ -12645,7 +13260,7 @@ function SelectDepositSourceScreen({
12645
13260
  label: "Send manually",
12646
13261
  color: tokens.text,
12647
13262
  onClick: onSendManually,
12648
- icon: /* @__PURE__ */ jsx(QrIcon2, { color: tokens.text })
13263
+ icon: /* @__PURE__ */ jsx(QrIcon3, { color: tokens.text })
12649
13264
  }
12650
13265
  ),
12651
13266
  onAddProvider && /* @__PURE__ */ jsx(
@@ -12663,7 +13278,7 @@ function SelectDepositSourceScreen({
12663
13278
  }
12664
13279
  );
12665
13280
  }
12666
- var contentStyle11 = {
13281
+ var contentStyle12 = {
12667
13282
  display: "flex",
12668
13283
  flexDirection: "column",
12669
13284
  gap: 8,
@@ -12755,7 +13370,7 @@ function ActionRow({
12755
13370
  }
12756
13371
  );
12757
13372
  }
12758
- function QrIcon2({ color }) {
13373
+ function QrIcon3({ color }) {
12759
13374
  return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12760
13375
  /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12761
13376
  /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -13453,7 +14068,7 @@ function SuccessScreen({
13453
14068
  type: "button",
13454
14069
  onClick: onDone,
13455
14070
  "aria-label": "Close",
13456
- style: closeButtonStyle4(tokens),
14071
+ style: closeButtonStyle5(tokens),
13457
14072
  children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
13458
14073
  "path",
13459
14074
  {
@@ -13488,7 +14103,7 @@ function SuccessScreen({
13488
14103
  style: illustrationStyle5
13489
14104
  }
13490
14105
  ),
13491
- /* @__PURE__ */ jsx("h2", { style: headingStyle9(tokens.text), children: "You\u2019re all set" })
14106
+ /* @__PURE__ */ jsx("h2", { style: headingStyle8(tokens.text), children: "You\u2019re all set" })
13492
14107
  ] }) : /* @__PURE__ */ jsxs("div", { style: screenContentStyle, children: [
13493
14108
  /* @__PURE__ */ jsx(IconCircle, { variant: "error", size: 64, children: /* @__PURE__ */ jsx("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ 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 }) }) }),
13494
14109
  /* @__PURE__ */ jsx("h2", { style: failureHeadingStyle(tokens.text), children: "Transfer failed" }),
@@ -13497,7 +14112,7 @@ function SuccessScreen({
13497
14112
  /* @__PURE__ */ jsx("span", { style: summaryLabelStyle(tokens.textMuted), children: "From" }),
13498
14113
  /* @__PURE__ */ jsx("span", { style: summaryValueStyle(tokens.text), children: sourceName })
13499
14114
  ] }) }),
13500
- !sourceName && merchantName && /* @__PURE__ */ jsxs("p", { style: subtitleStyle7(tokens.textSecondary), children: [
14115
+ !sourceName && merchantName && /* @__PURE__ */ jsxs("p", { style: subtitleStyle6(tokens.textSecondary), children: [
13501
14116
  "to ",
13502
14117
  merchantName,
13503
14118
  " \u2014 $",
@@ -13523,7 +14138,7 @@ var illustrationStyle5 = {
13523
14138
  objectFit: "contain",
13524
14139
  display: "block"
13525
14140
  };
13526
- var headingStyle9 = (color) => ({
14141
+ var headingStyle8 = (color) => ({
13527
14142
  fontSize: "2rem",
13528
14143
  fontWeight: 700,
13529
14144
  lineHeight: 1.05,
@@ -13538,7 +14153,7 @@ var screenContentStyle = {
13538
14153
  alignItems: "center",
13539
14154
  paddingTop: 16
13540
14155
  };
13541
- var subtitleStyle7 = (color) => ({
14156
+ var subtitleStyle6 = (color) => ({
13542
14157
  fontSize: "0.9rem",
13543
14158
  color,
13544
14159
  margin: "0 0 28px",
@@ -13588,7 +14203,7 @@ var returnMessageStyle = (color) => ({
13588
14203
  margin: "0 0 4px",
13589
14204
  lineHeight: 1.5
13590
14205
  });
13591
- var closeButtonStyle4 = (tokens) => ({
14206
+ var closeButtonStyle5 = (tokens) => ({
13592
14207
  width: 40,
13593
14208
  height: 40,
13594
14209
  borderRadius: "50%",
@@ -13633,7 +14248,7 @@ function SelectSourceScreen({
13633
14248
  onLogout
13634
14249
  }
13635
14250
  ),
13636
- /* @__PURE__ */ jsx("p", { style: subtitleStyle8(tokens.textMuted), children: "Choose which chain and token to pay from." }),
14251
+ /* @__PURE__ */ jsx("p", { style: subtitleStyle7(tokens.textMuted), children: "Choose which chain and token to pay from." }),
13637
14252
  /* @__PURE__ */ jsx("label", { style: labelStyle5(tokens.textSecondary), children: "Chain" }),
13638
14253
  /* @__PURE__ */ jsx("div", { style: optionListStyle, children: choices.map((chain) => {
13639
14254
  const isSelected = chain.chainName === selectedChainName;
@@ -13695,7 +14310,7 @@ function SelectSourceScreen({
13695
14310
  }
13696
14311
  );
13697
14312
  }
13698
- var subtitleStyle8 = (color) => ({
14313
+ var subtitleStyle7 = (color) => ({
13699
14314
  fontSize: "0.85rem",
13700
14315
  color,
13701
14316
  margin: "0 0 20px",
@@ -13837,8 +14452,8 @@ function AdvancedSourceScreen({
13837
14452
  right: /* @__PURE__ */ jsx("span", { style: advancedBadgeStyle(tokens.accent), children: "Advanced" })
13838
14453
  }
13839
14454
  ),
13840
- /* @__PURE__ */ jsx("h2", { style: headingStyle10(tokens.text), children: "Set up One-Tap deposits" }),
13841
- /* @__PURE__ */ jsx("p", { style: subtitleStyle9(tokens.textSecondary), children: "Select a token source for your One-Tap deposits." }),
14455
+ /* @__PURE__ */ jsx("h2", { style: headingStyle9(tokens.text), children: "Set up One-Tap deposits" }),
14456
+ /* @__PURE__ */ jsx("p", { style: subtitleStyle8(tokens.textSecondary), children: "Select a token source for your One-Tap deposits." }),
13842
14457
  /* @__PURE__ */ jsx("label", { style: labelStyle6(tokens.textSecondary), children: "Select tokens to approve" }),
13843
14458
  /* @__PURE__ */ jsx("div", { style: chainListStyle, children: choices.map((chain) => {
13844
14459
  const isExpanded = expandedChain === chain.chainName;
@@ -13901,14 +14516,14 @@ var advancedBadgeStyle = (color) => ({
13901
14516
  padding: "3px 10px",
13902
14517
  letterSpacing: "0.02em"
13903
14518
  });
13904
- var headingStyle10 = (color) => ({
14519
+ var headingStyle9 = (color) => ({
13905
14520
  fontSize: "1.3rem",
13906
14521
  fontWeight: 700,
13907
14522
  letterSpacing: "-0.02em",
13908
14523
  color,
13909
14524
  margin: "8px 0 4px"
13910
14525
  });
13911
- var subtitleStyle9 = (color) => ({
14526
+ var subtitleStyle8 = (color) => ({
13912
14527
  fontSize: "0.86rem",
13913
14528
  color,
13914
14529
  margin: "0 0 20px",
@@ -14042,8 +14657,8 @@ function TransferStatusLayout({
14042
14657
  footer: showRetry && onRetry ? /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetry, children: retryLabel }) : void 0,
14043
14658
  children: /* @__PURE__ */ jsxs("div", { style: wrapperStyle, children: [
14044
14659
  onLogout && /* @__PURE__ */ jsx("div", { style: menuOverlayStyle, children: /* @__PURE__ */ jsx(SettingsMenu, { onLogout }) }),
14045
- /* @__PURE__ */ jsxs("div", { style: contentStyle12, children: [
14046
- /* @__PURE__ */ jsx("h2", { style: headingStyle11(tokens.text), children: heading }),
14660
+ /* @__PURE__ */ jsxs("div", { style: contentStyle13, children: [
14661
+ /* @__PURE__ */ jsx("h2", { style: headingStyle10(tokens.text), children: heading }),
14047
14662
  visibleError && /* @__PURE__ */ jsx("div", { style: errorBannerStyle7(tokens), children: visibleError }),
14048
14663
  children
14049
14664
  ] })
@@ -14120,7 +14735,7 @@ var menuOverlayStyle = {
14120
14735
  right: 0,
14121
14736
  zIndex: 1
14122
14737
  };
14123
- var contentStyle12 = {
14738
+ var contentStyle13 = {
14124
14739
  flex: 1,
14125
14740
  display: "flex",
14126
14741
  flexDirection: "column",
@@ -14130,7 +14745,7 @@ var contentStyle12 = {
14130
14745
  padding: "32px 0",
14131
14746
  width: "100%"
14132
14747
  };
14133
- var headingStyle11 = (color) => ({
14748
+ var headingStyle10 = (color) => ({
14134
14749
  fontSize: "1.5rem",
14135
14750
  fontWeight: 700,
14136
14751
  lineHeight: "normal",
@@ -14237,7 +14852,7 @@ function DepositAddressScreen({
14237
14852
  ) : void 0
14238
14853
  }
14239
14854
  ),
14240
- /* @__PURE__ */ jsxs("div", { style: contentStyle13, children: [
14855
+ /* @__PURE__ */ jsxs("div", { style: contentStyle14, children: [
14241
14856
  /* @__PURE__ */ jsx("h2", { style: depositTitleStyle(tokens.text), children: "Deposit Address" }),
14242
14857
  qrReady && session && selectedOption ? /* @__PURE__ */ jsx(
14243
14858
  DepositQrCode,
@@ -14332,7 +14947,7 @@ var FeeRow = memo(function FeeRow2({
14332
14947
  }) {
14333
14948
  return /* @__PURE__ */ jsx("p", { style: bodyStyle3(color), children: feeCopy2 });
14334
14949
  });
14335
- var contentStyle13 = {
14950
+ var contentStyle14 = {
14336
14951
  alignItems: "center",
14337
14952
  display: "flex",
14338
14953
  flex: 1,
@@ -14564,7 +15179,7 @@ function OpenWalletScreen({
14564
15179
  return /* @__PURE__ */ jsxs(
14565
15180
  ScreenLayout,
14566
15181
  {
14567
- footer: error ? /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
15182
+ footer: error ? /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14568
15183
  /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14569
15184
  onRetryAuthorization && /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetryAuthorization, children: "Retry" })
14570
15185
  ] }) : void 0,
@@ -14582,7 +15197,7 @@ function OpenWalletScreen({
14582
15197
  /* @__PURE__ */ jsxs("div", { style: desktopContentStyle, children: [
14583
15198
  /* @__PURE__ */ jsxs("div", { style: primaryClusterStyle, children: [
14584
15199
  logoBlock,
14585
- /* @__PURE__ */ jsxs("h2", { style: headingStyle12(tokens.text), children: [
15200
+ /* @__PURE__ */ jsxs("h2", { style: headingStyle11(tokens.text), children: [
14586
15201
  "Setting up ",
14587
15202
  displayName,
14588
15203
  "\u2026"
@@ -14614,7 +15229,7 @@ function OpenWalletScreen({
14614
15229
  return /* @__PURE__ */ jsxs(
14615
15230
  ScreenLayout,
14616
15231
  {
14617
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
15232
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14618
15233
  error && /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14619
15234
  /* @__PURE__ */ jsxs(
14620
15235
  SecondaryButton,
@@ -14645,7 +15260,7 @@ function OpenWalletScreen({
14645
15260
  {
14646
15261
  type: "button",
14647
15262
  onClick: onLogout,
14648
- style: closeButtonStyle5(tokens.bgRecessed, tokens.text),
15263
+ style: closeButtonStyle6(tokens.bgRecessed, tokens.text),
14649
15264
  "aria-label": "Close",
14650
15265
  children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
14651
15266
  "path",
@@ -14687,7 +15302,7 @@ function useDelayedStatusRetry(enabled, deeplinkUri) {
14687
15302
  }, [deeplinkUri, enabled]);
14688
15303
  return visible;
14689
15304
  }
14690
- var contentStyle14 = {
15305
+ var contentStyle15 = {
14691
15306
  flex: 1,
14692
15307
  display: "flex",
14693
15308
  flexDirection: "column",
@@ -14697,7 +15312,7 @@ var contentStyle14 = {
14697
15312
  gap: 12
14698
15313
  };
14699
15314
  var desktopContentStyle = {
14700
- ...contentStyle14,
15315
+ ...contentStyle15,
14701
15316
  gap: 32
14702
15317
  };
14703
15318
  var primaryClusterStyle = {
@@ -14707,7 +15322,7 @@ var primaryClusterStyle = {
14707
15322
  textAlign: "center",
14708
15323
  gap: 12
14709
15324
  };
14710
- var footerStackStyle3 = {
15325
+ var footerStackStyle4 = {
14711
15326
  display: "flex",
14712
15327
  flexDirection: "column",
14713
15328
  gap: 8
@@ -14756,7 +15371,7 @@ var reownLogoStyle = {
14756
15371
  borderRadius: "50%",
14757
15372
  objectFit: "cover"
14758
15373
  };
14759
- var headingStyle12 = (color) => ({
15374
+ var headingStyle11 = (color) => ({
14760
15375
  fontSize: "1.5rem",
14761
15376
  fontWeight: 700,
14762
15377
  lineHeight: 1.1,
@@ -14872,7 +15487,7 @@ var mobileBodyStyle = (color) => ({
14872
15487
  margin: 0,
14873
15488
  maxWidth: 350
14874
15489
  });
14875
- var closeButtonStyle5 = (bg, color) => ({
15490
+ var closeButtonStyle6 = (bg, color) => ({
14876
15491
  width: 44,
14877
15492
  height: 44,
14878
15493
  borderRadius: "50%",
@@ -14908,7 +15523,7 @@ function ApprovingInWalletScreen({
14908
15523
  ScreenLayout,
14909
15524
  {
14910
15525
  scrollableBody: false,
14911
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
15526
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle5, children: [
14912
15527
  /* @__PURE__ */ jsxs("div", { style: lockBannerStyle2, children: [
14913
15528
  /* @__PURE__ */ jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsx(LockIcon3, {}) }),
14914
15529
  /* @__PURE__ */ jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -14924,11 +15539,11 @@ function ApprovingInWalletScreen({
14924
15539
  {
14925
15540
  onBack,
14926
15541
  onLogout,
14927
- center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
15542
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle4 })
14928
15543
  }
14929
15544
  ),
14930
- /* @__PURE__ */ jsxs("div", { style: contentStyle15, children: [
14931
- /* @__PURE__ */ jsx("h2", { style: headingStyle13(t.text), children: `Authorizing ${token} for passkey deposits` }),
15545
+ /* @__PURE__ */ jsxs("div", { style: contentStyle16, children: [
15546
+ /* @__PURE__ */ jsx("h2", { style: headingStyle12(t.text), children: `Authorizing ${token} for passkey deposits` }),
14932
15547
  /* @__PURE__ */ jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14933
15548
  /* @__PURE__ */ jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14934
15549
  steps.map((s, i) => /* @__PURE__ */ jsx(ChecklistRow, { step: s }, i))
@@ -15022,14 +15637,14 @@ function LockIcon3() {
15022
15637
  }
15023
15638
  ) });
15024
15639
  }
15025
- var wordmarkImgStyle3 = {
15640
+ var wordmarkImgStyle4 = {
15026
15641
  height: 22,
15027
15642
  width: "auto",
15028
15643
  display: "block",
15029
15644
  pointerEvents: "none",
15030
15645
  userSelect: "none"
15031
15646
  };
15032
- var contentStyle15 = {
15647
+ var contentStyle16 = {
15033
15648
  display: "flex",
15034
15649
  flexDirection: "column",
15035
15650
  alignItems: "center",
@@ -15039,7 +15654,7 @@ var contentStyle15 = {
15039
15654
  minHeight: 0,
15040
15655
  width: "100%"
15041
15656
  };
15042
- var headingStyle13 = (color) => ({
15657
+ var headingStyle12 = (color) => ({
15043
15658
  fontSize: 24,
15044
15659
  fontWeight: 700,
15045
15660
  lineHeight: "normal",
@@ -15090,7 +15705,7 @@ var labelStyle7 = (color) => ({
15090
15705
  lineHeight: 1.25,
15091
15706
  color
15092
15707
  });
15093
- var footerStackStyle4 = {
15708
+ var footerStackStyle5 = {
15094
15709
  display: "flex",
15095
15710
  flexDirection: "column",
15096
15711
  gap: 16,
@@ -15154,10 +15769,10 @@ function ConfirmSignScreen({
15154
15769
  ] }),
15155
15770
  children: [
15156
15771
  /* @__PURE__ */ jsx(ScreenHeader, { onLogout }),
15157
- /* @__PURE__ */ jsxs("div", { style: contentStyle16, children: [
15772
+ /* @__PURE__ */ jsxs("div", { style: contentStyle17, children: [
15158
15773
  logoSrc ? /* @__PURE__ */ jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsx(Spinner, { size: 48 }),
15159
- /* @__PURE__ */ jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
15160
- /* @__PURE__ */ jsx("p", { style: subtitleStyle10(tokens.textSecondary), children: subtitle }),
15774
+ /* @__PURE__ */ jsx("h2", { style: headingStyle13(tokens.text), children: heading }),
15775
+ /* @__PURE__ */ jsx("p", { style: subtitleStyle9(tokens.textSecondary), children: subtitle }),
15161
15776
  /* @__PURE__ */ jsxs("div", { style: successBadgeStyle(tokens), children: [
15162
15777
  /* @__PURE__ */ jsx("span", { style: checkmarkStyle, children: "\u2713" }),
15163
15778
  /* @__PURE__ */ jsx("span", { children: badge })
@@ -15167,7 +15782,7 @@ function ConfirmSignScreen({
15167
15782
  }
15168
15783
  );
15169
15784
  }
15170
- var contentStyle16 = {
15785
+ var contentStyle17 = {
15171
15786
  flex: 1,
15172
15787
  display: "flex",
15173
15788
  flexDirection: "column",
@@ -15182,14 +15797,14 @@ var logoStyle3 = {
15182
15797
  borderRadius: 14,
15183
15798
  objectFit: "contain"
15184
15799
  };
15185
- var headingStyle14 = (color) => ({
15800
+ var headingStyle13 = (color) => ({
15186
15801
  fontSize: "1.45rem",
15187
15802
  fontWeight: 700,
15188
15803
  letterSpacing: "-0.02em",
15189
15804
  color,
15190
15805
  margin: "20px 0 8px"
15191
15806
  });
15192
- var subtitleStyle10 = (color) => ({
15807
+ var subtitleStyle9 = (color) => ({
15193
15808
  fontSize: "0.9rem",
15194
15809
  color,
15195
15810
  margin: "0 0 24px",
@@ -15546,10 +16161,10 @@ function GuestTokenPickerScreen({
15546
16161
  ] }),
15547
16162
  children: [
15548
16163
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15549
- /* @__PURE__ */ jsxs("div", { style: contentStyle17, children: [
15550
- /* @__PURE__ */ jsx("h2", { style: headingStyle15(tokens.text), children: title }),
16164
+ /* @__PURE__ */ jsxs("div", { style: contentStyle18, children: [
16165
+ /* @__PURE__ */ jsx("h2", { style: headingStyle14(tokens.text), children: title }),
15551
16166
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15552
- entries2.length === 0 ? /* @__PURE__ */ jsx("p", { style: subtitleStyle11(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
16167
+ entries2.length === 0 ? /* @__PURE__ */ jsx("p", { style: subtitleStyle10(tokens.textMuted), children: emptyMessage ?? "No tokens available." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
15553
16168
  /* @__PURE__ */ jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15554
16169
  /* @__PURE__ */ jsx(
15555
16170
  "button",
@@ -15623,21 +16238,21 @@ function TokenRow({
15623
16238
  ] })
15624
16239
  ] });
15625
16240
  }
15626
- var contentStyle17 = {
16241
+ var contentStyle18 = {
15627
16242
  flex: 1,
15628
16243
  display: "flex",
15629
16244
  flexDirection: "column",
15630
16245
  padding: "0 20px 16px",
15631
16246
  gap: 12
15632
16247
  };
15633
- var headingStyle15 = (color) => ({
16248
+ var headingStyle14 = (color) => ({
15634
16249
  fontSize: "1.25rem",
15635
16250
  fontWeight: 700,
15636
16251
  color,
15637
16252
  margin: "0 0 8px",
15638
16253
  textAlign: "center"
15639
16254
  });
15640
- var subtitleStyle11 = (color) => ({
16255
+ var subtitleStyle10 = (color) => ({
15641
16256
  fontSize: "0.9rem",
15642
16257
  color,
15643
16258
  textAlign: "center"
@@ -15731,6 +16346,7 @@ var errorBannerStyle8 = (themeTokens) => ({
15731
16346
  });
15732
16347
  function ManualTransferFlow({
15733
16348
  hasMerchantAuthorization,
16349
+ authenticated = false,
15734
16350
  onCreatePasskey,
15735
16351
  createPasskeyLoading = false,
15736
16352
  createPasskeyError = null,
@@ -15774,8 +16390,8 @@ function ManualTransferFlow({
15774
16390
  if (!hasMerchantAuthorization) {
15775
16391
  screenContent = /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15776
16392
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15777
- /* @__PURE__ */ jsxs("div", { style: contentStyle18, children: [
15778
- /* @__PURE__ */ jsx("h2", { style: headingStyle16(tokens.text), children: "Manual transfer unavailable" }),
16393
+ /* @__PURE__ */ jsxs("div", { style: contentStyle19, children: [
16394
+ /* @__PURE__ */ jsx("h2", { style: headingStyle15(tokens.text), children: "Manual transfer unavailable" }),
15779
16395
  /* @__PURE__ */ jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15780
16396
  ] })
15781
16397
  ] });
@@ -15809,7 +16425,19 @@ function ManualTransferFlow({
15809
16425
  );
15810
16426
  } else if (screen === "deposit-complete") {
15811
16427
  const transferAmount = Number(session?.deliveredAmountUsd ?? session?.minAmountUsd ?? 0);
15812
- screenContent = /* @__PURE__ */ jsx(
16428
+ const showPasskeyUpsell = !authenticated && !passkeyCreated;
16429
+ screenContent = showPasskeyUpsell ? /* @__PURE__ */ jsx(
16430
+ ManualTransferPasskeyScreen,
16431
+ {
16432
+ onCreatePasskey: onCreatePasskey ?? (() => void 0),
16433
+ onNoThanks: onDismiss ?? onLogout ?? (() => void 0),
16434
+ amountUsd: transferAmount,
16435
+ loading: createPasskeyLoading,
16436
+ error: createPasskeyError,
16437
+ onBack,
16438
+ onClose: onDismiss ?? onLogout
16439
+ }
16440
+ ) : /* @__PURE__ */ jsx(
15813
16441
  SuccessScreen,
15814
16442
  {
15815
16443
  amount: transferAmount,
@@ -15818,7 +16446,7 @@ function ManualTransferFlow({
15818
16446
  onDone: onDismiss,
15819
16447
  onLogout
15820
16448
  }
15821
- ) ;
16449
+ );
15822
16450
  } else if (screen === "deposit-failed") {
15823
16451
  screenContent = /* @__PURE__ */ jsx(
15824
16452
  BlinkErrorScreen,
@@ -15843,7 +16471,7 @@ function ManualTransferFlow({
15843
16471
  }
15844
16472
  return screenContent;
15845
16473
  }
15846
- var contentStyle18 = {
16474
+ var contentStyle19 = {
15847
16475
  alignItems: "center",
15848
16476
  display: "flex",
15849
16477
  flex: 1,
@@ -15854,7 +16482,7 @@ var contentStyle18 = {
15854
16482
  paddingBottom: 24,
15855
16483
  width: "100%"
15856
16484
  };
15857
- var headingStyle16 = (color) => ({
16485
+ var headingStyle15 = (color) => ({
15858
16486
  color,
15859
16487
  fontSize: "2rem",
15860
16488
  lineHeight: 1.05,
@@ -15879,7 +16507,7 @@ function GenericLoadingShimmer() {
15879
16507
  role: "status",
15880
16508
  "aria-label": "Loading payment flow",
15881
16509
  "aria-busy": "true",
15882
- style: sheetStyle2(tokens),
16510
+ style: sheetStyle3(tokens),
15883
16511
  children: [
15884
16512
  /* @__PURE__ */ jsx("style", { children: `
15885
16513
  @keyframes blink-loading-shimmer {
@@ -15925,7 +16553,7 @@ function ShimmerBlock2({
15925
16553
  }
15926
16554
  );
15927
16555
  }
15928
- var sheetStyle2 = (tokens) => ({
16556
+ var sheetStyle3 = (tokens) => ({
15929
16557
  display: "flex",
15930
16558
  flexDirection: "column",
15931
16559
  height: "100%",
@@ -15986,6 +16614,19 @@ function buildDepositOptionsScreenProps({ flow, handlers }) {
15986
16614
  onClose: flow.isMobileApp ? void 0 : flow.onBack
15987
16615
  };
15988
16616
  }
16617
+ function buildWelcomeBackScreenProps({ flow, handlers }) {
16618
+ return {
16619
+ // "Complete setup & Deposit" advances the returning user to the wallet
16620
+ // picker (ACKNOWLEDGE_WELCOME_BACK releases the welcome-back derivation).
16621
+ onComplete: handlers.onAcknowledgeWelcomeBack,
16622
+ // "Send Crypto Manually" enters the manual-transfer flow, same target as
16623
+ // the logged-in source sheet's "Send manually" row.
16624
+ onToAddress: () => handlers.onSetPhase({ step: "manual-transfer" }),
16625
+ // Inside a native mobile in-app browser the host chrome handles dismissal,
16626
+ // so suppress the in-screen (X) close button.
16627
+ onClose: flow.isMobileApp ? void 0 : flow.onBack
16628
+ };
16629
+ }
15989
16630
  function buildWalletPickerScreenProps({
15990
16631
  flow,
15991
16632
  handlers
@@ -16406,6 +17047,7 @@ function StepRendererContent({
16406
17047
  ManualTransferFlow,
16407
17048
  {
16408
17049
  hasMerchantAuthorization: flow.merchantAuthorization != null,
17050
+ authenticated: flow.authenticated,
16409
17051
  onCreatePasskey: handlers.onSignupWithPasskey,
16410
17052
  createPasskeyLoading: flow.passkeyLoading,
16411
17053
  createPasskeyError: flow.state.error,
@@ -16420,6 +17062,8 @@ function StepRendererContent({
16420
17062
  return /* @__PURE__ */ jsx(LoginScreen, { ...buildLoginScreenProps(input) });
16421
17063
  case "deposit-options":
16422
17064
  return /* @__PURE__ */ jsx(DepositOptionsScreen, { ...buildDepositOptionsScreenProps(input) });
17065
+ case "welcome-back":
17066
+ return /* @__PURE__ */ jsx(WelcomeBackScreen, { ...buildWelcomeBackScreenProps(input) });
16423
17067
  case "wallet-picker":
16424
17068
  return /* @__PURE__ */ jsx(WalletPickerScreen, { ...buildWalletPickerScreenProps(input) });
16425
17069
  case "open-wallet":
@@ -19746,6 +20390,7 @@ function BlinkPaymentInner({
19746
20390
  onCommitTokenAuthorization: provider.handleCommitTokenAuthorization,
19747
20391
  onLogin: () => dispatch({ type: "REQUEST_LOGIN" }),
19748
20392
  onCancelLogin: () => dispatch({ type: "CANCEL_LOGIN_REQUEST" }),
20393
+ onAcknowledgeWelcomeBack: () => dispatch({ type: "ACKNOWLEDGE_WELCOME_BACK" }),
19749
20394
  onSetDepositToken: handleSetDepositToken,
19750
20395
  onConfirmSetupDeposit: handleConfirmSetupDeposit,
19751
20396
  onAmountInput: (value) => dispatch({ type: "SET_AMOUNT_INPUT", value }),
@@ -19838,6 +20483,6 @@ function BlinkPaymentInner({
19838
20483
  ) });
19839
20484
  }
19840
20485
 
19841
- export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, appendDebug, api_exports as blinkApi, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useTransferPolling, useTransferSigning };
20486
+ export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useTransferPolling, useTransferSigning };
19842
20487
  //# sourceMappingURL=index.js.map
19843
20488
  //# sourceMappingURL=index.js.map