@crossmint/client-sdk-react-native-ui 0.13.33 → 0.13.34

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 (241) hide show
  1. package/dist/chunk-24MMQ2R4.js +15 -0
  2. package/dist/chunk-24MMQ2R4.js.map +1 -0
  3. package/dist/chunk-2DNOAXOE.mjs +8 -0
  4. package/dist/chunk-2DNOAXOE.mjs.map +1 -0
  5. package/dist/chunk-2TEAOLM6.mjs +149 -0
  6. package/dist/chunk-2TEAOLM6.mjs.map +1 -0
  7. package/dist/chunk-2YRJHM46.mjs +50 -0
  8. package/dist/chunk-2YRJHM46.mjs.map +1 -0
  9. package/dist/chunk-34OVOZB2.mjs +111 -0
  10. package/dist/chunk-34OVOZB2.mjs.map +1 -0
  11. package/dist/chunk-3AWDWMZ2.mjs +18 -0
  12. package/dist/chunk-3AWDWMZ2.mjs.map +1 -0
  13. package/dist/chunk-3MWGBZ5O.js +348 -0
  14. package/dist/chunk-3MWGBZ5O.js.map +1 -0
  15. package/dist/chunk-3PJ6FXFT.mjs +1 -0
  16. package/dist/chunk-3PJ6FXFT.mjs.map +1 -0
  17. package/dist/chunk-3SFSPJXM.mjs +55 -0
  18. package/dist/chunk-3SFSPJXM.mjs.map +1 -0
  19. package/dist/chunk-4AJTICKY.mjs +44 -0
  20. package/dist/chunk-4AJTICKY.mjs.map +1 -0
  21. package/dist/chunk-4HKXTAVR.js +14 -0
  22. package/dist/chunk-4HKXTAVR.js.map +1 -0
  23. package/dist/chunk-4NTIGHRE.js +148 -0
  24. package/dist/chunk-4NTIGHRE.js.map +1 -0
  25. package/dist/chunk-4V7NDO5X.mjs +157 -0
  26. package/dist/chunk-4V7NDO5X.mjs.map +1 -0
  27. package/dist/chunk-4WJIXD7U.mjs +14 -0
  28. package/dist/chunk-4WJIXD7U.mjs.map +1 -0
  29. package/dist/chunk-5ZBDQUNG.js +1 -0
  30. package/dist/chunk-5ZBDQUNG.js.map +1 -0
  31. package/dist/chunk-6W2GOMYU.js +22 -0
  32. package/dist/chunk-6W2GOMYU.js.map +1 -0
  33. package/dist/chunk-6Z74KC25.mjs +1 -0
  34. package/dist/chunk-6Z74KC25.mjs.map +1 -0
  35. package/dist/chunk-7SPIOD4K.mjs +66 -0
  36. package/dist/chunk-7SPIOD4K.mjs.map +1 -0
  37. package/dist/chunk-ALMDA3KN.mjs +199 -0
  38. package/dist/chunk-ALMDA3KN.mjs.map +1 -0
  39. package/dist/chunk-BE4HT2U7.mjs +1 -0
  40. package/dist/chunk-BE4HT2U7.mjs.map +1 -0
  41. package/dist/chunk-BTH5QRIT.js +149 -0
  42. package/dist/chunk-BTH5QRIT.js.map +1 -0
  43. package/dist/chunk-BUB4U2GE.js +44 -0
  44. package/dist/chunk-BUB4U2GE.js.map +1 -0
  45. package/dist/chunk-BUTZZ7JB.js +36 -0
  46. package/dist/chunk-BUTZZ7JB.js.map +1 -0
  47. package/dist/chunk-CFHHVHNZ.mjs +157 -0
  48. package/dist/chunk-CFHHVHNZ.mjs.map +1 -0
  49. package/dist/chunk-DD2MVD6A.mjs +36 -0
  50. package/dist/chunk-DD2MVD6A.mjs.map +1 -0
  51. package/dist/chunk-EKXEDMRD.mjs +71 -0
  52. package/dist/chunk-EKXEDMRD.mjs.map +1 -0
  53. package/dist/chunk-GYBEEYGB.mjs +1 -0
  54. package/dist/chunk-GYBEEYGB.mjs.map +1 -0
  55. package/dist/chunk-HELXBZ7D.js +18 -0
  56. package/dist/chunk-HELXBZ7D.js.map +1 -0
  57. package/dist/chunk-IBQK5B7B.js +71 -0
  58. package/dist/chunk-IBQK5B7B.js.map +1 -0
  59. package/dist/chunk-IHZNXV5S.js +1 -0
  60. package/dist/chunk-IHZNXV5S.js.map +1 -0
  61. package/dist/chunk-J2MDWDV6.mjs +1 -0
  62. package/dist/chunk-J2MDWDV6.mjs.map +1 -0
  63. package/dist/chunk-KK4SQ7WF.js +1 -0
  64. package/dist/chunk-KK4SQ7WF.js.map +1 -0
  65. package/dist/chunk-LMXGU2XA.js +50 -0
  66. package/dist/chunk-LMXGU2XA.js.map +1 -0
  67. package/dist/chunk-LWQ5CJC4.mjs +22 -0
  68. package/dist/chunk-LWQ5CJC4.mjs.map +1 -0
  69. package/dist/chunk-MMVER6VO.js +1 -0
  70. package/dist/chunk-MMVER6VO.js.map +1 -0
  71. package/dist/chunk-MVLQR6RI.js +199 -0
  72. package/dist/chunk-MVLQR6RI.js.map +1 -0
  73. package/dist/chunk-NBWATZY4.js +157 -0
  74. package/dist/chunk-NBWATZY4.js.map +1 -0
  75. package/dist/chunk-NSSAF6CV.mjs +348 -0
  76. package/dist/chunk-NSSAF6CV.mjs.map +1 -0
  77. package/dist/chunk-OLVGVQEA.js +24 -0
  78. package/dist/chunk-OLVGVQEA.js.map +1 -0
  79. package/dist/chunk-OTRMAWWU.js +55 -0
  80. package/dist/chunk-OTRMAWWU.js.map +1 -0
  81. package/dist/chunk-Q2Y5CZT4.js +157 -0
  82. package/dist/chunk-Q2Y5CZT4.js.map +1 -0
  83. package/dist/chunk-Q7YPX4RJ.js +66 -0
  84. package/dist/chunk-Q7YPX4RJ.js.map +1 -0
  85. package/dist/chunk-R2M3HW3E.mjs +61 -0
  86. package/dist/chunk-R2M3HW3E.mjs.map +1 -0
  87. package/dist/chunk-R3ZW4OCR.js +61 -0
  88. package/dist/chunk-R3ZW4OCR.js.map +1 -0
  89. package/dist/chunk-R47XMJ32.js +1 -0
  90. package/dist/chunk-R47XMJ32.js.map +1 -0
  91. package/dist/chunk-R5GF6WFB.mjs +148 -0
  92. package/dist/chunk-R5GF6WFB.mjs.map +1 -0
  93. package/dist/chunk-RSCBYS6I.mjs +15 -0
  94. package/dist/chunk-RSCBYS6I.mjs.map +1 -0
  95. package/dist/chunk-TNPZITVL.mjs +1 -0
  96. package/dist/chunk-TNPZITVL.mjs.map +1 -0
  97. package/dist/chunk-U74INGIF.js +17 -0
  98. package/dist/chunk-U74INGIF.js.map +1 -0
  99. package/dist/chunk-V2PIS2OC.mjs +17 -0
  100. package/dist/chunk-V2PIS2OC.mjs.map +1 -0
  101. package/dist/chunk-VCF2YXCO.js +208 -0
  102. package/dist/chunk-VCF2YXCO.js.map +1 -0
  103. package/dist/chunk-XNVZRSGL.js +111 -0
  104. package/dist/chunk-XNVZRSGL.js.map +1 -0
  105. package/dist/chunk-XUGJXLWC.js +8 -0
  106. package/dist/chunk-XUGJXLWC.js.map +1 -0
  107. package/dist/chunk-XXJ7LQ44.js +1 -0
  108. package/dist/chunk-XXJ7LQ44.js.map +1 -0
  109. package/dist/chunk-YAVGI5BZ.mjs +24 -0
  110. package/dist/chunk-YAVGI5BZ.mjs.map +1 -0
  111. package/dist/chunk-Z7Y7COJM.mjs +208 -0
  112. package/dist/chunk-Z7Y7COJM.mjs.map +1 -0
  113. package/dist/components/embed/index.js +16 -1
  114. package/dist/components/embed/index.js.map +1 -0
  115. package/dist/components/embed/index.mjs +16 -1
  116. package/dist/components/embed/index.mjs.map +1 -0
  117. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js +14 -1
  118. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js.map +1 -0
  119. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs +14 -1
  120. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs.map +1 -0
  121. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js +13 -1
  122. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js.map +1 -0
  123. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs +13 -1
  124. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs.map +1 -0
  125. package/dist/components/embed/v3/crypto/PayerConnectionHandler.js +8 -1
  126. package/dist/components/embed/v3/crypto/PayerConnectionHandler.js.map +1 -0
  127. package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs +8 -1
  128. package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs.map +1 -0
  129. package/dist/components/embed/v3/index.js +15 -1
  130. package/dist/components/embed/v3/index.js.map +1 -0
  131. package/dist/components/embed/v3/index.mjs +15 -1
  132. package/dist/components/embed/v3/index.mjs.map +1 -0
  133. package/dist/components/index.js +34 -1
  134. package/dist/components/index.js.map +1 -0
  135. package/dist/components/index.mjs +34 -1
  136. package/dist/components/index.mjs.map +1 -0
  137. package/dist/components/signers/BaseCodeInput.js +9 -1
  138. package/dist/components/signers/BaseCodeInput.js.map +1 -0
  139. package/dist/components/signers/BaseCodeInput.mjs +9 -1
  140. package/dist/components/signers/BaseCodeInput.mjs.map +1 -0
  141. package/dist/components/signers/BaseConfirmation.js +9 -1
  142. package/dist/components/signers/BaseConfirmation.js.map +1 -0
  143. package/dist/components/signers/BaseConfirmation.mjs +9 -1
  144. package/dist/components/signers/BaseConfirmation.mjs.map +1 -0
  145. package/dist/components/signers/EmailSignersDialog.js +11 -1
  146. package/dist/components/signers/EmailSignersDialog.js.map +1 -0
  147. package/dist/components/signers/EmailSignersDialog.mjs +11 -1
  148. package/dist/components/signers/EmailSignersDialog.mjs.map +1 -0
  149. package/dist/components/signers/PhoneSignersDialog.js +11 -1
  150. package/dist/components/signers/PhoneSignersDialog.js.map +1 -0
  151. package/dist/components/signers/PhoneSignersDialog.mjs +11 -1
  152. package/dist/components/signers/PhoneSignersDialog.mjs.map +1 -0
  153. package/dist/components/signers/index.js +16 -1
  154. package/dist/components/signers/index.js.map +1 -0
  155. package/dist/components/signers/index.mjs +16 -1
  156. package/dist/components/signers/index.mjs.map +1 -0
  157. package/dist/components/wallets/ExportPrivateKeyButton.js +8 -1
  158. package/dist/components/wallets/ExportPrivateKeyButton.js.map +1 -0
  159. package/dist/components/wallets/ExportPrivateKeyButton.mjs +8 -1
  160. package/dist/components/wallets/ExportPrivateKeyButton.mjs.map +1 -0
  161. package/dist/components/wallets/index.js +9 -1
  162. package/dist/components/wallets/index.js.map +1 -0
  163. package/dist/components/wallets/index.mjs +9 -1
  164. package/dist/components/wallets/index.mjs.map +1 -0
  165. package/dist/hooks/index.js +26 -1
  166. package/dist/hooks/index.js.map +1 -0
  167. package/dist/hooks/index.mjs +26 -1
  168. package/dist/hooks/index.mjs.map +1 -0
  169. package/dist/hooks/useAuth.js +14 -1
  170. package/dist/hooks/useAuth.js.map +1 -0
  171. package/dist/hooks/useAuth.mjs +14 -1
  172. package/dist/hooks/useAuth.mjs.map +1 -0
  173. package/dist/hooks/useCrossmintCheckout.js +11 -1
  174. package/dist/hooks/useCrossmintCheckout.js.map +1 -0
  175. package/dist/hooks/useCrossmintCheckout.mjs +11 -1
  176. package/dist/hooks/useCrossmintCheckout.mjs.map +1 -0
  177. package/dist/hooks/useWalletEmailSigner.js +8 -1
  178. package/dist/hooks/useWalletEmailSigner.js.map +1 -0
  179. package/dist/hooks/useWalletEmailSigner.mjs +8 -1
  180. package/dist/hooks/useWalletEmailSigner.mjs.map +1 -0
  181. package/dist/index.js +79 -1
  182. package/dist/index.js.map +1 -0
  183. package/dist/index.mjs +79 -1
  184. package/dist/index.mjs.map +1 -0
  185. package/dist/logger/init.js +9 -1
  186. package/dist/logger/init.js.map +1 -0
  187. package/dist/logger/init.mjs +9 -1
  188. package/dist/logger/init.mjs.map +1 -0
  189. package/dist/plugin/mods/addQueryToAndroidManifest.js +8 -1
  190. package/dist/plugin/mods/addQueryToAndroidManifest.js.map +1 -0
  191. package/dist/plugin/mods/addQueryToAndroidManifest.mjs +8 -1
  192. package/dist/plugin/mods/addQueryToAndroidManifest.mjs.map +1 -0
  193. package/dist/plugin/withGooglePay.js +57 -1
  194. package/dist/plugin/withGooglePay.js.map +1 -0
  195. package/dist/plugin/withGooglePay.mjs +57 -1
  196. package/dist/plugin/withGooglePay.mjs.map +1 -0
  197. package/dist/providers/CrossmintAuthProvider.js +14 -1
  198. package/dist/providers/CrossmintAuthProvider.js.map +1 -0
  199. package/dist/providers/CrossmintAuthProvider.mjs +14 -1
  200. package/dist/providers/CrossmintAuthProvider.mjs.map +1 -0
  201. package/dist/providers/CrossmintProvider.js +12 -1
  202. package/dist/providers/CrossmintProvider.js.map +1 -0
  203. package/dist/providers/CrossmintProvider.mjs +12 -1
  204. package/dist/providers/CrossmintProvider.mjs.map +1 -0
  205. package/dist/providers/CrossmintWalletProvider.js +16 -1
  206. package/dist/providers/CrossmintWalletProvider.js.map +1 -0
  207. package/dist/providers/CrossmintWalletProvider.mjs +16 -1
  208. package/dist/providers/CrossmintWalletProvider.mjs.map +1 -0
  209. package/dist/providers/index.js +28 -1
  210. package/dist/providers/index.js.map +1 -0
  211. package/dist/providers/index.mjs +28 -1
  212. package/dist/providers/index.mjs.map +1 -0
  213. package/dist/styles/index.js +8 -1
  214. package/dist/styles/index.js.map +1 -0
  215. package/dist/styles/index.mjs +8 -1
  216. package/dist/styles/index.mjs.map +1 -0
  217. package/dist/styles/theme.js +8 -1
  218. package/dist/styles/theme.js.map +1 -0
  219. package/dist/styles/theme.mjs +8 -1
  220. package/dist/styles/theme.mjs.map +1 -0
  221. package/dist/types/auth.js +1 -1
  222. package/dist/types/auth.js.map +1 -0
  223. package/dist/types/auth.mjs +1 -0
  224. package/dist/types/auth.mjs.map +1 -0
  225. package/dist/utils/SecureStorage.js +8 -1
  226. package/dist/utils/SecureStorage.js.map +1 -0
  227. package/dist/utils/SecureStorage.mjs +8 -1
  228. package/dist/utils/SecureStorage.mjs.map +1 -0
  229. package/dist/utils/createCrossmintApiClient.js +9 -1
  230. package/dist/utils/createCrossmintApiClient.js.map +1 -0
  231. package/dist/utils/createCrossmintApiClient.mjs +9 -1
  232. package/dist/utils/createCrossmintApiClient.mjs.map +1 -0
  233. package/dist/utils/embed/userAgent.js +12 -1
  234. package/dist/utils/embed/userAgent.js.map +1 -0
  235. package/dist/utils/embed/userAgent.mjs +12 -1
  236. package/dist/utils/embed/userAgent.mjs.map +1 -0
  237. package/dist/utils/eventEmitter.js +8 -1
  238. package/dist/utils/eventEmitter.js.map +1 -0
  239. package/dist/utils/eventEmitter.mjs +8 -1
  240. package/dist/utils/eventEmitter.mjs.map +1 -0
  241. package/package.json +5 -5
