@swype-org/react-sdk 0.2.311 → 0.2.315

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.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,69 @@ 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
+ });
10582
+
10583
+ // src/deviceBiometricUnlockText.ts
10584
+ var FALLBACK = "Biometric verification";
10585
+ function getDeviceBiometricUnlockText() {
10586
+ const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10587
+ if (/iPhone|iPad|iPod/i.test(ua)) {
10588
+ return "Face ID";
10589
+ }
10590
+ if (/Android/i.test(ua)) {
10591
+ return "Fingerprint or face unlock";
10592
+ }
10593
+ if (/Windows NT/i.test(ua)) {
10594
+ return "Windows Hello";
10595
+ }
10596
+ if (/Macintosh|Mac OS X/i.test(ua)) {
10597
+ return "Touch ID";
10598
+ }
10599
+ return FALLBACK;
10600
+ }
10506
10601
  function LoginScreen({
10507
10602
  onLoginWithPasskey,
10508
10603
  onSignupWithPasskey,
@@ -10592,8 +10687,11 @@ function PasskeyInfoCard({ tokens }) {
10592
10687
  /* @__PURE__ */ jsxs("div", { style: infoRowStyle, children: [
10593
10688
  /* @__PURE__ */ jsx("div", { style: { color: tokens.text, flexShrink: 0, paddingTop: 2 }, children: /* @__PURE__ */ jsx(FaceIdIcon, { size: 24 }) }),
10594
10689
  /* @__PURE__ */ jsxs("div", { style: infoRowTextStyle, children: [
10595
- /* @__PURE__ */ jsx("div", { style: infoRowTitleStyle(tokens.text), children: "Deposit with FaceID" }),
10596
- /* @__PURE__ */ jsx("div", { style: infoRowSubtitleStyle(tokens.text), children: "Once you try it, you won't go back" })
10690
+ /* @__PURE__ */ jsxs("div", { style: infoRowTitleStyle(tokens.text), children: [
10691
+ "Deposit with ",
10692
+ getDeviceBiometricUnlockText()
10693
+ ] }),
10694
+ /* @__PURE__ */ jsx("div", { style: infoRowSubtitleStyle(tokens.text), children: "Everywhere Blink is enabled" })
10597
10695
  ] })
10598
10696
  ] })
10599
10697
  ] });
@@ -10731,25 +10829,6 @@ var avatarStyle = (tokens) => ({
10731
10829
  color: tokens.textMuted,
10732
10830
  background: "transparent"
10733
10831
  });
