@daimo/sdk 1.0.1 → 1.0.2

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.
Files changed (256) hide show
  1. package/dist/client/createDaimoClient.d.ts +2 -6
  2. package/dist/client/createDaimoClient.d.ts.map +1 -1
  3. package/dist/client/createDaimoClient.js +2 -1
  4. package/dist/client/createDaimoClient.js.map +1 -1
  5. package/dist/common/legacy/assert.d.ts +6 -0
  6. package/dist/common/legacy/assert.d.ts.map +1 -0
  7. package/dist/common/legacy/assert.js +25 -0
  8. package/dist/common/legacy/assert.js.map +1 -0
  9. package/dist/common/legacy/client.d.ts +67 -0
  10. package/dist/common/legacy/client.d.ts.map +1 -0
  11. package/dist/common/legacy/client.js +55 -0
  12. package/dist/common/legacy/client.js.map +1 -0
  13. package/dist/common/legacy/debug.d.ts +5 -0
  14. package/dist/common/legacy/debug.d.ts.map +1 -0
  15. package/dist/common/legacy/debug.js +21 -0
  16. package/dist/common/legacy/debug.js.map +1 -0
  17. package/dist/common/legacy/format.d.ts +16 -0
  18. package/dist/common/legacy/format.d.ts.map +1 -0
  19. package/dist/common/legacy/format.js +34 -0
  20. package/dist/common/legacy/format.js.map +1 -0
  21. package/dist/common/legacy/index.d.ts +11 -0
  22. package/dist/common/legacy/index.d.ts.map +1 -0
  23. package/dist/common/legacy/index.js +11 -0
  24. package/dist/common/legacy/index.js.map +1 -0
  25. package/dist/common/legacy/primitiveTypes.d.ts +11 -0
  26. package/dist/common/legacy/primitiveTypes.d.ts.map +1 -0
  27. package/dist/common/legacy/primitiveTypes.js +14 -0
  28. package/dist/common/legacy/primitiveTypes.js.map +1 -0
  29. package/dist/common/legacy/session.d.ts +246 -0
  30. package/dist/common/legacy/session.d.ts.map +1 -0
  31. package/dist/common/legacy/session.js +124 -0
  32. package/dist/common/legacy/session.js.map +1 -0
  33. package/dist/common/legacy/try.d.ts +4 -0
  34. package/dist/common/legacy/try.d.ts.map +1 -0
  35. package/dist/common/legacy/try.js +26 -0
  36. package/dist/common/legacy/try.js.map +1 -0
  37. package/dist/hooks/DaimoClientContext.d.ts +7 -0
  38. package/dist/hooks/DaimoClientContext.d.ts.map +1 -0
  39. package/dist/hooks/DaimoClientContext.js +15 -0
  40. package/dist/hooks/DaimoClientContext.js.map +1 -0
  41. package/dist/hooks/formatUserError.d.ts +3 -0
  42. package/dist/hooks/formatUserError.d.ts.map +1 -0
  43. package/dist/hooks/formatUserError.js +30 -0
  44. package/dist/hooks/formatUserError.js.map +1 -0
  45. package/dist/hooks/index.d.ts +12 -0
  46. package/dist/hooks/index.d.ts.map +1 -0
  47. package/dist/hooks/index.js +9 -0
  48. package/dist/hooks/index.js.map +1 -0
  49. package/dist/hooks/locale.d.ts +7 -0
  50. package/dist/hooks/locale.d.ts.map +1 -0
  51. package/dist/hooks/locale.js +15 -0
  52. package/dist/hooks/locale.js.map +1 -0
  53. package/dist/hooks/locales/en.d.ts +60 -0
  54. package/dist/hooks/locales/en.d.ts.map +1 -0
  55. package/dist/hooks/locales/en.js +76 -0
  56. package/dist/hooks/locales/en.js.map +1 -0
  57. package/dist/hooks/locales/es.d.ts +4 -0
  58. package/dist/hooks/locales/es.d.ts.map +1 -0
  59. package/dist/hooks/locales/es.js +60 -0
  60. package/dist/hooks/locales/es.js.map +1 -0
  61. package/dist/hooks/navEvent.d.ts +60 -0
  62. package/dist/hooks/navEvent.d.ts.map +1 -0
  63. package/dist/hooks/navEvent.js +16 -0
  64. package/dist/hooks/navEvent.js.map +1 -0
  65. package/dist/hooks/types.d.ts +71 -0
  66. package/dist/hooks/types.d.ts.map +1 -0
  67. package/dist/hooks/types.js +14 -0
  68. package/dist/hooks/types.js.map +1 -0
  69. package/dist/hooks/usePaymentCallbacks.d.ts +15 -0
  70. package/dist/hooks/usePaymentCallbacks.d.ts.map +1 -0
  71. package/dist/hooks/usePaymentCallbacks.js +27 -0
  72. package/dist/hooks/usePaymentCallbacks.js.map +1 -0
  73. package/dist/hooks/useSessionNav.d.ts +31 -0
  74. package/dist/hooks/useSessionNav.d.ts.map +1 -0
  75. package/dist/hooks/useSessionNav.js +439 -0
  76. package/dist/hooks/useSessionNav.js.map +1 -0
  77. package/dist/hooks/useSessionPolling.d.ts +10 -0
  78. package/dist/hooks/useSessionPolling.d.ts.map +1 -0
  79. package/dist/hooks/useSessionPolling.js +61 -0
  80. package/dist/hooks/useSessionPolling.js.map +1 -0
  81. package/dist/web/ChooseOptionPage.d.ts +9 -0
  82. package/dist/web/ChooseOptionPage.d.ts.map +1 -0
  83. package/dist/web/ChooseOptionPage.js +51 -0
  84. package/dist/web/ChooseOptionPage.js.map +1 -0
  85. package/dist/web/ConfirmationPage.d.ts +32 -0
  86. package/dist/web/ConfirmationPage.d.ts.map +1 -0
  87. package/dist/web/ConfirmationPage.js +72 -0
  88. package/dist/web/ConfirmationPage.js.map +1 -0
  89. package/dist/web/ConfirmationSpinner.d.ts +7 -0
  90. package/dist/web/ConfirmationSpinner.d.ts.map +1 -0
  91. package/dist/web/ConfirmationSpinner.js +20 -0
  92. package/dist/web/ConfirmationSpinner.js.map +1 -0
  93. package/dist/web/DaimoModal.d.ts +15 -0
  94. package/dist/web/DaimoModal.d.ts.map +1 -0
  95. package/dist/web/DaimoModal.js +283 -0
  96. package/dist/web/DaimoModal.js.map +1 -0
  97. package/dist/web/DeeplinkPage.d.ts +8 -0
  98. package/dist/web/DeeplinkPage.d.ts.map +1 -0
  99. package/dist/web/DeeplinkPage.js +13 -0
  100. package/dist/web/DeeplinkPage.js.map +1 -0
  101. package/dist/web/ErrorPage.d.ts +28 -0
  102. package/dist/web/ErrorPage.d.ts.map +1 -0
  103. package/dist/web/ErrorPage.js +47 -0
  104. package/dist/web/ErrorPage.js.map +1 -0
  105. package/dist/web/ExchangePage.d.ts +11 -0
  106. package/dist/web/ExchangePage.d.ts.map +1 -0
  107. package/dist/web/ExchangePage.js +13 -0
  108. package/dist/web/ExchangePage.js.map +1 -0
  109. package/dist/web/ExpiredPage.d.ts +9 -0
  110. package/dist/web/ExpiredPage.d.ts.map +1 -0
  111. package/dist/web/ExpiredPage.js +12 -0
  112. package/dist/web/ExpiredPage.js.map +1 -0
  113. package/dist/web/ModalSkeleton.d.ts +7 -0
  114. package/dist/web/ModalSkeleton.d.ts.map +1 -0
  115. package/dist/web/ModalSkeleton.js +13 -0
  116. package/dist/web/ModalSkeleton.js.map +1 -0
  117. package/dist/web/ProgressDots.d.ts +16 -0
  118. package/dist/web/ProgressDots.d.ts.map +1 -0
  119. package/dist/web/ProgressDots.js +55 -0
  120. package/dist/web/ProgressDots.js.map +1 -0
  121. package/dist/web/QRCode.d.ts +7 -0
  122. package/dist/web/QRCode.d.ts.map +1 -0
  123. package/dist/web/QRCode.js +69 -0
  124. package/dist/web/QRCode.js.map +1 -0
  125. package/dist/web/SelectAmountPage.d.ts +21 -0
  126. package/dist/web/SelectAmountPage.d.ts.map +1 -0
  127. package/dist/web/SelectAmountPage.js +27 -0
  128. package/dist/web/SelectAmountPage.js.map +1 -0
  129. package/dist/web/SelectTokenPage.d.ts +14 -0
  130. package/dist/web/SelectTokenPage.d.ts.map +1 -0
  131. package/dist/web/SelectTokenPage.js +71 -0
  132. package/dist/web/SelectTokenPage.js.map +1 -0
  133. package/dist/web/WaitingDepositAddressPage.d.ts +14 -0
  134. package/dist/web/WaitingDepositAddressPage.d.ts.map +1 -0
  135. package/dist/web/WaitingDepositAddressPage.js +126 -0
  136. package/dist/web/WaitingDepositAddressPage.js.map +1 -0
  137. package/dist/web/WalletAmountPage.d.ts +10 -0
  138. package/dist/web/WalletAmountPage.d.ts.map +1 -0
  139. package/dist/web/WalletAmountPage.js +158 -0
  140. package/dist/web/WalletAmountPage.js.map +1 -0
  141. package/dist/web/api/index.d.ts +10 -0
  142. package/dist/web/api/index.d.ts.map +1 -1
  143. package/dist/web/api/navTree.d.ts +7 -2
  144. package/dist/web/api/navTree.d.ts.map +1 -1
  145. package/dist/web/buttons.d.ts +15 -0
  146. package/dist/web/buttons.d.ts.map +1 -0
  147. package/dist/web/buttons.js +24 -0
  148. package/dist/web/buttons.js.map +1 -0
  149. package/dist/web/components/ChooseChainPage.d.ts +2 -1
  150. package/dist/web/components/ChooseChainPage.d.ts.map +1 -1
  151. package/dist/web/components/ChooseChainPage.js +4 -4
  152. package/dist/web/components/ChooseChainPage.js.map +1 -1
  153. package/dist/web/components/ChooseOptionPage.d.ts +3 -1
  154. package/dist/web/components/ChooseOptionPage.d.ts.map +1 -1
  155. package/dist/web/components/ChooseOptionPage.js +31 -11
  156. package/dist/web/components/ChooseOptionPage.js.map +1 -1
  157. package/dist/web/components/ChooseWalletPage.d.ts +2 -1
  158. package/dist/web/components/ChooseWalletPage.d.ts.map +1 -1
  159. package/dist/web/components/ChooseWalletPage.js +9 -7
  160. package/dist/web/components/ChooseWalletPage.js.map +1 -1
  161. package/dist/web/components/ConfirmationPage.d.ts +6 -3
  162. package/dist/web/components/ConfirmationPage.d.ts.map +1 -1
  163. package/dist/web/components/ConfirmationPage.js +11 -9
  164. package/dist/web/components/ConfirmationPage.js.map +1 -1
  165. package/dist/web/components/DaimoModal.js +24 -17
  166. package/dist/web/components/DaimoModal.js.map +1 -1
  167. package/dist/web/components/DeeplinkPage.d.ts +2 -1
  168. package/dist/web/components/DeeplinkPage.d.ts.map +1 -1
  169. package/dist/web/components/DeeplinkPage.js +3 -3
  170. package/dist/web/components/DeeplinkPage.js.map +1 -1
  171. package/dist/web/components/ExchangePage.d.ts +2 -1
  172. package/dist/web/components/ExchangePage.d.ts.map +1 -1
  173. package/dist/web/components/ExchangePage.js +2 -2
  174. package/dist/web/components/ExchangePage.js.map +1 -1
  175. package/dist/web/components/SelectAmountPage.d.ts +2 -1
  176. package/dist/web/components/SelectAmountPage.d.ts.map +1 -1
  177. package/dist/web/components/SelectAmountPage.js +3 -3
  178. package/dist/web/components/SelectAmountPage.js.map +1 -1
  179. package/dist/web/components/SelectTokenPage.d.ts +2 -1
  180. package/dist/web/components/SelectTokenPage.d.ts.map +1 -1
  181. package/dist/web/components/SelectTokenPage.js +8 -13
  182. package/dist/web/components/SelectTokenPage.js.map +1 -1
  183. package/dist/web/components/WaitingDepositAddressPage.d.ts +2 -1
  184. package/dist/web/components/WaitingDepositAddressPage.d.ts.map +1 -1
  185. package/dist/web/components/WaitingDepositAddressPage.js +9 -9
  186. package/dist/web/components/WaitingDepositAddressPage.js.map +1 -1
  187. package/dist/web/components/WalletAmountPage.d.ts +2 -1
  188. package/dist/web/components/WalletAmountPage.d.ts.map +1 -1
  189. package/dist/web/components/WalletAmountPage.js +14 -11
  190. package/dist/web/components/WalletAmountPage.js.map +1 -1
  191. package/dist/web/components/buttons.d.ts.map +1 -1
  192. package/dist/web/components/buttons.js +4 -8
  193. package/dist/web/components/buttons.js.map +1 -1
  194. package/dist/web/components/containers.d.ts.map +1 -1
  195. package/dist/web/components/containers.js +7 -9
  196. package/dist/web/components/containers.js.map +1 -1
  197. package/dist/web/components/icons.d.ts +3 -1
  198. package/dist/web/components/icons.d.ts.map +1 -1
  199. package/dist/web/components/icons.js +9 -5
  200. package/dist/web/components/icons.js.map +1 -1
  201. package/dist/web/components/shared.d.ts +30 -8
  202. package/dist/web/components/shared.d.ts.map +1 -1
  203. package/dist/web/components/shared.js +48 -23
  204. package/dist/web/components/shared.js.map +1 -1
  205. package/dist/web/containers.d.ts +19 -0
  206. package/dist/web/containers.d.ts.map +1 -0
  207. package/dist/web/containers.js +77 -0
  208. package/dist/web/containers.js.map +1 -0
  209. package/dist/web/hooks/locales/en.d.ts +2 -0
  210. package/dist/web/hooks/locales/en.d.ts.map +1 -1
  211. package/dist/web/hooks/locales/en.js +10 -8
  212. package/dist/web/hooks/locales/en.js.map +1 -1
  213. package/dist/web/hooks/locales/es.d.ts.map +1 -1
  214. package/dist/web/hooks/locales/es.js +2 -0
  215. package/dist/web/hooks/locales/es.js.map +1 -1
  216. package/dist/web/hooks/types.d.ts +1 -0
  217. package/dist/web/hooks/types.d.ts.map +1 -1
  218. package/dist/web/hooks/types.js.map +1 -1
  219. package/dist/web/hooks/useInjectedWallets.d.ts +4 -1
  220. package/dist/web/hooks/useInjectedWallets.d.ts.map +1 -1
  221. package/dist/web/hooks/useInjectedWallets.js +84 -25
  222. package/dist/web/hooks/useInjectedWallets.js.map +1 -1
  223. package/dist/web/hooks/useSessionNav.d.ts.map +1 -1
  224. package/dist/web/hooks/useSessionNav.js +44 -25
  225. package/dist/web/hooks/useSessionNav.js.map +1 -1
  226. package/dist/web/hooks/useWalletFlow.d.ts +1 -1
  227. package/dist/web/hooks/useWalletFlow.d.ts.map +1 -1
  228. package/dist/web/hooks/useWalletFlow.js +46 -6
  229. package/dist/web/hooks/useWalletFlow.js.map +1 -1
  230. package/dist/web/hooks/walletProvider.d.ts +10 -2
  231. package/dist/web/hooks/walletProvider.d.ts.map +1 -1
  232. package/dist/web/hooks/walletProvider.js +69 -7
  233. package/dist/web/hooks/walletProvider.js.map +1 -1
  234. package/dist/web/icons.d.ts +22 -0
  235. package/dist/web/icons.d.ts.map +1 -0
  236. package/dist/web/icons.js +33 -0
  237. package/dist/web/icons.js.map +1 -0
  238. package/dist/web/shared.d.ts +93 -0
  239. package/dist/web/shared.d.ts.map +1 -0
  240. package/dist/web/shared.js +202 -0
  241. package/dist/web/shared.js.map +1 -0
  242. package/dist/web/styles.css +1 -1
  243. package/dist/web/theme.css +19 -18
  244. package/dist/web/useCopyToClipboard.d.ts +6 -0
  245. package/dist/web/useCopyToClipboard.d.ts.map +1 -0
  246. package/dist/web/useCopyToClipboard.js +20 -0
  247. package/dist/web/useCopyToClipboard.js.map +1 -0
  248. package/dist/web/useWalletFlow.d.ts +23 -0
  249. package/dist/web/useWalletFlow.d.ts.map +1 -0
  250. package/dist/web/useWalletFlow.js +334 -0
  251. package/dist/web/useWalletFlow.js.map +1 -0
  252. package/dist/web/walletProvider.d.ts +34 -0
  253. package/dist/web/walletProvider.d.ts.map +1 -0
  254. package/dist/web/walletProvider.js +14 -0
  255. package/dist/web/walletProvider.js.map +1 -0
  256. package/package.json +5 -1