@@ -0,0 +1,15 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }// src/utils/embed/userAgent.ts
2
+ var _reactnative = require('react-native');
3
+ var _expodevice = require('expo-device'); var Device = _interopRequireWildcard(_expodevice);
4
+ var osVersion2 = Device.osVersion || "0";
5
+ var modelName2 = Device.modelName || "Unknown";
6
+ var userAgent = _reactnative.Platform.OS === "ios" ? `Mozilla/5.0 (iPhone; CPU iPhone OS ${osVersion2.toString().replace(/\./g, "_")} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${Math.floor(
7
+ Number(osVersion2) / 2
8
+ )}.0 Mobile/15E148 Safari/604.1` : `Mozilla/5.0 (Linux; Android ${osVersion2}; ${modelName2}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36`;
9
+
10
+
11
+
12
+
13
+
14
+ exports.osVersion = osVersion2; exports.modelName = modelName2; exports.userAgent = userAgent;
15
+ //# sourceMappingURL=chunk-24MMQ2R4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/embed/userAgent.ts"],"names":["osVersion","modelName"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,YAAY,YAAY;AAEjB,IAAMA,aAAmB,oBAAa;AACtC,IAAMC,aAAmB,oBAAa;AAEtC,IAAM,YACT,SAAS,OAAO,QACV,sCAAsCD,WACjC,SAAS,EACT,QAAQ,OAAO,GAAG,CAAC,oEAAoE,KAAK;AAAA,EAC7F,OAAOA,UAAS,IAAI;AACxB,CAAC,kCACD,+BAA+BA,UAAS,KAAKC,UAAS","sourcesContent":["import { Platform } from \"react-native\";\nimport * as Device from \"expo-device\";\n\nexport const osVersion = Device.osVersion || \"0\";\nexport const modelName = Device.modelName || \"Unknown\";\n\nexport const userAgent =\n Platform.OS === \"ios\"\n ? `Mozilla/5.0 (iPhone; CPU iPhone OS ${osVersion\n .toString()\n .replace(/\\./g, \"_\")} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${Math.floor(\n Number(osVersion) / 2\n )}.0 Mobile/15E148 Safari/604.1`\n : `Mozilla/5.0 (Linux; Android ${osVersion}; ${modelName}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36`;\n"]}
@@ -0,0 +1,8 @@
1
+ // src/utils/eventEmitter.ts
2
+ import mitt from "mitt";
3
+ var localEventEmitter = mitt();
4
+
5
+ export {
6
+ localEventEmitter
7
+ };
8
+ //# sourceMappingURL=chunk-2DNOAXOE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/eventEmitter.ts"],"sourcesContent":["import type { Order } from \"@crossmint/client-sdk-base\";\nimport mitt from \"mitt\";\n\nexport type LocalEventEmitterEvents = {\n \"order:updated\": {\n order?: Order;\n orderClientSecret?: string;\n };\n \"order:creation-failed\": {\n errorMessage: string;\n };\n};\n\n// Create a singleton instance for global use\nexport const localEventEmitter = mitt<LocalEventEmitterEvents>();\n"],"mappings":";AACA,OAAO,UAAU;AAaV,IAAM,oBAAoB,KAA8B;","names":[]}
@@ -0,0 +1,149 @@
1
+ import {
2
+ theme
3
+ } from "./chunk-3AWDWMZ2.mjs";
4
+ import {
5
+ __async
6
+ } from "./chunk-7SPIOD4K.mjs";
7
+
8
+ // src/components/signers/BaseConfirmation.tsx
9
+ import { useState } from "react";
10
+ import { View, Text, TouchableOpacity, StyleSheet, ActivityIndicator } from "react-native";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ function BaseConfirmation({
13
+ contactInfo,
14
+ contactType,
15
+ icon,
16
+ onConfirm,
17
+ onCancel,
18
+ appearance
19
+ }) {
20
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
21
+ const [isLoading, setIsLoading] = useState(false);
22
+ const [error, setError] = useState(null);
23
+ const handleConfirm = () => __async(this, null, function* () {
24
+ setIsLoading(true);
25
+ setError(null);
26
+ try {
27
+ yield onConfirm();
28
+ } catch (error2) {
29
+ console.error(`Failed to send ${contactType} code`, error2);
30
+ setError(`Failed to send ${contactType === "email" ? "email" : "SMS"}. Please try again.`);
31
+ } finally {
32
+ setIsLoading(false);
33
+ }
34
+ });
35
+ const dynamicStyles = StyleSheet.create({
36
+ container: {
37
+ width: "100%"
38
+ },
39
+ title: {
40
+ fontSize: 24,
41
+ fontWeight: "600",
42
+ color: ((_a = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _a.textPrimary) || theme["cm-text-primary"],
43
+ textAlign: "center",
44
+ marginBottom: 8
45
+ },
46
+ description: {
47
+ fontSize: 16,
48
+ color: ((_b = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _b.textSecondary) || theme["cm-text-secondary"],
49
+ textAlign: "center",
50
+ marginBottom: 24,
51
+ lineHeight: 22
52
+ },
53
+ contactContainer: {
54
+ borderWidth: 1,
55
+ borderColor: ((_c = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _c.border) || theme["cm-border"],
56
+ borderRadius: (appearance == null ? void 0 : appearance.borderRadius) || 12,
57
+ padding: 16,
58
+ marginBottom: 24,
59
+ flexDirection: "row",
60
+ alignItems: "center"
61
+ },
62
+ contactText: {
63
+ fontSize: 16,
64
+ color: ((_d = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _d.textPrimary) || theme["cm-text-primary"],
65
+ marginLeft: 12,
66
+ flex: 1
67
+ },
68
+ errorText: {
69
+ fontSize: 14,
70
+ color: ((_e = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _e.danger) || theme["cm-danger"],
71
+ textAlign: "center",
72
+ marginBottom: 16
73
+ },
74
+ buttonContainer: {
75
+ flexDirection: "row",
76
+ gap: 12
77
+ },
78
+ button: {
79
+ flex: 1,
80
+ paddingVertical: 16,
81
+ paddingHorizontal: 24,
82
+ borderRadius: 999,
83
+ alignItems: "center",
84
+ justifyContent: "center",
85
+ minHeight: 52
86
+ },
87
+ primaryButton: {
88
+ backgroundColor: ((_f = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _f.accent) || theme["cm-accent"]
89
+ },
90
+ secondaryButton: {
91
+ backgroundColor: "transparent",
92
+ borderWidth: 1,
93
+ borderColor: ((_g = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _g.border) || theme["cm-border"]
94
+ },
95
+ disabledButton: {
96
+ opacity: 0.6
97
+ },
98
+ buttonText: {
99
+ fontSize: 16,
100
+ fontWeight: "500",
101
+ color: ((_h = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _h.background) || theme["cm-background-primary"]
102
+ },
103
+ secondaryButtonText: {
104
+ color: ((_i = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _i.textPrimary) || theme["cm-text-primary"]
105
+ }
106
+ });
107
+ return /* @__PURE__ */ jsxs(View, { style: dynamicStyles.container, children: [
108
+ /* @__PURE__ */ jsx(Text, { style: dynamicStyles.title, children: "Confirm it's you" }),
109
+ /* @__PURE__ */ jsxs(Text, { style: dynamicStyles.description, children: [
110
+ "You're using this wallet for the first time on this device. Click 'Send code' to get a one-time verification code",
111
+ contactType === "phone" ? " via SMS" : "",
112
+ "."
113
+ ] }),
114
+ /* @__PURE__ */ jsxs(View, { style: dynamicStyles.contactContainer, children: [
115
+ icon,
116
+ /* @__PURE__ */ jsx(Text, { style: dynamicStyles.contactText, children: contactInfo })
117
+ ] }),
118
+ error && /* @__PURE__ */ jsx(Text, { style: dynamicStyles.errorText, children: error }),
119
+ /* @__PURE__ */ jsxs(View, { style: dynamicStyles.buttonContainer, children: [
120
+ /* @__PURE__ */ jsx(
121
+ TouchableOpacity,
122
+ {
123
+ style: [dynamicStyles.button, dynamicStyles.secondaryButton],
124
+ onPress: onCancel,
125
+ disabled: isLoading,
126
+ children: /* @__PURE__ */ jsx(Text, { style: [dynamicStyles.buttonText, dynamicStyles.secondaryButtonText], children: "Cancel" })
127
+ }
128
+ ),
129
+ /* @__PURE__ */ jsx(
130
+ TouchableOpacity,
131
+ {
132
+ style: [
133
+ dynamicStyles.button,
134
+ dynamicStyles.primaryButton,
135
+ isLoading && dynamicStyles.disabledButton
136
+ ],
137
+ onPress: handleConfirm,
138
+ disabled: isLoading,
139
+ children: isLoading ? /* @__PURE__ */ jsx(ActivityIndicator, { color: ((_j = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _j.background) || theme["cm-background-primary"] }) : /* @__PURE__ */ jsx(Text, { style: dynamicStyles.buttonText, children: "Send code" })
140
+ }
141
+ )
142
+ ] })
143
+ ] });
144
+ }
145
+
146
+ export {
147
+ BaseConfirmation
148
+ };
149
+ //# sourceMappingURL=chunk-2TEAOLM6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/signers/BaseConfirmation.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { View, Text, TouchableOpacity, StyleSheet, ActivityIndicator } from \"react-native\";\nimport type { UIConfig } from \"@crossmint/common-sdk-base\";\nimport { theme } from \"../../styles/theme\";\n\ninterface BaseConfirmationProps {\n contactInfo: string;\n contactType: \"email\" | \"phone\";\n icon: ReactNode;\n onConfirm: () => Promise<void>;\n onCancel?: () => void;\n appearance?: UIConfig;\n}\n\nexport function BaseConfirmation({\n contactInfo,\n contactType,\n icon,\n onConfirm,\n onCancel,\n appearance,\n}: BaseConfirmationProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleConfirm = async () => {\n setIsLoading(true);\n setError(null);\n try {\n await onConfirm();\n } catch (error) {\n console.error(`Failed to send ${contactType} code`, error);\n setError(`Failed to send ${contactType === \"email\" ? \"email\" : \"SMS\"}. Please try again.`);\n } finally {\n setIsLoading(false);\n }\n };\n\n const dynamicStyles = StyleSheet.create({\n container: {\n width: \"100%\",\n },\n title: {\n fontSize: 24,\n fontWeight: \"600\",\n color: appearance?.colors?.textPrimary || theme[\"cm-text-primary\"],\n textAlign: \"center\",\n marginBottom: 8,\n },\n description: {\n fontSize: 16,\n color: appearance?.colors?.textSecondary || theme[\"cm-text-secondary\"],\n textAlign: \"center\",\n marginBottom: 24,\n lineHeight: 22,\n },\n contactContainer: {\n borderWidth: 1,\n borderColor: appearance?.colors?.border || theme[\"cm-border\"],\n borderRadius: appearance?.borderRadius || 12,\n padding: 16,\n marginBottom: 24,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n contactText: {\n fontSize: 16,\n color: appearance?.colors?.textPrimary || theme[\"cm-text-primary\"],\n marginLeft: 12,\n flex: 1,\n },\n errorText: {\n fontSize: 14,\n color: appearance?.colors?.danger || theme[\"cm-danger\"],\n textAlign: \"center\",\n marginBottom: 16,\n },\n buttonContainer: {\n flexDirection: \"row\",\n gap: 12,\n },\n button: {\n flex: 1,\n paddingVertical: 16,\n paddingHorizontal: 24,\n borderRadius: 999,\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: 52,\n },\n primaryButton: {\n backgroundColor: appearance?.colors?.accent || theme[\"cm-accent\"],\n },\n secondaryButton: {\n backgroundColor: \"transparent\",\n borderWidth: 1,\n borderColor: appearance?.colors?.border || theme[\"cm-border\"],\n },\n disabledButton: {\n opacity: 0.6,\n },\n buttonText: {\n fontSize: 16,\n fontWeight: \"500\",\n color: appearance?.colors?.background || theme[\"cm-background-primary\"],\n },\n secondaryButtonText: {\n color: appearance?.colors?.textPrimary || theme[\"cm-text-primary\"],\n },\n });\n\n return (\n <View style={dynamicStyles.container}>\n <Text style={dynamicStyles.title}>Confirm it's you</Text>\n <Text style={dynamicStyles.description}>\n You're using this wallet for the first time on this device. Click 'Send code' to get a one-time\n verification code{contactType === \"phone\" ? \" via SMS\" : \"\"}.\n </Text>\n\n <View style={dynamicStyles.contactContainer}>\n {icon}\n <Text style={dynamicStyles.contactText}>{contactInfo}</Text>\n </View>\n\n {error && <Text style={dynamicStyles.errorText}>{error}</Text>}\n\n <View style={dynamicStyles.buttonContainer}>\n <TouchableOpacity\n style={[dynamicStyles.button, dynamicStyles.secondaryButton]}\n onPress={onCancel}\n disabled={isLoading}\n >\n <Text style={[dynamicStyles.buttonText, dynamicStyles.secondaryButtonText]}>Cancel</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={[\n dynamicStyles.button,\n dynamicStyles.primaryButton,\n isLoading && dynamicStyles.disabledButton,\n ]}\n onPress={handleConfirm}\n disabled={isLoading}\n >\n {isLoading ? (\n <ActivityIndicator color={appearance?.colors?.background || theme[\"cm-background-primary\"]} />\n ) : (\n <Text style={dynamicStyles.buttonText}>Send code</Text>\n )}\n </TouchableOpacity>\n </View>\n </View>\n );\n}\n"],"mappings":"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","names":["error"]}
@@ -0,0 +1,50 @@
1
+ import {
2
+ package_default
3
+ } from "./chunk-R2M3HW3E.mjs";
4
+
5
+ // src/logger/init.ts
6
+ import { SdkLogger, ReactNativeDatadogSink, validateAPIKey } from "@crossmint/common-sdk-base";
7
+ import { AppState } from "react-native";
8
+ import Constants from "expo-constants";
9
+ import * as Device from "expo-device";
10
+ function initReactNativeLogger(apiKey, consoleLogLevel) {
11
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
12
+ const validationResult = validateAPIKey(apiKey);
13
+ if (!validationResult.isValid) {
14
+ throw new Error(`Invalid API key: ${validationResult.message}`);
15
+ }
16
+ const { environment, projectId } = validationResult;
17
+ const logger = new SdkLogger({
18
+ packageName: package_default.name,
19
+ packageVersion: package_default.version,
20
+ environment,
21
+ projectId,
22
+ platform: "react-native",
23
+ consoleLogLevel
24
+ });
25
+ const bundleId = (_f = (_e = (_b = (_a = Constants.expoConfig) == null ? void 0 : _a.ios) == null ? void 0 : _b.bundleIdentifier) != null ? _e : (_d = (_c = Constants.expoConfig) == null ? void 0 : _c.android) == null ? void 0 : _d.package) != null ? _f : void 0;
26
+ const agentInfo = {};
27
+ if (Device != null) {
28
+ agentInfo.device = (_i = (_h = (_g = Device.modelName) != null ? _g : Device.deviceName) != null ? _h : Device.brand) != null ? _i : void 0;
29
+ agentInfo.os_version = (_j = Device.osVersion) != null ? _j : void 0;
30
+ agentInfo.os_name = (_k = Device.osName) != null ? _k : void 0;
31
+ }
32
+ const sink = new ReactNativeDatadogSink(environment, bundleId, agentInfo);
33
+ logger.addSink(sink);
34
+ setupReactNativeFlushListeners(logger);
35
+ return logger;
36
+ }
37
+ function setupReactNativeFlushListeners(logger) {
38
+ AppState.addEventListener("change", (nextAppState) => {
39
+ if (nextAppState === "background" || nextAppState === "inactive") {
40
+ if (typeof logger.flush === "function") {
41
+ void logger.flush();
42
+ }
43
+ }
44
+ });
45
+ }
46
+
47
+ export {
48
+ initReactNativeLogger
49
+ };
50
+ //# sourceMappingURL=chunk-2YRJHM46.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger/init.ts"],"sourcesContent":["import { SdkLogger, ReactNativeDatadogSink, validateAPIKey, type ConsoleLogLevel } from \"@crossmint/common-sdk-base\";\nimport { AppState } from \"react-native\";\nimport Constants from \"expo-constants\";\nimport * as Device from \"expo-device\";\nimport packageJson from \"../../package.json\";\n\n/**\n * Initialize the SDK logger for the React Native UI SDK\n * Should be called once when the SDK is initialized (typically in CrossmintProvider)\n * This handles React Native-specific Datadog sink initialization\n *\n * @param apiKey - API key to determine environment (development/staging/production) and project ID\n * @param consoleLogLevel - Minimum log level for console output (or \"silent\" to suppress all output). Defaults to \"debug\" for backward compatibility\n * @returns The initialized logger instance\n */\nexport function initReactNativeLogger(apiKey: string, consoleLogLevel?: ConsoleLogLevel): SdkLogger {\n const validationResult = validateAPIKey(apiKey);\n if (!validationResult.isValid) {\n throw new Error(`Invalid API key: ${validationResult.message}`);\n }\n const { environment, projectId } = validationResult;\n const logger = new SdkLogger({\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n environment,\n projectId,\n platform: \"react-native\",\n consoleLogLevel,\n });\n\n // Get app bundle ID to use as service name in Datadog logs\n const bundleId: string | undefined =\n Constants.expoConfig?.ios?.bundleIdentifier ?? Constants.expoConfig?.android?.package ?? undefined;\n\n // Collect device and OS information for agent info\n const agentInfo: Record<string, string | undefined> = {};\n if (Device != null) {\n agentInfo.device = Device.modelName ?? Device.deviceName ?? Device.brand ?? undefined;\n agentInfo.os_version = Device.osVersion ?? undefined;\n agentInfo.os_name = Device.osName ?? undefined;\n }\n\n // Create HTTP-based Datadog sink that sends logs directly via telemetry proxy\n // This bypasses the Datadog React Native SDK entirely, ensuring isolation\n // Service name is set to the app bundle ID for better log identification\n const sink = new ReactNativeDatadogSink(environment, bundleId, agentInfo);\n logger.addSink(sink);\n\n // Set up app state change listener to flush logs when app goes to background\n // This ensures logs are sent before the app is closed or backgrounded\n setupReactNativeFlushListeners(logger);\n\n return logger;\n}\n\n/**\n * Set up React Native app state change listeners to flush logs when app goes to background\n */\nfunction setupReactNativeFlushListeners(logger: SdkLogger): void {\n AppState.addEventListener(\"change\", (nextAppState) => {\n // Flush logs when app goes to background or inactive\n if (nextAppState === \"background\" || nextAppState === \"inactive\") {\n if (typeof logger.flush === \"function\") {\n void logger.flush();\n }\n }\n });\n}\n"],"mappings":";;;;;AAAA,SAAS,WAAW,wBAAwB,sBAA4C;AACxF,SAAS,gBAAgB;AACzB,OAAO,eAAe;AACtB,YAAY,YAAY;AAYjB,SAAS,sBAAsB,QAAgB,iBAA8C;AAfpG;AAgBI,QAAM,mBAAmB,eAAe,MAAM;AAC9C,MAAI,CAAC,iBAAiB,SAAS;AAC3B,UAAM,IAAI,MAAM,oBAAoB,iBAAiB,OAAO,EAAE;AAAA,EAClE;AACA,QAAM,EAAE,aAAa,UAAU,IAAI;AACnC,QAAM,SAAS,IAAI,UAAU;AAAA,IACzB,aAAa,gBAAY;AAAA,IACzB,gBAAgB,gBAAY;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACJ,CAAC;AAGD,QAAM,YACF,iCAAU,eAAV,mBAAsB,QAAtB,mBAA2B,qBAA3B,aAA+C,qBAAU,eAAV,mBAAsB,YAAtB,mBAA+B,YAA9E,YAAyF;AAG7F,QAAM,YAAgD,CAAC;AACvD,MAAI,UAAU,MAAM;AAChB,cAAU,UAAS,iBAAO,qBAAP,YAA2B,sBAA3B,YAAgD,iBAAhD,YAAyD;AAC5E,cAAU,cAAa,KAAO,qBAAP,YAAoB;AAC3C,cAAU,WAAU,KAAO,kBAAP,YAAiB;AAAA,EACzC;AAKA,QAAM,OAAO,IAAI,uBAAuB,aAAa,UAAU,SAAS;AACxE,SAAO,QAAQ,IAAI;AAInB,iCAA+B,MAAM;AAErC,SAAO;AACX;AAKA,SAAS,+BAA+B,QAAyB;AAC7D,WAAS,iBAAiB,UAAU,CAAC,iBAAiB;AAElD,QAAI,iBAAiB,gBAAgB,iBAAiB,YAAY;AAC9D,UAAI,OAAO,OAAO,UAAU,YAAY;AACpC,aAAK,OAAO,MAAM;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;","names":[]}
@@ -0,0 +1,111 @@
1
+ import {
2
+ __async
3
+ } from "./chunk-7SPIOD4K.mjs";
4
+
5
+ // src/components/wallets/ExportPrivateKeyButton.tsx
6
+ import { useState, useCallback, useRef, useEffect } from "react";
7
+ import { View, Text, StyleSheet, Alert } from "react-native";
8
+ import { useWallet, useCrossmint } from "@crossmint/client-sdk-react-base";
9
+ import { environmentUrlConfig, exportSignerInboundEvents, exportSignerOutboundEvents } from "@crossmint/client-signers";
10
+ import { isExportableSigner } from "@crossmint/wallets-sdk";
11
+ import { validateAPIKey } from "@crossmint/common-sdk-base";
12
+ import { WebViewParent, RNWebView } from "@crossmint/client-sdk-rn-window";
13
+ import { jsx } from "react/jsx-runtime";
14
+ function ExportPrivateKeyButton({ appearance }) {
15
+ const { wallet } = useWallet();
16
+ const { crossmint } = useCrossmint();
17
+ const webViewRef = useRef(null);
18
+ const connectionRef = useRef(null);
19
+ const [frameUrl, setFrameUrl] = useState("");
20
+ useEffect(() => {
21
+ if (crossmint != null) {
22
+ try {
23
+ const parsedAPIKey = validateAPIKey(crossmint.apiKey);
24
+ if (parsedAPIKey.isValid) {
25
+ const baseUrl = environmentUrlConfig[parsedAPIKey.environment];
26
+ setFrameUrl(`${baseUrl}/export`);
27
+ }
28
+ } catch (error) {
29
+ console.error("Failed to get TEE URL:", error);
30
+ }
31
+ }
32
+ }, [crossmint]);
33
+ const handleWebViewLoadEnd = useCallback(
34
+ (syntheticEvent) => __async(this, null, function* () {
35
+ if (wallet == null || webViewRef.current == null || syntheticEvent.nativeEvent.loading) {
36
+ return;
37
+ }
38
+ try {
39
+ if (isExportableSigner(wallet.signer)) {
40
+ const connection = new WebViewParent(webViewRef, {
41
+ incomingEvents: exportSignerOutboundEvents,
42
+ outgoingEvents: exportSignerInboundEvents
43
+ });
44
+ connectionRef.current = connection;
45
+ yield connection.handshakeWithChild();
46
+ yield wallet.signer._exportPrivateKey(connection);
47
+ }
48
+ } catch (error) {
49
+ console.error("Failed to export private key:", error);
50
+ Alert.alert("Export Failed", "Failed to export private key. Please try again.");
51
+ }
52
+ }),
53
+ [wallet]
54
+ );
55
+ const handleWebViewError = useCallback((syntheticEvent) => {
56
+ const { nativeEvent } = syntheticEvent;
57
+ console.error("WebView error:", nativeEvent);
58
+ Alert.alert("Export Failed", "Failed to load export interface. Please try again.");
59
+ }, []);
60
+ const handleMessage = useCallback((event) => {
61
+ if (connectionRef.current) {
62
+ connectionRef.current.handleMessage(event);
63
+ }
64
+ }, []);
65
+ if (frameUrl === "" || wallet == null || !isExportableSigner(wallet.signer)) {
66
+ return null;
67
+ }
68
+ return /* @__PURE__ */ jsx(View, { style: styles.webViewContainer, children: /* @__PURE__ */ jsx(
69
+ RNWebView,
70
+ {
71
+ ref: webViewRef,
72
+ source: { uri: frameUrl },
73
+ style: styles.webView,
74
+ javaScriptEnabled: true,
75
+ domStorageEnabled: true,
76
+ onLoadEnd: handleWebViewLoadEnd,
77
+ onError: handleWebViewError,
78
+ onHttpError: handleWebViewError,
79
+ onMessage: handleMessage,
80
+ startInLoadingState: true,
81
+ renderLoading: () => /* @__PURE__ */ jsx(View, { style: styles.loadingContainer, children: /* @__PURE__ */ jsx(Text, { style: styles.loadingText, children: "Loading..." }) })
82
+ }
83
+ ) });
84
+ }
85
+ var styles = StyleSheet.create({
86
+ webViewContainer: {
87
+ height: 56,
88
+ borderWidth: 1,
89
+ borderColor: "#E5E5E5",
90
+ borderRadius: 12,
91
+ overflow: "hidden"
92
+ },
93
+ webView: {
94
+ flex: 1
95
+ },
96
+ loadingContainer: {
97
+ flex: 1,
98
+ justifyContent: "center",
99
+ alignItems: "center",
100
+ backgroundColor: "#F5F5F5"
101
+ },
102
+ loadingText: {
103
+ fontSize: 16,
104
+ color: "#666666"
105
+ }
106
+ });
107
+
108
+ export {
109
+ ExportPrivateKeyButton
110
+ };
111
+ //# sourceMappingURL=chunk-34OVOZB2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/wallets/ExportPrivateKeyButton.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { View, Text, StyleSheet, Alert } from \"react-native\";\nimport type { WebView, WebViewMessageEvent } from \"react-native-webview\";\nimport { useWallet, useCrossmint } from \"@crossmint/client-sdk-react-base\";\nimport { environmentUrlConfig, exportSignerInboundEvents, exportSignerOutboundEvents } from \"@crossmint/client-signers\";\nimport { isExportableSigner } from \"@crossmint/wallets-sdk\";\nimport { validateAPIKey } from \"@crossmint/common-sdk-base\";\nimport type { UIConfig } from \"@crossmint/common-sdk-base\";\nimport { WebViewParent, RNWebView } from \"@crossmint/client-sdk-rn-window\";\n\nexport interface ExportPrivateKeyButtonProps {\n /** Optional appearance configuration for styling the export button. */\n appearance?: UIConfig;\n}\n\n/**\n * Renders a button that allows the user to export their wallet's private key.\n * Only works with email and phone signers. Will not render for passkey or external wallet signers.\n */\nexport function ExportPrivateKeyButton({ appearance }: ExportPrivateKeyButtonProps) {\n const { wallet } = useWallet();\n const { crossmint } = useCrossmint();\n const webViewRef = useRef<WebView>(null);\n const connectionRef = useRef<WebViewParent<\n typeof exportSignerOutboundEvents,\n typeof exportSignerInboundEvents\n > | null>(null);\n const [frameUrl, setFrameUrl] = useState<string>(\"\");\n\n useEffect(() => {\n if (crossmint != null) {\n try {\n const parsedAPIKey = validateAPIKey(crossmint.apiKey);\n if (parsedAPIKey.isValid) {\n const baseUrl = environmentUrlConfig[parsedAPIKey.environment];\n setFrameUrl(`${baseUrl}/export`);\n }\n } catch (error) {\n console.error(\"Failed to get TEE URL:\", error);\n }\n }\n }, [crossmint]);\n\n const handleWebViewLoadEnd = useCallback(\n async (syntheticEvent: { nativeEvent: { loading: boolean } }) => {\n if (wallet == null || webViewRef.current == null || syntheticEvent.nativeEvent.loading) {\n return;\n }\n\n try {\n if (isExportableSigner(wallet.signer)) {\n const connection = new WebViewParent(webViewRef, {\n incomingEvents: exportSignerOutboundEvents,\n outgoingEvents: exportSignerInboundEvents,\n });\n connectionRef.current = connection;\n await connection.handshakeWithChild();\n await wallet.signer._exportPrivateKey(connection);\n }\n } catch (error) {\n console.error(\"Failed to export private key:\", error);\n Alert.alert(\"Export Failed\", \"Failed to export private key. Please try again.\");\n }\n },\n [wallet]\n );\n\n const handleWebViewError = useCallback((syntheticEvent: { nativeEvent: unknown }) => {\n const { nativeEvent } = syntheticEvent;\n console.error(\"WebView error:\", nativeEvent);\n Alert.alert(\"Export Failed\", \"Failed to load export interface. Please try again.\");\n }, []);\n\n const handleMessage = useCallback((event: WebViewMessageEvent) => {\n if (connectionRef.current) {\n connectionRef.current.handleMessage(event);\n }\n }, []);\n\n if (frameUrl === \"\" || wallet == null || !isExportableSigner(wallet.signer)) {\n return null;\n }\n\n return (\n <View style={styles.webViewContainer}>\n <RNWebView\n ref={webViewRef}\n source={{ uri: frameUrl }}\n style={styles.webView}\n javaScriptEnabled={true}\n domStorageEnabled={true}\n onLoadEnd={handleWebViewLoadEnd}\n onError={handleWebViewError}\n onHttpError={handleWebViewError}\n onMessage={handleMessage}\n startInLoadingState={true}\n renderLoading={() => (\n <View style={styles.loadingContainer}>\n <Text style={styles.loadingText}>Loading...</Text>\n </View>\n )}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n webViewContainer: {\n height: 56,\n borderWidth: 1,\n borderColor: \"#E5E5E5\",\n borderRadius: 12,\n overflow: \"hidden\",\n },\n webView: {\n flex: 1,\n },\n loadingContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n backgroundColor: \"#F5F5F5\",\n },\n loadingText: {\n fontSize: 16,\n color: \"#666666\",\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,18 @@
1
+ // src/styles/theme.ts
2
+ var theme = {
3
+ "cm-text-primary": "#00150D",
4
+ "cm-text-secondary": "#67797F",
5
+ "cm-background-primary": "#FFFFFF",
6
+ "cm-muted-primary": "#F0F2F4",
7
+ "cm-hover": "#E9ECF0",
8
+ "cm-border": "#D9D9D9",
9
+ "cm-link": "#1A74E9",
10
+ "cm-accent": "#4CAF50",
11
+ // old 04AA6D
12
+ "cm-danger": "#f44336"
13
+ };
14
+
15
+ export {
16
+ theme
17
+ };
18
+ //# sourceMappingURL=chunk-3AWDWMZ2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/theme.ts"],"sourcesContent":["export const theme = {\n \"cm-text-primary\": \"#00150D\",\n \"cm-text-secondary\": \"#67797F\",\n \"cm-background-primary\": \"#FFFFFF\",\n \"cm-muted-primary\": \"#F0F2F4\",\n \"cm-hover\": \"#E9ECF0\",\n \"cm-border\": \"#D9D9D9\",\n \"cm-link\": \"#1A74E9\",\n \"cm-accent\": \"#4CAF50\", // old 04AA6D\n \"cm-danger\": \"#f44336\",\n} as const;\n"],"mappings":";AAAO,IAAM,QAAQ;AAAA,EACjB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA;AAAA,EACb,aAAa;AACjB;","names":[]}