10734
-
10735
- // src/deviceBiometricUnlockText.ts
10736
- var FALLBACK = "Biometric verification";
10737
- function getDeviceBiometricUnlockText() {
10738
- const ua = typeof navigator !== "undefined" && typeof navigator.userAgent === "string" ? navigator.userAgent : "";
10739
- if (/iPhone|iPad|iPod/i.test(ua)) {
10740
- return "Face ID";
10741
- }
10742
- if (/Android/i.test(ua)) {
10743
- return "Fingerprint or face unlock";
10744
- }
10745
- if (/Windows NT/i.test(ua)) {
10746
- return "Windows Hello";
10747
- }
10748
- if (/Macintosh|Mac OS X/i.test(ua)) {
10749
- return "Touch ID";
10750
- }
10751
- return FALLBACK;
10752
- }
10753
10832
  var CLUSTER_LOGOS = [
10754
10833
  METAMASK_LOGO,
10755
10834
  PHANTOM_LOGO,
@@ -10798,7 +10877,7 @@ function DepositOptionsScreen({
10798
10877
  onClick: onSignInWithBlink,
10799
10878
  style: depositPillStyle(tokens.accent),
10800
10879
  children: [
10801
- /* @__PURE__ */ jsx("span", { style: depositPillLabelStyle(tokens.accentText), children: depositLabel }),
10880
+ /* @__PURE__ */ jsx(FitText, { maxFontSize: 16, minFontSize: 11, color: tokens.accentText, children: depositLabel }),
10802
10881
  /* @__PURE__ */ jsx("span", { style: clusterStyle, children: CLUSTER_LOGOS.map((logo, i) => /* @__PURE__ */ jsx(
10803
10882
  "span",
10804
10883
  {
@@ -10905,6 +10984,7 @@ var depositPillStyle = (bg) => ({
10905
10984
  display: "flex",
10906
10985
  alignItems: "center",
10907
10986
  justifyContent: "space-between",
10987
+ gap: 8,
10908
10988
  width: "100%",
10909
10989
  height: 56,
10910
10990
  padding: "12px 12px 12px 24px",
@@ -10915,16 +10995,11 @@ var depositPillStyle = (bg) => ({
10915
10995
  boxSizing: "border-box",
10916
10996
  fontFamily: "inherit"
10917
10997
  });
10918
- var depositPillLabelStyle = (color) => ({
10919
- color,
10920
- fontSize: 16,
10921
- fontWeight: 500,
10922
- whiteSpace: "nowrap"
10923
- });
10924
10998
  var clusterStyle = {
10925
10999
  display: "inline-flex",
10926
11000
  alignItems: "center",
10927
- isolation: "isolate"
11001
+ isolation: "isolate",
11002
+ flexShrink: 0
10928
11003
  };
10929
11004
  var clusterChipStyle = (bg, last) => ({
10930
11005
  width: 32,
@@ -11019,102 +11094,391 @@ var closeButtonStyle2 = (bg, color) => ({
11019
11094
  cursor: "pointer",
11020
11095
  padding: 0
11021
11096
  });
11022
- function BlinkErrorScreen({
11023
- title,
11024
- message,
11025
- retryLabel,
11026
- 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,
11027
11108
  onClose
11028
11109
  }) {
11029
11110
  const { tokens } = useBlinkConfig();
11030
- const headerRight = onClose ? /* @__PURE__ */ jsx(
11031
- "button",
11032
- {
11033
- type: "button",
11034
- onClick: onClose,
11035
- "aria-label": "Close",
11036
- style: closeButtonStyle3(tokens),
11037
- children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
11038
- "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",
11039
11117
  {
11040
- d: "M6 6l12 12M18 6L6 18",
11041
- stroke: "currentColor",
11042
- strokeWidth: "2",
11043
- strokeLinecap: "round",
11044
- 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
+ ) })
11045
11132
  }
11046
- ) })
11047
- }
11048
- ) : void 0;
11049
- 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 }) {
11050
11183
  return /* @__PURE__ */ jsxs(
11051
- ScreenLayout,
11184
+ "svg",
11052
11185
  {
11053
- 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 },
11054
11192
  children: [
11055
- /* @__PURE__ */ jsx(ScreenHeader, { right: headerRight }),
11056
- /* @__PURE__ */ jsxs("div", { style: contentStyle3, children: [
11057
- /* @__PURE__ */ jsx(
11058
- "img",
11059
- {
11060
- src: BLINK_ERROR_ILLUSTRATION,
11061
- alt: "",
11062
- "aria-hidden": "true",
11063
- style: illustrationStyle2
11064
- }
11065
- ),
11066
- /* @__PURE__ */ jsx("h2", { style: headingStyle2(tokens.text), children: title }),
11067
- message && /* @__PURE__ */ jsx("p", { style: messageStyle(tokens.text), children: message })
11068
- ] })
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 })
11069
11203
  ]
11070
11204
  }
11071
11205
  );
11072
11206
  }
11207
+ var sheetStyle2 = {
11208
+ position: "relative",
11209
+ minHeight: "100%",
11210
+ display: "flex",
11211
+ flexDirection: "column",
11212
+ boxSizing: "border-box"
11213
+ };
11073
11214
  var contentStyle3 = {
11074
- textAlign: "center",
11075
- flex: 1,
11076
11215
  display: "flex",
11077
11216
  flexDirection: "column",
11078
11217
  alignItems: "center",
11079
- justifyContent: "center",
11080
- gap: 16
11218
+ gap: 32,
11219
+ padding: "32px 8px"
11081
11220
  };
11082
- var illustrationStyle2 = {
11083
- width: 200,
11084
- 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%",
11085
11237
  objectFit: "contain",
11086
11238
  display: "block"
11087
11239
  };
11088
- var headingStyle2 = (color) => ({
11089
- fontSize: "1.5rem",
11090
- fontWeight: 700,
11091
- lineHeight: 1.1,
11092
- letterSpacing: "-0.01em",
11093
- color,
11094
- margin: 0
11095
- });
11096
- var messageStyle = (color) => ({
11097
- fontSize: "1rem",
11098
- fontWeight: 400,
11099
- lineHeight: 1.4,
11100
- color,
11101
- margin: 0,
11102
- maxWidth: 320
11103
- });
11104
- var closeButtonStyle3 = (tokens) => ({
11105
- width: 40,
11106
- height: 40,
11107
- borderRadius: "50%",
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,
11108
11258
  border: "none",
11109
- background: tokens.bgRecessed,
11110
- color: tokens.text,
11259
+ borderRadius: 32,
11260
+ cursor: "pointer",
11261
+ boxSizing: "border-box",
11262
+ fontFamily: "inherit"
11263
+ });
11264
+ var completeSetupBandStyle = (color) => ({
11111
11265
  display: "flex",
11112
11266
  alignItems: "center",
11113
11267
  justifyContent: "center",
11114
- cursor: "pointer",
11115
- padding: 0
11268
+ height: 26,
11269
+ color,
11270
+ fontSize: 13,
11271
+ fontWeight: 600,
11272
+ letterSpacing: "0.01em"
11116
11273
  });
11117
- function AmountTooLowScreen({
11274
+ var depositPillStyle2 = (bg) => ({
11275
+ display: "flex",
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",
11300
+ justifyContent: "center",
11301
+ marginRight: last ? 0 : -12,
11302
+ filter: "drop-shadow(0 0 2px rgba(0, 0, 0, 0.24))",
11303
+ flexShrink: 0
11304
+ });
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({
11118
11482
  minAmountUsd,
11119
11483
  onRetry,
11120
11484
  onClose
@@ -11183,7 +11547,7 @@ function OtpVerifyScreen({
11183
11547
  ] }),
11184
11548
  children: [
11185
11549
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
11186
- /* @__PURE__ */ jsxs("div", { style: contentStyle4, children: [
11550
+ /* @__PURE__ */ jsxs("div", { style: contentStyle5, children: [
11187
11551
  /* @__PURE__ */ jsx("h2", { style: headingStyle3(tokens.text), children: "Confirm it is you" }),
11188
11552
  /* @__PURE__ */ jsxs("p", { style: subtitleStyle2(tokens.textSecondary), children: [
11189
11553
  "We sent a 6-digit code to",
@@ -11207,7 +11571,7 @@ function OtpVerifyScreen({
11207
11571
  }
11208
11572
  );
11209
11573
  }
11210
- var contentStyle4 = {
11574
+ var contentStyle5 = {
11211
11575
  textAlign: "center",
11212
11576
  display: "flex",
11213
11577
  flexDirection: "column",
@@ -11289,7 +11653,7 @@ function PasskeyScreen({
11289
11653
  ] }),
11290
11654
  children: [
11291
11655
  /* @__PURE__ */ jsx(ScreenHeader, { onBack, onLogout }),
11292
- /* @__PURE__ */ jsxs("div", { style: contentStyle5, children: [
11656
+ /* @__PURE__ */ jsxs("div", { style: contentStyle6, children: [
11293
11657
  /* @__PURE__ */ jsx("h2", { style: headingStyle4(tokens.text), children: "Secure your account with a passkey" }),
11294
11658
  /* @__PURE__ */ jsx("p", { style: subtitleStyle3(tokens.textSecondary), children: "This enables secure one-tap deposits on this device" }),
11295
11659
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle2(tokens), children: error })
@@ -11298,7 +11662,7 @@ function PasskeyScreen({
11298
11662
  }
11299
11663
  );
11300
11664
  }
11301
- var contentStyle5 = {
11665
+ var contentStyle6 = {
11302
11666
  textAlign: "center",
11303
11667
  flex: 1,
11304
11668
  display: "flex",
@@ -11365,7 +11729,7 @@ function PasskeyPopupWelcomeScreen({
11365
11729
  ) }),
11366
11730
  children: [
11367
11731
  /* @__PURE__ */ jsx(ScreenHeader, { onBack, onLogout }),
11368
- /* @__PURE__ */ jsxs("div", { style: contentStyle6, children: [
11732
+ /* @__PURE__ */ jsxs("div", { style: contentStyle7, children: [
11369
11733
  /* @__PURE__ */ jsxs("div", { style: lockupStyle, children: [
11370
11734
  /* @__PURE__ */ jsx("img", { src: BLINK_LOGO, alt: "", "aria-hidden": true, style: lockupMarkStyle }),
11371
11735
  /* @__PURE__ */ jsx("span", { style: wordmarkStyle(tokens.text), children: "Blink" })
@@ -11405,7 +11769,7 @@ function PasskeyIcon() {
11405
11769
  )
11406
11770
  ] });
11407
11771
  }
11408
- var contentStyle6 = {
11772
+ var contentStyle7 = {
11409
11773
  flex: 1,
11410
11774
  minHeight: 0,
11411
11775
  display: "flex",
@@ -11481,7 +11845,7 @@ function VerifyPasskeyScreen({
11481
11845
  ] }),
11482
11846
  children: [
11483
11847
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
11484
- /* @__PURE__ */ jsxs("div", { style: contentStyle7, children: [
11848
+ /* @__PURE__ */ jsxs("div", { style: contentStyle8, children: [
11485
11849
  /* @__PURE__ */ jsx(IconCircle, { variant: "accent", size: 64, children: /* @__PURE__ */ jsxs("svg", { width: "36", height: "36", viewBox: "0 0 24 24", fill: "none", children: [
11486
11850
  /* @__PURE__ */ jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "3", stroke: tokens.accent, strokeWidth: "1.5", strokeDasharray: "3 2" }),
11487
11851
  /* @__PURE__ */ jsx("circle", { cx: "9", cy: "10", r: "1", fill: tokens.accent }),
@@ -11497,7 +11861,7 @@ function VerifyPasskeyScreen({
11497
11861
  }
11498
11862
  );
11499
11863
  }
11500
- var contentStyle7 = {
11864
+ var contentStyle8 = {
11501
11865
  textAlign: "center",
11502
11866
  flex: 1,
11503
11867
  display: "flex",
@@ -12194,6 +12558,260 @@ var errorBannerStyle5 = (tokens) => ({
12194
12558
  marginBottom: 14,
12195
12559
  lineHeight: 1.5
12196
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
+ });
12197
12815
  var SHIMMER_ROWS = 3;
12198
12816
  function LinkTokensScreen({
12199
12817
  entries: entries2,
@@ -12216,7 +12834,7 @@ function LinkTokensScreen({
12216
12834
  ScreenLayout,
12217
12835
  {
12218
12836
  scrollableBody: false,
12219
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle2, children: [
12837
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
12220
12838
  /* @__PURE__ */ jsxs("div", { style: lockBannerStyle, children: [
12221
12839
  /* @__PURE__ */ jsx("span", { style: lockIconWrapStyle(t.text), children: /* @__PURE__ */ jsx(LockIcon2, {}) }),
12222
12840
  /* @__PURE__ */ jsx("p", { style: lockBannerTextStyle(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -12250,11 +12868,11 @@ function LinkTokensScreen({
12250
12868
  {
12251
12869
  onBack,
12252
12870
  onLogout,
12253
- center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle2 })
12871
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
12254
12872
  }
12255
12873
  ),
12256
- /* @__PURE__ */ jsxs("div", { style: contentStyle9, children: [
12257
- /* @__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" }),
12258
12876
  /* @__PURE__ */ jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
12259
12877
  showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxs(
12260
12878
  "div",
@@ -12306,7 +12924,7 @@ function LockIcon2() {
12306
12924
  }
12307
12925
  ) });
12308
12926
  }
12309
- var contentStyle9 = {
12927
+ var contentStyle10 = {
12310
12928
  display: "flex",
12311
12929
  flexDirection: "column",
12312
12930
  alignItems: "center",
@@ -12316,14 +12934,14 @@ var contentStyle9 = {
12316
12934
  minHeight: 0,
12317
12935
  width: "100%"
12318
12936
  };
12319
- var wordmarkImgStyle2 = {
12937
+ var wordmarkImgStyle3 = {
12320
12938
  height: 22,
12321
12939
  width: "auto",
12322
12940
  display: "block",
12323
12941
  pointerEvents: "none",
12324
12942
  userSelect: "none"
12325
12943
  };
12326
- var headingStyle7 = (color) => ({
12944
+ var headingStyle6 = (color) => ({
12327
12945
  fontSize: 24,
12328
12946
  fontWeight: 700,
12329
12947
  lineHeight: "normal",
@@ -12391,7 +13009,7 @@ var bannerSlotStyle = {
12391
13009
  justifyContent: "center",
12392
13010
  width: "100%"
12393
13011
  };
12394
- var footerStackStyle2 = {
13012
+ var footerStackStyle3 = {
12395
13013
  display: "flex",
12396
13014
  flexDirection: "column",
12397
13015
  gap: 16,
@@ -12427,7 +13045,7 @@ function DepositCompleteScreen({ amount }) {
12427
13045
  const { tokens } = useBlinkConfig();
12428
13046
  return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
12429
13047
  /* @__PURE__ */ jsx(ScreenHeader, {}),
12430
- /* @__PURE__ */ jsxs("div", { style: contentStyle10, children: [
13048
+ /* @__PURE__ */ jsxs("div", { style: contentStyle11, children: [
12431
13049
  /* @__PURE__ */ jsx(
12432
13050
  "img",
12433
13051
  {
@@ -12437,12 +13055,12 @@ function DepositCompleteScreen({ amount }) {
12437
13055
  style: illustrationStyle4
12438
13056
  }
12439
13057
  ),
12440
- /* @__PURE__ */ jsx("h2", { style: headingStyle8(tokens.text), children: `$${amount.toFixed(2)} Deposited` }),
12441
- /* @__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." })
12442
13060
  ] })
12443
13061
  ] });
12444
13062
  }
12445
- var contentStyle10 = {
13063
+ var contentStyle11 = {
12446
13064
  flex: 1,
12447
13065
  display: "flex",
12448
13066
  flexDirection: "column",
@@ -12458,7 +13076,7 @@ var illustrationStyle4 = {
12458
13076
  objectFit: "contain",
12459
13077
  display: "block"
12460
13078
  };
12461
- var headingStyle8 = (color) => ({
13079
+ var headingStyle7 = (color) => ({
12462
13080
  fontSize: "2rem",
12463
13081
  fontWeight: 700,
12464
13082
  lineHeight: 1.05,
@@ -12466,7 +13084,7 @@ var headingStyle8 = (color) => ({
12466
13084
  color,
12467
13085
  margin: 0
12468
13086
  });
12469
- var subtitleStyle6 = (color) => ({
13087
+ var subtitleStyle5 = (color) => ({
12470
13088
  fontSize: "1rem",
12471
13089
  color,
12472
13090
  margin: 0,
@@ -12599,7 +13217,7 @@ function SelectDepositSourceScreen({
12599
13217
  footer,
12600
13218
  children: [
12601
13219
  /* @__PURE__ */ jsx(ScreenHeader, { title: "Select source", onBack: onBack ?? onDone, onLogout }),
12602
- /* @__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: [
12603
13221
  orderedAccounts.map((account) => {
12604
13222
  const authRows = authorized.filter((opt) => rowAccountId(opt) === account.id);
12605
13223
  const reqRows = requiresAuth.filter((opt) => rowAccountId(opt) === account.id);
@@ -12642,7 +13260,7 @@ function SelectDepositSourceScreen({
12642
13260
  label: "Send manually",
12643
13261
  color: tokens.text,
12644
13262
  onClick: onSendManually,
12645
- icon: /* @__PURE__ */ jsx(QrIcon2, { color: tokens.text })
13263
+ icon: /* @__PURE__ */ jsx(QrIcon3, { color: tokens.text })
12646
13264
  }
12647
13265
  ),
12648
13266
  onAddProvider && /* @__PURE__ */ jsx(
@@ -12660,7 +13278,7 @@ function SelectDepositSourceScreen({
12660
13278
  }
12661
13279
  );
12662
13280
  }
12663
- var contentStyle11 = {
13281
+ var contentStyle12 = {
12664
13282
  display: "flex",
12665
13283
  flexDirection: "column",
12666
13284
  gap: 8,
@@ -12752,7 +13370,7 @@ function ActionRow({
12752
13370
  }
12753
13371
  );
12754
13372
  }
12755
- function QrIcon2({ color }) {
13373
+ function QrIcon3({ color }) {
12756
13374
  return /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
12757
13375
  /* @__PURE__ */ jsx("rect", { x: "3.5", y: "3.5", width: "7", height: "7", rx: "1", stroke: color, strokeWidth: "1.4" }),
12758
13376
  /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "2", height: "2", fill: color }),
@@ -13450,7 +14068,7 @@ function SuccessScreen({
13450
14068
  type: "button",
13451
14069
  onClick: onDone,
13452
14070
  "aria-label": "Close",
13453
- style: closeButtonStyle4(tokens),
14071
+ style: closeButtonStyle5(tokens),
13454
14072
  children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
13455
14073
  "path",
13456
14074
  {
@@ -13485,7 +14103,7 @@ function SuccessScreen({
13485
14103
  style: illustrationStyle5
13486
14104
  }
13487
14105
  ),
13488
- /* @__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" })
13489
14107
  ] }) : /* @__PURE__ */ jsxs("div", { style: screenContentStyle, children: [
13490
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 }) }) }),
13491
14109
  /* @__PURE__ */ jsx("h2", { style: failureHeadingStyle(tokens.text), children: "Transfer failed" }),
@@ -13494,7 +14112,7 @@ function SuccessScreen({
13494
14112
  /* @__PURE__ */ jsx("span", { style: summaryLabelStyle(tokens.textMuted), children: "From" }),
13495
14113
  /* @__PURE__ */ jsx("span", { style: summaryValueStyle(tokens.text), children: sourceName })
13496
14114
  ] }) }),
13497
- !sourceName && merchantName && /* @__PURE__ */ jsxs("p", { style: subtitleStyle7(tokens.textSecondary), children: [
14115
+ !sourceName && merchantName && /* @__PURE__ */ jsxs("p", { style: subtitleStyle6(tokens.textSecondary), children: [
13498
14116
  "to ",
13499
14117
  merchantName,
13500
14118
  " \u2014 $",
@@ -13520,7 +14138,7 @@ var illustrationStyle5 = {
13520
14138
  objectFit: "contain",
13521
14139
  display: "block"
13522
14140
  };
13523
- var headingStyle9 = (color) => ({
14141
+ var headingStyle8 = (color) => ({
13524
14142
  fontSize: "2rem",
13525
14143
  fontWeight: 700,
13526
14144
  lineHeight: 1.05,
@@ -13535,7 +14153,7 @@ var screenContentStyle = {
13535
14153
  alignItems: "center",
13536
14154
  paddingTop: 16
13537
14155
  };
13538
- var subtitleStyle7 = (color) => ({
14156
+ var subtitleStyle6 = (color) => ({
13539
14157
  fontSize: "0.9rem",
13540
14158
  color,
13541
14159
  margin: "0 0 28px",
@@ -13585,7 +14203,7 @@ var returnMessageStyle = (color) => ({
13585
14203
  margin: "0 0 4px",
13586
14204
  lineHeight: 1.5
13587
14205
  });
13588
- var closeButtonStyle4 = (tokens) => ({
14206
+ var closeButtonStyle5 = (tokens) => ({
13589
14207
  width: 40,
13590
14208
  height: 40,
13591
14209
  borderRadius: "50%",
@@ -13630,7 +14248,7 @@ function SelectSourceScreen({
13630
14248
  onLogout
13631
14249
  }
13632
14250
  ),
13633
- /* @__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." }),
13634
14252
  /* @__PURE__ */ jsx("label", { style: labelStyle5(tokens.textSecondary), children: "Chain" }),
13635
14253
  /* @__PURE__ */ jsx("div", { style: optionListStyle, children: choices.map((chain) => {
13636
14254
  const isSelected = chain.chainName === selectedChainName;
@@ -13692,7 +14310,7 @@ function SelectSourceScreen({
13692
14310
  }
13693
14311
  );
13694
14312
  }
13695
- var subtitleStyle8 = (color) => ({
14313
+ var subtitleStyle7 = (color) => ({
13696
14314
  fontSize: "0.85rem",
13697
14315
  color,
13698
14316
  margin: "0 0 20px",
@@ -13834,8 +14452,8 @@ function AdvancedSourceScreen({
13834
14452
  right: /* @__PURE__ */ jsx("span", { style: advancedBadgeStyle(tokens.accent), children: "Advanced" })
13835
14453
  }
13836
14454
  ),
13837
- /* @__PURE__ */ jsx("h2", { style: headingStyle10(tokens.text), children: "Set up One-Tap deposits" }),
13838
- /* @__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." }),
13839
14457
  /* @__PURE__ */ jsx("label", { style: labelStyle6(tokens.textSecondary), children: "Select tokens to approve" }),
13840
14458
  /* @__PURE__ */ jsx("div", { style: chainListStyle, children: choices.map((chain) => {
13841
14459
  const isExpanded = expandedChain === chain.chainName;
@@ -13898,14 +14516,14 @@ var advancedBadgeStyle = (color) => ({
13898
14516
  padding: "3px 10px",
13899
14517
  letterSpacing: "0.02em"
13900
14518
  });
13901
- var headingStyle10 = (color) => ({
14519
+ var headingStyle9 = (color) => ({
13902
14520
  fontSize: "1.3rem",
13903
14521
  fontWeight: 700,
13904
14522
  letterSpacing: "-0.02em",
13905
14523
  color,
13906
14524
  margin: "8px 0 4px"
13907
14525
  });
13908
- var subtitleStyle9 = (color) => ({
14526
+ var subtitleStyle8 = (color) => ({
13909
14527
  fontSize: "0.86rem",
13910
14528
  color,
13911
14529
  margin: "0 0 20px",
@@ -14039,8 +14657,8 @@ function TransferStatusLayout({
14039
14657
  footer: showRetry && onRetry ? /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetry, children: retryLabel }) : void 0,
14040
14658
  children: /* @__PURE__ */ jsxs("div", { style: wrapperStyle, children: [
14041
14659
  onLogout && /* @__PURE__ */ jsx("div", { style: menuOverlayStyle, children: /* @__PURE__ */ jsx(SettingsMenu, { onLogout }) }),
14042
- /* @__PURE__ */ jsxs("div", { style: contentStyle12, children: [
14043
- /* @__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 }),
14044
14662
  visibleError && /* @__PURE__ */ jsx("div", { style: errorBannerStyle7(tokens), children: visibleError }),
14045
14663
  children
14046
14664
  ] })
@@ -14117,7 +14735,7 @@ var menuOverlayStyle = {
14117
14735
  right: 0,
14118
14736
  zIndex: 1
14119
14737
  };
14120
- var contentStyle12 = {
14738
+ var contentStyle13 = {
14121
14739
  flex: 1,
14122
14740
  display: "flex",
14123
14741
  flexDirection: "column",
@@ -14127,7 +14745,7 @@ var contentStyle12 = {
14127
14745
  padding: "32px 0",
14128
14746
  width: "100%"
14129
14747
  };
14130
- var headingStyle11 = (color) => ({
14748
+ var headingStyle10 = (color) => ({
14131
14749
  fontSize: "1.5rem",
14132
14750
  fontWeight: 700,
14133
14751
  lineHeight: "normal",
@@ -14234,7 +14852,7 @@ function DepositAddressScreen({
14234
14852
  ) : void 0
14235
14853
  }
14236
14854
  ),
14237
- /* @__PURE__ */ jsxs("div", { style: contentStyle13, children: [
14855
+ /* @__PURE__ */ jsxs("div", { style: contentStyle14, children: [
14238
14856
  /* @__PURE__ */ jsx("h2", { style: depositTitleStyle(tokens.text), children: "Deposit Address" }),
14239
14857
  qrReady && session && selectedOption ? /* @__PURE__ */ jsx(
14240
14858
  DepositQrCode,
@@ -14329,7 +14947,7 @@ var FeeRow = memo(function FeeRow2({
14329
14947
  }) {
14330
14948
  return /* @__PURE__ */ jsx("p", { style: bodyStyle3(color), children: feeCopy2 });
14331
14949
  });
14332
- var contentStyle13 = {
14950
+ var contentStyle14 = {
14333
14951
  alignItems: "center",
14334
14952
  display: "flex",
14335
14953
  flex: 1,
@@ -14561,7 +15179,7 @@ function OpenWalletScreen({
14561
15179
  return /* @__PURE__ */ jsxs(
14562
15180
  ScreenLayout,
14563
15181
  {
14564
- footer: error ? /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
15182
+ footer: error ? /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14565
15183
  /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14566
15184
  onRetryAuthorization && /* @__PURE__ */ jsx(OutlineButton, { onClick: onRetryAuthorization, children: "Retry" })
14567
15185
  ] }) : void 0,
@@ -14579,7 +15197,7 @@ function OpenWalletScreen({
14579
15197
  /* @__PURE__ */ jsxs("div", { style: desktopContentStyle, children: [
14580
15198
  /* @__PURE__ */ jsxs("div", { style: primaryClusterStyle, children: [
14581
15199
  logoBlock,
14582
- /* @__PURE__ */ jsxs("h2", { style: headingStyle12(tokens.text), children: [
15200
+ /* @__PURE__ */ jsxs("h2", { style: headingStyle11(tokens.text), children: [
14583
15201
  "Setting up ",
14584
15202
  displayName,
14585
15203
  "\u2026"
@@ -14611,7 +15229,7 @@ function OpenWalletScreen({
14611
15229
  return /* @__PURE__ */ jsxs(
14612
15230
  ScreenLayout,
14613
15231
  {
14614
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle3, children: [
15232
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
14615
15233
  error && /* @__PURE__ */ jsx(InfoBanner, { children: error }),
14616
15234
  /* @__PURE__ */ jsxs(
14617
15235
  SecondaryButton,
@@ -14642,7 +15260,7 @@ function OpenWalletScreen({
14642
15260
  {
14643
15261
  type: "button",
14644
15262
  onClick: onLogout,
14645
- style: closeButtonStyle5(tokens.bgRecessed, tokens.text),
15263
+ style: closeButtonStyle6(tokens.bgRecessed, tokens.text),
14646
15264
  "aria-label": "Close",
14647
15265
  children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
14648
15266
  "path",
@@ -14684,7 +15302,7 @@ function useDelayedStatusRetry(enabled, deeplinkUri) {
14684
15302
  }, [deeplinkUri, enabled]);
14685
15303
  return visible;
14686
15304
  }
14687
- var contentStyle14 = {
15305
+ var contentStyle15 = {
14688
15306
  flex: 1,
14689
15307
  display: "flex",
14690
15308
  flexDirection: "column",
@@ -14694,7 +15312,7 @@ var contentStyle14 = {
14694
15312
  gap: 12
14695
15313
  };
14696
15314
  var desktopContentStyle = {
14697
- ...contentStyle14,
15315
+ ...contentStyle15,
14698
15316
  gap: 32
14699
15317
  };
14700
15318
  var primaryClusterStyle = {
@@ -14704,7 +15322,7 @@ var primaryClusterStyle = {
14704
15322
  textAlign: "center",
14705
15323
  gap: 12
14706
15324
  };
14707
- var footerStackStyle3 = {
15325
+ var footerStackStyle4 = {
14708
15326
  display: "flex",
14709
15327
  flexDirection: "column",
14710
15328
  gap: 8
@@ -14753,7 +15371,7 @@ var reownLogoStyle = {
14753
15371
  borderRadius: "50%",
14754
15372
  objectFit: "cover"
14755
15373
  };
14756
- var headingStyle12 = (color) => ({
15374
+ var headingStyle11 = (color) => ({
14757
15375
  fontSize: "1.5rem",
14758
15376
  fontWeight: 700,
14759
15377
  lineHeight: 1.1,
@@ -14869,7 +15487,7 @@ var mobileBodyStyle = (color) => ({
14869
15487
  margin: 0,
14870
15488
  maxWidth: 350
14871
15489
  });
14872
- var closeButtonStyle5 = (bg, color) => ({
15490
+ var closeButtonStyle6 = (bg, color) => ({
14873
15491
  width: 44,
14874
15492
  height: 44,
14875
15493
  borderRadius: "50%",
@@ -14905,7 +15523,7 @@ function ApprovingInWalletScreen({
14905
15523
  ScreenLayout,
14906
15524
  {
14907
15525
  scrollableBody: false,
14908
- footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle4, children: [
15526
+ footer: /* @__PURE__ */ jsxs("div", { style: footerStackStyle5, children: [
14909
15527
  /* @__PURE__ */ jsxs("div", { style: lockBannerStyle2, children: [
14910
15528
  /* @__PURE__ */ jsx("span", { style: lockIconWrapStyle2(t.text), children: /* @__PURE__ */ jsx(LockIcon3, {}) }),
14911
15529
  /* @__PURE__ */ jsx("p", { style: lockBannerTextStyle2(t.text), children: "Your passkey is required each time you deposit. Funds cannot move without your approval." })
@@ -14921,11 +15539,11 @@ function ApprovingInWalletScreen({
14921
15539
  {
14922
15540
  onBack,
14923
15541
  onLogout,
14924
- center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle3 })
15542
+ center: /* @__PURE__ */ jsx("img", { src: BLINK_WORDMARK, alt: "Blink", style: wordmarkImgStyle4 })
14925
15543
  }
14926
15544
  ),
14927
- /* @__PURE__ */ jsxs("div", { style: contentStyle15, children: [
14928
- /* @__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` }),
14929
15547
  /* @__PURE__ */ jsxs("div", { style: cardStyle2(t.bgRecessed, t.radiusLg), children: [
14930
15548
  /* @__PURE__ */ jsx("style", { children: SPIN_KEYFRAMES_CSS2 }),
14931
15549
  steps.map((s, i) => /* @__PURE__ */ jsx(ChecklistRow, { step: s }, i))
@@ -15019,14 +15637,14 @@ function LockIcon3() {
15019
15637
  }
15020
15638
  ) });
15021
15639
  }
15022
- var wordmarkImgStyle3 = {
15640
+ var wordmarkImgStyle4 = {
15023
15641
  height: 22,
15024
15642
  width: "auto",
15025
15643
  display: "block",
15026
15644
  pointerEvents: "none",
15027
15645
  userSelect: "none"
15028
15646
  };
15029
- var contentStyle15 = {
15647
+ var contentStyle16 = {
15030
15648
  display: "flex",
15031
15649
  flexDirection: "column",
15032
15650
  alignItems: "center",
@@ -15036,7 +15654,7 @@ var contentStyle15 = {
15036
15654
  minHeight: 0,
15037
15655
  width: "100%"
15038
15656
  };
15039
- var headingStyle13 = (color) => ({
15657
+ var headingStyle12 = (color) => ({
15040
15658
  fontSize: 24,
15041
15659
  fontWeight: 700,
15042
15660
  lineHeight: "normal",
@@ -15087,7 +15705,7 @@ var labelStyle7 = (color) => ({
15087
15705
  lineHeight: 1.25,
15088
15706
  color
15089
15707
  });
15090
- var footerStackStyle4 = {
15708
+ var footerStackStyle5 = {
15091
15709
  display: "flex",
15092
15710
  flexDirection: "column",
15093
15711
  gap: 16,
@@ -15151,10 +15769,10 @@ function ConfirmSignScreen({
15151
15769
  ] }),
15152
15770
  children: [
15153
15771
  /* @__PURE__ */ jsx(ScreenHeader, { onLogout }),
15154
- /* @__PURE__ */ jsxs("div", { style: contentStyle16, children: [
15772
+ /* @__PURE__ */ jsxs("div", { style: contentStyle17, children: [
15155
15773
  logoSrc ? /* @__PURE__ */ jsx("img", { src: logoSrc, alt: displayName, style: logoStyle3 }) : /* @__PURE__ */ jsx(Spinner, { size: 48 }),
15156
- /* @__PURE__ */ jsx("h2", { style: headingStyle14(tokens.text), children: heading }),
15157
- /* @__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 }),
15158
15776
  /* @__PURE__ */ jsxs("div", { style: successBadgeStyle(tokens), children: [
15159
15777
  /* @__PURE__ */ jsx("span", { style: checkmarkStyle, children: "\u2713" }),
15160
15778
  /* @__PURE__ */ jsx("span", { children: badge })
@@ -15164,7 +15782,7 @@ function ConfirmSignScreen({
15164
15782
  }
15165
15783
  );
15166
15784
  }
15167
- var contentStyle16 = {
15785
+ var contentStyle17 = {
15168
15786
  flex: 1,
15169
15787
  display: "flex",
15170
15788
  flexDirection: "column",
@@ -15179,14 +15797,14 @@ var logoStyle3 = {
15179
15797
  borderRadius: 14,
15180
15798
  objectFit: "contain"
15181
15799
  };
15182
- var headingStyle14 = (color) => ({
15800
+ var headingStyle13 = (color) => ({
15183
15801
  fontSize: "1.45rem",
15184
15802
  fontWeight: 700,
15185
15803
  letterSpacing: "-0.02em",
15186
15804
  color,
15187
15805
  margin: "20px 0 8px"
15188
15806
  });
15189
- var subtitleStyle10 = (color) => ({
15807
+ var subtitleStyle9 = (color) => ({
15190
15808
  fontSize: "0.9rem",
15191
15809
  color,
15192
15810
  margin: "0 0 24px",
@@ -15543,10 +16161,10 @@ function GuestTokenPickerScreen({
15543
16161
  ] }),
15544
16162
  children: [
15545
16163
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15546
- /* @__PURE__ */ jsxs("div", { style: contentStyle17, children: [
15547
- /* @__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 }),
15548
16166
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle8(tokens), children: error }),
15549
- 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: [
15550
16168
  /* @__PURE__ */ jsx("label", { style: labelStyle8(tokens.textSecondary), children: "Token" }),
15551
16169
  /* @__PURE__ */ jsx(
15552
16170
  "button",
@@ -15620,21 +16238,21 @@ function TokenRow({
15620
16238
  ] })
15621
16239
  ] });
15622
16240
  }
15623
- var contentStyle17 = {
16241
+ var contentStyle18 = {
15624
16242
  flex: 1,
15625
16243
  display: "flex",
15626
16244
  flexDirection: "column",
15627
16245
  padding: "0 20px 16px",
15628
16246
  gap: 12
15629
16247
  };
15630
- var headingStyle15 = (color) => ({
16248
+ var headingStyle14 = (color) => ({
15631
16249
  fontSize: "1.25rem",
15632
16250
  fontWeight: 700,
15633
16251
  color,
15634
16252
  margin: "0 0 8px",
15635
16253
  textAlign: "center"
15636
16254
  });
15637
- var subtitleStyle11 = (color) => ({
16255
+ var subtitleStyle10 = (color) => ({
15638
16256
  fontSize: "0.9rem",
15639
16257
  color,
15640
16258
  textAlign: "center"
@@ -15728,6 +16346,7 @@ var errorBannerStyle8 = (themeTokens) => ({
15728
16346
  });
15729
16347
  function ManualTransferFlow({
15730
16348
  hasMerchantAuthorization,
16349
+ authenticated = false,
15731
16350
  onCreatePasskey,
15732
16351
  createPasskeyLoading = false,
15733
16352
  createPasskeyError = null,
@@ -15771,8 +16390,8 @@ function ManualTransferFlow({
15771
16390
  if (!hasMerchantAuthorization) {
15772
16391
  screenContent = /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(PrimaryButton, { onClick: onBack, children: "Back" }), children: [
15773
16392
  /* @__PURE__ */ jsx(ScreenHeader, { onBack }),
15774
- /* @__PURE__ */ jsxs("div", { style: contentStyle18, children: [
15775
- /* @__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" }),
15776
16395
  /* @__PURE__ */ jsx("p", { style: bodyStyle5(tokens.textMuted), children: "merchantAuthorization is required." })
15777
16396
  ] })
15778
16397
  ] });
@@ -15806,7 +16425,19 @@ function ManualTransferFlow({
15806
16425
  );
15807
16426
  } else if (screen === "deposit-complete") {
15808
16427
  const transferAmount = Number(session?.deliveredAmountUsd ?? session?.minAmountUsd ?? 0);
15809
- 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(
15810
16441
  SuccessScreen,
15811
16442
  {
15812
16443
  amount: transferAmount,
@@ -15815,7 +16446,7 @@ function ManualTransferFlow({
15815
16446
  onDone: onDismiss,
15816
16447
  onLogout
15817
16448
  }
15818
- ) ;
16449
+ );
15819
16450
  } else if (screen === "deposit-failed") {
15820
16451
  screenContent = /* @__PURE__ */ jsx(
15821
16452
  BlinkErrorScreen,
@@ -15840,7 +16471,7 @@ function ManualTransferFlow({
15840
16471
  }
15841
16472
  return screenContent;
15842
16473
  }
15843
- var contentStyle18 = {
16474
+ var contentStyle19 = {
15844
16475
  alignItems: "center",
15845
16476
  display: "flex",
15846
16477
  flex: 1,
@@ -15851,7 +16482,7 @@ var contentStyle18 = {
15851
16482
  paddingBottom: 24,
15852
16483
  width: "100%"
15853
16484
  };
15854
- var headingStyle16 = (color) => ({
16485
+ var headingStyle15 = (color) => ({
15855
16486
  color,
15856
16487
  fontSize: "2rem",
15857
16488
  lineHeight: 1.05,
@@ -15876,7 +16507,7 @@ function GenericLoadingShimmer() {
15876
16507
  role: "status",
15877
16508
  "aria-label": "Loading payment flow",
15878
16509
  "aria-busy": "true",
15879
- style: sheetStyle2(tokens),
16510
+ style: sheetStyle3(tokens),
15880
16511
  children: [
15881
16512
  /* @__PURE__ */ jsx("style", { children: `
15882
16513
  @keyframes blink-loading-shimmer {
@@ -15922,7 +16553,7 @@ function ShimmerBlock2({
15922
16553
  }
15923
16554
  );
15924
16555
  }
15925
- var sheetStyle2 = (tokens) => ({
16556
+ var sheetStyle3 = (tokens) => ({
15926
16557
  display: "flex",
15927
16558
  flexDirection: "column",
15928
16559
  height: "100%",
@@ -15983,6 +16614,19 @@ function buildDepositOptionsScreenProps({ flow, handlers }) {
15983
16614
  onClose: flow.isMobileApp ? void 0 : flow.onBack
15984
16615
  };
15985
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
+ }
15986
16630
  function buildWalletPickerScreenProps({
15987
16631
  flow,
15988
16632
  handlers
@@ -16403,6 +17047,7 @@ function StepRendererContent({
16403
17047
  ManualTransferFlow,
16404
17048
  {
16405
17049
  hasMerchantAuthorization: flow.merchantAuthorization != null,
17050
+ authenticated: flow.authenticated,
16406
17051
  onCreatePasskey: handlers.onSignupWithPasskey,
16407
17052
  createPasskeyLoading: flow.passkeyLoading,
16408
17053
  createPasskeyError: flow.state.error,
@@ -16417,6 +17062,8 @@ function StepRendererContent({
16417
17062
  return /* @__PURE__ */ jsx(LoginScreen, { ...buildLoginScreenProps(input) });
16418
17063
  case "deposit-options":
16419
17064
  return /* @__PURE__ */ jsx(DepositOptionsScreen, { ...buildDepositOptionsScreenProps(input) });
17065
+ case "welcome-back":
17066
+ return /* @__PURE__ */ jsx(WelcomeBackScreen, { ...buildWelcomeBackScreenProps(input) });
16420
17067
  case "wallet-picker":
16421
17068
  return /* @__PURE__ */ jsx(WalletPickerScreen, { ...buildWalletPickerScreenProps(input) });
16422
17069
  case "open-wallet":
@@ -19743,6 +20390,7 @@ function BlinkPaymentInner({
19743
20390
  onCommitTokenAuthorization: provider.handleCommitTokenAuthorization,
19744
20391
  onLogin: () => dispatch({ type: "REQUEST_LOGIN" }),
19745
20392
  onCancelLogin: () => dispatch({ type: "CANCEL_LOGIN_REQUEST" }),
20393
+ onAcknowledgeWelcomeBack: () => dispatch({ type: "ACKNOWLEDGE_WELCOME_BACK" }),
19746
20394
  onSetDepositToken: handleSetDepositToken,
19747
20395
  onConfirmSetupDeposit: handleConfirmSetupDeposit,
19748
20396
  onAmountInput: (value) => dispatch({ type: "SET_AMOUNT_INPUT", value }),
@@ -19835,6 +20483,6 @@ function BlinkPaymentInner({
19835
20483
  ) });
19836
20484
  }
19837
20485
 
19838
- 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 };
19839
20487
  //# sourceMappingURL=index.js.map
19840
20488
  //# sourceMappingURL=index.js.map