@@ -1,3 +1,10 @@
1
+ import { base58 } from "@scure/base";
2
+ // ─── Wallet Standard ────────────────────────────────────────────────────────
3
+ //
4
+ // Wallet Standard is the Solana equivalent of EIP-6963: an event-based
5
+ // discovery protocol that works with any compliant wallet (Phantom, Tria,
6
+ // Backpack, Solflare, etc.) without hardcoding wallet-specific globals.
7
+ const SOLANA_MAINNET = "solana:mainnet";
1
8
  /** Get the EVM wallet provider from window.ethereum */
2
9
  export function getEthereumProvider() {
3
10
  if (typeof window === "undefined")
@@ -11,13 +18,68 @@ export function getSolanaProvider() {
11
18
  const w = window;
12
19
  return w.phantom?.solana ?? w.solana ?? null;
13
20
  }
14
- /** Get the Solana provider for a known multi-chain wallet by EIP-6963 rdns. */
15
- export function getSolanaProviderForRdns(rdns) {
16
- if (typeof window === "undefined")
21
+ export function isSolanaWallet(wallet) {
22
+ return wallet.chains.some((c) => c === SOLANA_MAINNET);
23
+ }
24
+ /**
25
+ * Wrap a wallet-standard Wallet as our SolanaProvider interface.
26
+ * Returns null if the wallet lacks `standard:connect` or
27
+ * `solana:signAndSendTransaction` features (e.g. a watch-only or
28
+ * message-sign-only wallet).
29
+ */
30
+ export function wrapWalletStandard(wallet) {
31
+ const connect = wallet.features["standard:connect"];
32
+ const send = wallet.features["solana:signAndSendTransaction"];
33
+ if (!connect || !send)
17
34
  return null;
18
- const w = window;
19
- if (rdns === "app.phantom")
20
- return w.phantom?.solana ?? null;
21
- return null;
35
+ const events = wallet.features["standard:events"];
36
+ const getSolAccount = () => wallet.accounts.find((a) => a.chains.some((c) => c === SOLANA_MAINNET));
37
+ const offFns = new Map();
38
+ return {
39
+ get publicKey() {
40
+ const a = getSolAccount();
41
+ return a ? { toBase58: () => a.address } : null;
42
+ },
43
+ async connect() {
44
+ const { accounts } = await connect.connect();
45
+ const a = accounts.find((ac) => ac.chains.some((c) => c === SOLANA_MAINNET));
46
+ if (!a)
47
+ throw new Error("no solana account");
48
+ return { publicKey: { toBase58: () => a.address } };
49
+ },
50
+ async signAndSendTransaction(tx, options) {
51
+ const a = getSolAccount();
52
+ if (!a)
53
+ throw new Error("no solana account");
54
+ const [result] = await send.signAndSendTransaction({
55
+ account: a,
56
+ transaction: tx.serialize(),
57
+ chain: SOLANA_MAINNET,
58
+ options,
59
+ });
60
+ return { signature: base58.encode(result.signature) };
61
+ },
62
+ on: events
63
+ ? (event, callback) => {
64
+ if (event !== "accountChanged")
65
+ return;
66
+ const off = events.on("change", (props) => {
67
+ if (!props.accounts)
68
+ return;
69
+ const a = props.accounts.find((ac) => ac.chains.some((c) => c === SOLANA_MAINNET));
70
+ callback(a ? { toBase58: () => a.address } : null);
71
+ });
72
+ offFns.set(callback, off);
73
+ }
74
+ : undefined,
75
+ off: events
76
+ ? (event, callback) => {
77
+ if (event !== "accountChanged")
78
+ return;
79
+ offFns.get(callback)?.();
80
+ offFns.delete(callback);
81
+ }
82
+ : undefined,
83
+ };
22
84
  }
23
85
  //# sourceMappingURL=walletProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"walletProvider.js","sourceRoot":"","sources":["../../../src/web/hooks/walletProvider.ts"],"names":[],"mappings":"AA+BA,uDAAuD;AACvD,MAAM,UAAU,mBAAmB;IACjC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAQ,MAA4B,CAAC,QAAQ,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,CAAC,GAAG,MAA2B,CAAC;IACtC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,CAAC,GAAG,MAA2B,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"walletProvider.js","sourceRoot":"","sources":["../../../src/web/hooks/walletProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ type IconProps = {
2
+ className?: string;
3
+ size?: number;
4
+ };
5
+ /** Green checkmark icon for success states */
6
+ export declare function CheckIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
7
+ /** Clock icon for expired/timeout states */
8
+ export declare function ExpiredIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
9
+ /** X icon for error states */
10
+ export declare function ErrorIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
11
+ /** Back arrow for navigation */
12
+ export declare function BackArrowIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
13
+ /** Close X icon for modal dismiss - matches BackArrowIcon style */
14
+ export declare function CloseIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
15
+ /** Copy icon with checkmark state */
16
+ export declare function CopyIcon({ className, size, copied, }: IconProps & {
17
+ copied?: boolean;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ /** External link icon */
20
+ export declare function ExternalLinkIcon({ className, size }: IconProps): import("react/jsx-runtime").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/web/icons.tsx"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CAgB5D;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CAiB9D;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CAkB5D;AAED,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CAkBhE;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CAkB5D;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,IAAS,EACT,MAAc,GACf,EAAE,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,2CAkClC;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,SAAS,2CA2BnE"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Green checkmark icon for success states */
3
+ export function CheckIcon({ className, size = 40 }) {
4
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className ?? "text-[var(--daimo-success)]", children: _jsx("path", { d: "M20 6L9 17l-5-5" }) }));
5
+ }
6
+ /** Clock icon for expired/timeout states */
7
+ export function ExpiredIcon({ className, size = 40 }) {
8
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className ?? "text-[var(--daimo-error)]", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 6v6l4 2" })] }));
9
+ }
10
+ /** X icon for error states */
11
+ export function ErrorIcon({ className, size = 40 }) {
12
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className ?? "text-[var(--daimo-error)]", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M15 9l-6 6" }), _jsx("path", { d: "M9 9l6 6" })] }));
13
+ }
14
+ /** Back arrow for navigation */
15
+ export function BackArrowIcon({ className, size = 20 }) {
16
+ return (_jsx("svg", { width: size * 0.6, height: size, viewBox: "0 0 12 20", fill: "none", className: className ?? "text-[var(--daimo-text-muted)]", children: _jsx("path", { d: "M10 18L2 10L10 2", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
17
+ }
18
+ /** Close X icon for modal dismiss - matches BackArrowIcon style */
19
+ export function CloseIcon({ className, size = 20 }) {
20
+ return (_jsx("svg", { width: size * 0.6, height: size * 0.6, viewBox: "0 0 12 12", fill: "none", className: className ?? "text-[var(--daimo-text-muted)]", children: _jsx("path", { d: "M2 2L10 10M10 2L2 10", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
21
+ }
22
+ /** Copy icon with checkmark state */
23
+ export function CopyIcon({ className, size = 20, copied = false, }) {
24
+ if (copied) {
25
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className ?? "text-[var(--daimo-accent)]", children: _jsx("path", { d: "M20 6L9 17l-5-5" }) }));
26
+ }
27
+ return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: className ?? "text-[var(--daimo-text-muted)]", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" })] }));
28
+ }
29
+ /** External link icon */
30
+ export function ExternalLinkIcon({ className, size = 16 }) {
31
+ return (_jsxs("svg", { "aria-hidden": "true", width: size, height: size, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, children: [_jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4 4C2.89543 4 2 4.89543 2 6V12C2 13.1046 2.89543 14 4 14H10C11.1046 14 12 13.1046 12 12V9.66667C12 9.11438 12.4477 8.66667 13 8.66667C13.5523 8.66667 14 9.11438 14 9.66667V12C14 14.2091 12.2091 16 10 16H4C1.79086 16 0 14.2091 0 12V6C0 3.79086 1.79086 2 4 2H6.33333C6.88562 2 7.33333 2.44772 7.33333 3C7.33333 3.55228 6.88562 4 6.33333 4H4Z", fill: "currentColor", fillOpacity: 0.4 }), _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M9.5 1C9.5 0.447715 9.94772 0 10.5 0H15C15.5523 0 16 0.447715 16 1V5.5C16 6.05228 15.5523 6.5 15 6.5C14.4477 6.5 14 6.05228 14 5.5V3.41421L8.70711 8.70711C8.31658 9.09763 7.68342 9.09763 7.29289 8.70711C6.90237 8.31658 6.90237 7.68342 7.29289 7.29289L12.5858 2H10.5C9.94772 2 9.5 1.55228 9.5 1Z", fill: "currentColor", fillOpacity: 0.4 })] }));
32
+ }
33
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/web/icons.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { DaimoPayToken } from "../common/legacy/session.js";
2
+ import { ReactNode } from "react";
3
+ import { BackArrowIcon } from "./icons.js";
4
+ export { BackArrowIcon };
5
+ type AmountInputProps = {
6
+ minimumUsd: number;
7
+ maximumUsd: number;
8
+ /** Label shown below input (e.g., "Balance: $X.XX" or "Minimum $X.XX") */
9
+ defaultLabel?: string;
10
+ onSubmit: (amountUsd: number) => void;
11
+ /** Called whenever the amount changes */
12
+ onChange?: (amountUsd: number, isValid: boolean) => void;
13
+ };
14
+ /**
15
+ * USD amount input with dynamic width and min/max validation.
16
+ * Shows warning messages when amount is outside valid range.
17
+ */
18
+ export declare function AmountInput({ minimumUsd, maximumUsd, defaultLabel, onSubmit, onChange, }: AmountInputProps): import("react/jsx-runtime").JSX.Element;
19
+ /** Hook to manage amount input state externally */
20
+ export declare function useAmountInput(minimumUsd: number, maximumUsd: number): {
21
+ amountUsd: number;
22
+ isValid: boolean;
23
+ handleChange: (amount: number, valid: boolean) => void;
24
+ };
25
+ /** Resolve relative icon paths to absolute URLs */
26
+ export declare function resolveIconUrl(icon: string): string;
27
+ /** Standard page header with optional back button and centered title */
28
+ type PageHeaderProps = {
29
+ title: string;
30
+ onBack?: (() => void) | null;
31
+ };
32
+ export declare function PageHeader({ title, onBack }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
33
+ /** Standard page logo display */
34
+ type PageLogoProps = {
35
+ icon: string;
36
+ alt: string;
37
+ size?: "md" | "lg";
38
+ };
39
+ export declare function PageLogo({ icon, alt, size }: PageLogoProps): import("react/jsx-runtime").JSX.Element;
40
+ /** Centered content container for detail pages */
41
+ type PageContentProps = {
42
+ children: ReactNode;
43
+ };
44
+ export declare function PageContent({ children }: PageContentProps): import("react/jsx-runtime").JSX.Element;
45
+ /** Centered error message */
46
+ export declare function ErrorMessage({ message }: {
47
+ message: string;
48
+ }): import("react/jsx-runtime").JSX.Element;
49
+ type ContactSupportButtonProps = {
50
+ subject: string;
51
+ info: Record<string, string>;
52
+ };
53
+ /** Contact support mailto link button */
54
+ export declare function ContactSupportButton({ subject, info, }: ContactSupportButtonProps): import("react/jsx-runtime").JSX.Element;
55
+ /** Show receipt link button */
56
+ export declare function ShowReceiptButton({ sessionId }: {
57
+ sessionId: string;
58
+ }): import("react/jsx-runtime").JSX.Element;
59
+ type TokenIconWithChainBadgeProps = {
60
+ /** Full token object (preferred — provides logoURI) */
61
+ token?: DaimoPayToken;
62
+ /** Alternative: just chainId, symbol, and logoURI (for cases without full token) */
63
+ chainId?: number;
64
+ symbol?: string;
65
+ logoURI?: string;
66
+ /** Size variant: "sm" (32px) for lists, "lg" (80px) for headers, "qr" (48px) for QR codes */
67
+ size?: "sm" | "lg" | "qr";
68
+ /** Border color class for the chain badge (defaults to row background colors) */
69
+ badgeBorderClass?: string;
70
+ };
71
+ /**
72
+ * Token icon with chain badge overlay.
73
+ * - "sm": 32x32 token, 15x15 badge (for list rows)
74
+ * - "lg": 80x80 token, 32x32 badge (for page headers)
75
+ * - "qr": 48x48 token, 16x16 badge at top-right (for QR code centers)
76
+ */
77
+ export declare function TokenIconWithChainBadge({ token, chainId, symbol, logoURI, size, badgeBorderClass, }: TokenIconWithChainBadgeProps): import("react/jsx-runtime").JSX.Element;
78
+ /** Map chainId to logo filename */
79
+ export declare function getChainLogoFilename(chainId: number): string;
80
+ type CopyableInfoCardProps = {
81
+ label: string;
82
+ value: string;
83
+ /** Display value (if different from copy value) */
84
+ displayValue?: string;
85
+ /** Suffix shown after display value */
86
+ suffix?: string;
87
+ disabled?: boolean;
88
+ /** Callback when value is copied */
89
+ onCopy?: (value: string) => void;
90
+ };
91
+ /** Card with label, value, and copy button */
92
+ export declare function CopyableInfoCard({ label, value, displayValue, suffix, disabled, onCopy, }: CopyableInfoCardProps): import("react/jsx-runtime").JSX.Element;
93
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/web/shared.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { arbitrum, base, bsc, celo, ethereum, getChainName, gnosis, hyperEvm, linea, monad, optimism, polygon, scroll, solana, tron, worldchain, } from "../common/chain.js";
3
+ import { useCallback, useState } from "react";
4
+ import { BackArrowIcon, CopyIcon } from "./icons.js";
5
+ import { t } from "../hooks/locale.js";
6
+ export { BackArrowIcon };
7
+ const PAY_BASE_URL = "https://daimo.com";
8
+ const CHAIN_LOGOS = {
9
+ [arbitrum.chainId]: "arbitrum.svg",
10
+ [base.chainId]: "base.svg",
11
+ [bsc.chainId]: "bsc.svg",
12
+ [celo.chainId]: "celo.svg",
13
+ [ethereum.chainId]: "ethereum.svg",
14
+ [gnosis.chainId]: "gnosis.svg",
15
+ [hyperEvm.chainId]: "hyperevm.svg",
16
+ [linea.chainId]: "linea.svg",
17
+ [monad.chainId]: "monad.svg",
18
+ [optimism.chainId]: "optimism.svg",
19
+ [polygon.chainId]: "polygon.svg",
20
+ [scroll.chainId]: "scroll.svg",
21
+ [solana.chainId]: "solana.svg",
22
+ [tron.chainId]: "tron.svg",
23
+ [worldchain.chainId]: "worldchain.svg",
24
+ };
25
+ // --- Copy to Clipboard Hook ---
26
+ function useCopyToClipboard(resetDelayMs = 1500) {
27
+ const [copied, setCopied] = useState(false);
28
+ const copy = useCallback(async (text) => {
29
+ try {
30
+ await navigator.clipboard.writeText(text);
31
+ setCopied(true);
32
+ setTimeout(() => setCopied(false), resetDelayMs);
33
+ }
34
+ catch {
35
+ console.error("failed to copy to clipboard");
36
+ }
37
+ }, [resetDelayMs]);
38
+ return { copy, copied };
39
+ }
40
+ /**
41
+ * USD amount input with dynamic width and min/max validation.
42
+ * Shows warning messages when amount is outside valid range.
43
+ */
44
+ export function AmountInput({ minimumUsd, maximumUsd, defaultLabel, onSubmit, onChange, }) {
45
+ const [inputValue, setInputValue] = useState("");
46
+ const amountUsd = parseFloat(inputValue) || 0;
47
+ const isValid = amountUsd >= minimumUsd && amountUsd <= maximumUsd;
48
+ const showMinWarning = inputValue !== "" && amountUsd < minimumUsd;
49
+ const showMaxWarning = inputValue !== "" && amountUsd > maximumUsd;
50
+ const handleInputChange = (e) => {
51
+ const value = e.target.value;
52
+ // Allow empty, or digits with up to 2 decimal places
53
+ if (value === "" || /^\d*\.?\d{0,2}$/.test(value)) {
54
+ setInputValue(value);
55
+ const newAmount = parseFloat(value) || 0;
56
+ const newIsValid = newAmount >= minimumUsd && newAmount <= maximumUsd;
57
+ onChange?.(newAmount, newIsValid);
58
+ }
59
+ };
60
+ const handleKeyDown = (e) => {
61
+ if (e.key === "Enter" && isValid) {
62
+ onSubmit(amountUsd);
63
+ }
64
+ };
65
+ // Dynamic width: shrink for decimal point, min 1ch, max 10ch
66
+ const inputWidth = inputValue.length === 0
67
+ ? "3.55ch"
68
+ : `${Math.min(inputValue.length - (inputValue.match(/\./g) || []).length * 0.45, 10)}ch`;
69
+ const label = showMinWarning
70
+ ? `${t.minimum} $${minimumUsd.toFixed(2)}`
71
+ : showMaxWarning
72
+ ? `${t.maximum} $${maximumUsd.toFixed(0)}`
73
+ : (defaultLabel ?? `${t.minimum} $${minimumUsd.toFixed(2)}`);
74
+ const labelClass = showMinWarning || showMaxWarning
75
+ ? "text-sm text-[var(--daimo-text)]"
76
+ : "text-sm text-[var(--daimo-text-secondary)]";
77
+ // $ sign color: placeholder when empty, text color when typed
78
+ const dollarColor = inputValue
79
+ ? "text-[var(--daimo-text)]"
80
+ : "text-[var(--daimo-placeholder)]";
81
+ return (_jsxs("div", { className: "flex flex-col items-center gap-6", children: [_jsxs("div", { className: "flex items-center justify-center gap-1", children: [_jsx("span", { className: `text-3xl font-semibold ${dollarColor}`, children: "$" }), _jsx("input", { type: "text", inputMode: "decimal", value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: "0.00", className: "bg-transparent text-5xl font-semibold text-[var(--daimo-text)] placeholder-[var(--daimo-placeholder)] outline-none caret-[var(--daimo-text-muted)]", style: {
82
+ width: inputWidth,
83
+ minWidth: "1ch",
84
+ maxWidth: "10ch",
85
+ }, autoFocus: true })] }), _jsx("p", { className: labelClass, children: label })] }));
86
+ }
87
+ /** Hook to manage amount input state externally */
88
+ export function useAmountInput(minimumUsd, maximumUsd) {
89
+ const [amountUsd, setAmountUsd] = useState(0);
90
+ const [isValid, setIsValid] = useState(false);
91
+ const handleChange = (amount, valid) => {
92
+ setAmountUsd(amount);
93
+ setIsValid(valid);
94
+ };
95
+ return { amountUsd, isValid, handleChange };
96
+ }
97
+ /** Resolve relative icon paths to absolute URLs */
98
+ export function resolveIconUrl(icon) {
99
+ if (icon.startsWith("http://") ||
100
+ icon.startsWith("https://") ||
101
+ icon.startsWith("data:")) {
102
+ return icon;
103
+ }
104
+ return `${PAY_BASE_URL}${icon}`;
105
+ }
106
+ export function PageHeader({ title, onBack }) {
107
+ return (_jsxs("div", { className: "sticky top-0 z-10 flex items-center justify-center p-6 bg-[var(--daimo-surface)]", children: [onBack && (_jsx("button", { onClick: onBack, "aria-label": "Go back", className: "absolute left-2 min-w-[44px] min-h-[44px] flex items-center justify-center px-4 py-2 rounded-lg touch-action-manipulation hover:[@media(hover:hover)]:bg-[var(--daimo-surface-secondary)] active:bg-[var(--daimo-surface-secondary)] active:scale-[0.95] transition-[background-color,transform] duration-150 ease-out", children: _jsx(BackArrowIcon, {}) })), _jsx("h1", { className: "text-lg font-semibold text-[var(--daimo-title)] text-balance", children: title })] }));
108
+ }
109
+ export function PageLogo({ icon, alt, size = "lg" }) {
110
+ const sizeClass = size === "lg" ? "w-20 h-20" : "w-16 h-16";
111
+ return (_jsx("img", { src: resolveIconUrl(icon), alt: alt, className: `${sizeClass} object-contain rounded-[25%]` }));
112
+ }
113
+ export function PageContent({ children }) {
114
+ return (_jsx("div", { className: "flex-1 flex flex-col items-center justify-center p-6 gap-6", children: children }));
115
+ }
116
+ /** Centered error message */
117
+ export function ErrorMessage({ message }) {
118
+ return (_jsx("p", { className: "text-sm text-[var(--daimo-text-secondary)] text-center max-w-xs truncate", children: message }));
119
+ }
120
+ /** Contact support mailto link button */
121
+ export function ContactSupportButton({ subject, info, }) {
122
+ const email = "support@daimo.com";
123
+ const bodyLines = [
124
+ ...Object.entries(info).map(([key, value]) => `${key}: ${value}`),
125
+ "",
126
+ t.tellUsHowWeCanHelp,
127
+ ];
128
+ const body = bodyLines.join("\n");
129
+ const href = `mailto:${email}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
130
+ return (_jsx("a", { href: href, className: "text-sm text-[var(--daimo-text-secondary)] hover:text-[var(--daimo-text)] underline", children: t.contactSupport }));
131
+ }
132
+ /** Show receipt link button */
133
+ export function ShowReceiptButton({ sessionId }) {
134
+ return (_jsx("a", { href: `${PAY_BASE_URL}/receipt?id=${sessionId}`, target: "_blank", rel: "noopener noreferrer", className: "text-sm text-[var(--daimo-text-muted)] underline", children: t.showReceipt }));
135
+ }
136
+ /**
137
+ * Token icon with chain badge overlay.
138
+ * - "sm": 32x32 token, 15x15 badge (for list rows)
139
+ * - "lg": 80x80 token, 32x32 badge (for page headers)
140
+ * - "qr": 48x48 token, 16x16 badge at top-right (for QR code centers)
141
+ */
142
+ export function TokenIconWithChainBadge({ token, chainId, symbol, logoURI, size = "sm", badgeBorderClass, }) {
143
+ const tokenSymbol = token?.symbol ?? symbol ?? "USDC";
144
+ const tokenChainId = token?.chainId ?? chainId ?? 1;
145
+ const logoUrl = token?.logoURI ?? logoURI;
146
+ const chainLogoUrl = `/chain-logos/${getChainLogoFilename(tokenChainId)}`;
147
+ const sizeConfig = {
148
+ sm: {
149
+ container: "w-8 h-8 shrink-0",
150
+ icon: "w-8 h-8 rounded-full",
151
+ badge: "w-[15px] h-[15px]",
152
+ position: "absolute -bottom-0.5 -right-0.5",
153
+ style: {
154
+ borderWidth: "1px",
155
+ borderColor: "var(--daimo-surface-secondary)",
156
+ backgroundColor: "var(--daimo-surface-secondary)",
157
+ },
158
+ },
159
+ lg: {
160
+ container: "w-20 h-20",
161
+ icon: "w-20 h-20 object-contain rounded-full",
162
+ badge: "w-8 h-8",
163
+ position: "absolute -bottom-1 -right-1",
164
+ style: {
165
+ borderWidth: "2px",
166
+ borderColor: "var(--daimo-surface)",
167
+ backgroundColor: "var(--daimo-surface)",
168
+ },
169
+ },
170
+ qr: {
171
+ container: "w-12 h-12",
172
+ icon: "w-12 h-12 object-contain rounded-full",
173
+ badge: "w-5 h-5",
174
+ position: "absolute -bottom-0.5 -right-0.5",
175
+ style: {
176
+ borderWidth: "1.5px",
177
+ borderColor: "var(--daimo-surface)",
178
+ backgroundColor: "var(--daimo-surface)",
179
+ },
180
+ },
181
+ };
182
+ const config = sizeConfig[size];
183
+ return (_jsxs("div", { className: `relative ${config.container}`, children: [logoUrl && (_jsx("img", { src: resolveIconUrl(logoUrl), alt: tokenSymbol, className: config.icon, onError: (e) => {
184
+ e.target.style.display = "none";
185
+ } })), _jsx("img", { src: resolveIconUrl(chainLogoUrl), alt: getChainName(tokenChainId), className: `${config.position} ${config.badge} rounded-full ${badgeBorderClass ?? ""}`, style: badgeBorderClass ? undefined : config.style, onError: (e) => {
186
+ e.target.style.display = "none";
187
+ } })] }));
188
+ }
189
+ /** Map chainId to logo filename */
190
+ export function getChainLogoFilename(chainId) {
191
+ return CHAIN_LOGOS[chainId] ?? "ethereum.svg";
192
+ }
193
+ /** Card with label, value, and copy button */
194
+ export function CopyableInfoCard({ label, value, displayValue, suffix, disabled = false, onCopy, }) {
195
+ const { copy, copied } = useCopyToClipboard();
196
+ const handleCopy = () => {
197
+ copy(value);
198
+ onCopy?.(value);
199
+ };
200
+ return (_jsxs("button", { onClick: handleCopy, disabled: disabled, "aria-label": `Copy ${label}`, className: "w-full min-h-[56px] p-4 bg-[var(--daimo-surface-secondary)] rounded-[var(--daimo-radius-lg)] flex items-center justify-between touch-action-manipulation hover:[@media(hover:hover)]:bg-[var(--daimo-surface-hover)] active:scale-[0.98] transition-[background-color,transform] duration-150 ease-out disabled:opacity-50 disabled:cursor-not-allowed", children: [_jsxs("div", { className: "text-left", children: [_jsx("p", { className: "text-sm text-[var(--daimo-text-secondary)] font-medium mb-1", children: label }), _jsxs("p", { className: "text-lg font-semibold text-[var(--daimo-text)] tabular-nums", children: [displayValue ?? value, suffix && _jsx("span", { className: "ml-2", children: suffix })] })] }), _jsx(CopyIcon, { copied: copied })] }));
201
+ }
202
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/web/shared.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- :root{--daimo-bg:#00000008;--daimo-surface:#fff;--daimo-surface-secondary:#f6f7f9;--daimo-surface-hover:#f0f2f5;--daimo-skeleton:#f6f7f9;--daimo-title:#373737;--daimo-text:#373737;--daimo-text-secondary:#999;--daimo-text-muted:#9ca3af;--daimo-success:#22c55e;--daimo-success-light:#dcfce7;--daimo-checkmark:#22c55e;--daimo-error:#ef4444;--daimo-error-light:#fee2e2;--daimo-warning:#f97316;--daimo-accent:#3b82f6;--daimo-placeholder:#d1d5db;--daimo-border:#fbfafb;--daimo-qr-bg:#fff;--daimo-qr-dot:#373737;--daimo-radius-sm:0.5rem;--daimo-radius-md:0.75rem;--daimo-radius-lg:1rem}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--daimo-bg:#00000008;--daimo-surface:#2b2b2b;--daimo-surface-secondary:#383838;--daimo-surface-hover:#404040;--daimo-skeleton:#2b2b2b;--daimo-title:#fff;--daimo-text:#fff;--daimo-text-secondary:#7e7e7e;--daimo-text-muted:#858585;--daimo-success:#4ade80;--daimo-success-light:#14532d;--daimo-checkmark:#f3f4f6;--daimo-error:#f87171;--daimo-error-light:#7f1d1d;--daimo-warning:#fb923c;--daimo-accent:#0977d5;--daimo-placeholder:#9ca3af;--daimo-border:#3d3d3d;--daimo-qr-bg:#2b2b2b;--daimo-qr-dot:#fff}}.scroll-fade{padding-top:4px;mask-image:linear-gradient(180deg,transparent,#000 4px,#000 calc(100% - 4px),transparent);-webkit-mask-image:linear-gradient(180deg,transparent,#000 4px,#000 calc(100% - 4px),transparent)}.daimo-page-enter{animation:daimo-page-in .15s cubic-bezier(.23,1,.32,1) both}@keyframes daimo-page-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.daimo-page-enter{animation:none}}.transition-qr{transition:opacity .28s cubic-bezier(.215,.61,.355,1),transform .28s cubic-bezier(.215,.61,.355,1);will-change:opacity,transform}.transition-qr-icon{transition:transform .28s cubic-bezier(.645,.045,.355,1),opacity .28s cubic-bezier(.645,.045,.355,1);will-change:transform,opacity}.transition-qr-spacer{transition:height .28s cubic-bezier(.645,.045,.355,1)}@media (prefers-reduced-motion:reduce){.transition-qr,.transition-qr-icon,.transition-qr-spacer{transition:none}}[data-theme=dark]{--daimo-bg:#111827;--daimo-surface:#1f2937;--daimo-surface-secondary:#374151;--daimo-surface-hover:#4b5563;--daimo-skeleton:#4b5563;--daimo-title:#f3f4f6;--daimo-text:#f3f4f6;--daimo-text-secondary:#9ca3af;--daimo-text-muted:#6b7280;--daimo-success:#4ade80;--daimo-success-light:#14532d;--daimo-checkmark:#f3f4f6;--daimo-error:#f87171;--daimo-error-light:#7f1d1d;--daimo-warning:#fb923c;--daimo-accent:#0977d5;--daimo-placeholder:#6b7280}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-\[13px\]{inset:13px}.inset-\[6px\]{inset:6px}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-bottom-1{bottom:-.25rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.bottom-0{bottom:0}.left-1\/2{left:50%}.left-2{left:.5rem}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-6{top:1.5rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mr-3{margin-right:.75rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0\.5{height:.125rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[15px\]{height:15px}.h-\[28\%\]{height:28%}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-\[100px\]{min-height:100px}.min-h-\[44px\]{min-height:44px}.min-h-\[56px\]{min-height:56px}.min-h-full{min-height:100%}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\/5{width:60%}.w-32{width:8rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-\[100px\]{width:100px}.w-\[15px\]{width:15px}.w-\[28\%\]{width:28%}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[44px\]{min-width:44px}.max-w-16{max-width:4rem}.max-w-\[200px\]{max-width:200px}.max-w-\[512px\]{max-width:512px}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-90{--tw-rotate:-90deg}.-rotate-90,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-50,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-not-allowed{cursor:not-allowed}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-balance{text-wrap:balance}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[25\%\]{border-radius:25%}.rounded-\[var\(--daimo-radius-lg\)\]{border-radius:var(--daimo-radius-lg)}.rounded-\[var\(--daimo-radius-md\)\]{border-radius:var(--daimo-radius-md)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-t-\[var\(--daimo-radius-lg\)\]{border-top-left-radius:var(--daimo-radius-lg);border-top-right-radius:var(--daimo-radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-none{border-style:none}.border-\[var\(--daimo-border\)\]{border-color:var(--daimo-border)}.border-\[var\(--daimo-qr-bg\2c white\)\]{border-color:var(--daimo-qr-bg,#fff)}.border-\[var\(--daimo-surface\)\]{border-color:var(--daimo-surface)}.bg-\[var\(--daimo-primary\)\]{background-color:var(--daimo-primary)}.bg-\[var\(--daimo-qr-bg\2c white\)\]{background-color:var(--daimo-qr-bg,#fff)}.bg-\[var\(--daimo-surface\)\]{background-color:var(--daimo-surface)}.bg-\[var\(--daimo-surface-secondary\)\]{background-color:var(--daimo-surface-secondary)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem}.pb-4,.py-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-\[100\%\]{padding-bottom:100%}.text-left{text-align:left}.text-center{text-align:center}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-tight{line-height:1.25}.text-\[var\(--daimo-accent\)\]{color:var(--daimo-accent)}.text-\[var\(--daimo-error\)\]{color:var(--daimo-error)}.text-\[var\(--daimo-placeholder\)\]{color:var(--daimo-placeholder)}.text-\[var\(--daimo-success\)\]{color:var(--daimo-success)}.text-\[var\(--daimo-text\)\]{color:var(--daimo-text)}.text-\[var\(--daimo-text-muted\)\]{color:var(--daimo-text-muted)}.text-\[var\(--daimo-text-secondary\)\]{color:var(--daimo-text-secondary)}.text-\[var\(--daimo-title\)\]{color:var(--daimo-title)}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.placeholder-\[var\(--daimo-placeholder\)\]::-moz-placeholder{color:var(--daimo-placeholder)}.placeholder-\[var\(--daimo-placeholder\)\]::placeholder{color:var(--daimo-placeholder)}.caret-\[var\(--daimo-text-muted\)\]{caret-color:var(--daimo-text-muted)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[background-color\2c transform\]{transition-property:background-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[opacity\2c transform\]{transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-opacity{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.hover\:bg-\[var\(--daimo-surface-hover\)\]:hover{background-color:var(--daimo-surface-hover)}.hover\:text-\[var\(--daimo-text\)\]:hover{color:var(--daimo-text)}.hover\:opacity-90:hover{opacity:.9}.focus\:border-none:focus{border-style:none}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.active\:scale-\[0\.95\]:active{--tw-scale-x:0.95;--tw-scale-y:0.95}.active\:scale-\[0\.95\]:active,.active\:scale-\[0\.97\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-\[0\.97\]:active{--tw-scale-x:0.97;--tw-scale-y:0.97}.active\:scale-\[0\.98\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:bg-\[var\(--daimo-surface-secondary\)\]:active{background-color:var(--daimo-surface-secondary)}.active\:opacity-50:active{opacity:.5}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:no-preference){@keyframes pulse{50%{opacity:.5}}.motion-safe\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}}@media (min-width:640px){.sm\:max-w-\[260px\]{max-width:260px}.sm\:rounded-\[var\(--daimo-radius-lg\)\]{border-radius:var(--daimo-radius-lg)}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:pb-4{padding-bottom:1rem}}@media(hover:hover){.hover\:\[\@media\(hover\:hover\)\]\:bg-\[var\(--daimo-surface-hover\)\]:hover{background-color:var(--daimo-surface-hover)}.hover\:\[\@media\(hover\:hover\)\]\:bg-\[var\(--daimo-surface-secondary\)\]:hover{background-color:var(--daimo-surface-secondary)}.hover\:\[\@media\(hover\:hover\)\]\:opacity-70:hover{opacity:.7}}
1
+ :root{--daimo-bg:#00000008;--daimo-surface:#fff;--daimo-surface-secondary:#f6f7f9;--daimo-surface-hover:#f0f2f5;--daimo-skeleton:#f6f7f9;--daimo-title:#373737;--daimo-text:#373737;--daimo-text-secondary:#999;--daimo-text-muted:#9ca3af;--daimo-success:#22c55e;--daimo-success-light:#dcfce7;--daimo-checkmark:#22c55e;--daimo-error:#ef4444;--daimo-error-light:#fee2e2;--daimo-warning:#f97316;--daimo-accent:#3b82f6;--daimo-placeholder:#d1d5db;--daimo-border:#fbfafb;--daimo-qr-bg:#fff;--daimo-qr-dot:#373737;--daimo-radius-sm:0.5rem;--daimo-radius-md:0.75rem;--daimo-radius-lg:1rem;--daimo-radius-xl:20px}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--daimo-bg:#00000008;--daimo-surface:#2b2b2b;--daimo-surface-secondary:#383838;--daimo-surface-hover:#404040;--daimo-skeleton:#2b2b2b;--daimo-title:#fff;--daimo-text:#fff;--daimo-text-secondary:#7e7e7e;--daimo-text-muted:#858585;--daimo-success:#4ade80;--daimo-success-light:#14532d;--daimo-checkmark:#f3f4f6;--daimo-error:#f87171;--daimo-error-light:#7f1d1d;--daimo-warning:#fb923c;--daimo-accent:#0977d5;--daimo-placeholder:#9ca3af;--daimo-border:#3d3d3d;--daimo-qr-bg:#2b2b2b;--daimo-qr-dot:#fff}}.scroll-fade:after{content:"";pointer-events:none;z-index:10;position:sticky;bottom:0;left:0;right:0;display:block;height:32px;margin-top:-32px;background:linear-gradient(to bottom,transparent,var(--daimo-surface));transition:opacity .3s ease}.scroll-fade.scroll-end:after{opacity:0}.daimo-page-enter{animation:daimo-page-in .15s cubic-bezier(.23,1,.32,1) both}@keyframes daimo-page-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.daimo-page-enter{animation:none}}.transition-qr{transition:opacity .28s cubic-bezier(.215,.61,.355,1),transform .28s cubic-bezier(.215,.61,.355,1);will-change:opacity,transform}.transition-qr-icon{transition:transform .28s cubic-bezier(.645,.045,.355,1),opacity .28s cubic-bezier(.645,.045,.355,1);will-change:transform,opacity}.transition-qr-spacer{transition:height .28s cubic-bezier(.645,.045,.355,1)}@media (prefers-reduced-motion:reduce){.transition-qr,.transition-qr-icon,.transition-qr-spacer{transition:none}}[data-theme=dark]{--daimo-bg:#111827;--daimo-surface:#1f2937;--daimo-surface-secondary:#374151;--daimo-surface-hover:#4b5563;--daimo-skeleton:#4b5563;--daimo-title:#f3f4f6;--daimo-text:#f3f4f6;--daimo-text-secondary:#9ca3af;--daimo-text-muted:#6b7280;--daimo-success:#4ade80;--daimo-success-light:#14532d;--daimo-checkmark:#f3f4f6;--daimo-error:#f87171;--daimo-error-light:#7f1d1d;--daimo-warning:#fb923c;--daimo-accent:#0977d5;--daimo-placeholder:#6b7280}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-\[13px\]{inset:13px}.inset-\[6px\]{inset:6px}.inset-x-0{left:0;right:0}.-bottom-0\.5{bottom:-.125rem}.-bottom-1{bottom:-.25rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.bottom-0{bottom:0}.left-1\/2{left:50%}.left-5{left:1.25rem}.right-\[17px\]{right:17px}.top-0{top:0}.top-1\/2{top:50%}.top-\[22px\]{top:22px}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.mr-3{margin-right:.75rem}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0\.5{height:.125rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[15px\]{height:15px}.h-\[28\%\]{height:28%}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-\[100px\]{min-height:100px}.min-h-\[44px\]{min-height:44px}.min-h-\[56px\]{min-height:56px}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\/5{width:60%}.w-32{width:8rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-\[100px\]{width:100px}.w-\[15px\]{width:15px}.w-\[28\%\]{width:28%}.w-full{width:100%}.min-w-0{min-width:0}.max-w-16{max-width:4rem}.max-w-\[200px\]{max-width:200px}.max-w-\[420px\]{max-width:420px}.max-w-\[512px\]{max-width:512px}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-90{--tw-rotate:-90deg}.-rotate-90,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-50,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-not-allowed{cursor:not-allowed}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-balance{text-wrap:balance}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[25\%\]{border-radius:25%}.rounded-\[var\(--daimo-radius-lg\)\]{border-radius:var(--daimo-radius-lg)}.rounded-\[var\(--daimo-radius-md\)\]{border-radius:var(--daimo-radius-md)}.rounded-\[var\(--daimo-radius-sm\)\]{border-radius:var(--daimo-radius-sm)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-t-\[var\(--daimo-radius-xl\)\]{border-top-left-radius:var(--daimo-radius-xl);border-top-right-radius:var(--daimo-radius-xl)}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-none{border-style:none}.border-\[var\(--daimo-border\)\]{border-color:var(--daimo-border)}.border-\[var\(--daimo-qr-bg\2c white\)\]{border-color:var(--daimo-qr-bg,#fff)}.border-\[var\(--daimo-surface\)\]{border-color:var(--daimo-surface)}.bg-\[var\(--daimo-primary\)\]{background-color:var(--daimo-primary)}.bg-\[var\(--daimo-qr-bg\2c white\)\]{background-color:var(--daimo-qr-bg,#fff)}.bg-\[var\(--daimo-surface\)\]{background-color:var(--daimo-surface)}.bg-\[var\(--daimo-surface-secondary\)\]{background-color:var(--daimo-surface-secondary)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.pb-0{padding-bottom:0}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-\[100\%\]{padding-bottom:100%}.text-left{text-align:left}.text-center{text-align:center}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[24px\]{font-size:24px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[21px\]{line-height:21px}.leading-tight{line-height:1.25}.text-\[var\(--daimo-accent\)\]{color:var(--daimo-accent)}.text-\[var\(--daimo-error\)\]{color:var(--daimo-error)}.text-\[var\(--daimo-placeholder\)\]{color:var(--daimo-placeholder)}.text-\[var\(--daimo-success\)\]{color:var(--daimo-success)}.text-\[var\(--daimo-text\)\]{color:var(--daimo-text)}.text-\[var\(--daimo-text-muted\)\]{color:var(--daimo-text-muted)}.text-\[var\(--daimo-text-secondary\)\]{color:var(--daimo-text-secondary)}.text-\[var\(--daimo-title\)\]{color:var(--daimo-title)}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.placeholder-\[var\(--daimo-placeholder\)\]::-moz-placeholder{color:var(--daimo-placeholder)}.placeholder-\[var\(--daimo-placeholder\)\]::placeholder{color:var(--daimo-placeholder)}.caret-\[var\(--daimo-text-muted\)\]{caret-color:var(--daimo-text-muted)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[background-color\2c transform\]{transition-property:background-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[background-color\]{transition-property:background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\]{transition-property:border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[opacity\2c transform\]{transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[transition-duration\:200ms\2c 100ms\]{transition-duration:.2s,.1s}.hover\:bg-\[var\(--daimo-surface-hover\)\]:hover{background-color:var(--daimo-surface-hover)}.hover\:text-\[var\(--daimo-text\)\]:hover{color:var(--daimo-text)}.hover\:opacity-90:hover{opacity:.9}.focus\:border-none:focus{border-style:none}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.active\:scale-\[0\.9\]:active{--tw-scale-x:0.9;--tw-scale-y:0.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:opacity-50:active{opacity:.5}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:no-preference){@keyframes pulse{50%{opacity:.5}}.motion-safe\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}}@media (min-width:640px){.sm\:max-w-\[260px\]{max-width:260px}.sm\:rounded-\[var\(--daimo-radius-xl\)\]{border-radius:var(--daimo-radius-xl)}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:pb-4{padding-bottom:1rem}}@media(hover:hover){.hover\:\[\@media\(hover\:hover\)\]\:\!bg-\[var\(--daimo-surface-secondary\)\]:hover{background-color:var(--daimo-surface-secondary)!important}.hover\:\[\@media\(hover\:hover\)\]\:bg-\[var\(--daimo-surface-hover\)\]:hover{background-color:var(--daimo-surface-hover)}.hover\:\[\@media\(hover\:hover\)\]\:bg-\[var\(--daimo-surface-secondary\)\]:hover{background-color:var(--daimo-surface-secondary)}.hover\:\[\@media\(hover\:hover\)\]\:opacity-70:hover{opacity:.7}}
@@ -42,6 +42,7 @@
42
42
  --daimo-radius-sm: 0.5rem;
43
43
  --daimo-radius-md: 0.75rem;
44
44
  --daimo-radius-lg: 1rem;
45
+ --daimo-radius-xl: 20px;
45
46
  }
46
47
 
47
48
  /* Dark mode: system preference */
@@ -81,24 +82,24 @@
81
82
  }
82
83
  }
83
84
 
84
- /* Scroll fade — 4px gradient at top and bottom of scrollable areas.
85
- padding-top offsets the top fade so content is fully visible at rest. */
86
- .scroll-fade {
87
- padding-top: 4px;
88
- mask-image: linear-gradient(
89
- to bottom,
90
- transparent,
91
- black 4px,
92
- black calc(100% - 4px),
93
- transparent
94
- );
95
- -webkit-mask-image: linear-gradient(
96
- to bottom,
97
- transparent,
98
- black 4px,
99
- black calc(100% - 4px),
100
- transparent
101
- );
85
+ /* Scroll fade — 32px sticky gradient at bottom of scrollable areas.
86
+ Fades content into the background; disappears when scrolled to bottom. */
87
+ .scroll-fade::after {
88
+ content: "";
89
+ pointer-events: none;
90
+ z-index: 10;
91
+ position: sticky;
92
+ bottom: 0;
93
+ left: 0;
94
+ right: 0;
95
+ display: block;
96
+ height: 32px;
97
+ margin-top: -32px;
98
+ background: linear-gradient(to bottom, transparent, var(--daimo-surface));
99
+ transition: opacity 300ms ease;
100
+ }
101
+ .scroll-fade.scroll-end::after {
102
+ opacity: 0;
102
103
  }
103
104
 
104
105
  /* Page enter animation — subtle fade + slide on page change */
@@ -0,0 +1,6 @@
1
+ /** Web-only clipboard hook with visual feedback. */
2
+ export declare function useCopyToClipboard(resetMs?: number): {
3
+ copy: (text: string) => Promise<void>;
4
+ copied: boolean;
5
+ };
6
+ //# sourceMappingURL=useCopyToClipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCopyToClipboard.d.ts","sourceRoot":"","sources":["../../src/web/useCopyToClipboard.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,OAAO,SAAO;iBAKhC,MAAM;;EActB"}