@teamvortexsoftware/vortex-react-native 1.0.0 → 1.0.1

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 (217) hide show
  1. package/dist/InviteFormCore-D4HkMMo0.d.mts +721 -0
  2. package/dist/InviteFormCore-D9oUCbu7.d.ts +721 -0
  3. package/dist/VortexClient.js +192 -0
  4. package/dist/VortexClient.js.map +1 -0
  5. package/dist/VortexDeferredLinks.js +127 -0
  6. package/dist/VortexDeferredLinks.js.map +1 -0
  7. package/dist/clientInfo.js +45 -0
  8. package/dist/clientInfo.js.map +1 -0
  9. package/dist/components/ContactsPickerModal.js +182 -0
  10. package/dist/components/ContactsPickerModal.js.map +1 -0
  11. package/dist/components/InviteFormCore.js +2141 -0
  12. package/dist/components/InviteFormCore.js.map +1 -0
  13. package/dist/components/InviteFormMobile.js +463 -0
  14. package/dist/components/InviteFormMobile.js.map +1 -0
  15. package/dist/components/InviteFormWeb.js +295 -0
  16. package/dist/components/InviteFormWeb.js.map +1 -0
  17. package/dist/components/PlacedItemToolbar.js +147 -0
  18. package/dist/components/PlacedItemToolbar.js.map +1 -0
  19. package/dist/components/ShareButtons.js +181 -0
  20. package/dist/components/ShareButtons.js.map +1 -0
  21. package/dist/components/VrtxContactsImport.js +234 -0
  22. package/dist/components/VrtxContactsImport.js.map +1 -0
  23. package/dist/components/VrtxEmailInvitations.js +341 -0
  24. package/dist/components/VrtxEmailInvitations.js.map +1 -0
  25. package/dist/components/VrtxFindFriends.js +400 -0
  26. package/dist/components/VrtxFindFriends.js.map +1 -0
  27. package/dist/components/VrtxHeading.js +58 -0
  28. package/dist/components/VrtxHeading.js.map +1 -0
  29. package/dist/components/VrtxIncomingInvitations.js +657 -0
  30. package/dist/components/VrtxIncomingInvitations.js.map +1 -0
  31. package/dist/components/VrtxInvitationSuggestions.js +506 -0
  32. package/dist/components/VrtxInvitationSuggestions.js.map +1 -0
  33. package/dist/components/VrtxInviteContacts.js +512 -0
  34. package/dist/components/VrtxInviteContacts.js.map +1 -0
  35. package/dist/components/VrtxOutgoingInvitations.js +572 -0
  36. package/dist/components/VrtxOutgoingInvitations.js.map +1 -0
  37. package/dist/components/VrtxSearchBox.js +487 -0
  38. package/dist/components/VrtxSearchBox.js.map +1 -0
  39. package/dist/components/VrtxSelect.js +27 -0
  40. package/dist/components/VrtxSelect.js.map +1 -0
  41. package/dist/components/VrtxShareOptions.js +435 -0
  42. package/dist/components/VrtxShareOptions.js.map +1 -0
  43. package/dist/components/VrtxSubmit.js +132 -0
  44. package/dist/components/VrtxSubmit.js.map +1 -0
  45. package/dist/components/VrtxText.js +146 -0
  46. package/dist/components/VrtxText.js.map +1 -0
  47. package/dist/constants/mockData.d.mts +7 -0
  48. package/dist/constants/mockData.d.ts +7 -0
  49. package/dist/constants/mockData.js +48 -0
  50. package/dist/constants/mockData.js.map +1 -0
  51. package/dist/constants/mockData.mjs +22 -0
  52. package/dist/constants/mockData.mjs.map +1 -0
  53. package/dist/context/VortexModulesContext.js +135 -0
  54. package/dist/context/VortexModulesContext.js.map +1 -0
  55. package/dist/hooks/useInvitationFormLogic.d.mts +2 -0
  56. package/dist/hooks/useInvitationFormLogic.d.ts +2 -0
  57. package/dist/hooks/useInvitationFormLogic.js +300 -0
  58. package/dist/hooks/useInvitationFormLogic.js.map +1 -0
  59. package/dist/hooks/useInvitationFormLogic.mjs +276 -0
  60. package/dist/hooks/useInvitationFormLogic.mjs.map +1 -0
  61. package/dist/hooks/usePrefetchWidgetConfiguration.js +117 -0
  62. package/dist/hooks/usePrefetchWidgetConfiguration.js.map +1 -0
  63. package/dist/hooks/useThemeStyles.js +41 -0
  64. package/dist/hooks/useThemeStyles.js.map +1 -0
  65. package/dist/hooks/useVortexInvite.js +732 -0
  66. package/dist/hooks/useVortexInvite.js.map +1 -0
  67. package/dist/index-web.d.mts +93 -0
  68. package/dist/index-web.d.ts +93 -0
  69. package/dist/index-web.js +7397 -0
  70. package/dist/index-web.js.map +1 -0
  71. package/dist/index-web.mjs +7445 -0
  72. package/dist/index-web.mjs.map +1 -0
  73. package/dist/index.d.mts +656 -0
  74. package/dist/index.d.ts +656 -0
  75. package/dist/index.js +10206 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/index.mjs +10244 -0
  78. package/dist/index.mjs.map +1 -0
  79. package/dist/types/VortexClient.d.ts +106 -0
  80. package/dist/types/VortexClient.d.ts.map +1 -0
  81. package/dist/types/VortexDeferredLinks.d.ts +73 -0
  82. package/dist/types/VortexDeferredLinks.d.ts.map +1 -0
  83. package/dist/types/clientInfo.d.ts +5 -0
  84. package/dist/types/clientInfo.d.ts.map +1 -0
  85. package/dist/types/components/ContactsPickerModal.d.ts +18 -0
  86. package/dist/types/components/ContactsPickerModal.d.ts.map +1 -0
  87. package/dist/types/components/InviteFormCore.d.ts +166 -0
  88. package/dist/types/components/InviteFormCore.d.ts.map +1 -0
  89. package/dist/types/components/InviteFormMobile.d.ts +42 -0
  90. package/dist/types/components/InviteFormMobile.d.ts.map +1 -0
  91. package/dist/types/components/InviteFormWeb.d.ts +87 -0
  92. package/dist/types/components/InviteFormWeb.d.ts.map +1 -0
  93. package/dist/types/components/PlacedItemToolbar.d.ts +16 -0
  94. package/dist/types/components/PlacedItemToolbar.d.ts.map +1 -0
  95. package/dist/types/components/ShareButtons.d.ts +29 -0
  96. package/dist/types/components/ShareButtons.d.ts.map +1 -0
  97. package/dist/types/components/VrtxContactsImport.d.ts +14 -0
  98. package/dist/types/components/VrtxContactsImport.d.ts.map +1 -0
  99. package/dist/types/components/VrtxEmailInvitations.d.ts +31 -0
  100. package/dist/types/components/VrtxEmailInvitations.d.ts.map +1 -0
  101. package/dist/types/components/VrtxFindFriends.d.ts +25 -0
  102. package/dist/types/components/VrtxFindFriends.d.ts.map +1 -0
  103. package/dist/types/components/VrtxHeading.d.ts +6 -0
  104. package/dist/types/components/VrtxHeading.d.ts.map +1 -0
  105. package/dist/types/components/VrtxIncomingInvitations.d.ts +27 -0
  106. package/dist/types/components/VrtxIncomingInvitations.d.ts.map +1 -0
  107. package/dist/types/components/VrtxInvitationSuggestions.d.ts +25 -0
  108. package/dist/types/components/VrtxInvitationSuggestions.d.ts.map +1 -0
  109. package/dist/types/components/VrtxInviteContacts.d.ts +24 -0
  110. package/dist/types/components/VrtxInviteContacts.d.ts.map +1 -0
  111. package/dist/types/components/VrtxOutgoingInvitations.d.ts +27 -0
  112. package/dist/types/components/VrtxOutgoingInvitations.d.ts.map +1 -0
  113. package/dist/types/components/VrtxSearchBox.d.ts +28 -0
  114. package/dist/types/components/VrtxSearchBox.d.ts.map +1 -0
  115. package/dist/types/components/VrtxSelect.d.ts +6 -0
  116. package/dist/types/components/VrtxSelect.d.ts.map +1 -0
  117. package/dist/types/components/VrtxShareOptions.d.ts +41 -0
  118. package/dist/types/components/VrtxShareOptions.d.ts.map +1 -0
  119. package/dist/types/components/VrtxSubmit.d.ts +18 -0
  120. package/dist/types/components/VrtxSubmit.d.ts.map +1 -0
  121. package/dist/types/components/VrtxText.d.ts +8 -0
  122. package/dist/types/components/VrtxText.d.ts.map +1 -0
  123. package/dist/types/constants/mockData.d.ts +4 -0
  124. package/dist/types/constants/mockData.d.ts.map +1 -0
  125. package/dist/types/context/VortexModulesContext.d.ts +238 -0
  126. package/dist/types/context/VortexModulesContext.d.ts.map +1 -0
  127. package/dist/types/findFriends.js +10 -0
  128. package/dist/types/findFriends.js.map +1 -0
  129. package/dist/types/hooks/useInvitationFormLogic.d.ts +55 -0
  130. package/dist/types/hooks/useInvitationFormLogic.d.ts.map +1 -0
  131. package/dist/types/hooks/usePrefetchWidgetConfiguration.d.ts +39 -0
  132. package/dist/types/hooks/usePrefetchWidgetConfiguration.d.ts.map +1 -0
  133. package/dist/types/hooks/useThemeStyles.d.ts +35 -0
  134. package/dist/types/hooks/useThemeStyles.d.ts.map +1 -0
  135. package/dist/types/hooks/useVortexInvite.d.ts +86 -0
  136. package/dist/types/hooks/useVortexInvite.d.ts.map +1 -0
  137. package/dist/types/index-web.d.ts +23 -0
  138. package/dist/types/index-web.d.ts.map +1 -0
  139. package/dist/types/index.d.ts +23 -0
  140. package/dist/types/index.d.ts.map +1 -0
  141. package/dist/types/invitations.js +13 -0
  142. package/dist/types/invitations.js.map +1 -0
  143. package/dist/types/inviteContacts.js +14 -0
  144. package/dist/types/inviteContacts.js.map +1 -0
  145. package/dist/types/platformOperations.js +3 -0
  146. package/dist/types/platformOperations.js.map +1 -0
  147. package/dist/types/searchBox.js +11 -0
  148. package/dist/types/searchBox.js.map +1 -0
  149. package/dist/types/types/findFriends.d.ts +101 -0
  150. package/dist/types/types/findFriends.d.ts.map +1 -0
  151. package/dist/types/types/invitations.d.ts +301 -0
  152. package/dist/types/types/invitations.d.ts.map +1 -0
  153. package/dist/types/types/inviteContacts.d.ts +86 -0
  154. package/dist/types/types/inviteContacts.d.ts.map +1 -0
  155. package/dist/types/types/platformOperations.d.ts +185 -0
  156. package/dist/types/types/platformOperations.d.ts.map +1 -0
  157. package/dist/types/types/searchBox.d.ts +69 -0
  158. package/dist/types/types/searchBox.d.ts.map +1 -0
  159. package/dist/types/types/unfurlConfig.d.ts +34 -0
  160. package/dist/types/types/unfurlConfig.d.ts.map +1 -0
  161. package/dist/types/unfurlConfig.js +21 -0
  162. package/dist/types/unfurlConfig.js.map +1 -0
  163. package/dist/types/utils/analytics.d.ts +54 -0
  164. package/dist/types/utils/analytics.d.ts.map +1 -0
  165. package/dist/types/utils/configCache.d.ts +34 -0
  166. package/dist/types/utils/configCache.d.ts.map +1 -0
  167. package/dist/types/utils/contactUtils.d.ts +9 -0
  168. package/dist/types/utils/contactUtils.d.ts.map +1 -0
  169. package/dist/types/utils/featureWarnings.d.ts +56 -0
  170. package/dist/types/utils/featureWarnings.d.ts.map +1 -0
  171. package/dist/types/utils/formUtils.d.ts +93 -0
  172. package/dist/types/utils/formUtils.d.ts.map +1 -0
  173. package/dist/types/utils/gradientUtils.d.ts +67 -0
  174. package/dist/types/utils/gradientUtils.d.ts.map +1 -0
  175. package/dist/types/utils/invitationEvents.d.ts +21 -0
  176. package/dist/types/utils/invitationEvents.d.ts.map +1 -0
  177. package/dist/types/utils/moduleLoaders.d.ts +115 -0
  178. package/dist/types/utils/moduleLoaders.d.ts.map +1 -0
  179. package/dist/types/utils/moduleLoaders.web.d.ts +73 -0
  180. package/dist/types/utils/moduleLoaders.web.d.ts.map +1 -0
  181. package/dist/types/utils/nameUtils.d.ts +15 -0
  182. package/dist/types/utils/nameUtils.d.ts.map +1 -0
  183. package/dist/types/utils/themeUtils.d.ts +38 -0
  184. package/dist/types/utils/themeUtils.d.ts.map +1 -0
  185. package/dist/types/vortexInvite.d.ts +165 -0
  186. package/dist/types/vortexInvite.d.ts.map +1 -0
  187. package/dist/useInvitationFormLogic-Ct73M19B.d.mts +242 -0
  188. package/dist/useInvitationFormLogic-Ct73M19B.d.ts +242 -0
  189. package/dist/utils/analytics.js +92 -0
  190. package/dist/utils/analytics.js.map +1 -0
  191. package/dist/utils/configCache.js +68 -0
  192. package/dist/utils/configCache.js.map +1 -0
  193. package/dist/utils/contactUtils.d.mts +12 -0
  194. package/dist/utils/contactUtils.d.ts +12 -0
  195. package/dist/utils/contactUtils.js +37 -0
  196. package/dist/utils/contactUtils.js.map +1 -0
  197. package/dist/utils/contactUtils.mjs +12 -0
  198. package/dist/utils/contactUtils.mjs.map +1 -0
  199. package/dist/utils/featureWarnings.js +214 -0
  200. package/dist/utils/featureWarnings.js.map +1 -0
  201. package/dist/utils/formUtils.js +284 -0
  202. package/dist/utils/formUtils.js.map +1 -0
  203. package/dist/utils/gradientUtils.js +120 -0
  204. package/dist/utils/gradientUtils.js.map +1 -0
  205. package/dist/utils/invitationEvents.js +45 -0
  206. package/dist/utils/invitationEvents.js.map +1 -0
  207. package/dist/utils/moduleLoaders.js +275 -0
  208. package/dist/utils/moduleLoaders.js.map +1 -0
  209. package/dist/utils/moduleLoaders.web.js +72 -0
  210. package/dist/utils/moduleLoaders.web.js.map +1 -0
  211. package/dist/utils/nameUtils.js +51 -0
  212. package/dist/utils/nameUtils.js.map +1 -0
  213. package/dist/utils/themeUtils.js +141 -0
  214. package/dist/utils/themeUtils.js.map +1 -0
  215. package/dist/vortexInvite.js +83 -0
  216. package/dist/vortexInvite.js.map +1 -0
  217. package/package.json +21 -56
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.VrtxEmailInvitations = VrtxEmailInvitations;
16
+ const react_1 = __importDefault(require("react"));
17
+ const react_native_1 = require("react-native");
18
+ const isWeb = react_native_1.Platform.OS === 'web';
19
+ // Parse CSS linear-gradient to extract first color for fallback
20
+ function parseGradientFirstColor(gradientString) {
21
+ if (!gradientString || !gradientString.includes('linear-gradient')) {
22
+ return null;
23
+ }
24
+ const stopsRegex = /(rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}|[a-z]+)\s+(\d+)%/i;
25
+ const match = stopsRegex.exec(gradientString);
26
+ if (match) {
27
+ return match[1].trim();
28
+ }
29
+ return null;
30
+ }
31
+ const ButtonWrapper = ({ children, style, gradientString, onPress, disabled, }) => {
32
+ const styleArray = Array.isArray(style) ? style : [style];
33
+ // On web, use CSS gradients directly
34
+ if (gradientString && isWeb) {
35
+ return (<react_native_1.TouchableOpacity style={[...styleArray, { background: gradientString }]} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
36
+ {children}
37
+ </react_native_1.TouchableOpacity>);
38
+ }
39
+ // On native, use first color from gradient as solid background
40
+ const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;
41
+ const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;
42
+ return (<react_native_1.TouchableOpacity style={finalStyle} onPress={onPress} disabled={disabled} activeOpacity={0.7}>
43
+ {children}
44
+ </react_native_1.TouchableOpacity>);
45
+ };
46
+ const ChipWrapper = ({ children, style, gradientString }) => {
47
+ const styleArray = Array.isArray(style) ? style : [style];
48
+ // On web, use CSS gradients directly
49
+ if (gradientString && isWeb) {
50
+ return <react_native_1.View style={[...styleArray, { background: gradientString }]}>{children}</react_native_1.View>;
51
+ }
52
+ // On native, use first color from gradient as solid background
53
+ const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;
54
+ const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;
55
+ return <react_native_1.View style={finalStyle}>{children}</react_native_1.View>;
56
+ };
57
+ function VrtxEmailInvitations({ block, view, emails, emailInput, setEmailInput, handleEmailSubmit, handleRemoveEmail, submitButtonBlock, handleSendInvitation, triggerHaptic, loadingEmailInvite = false, sendSuccess = false, lastInvalidEmail = null, EditableWrapper, onEmailFieldFocus, onEmailFieldBlur, handleAddByEmail, renderIcon, isEditMode = false, }) {
58
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
59
+ const inputRef = react_1.default.useRef(null);
60
+ // Smart email input handler: detect delimiter characters (space, comma, semicolon)
61
+ // and automatically convert valid emails into pills — best-practice multi-email UX.
62
+ // Also handles paste of multiple emails separated by delimiters.
63
+ const handleChangeText = react_1.default.useCallback((text) => {
64
+ // Check if pasted text contains multiple emails (e.g. "a@b.com, c@d.com")
65
+ const delimiterRegex = /[,;\s]+/;
66
+ if (delimiterRegex.test(text) && text.trim().includes('@')) {
67
+ const parts = text.split(delimiterRegex).filter(Boolean);
68
+ // If multiple parts, try to pill-ify all complete ones
69
+ if (parts.length > 1) {
70
+ for (const part of parts) {
71
+ handleEmailSubmit(part.trim());
72
+ }
73
+ setEmailInput('');
74
+ return;
75
+ }
76
+ }
77
+ // Check if the last character typed is a delimiter
78
+ const lastChar = text.slice(-1);
79
+ const delimiters = [' ', ',', ';'];
80
+ if (delimiters.includes(lastChar)) {
81
+ const candidate = text.slice(0, -1).trim();
82
+ if (candidate) {
83
+ handleEmailSubmit(candidate);
84
+ triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light');
85
+ return;
86
+ }
87
+ // If nothing before the delimiter, ignore it
88
+ return;
89
+ }
90
+ setEmailInput(text);
91
+ }, [setEmailInput, handleEmailSubmit, triggerHaptic]);
92
+ // Convert any pending text to a pill on blur
93
+ const handleBlur = react_1.default.useCallback(() => {
94
+ if (emailInput.trim()) {
95
+ handleEmailSubmit(emailInput.trim());
96
+ }
97
+ onEmailFieldBlur === null || onEmailFieldBlur === void 0 ? void 0 : onEmailFieldBlur();
98
+ }, [emailInput, handleEmailSubmit, onEmailFieldBlur]);
99
+ // Extract styles from block.style
100
+ const blockStyle = (block === null || block === void 0 ? void 0 : block.style) || {};
101
+ // Merge styles
102
+ const mergedStyle = Object.assign({}, blockStyle);
103
+ // Extract gradient string and fallback color
104
+ // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'
105
+ const rawBackground = mergedStyle.background || null;
106
+ const isGradient = rawBackground === null || rawBackground === void 0 ? void 0 : rawBackground.includes('gradient');
107
+ const gradientString = isGradient ? rawBackground : null;
108
+ const fallbackColor = isGradient
109
+ ? parseGradientFirstColor(rawBackground)
110
+ : rawBackground || mergedStyle.backgroundColor;
111
+ // Extract text color
112
+ const textColor = mergedStyle.color || '#333';
113
+ // Create text style
114
+ const textStyle = Object.assign(Object.assign({}, mergedStyle), { color: textColor });
115
+ // Extract submit button styles and content if provided
116
+ const submitButtonStyle = (submitButtonBlock === null || submitButtonBlock === void 0 ? void 0 : submitButtonBlock.style) || {};
117
+ const submitButtonGradientString = submitButtonStyle.background || null;
118
+ const submitButtonFallbackColor = submitButtonGradientString
119
+ ? parseGradientFirstColor(submitButtonGradientString)
120
+ : submitButtonStyle.backgroundColor;
121
+ const submitButtonTextColor = submitButtonStyle.color || '#fff';
122
+ const submitButtonText = (submitButtonBlock === null || submitButtonBlock === void 0 ? void 0 : submitButtonBlock.textContent) || ((_a = submitButtonBlock === null || submitButtonBlock === void 0 ? void 0 : submitButtonBlock.attributes) === null || _a === void 0 ? void 0 : _a.label) || 'Invite';
123
+ const handleSendInvitationWithHaptics = () => __awaiter(this, void 0, void 0, function* () {
124
+ if (handleSendInvitation) {
125
+ yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
126
+ yield handleSendInvitation();
127
+ }
128
+ });
129
+ const handleAddByEmailWithHaptics = () => __awaiter(this, void 0, void 0, function* () {
130
+ if (handleAddByEmail) {
131
+ yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
132
+ handleAddByEmail();
133
+ }
134
+ });
135
+ // On main view, render as a button
136
+ if (view === 'main') {
137
+ return (<react_native_1.View key={block.id} style={{
138
+ position: 'relative',
139
+ }}>
140
+ <ButtonWrapper style={[
141
+ styles.button,
142
+ styles.fullButton,
143
+ {
144
+ borderWidth: 1,
145
+ borderColor: '#e0e0e0',
146
+ },
147
+ mergedStyle,
148
+ fallbackColor ? { backgroundColor: fallbackColor } : undefined,
149
+ ]} gradientString={gradientString} onPress={isEditMode ? undefined : handleAddByEmailWithHaptics} disabled={isEditMode}>
150
+ {renderIcon && (<react_native_1.View style={styles.buttonIconContainer}>
151
+ {renderIcon({ name: 'email', size: 18, color: textColor })}
152
+ </react_native_1.View>)}
153
+ <react_native_1.Text style={[styles.buttonText, { color: textColor }]}>
154
+ {((_d = (_c = (_b = block.settings) === null || _b === void 0 ? void 0 : _b.customizations) === null || _c === void 0 ? void 0 : _c['mobile.addByEmailButton']) === null || _d === void 0 ? void 0 : _d.textContent) || ((_e = block.attributes) === null || _e === void 0 ? void 0 : _e.label) || 'Add by Email'}
155
+ </react_native_1.Text>
156
+ </ButtonWrapper>
157
+ {/* Circle button for edit mode to preview the email form */}
158
+ {isEditMode && (<react_native_1.TouchableOpacity {...{
159
+ 'data-circle-button': 'true',
160
+ onMouseDown: (e) => __awaiter(this, void 0, void 0, function* () {
161
+ console.log('[VrtxEmailInvitations] Circle button onMouseDown - switching to email view');
162
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
163
+ e._circleButtonClick = true;
164
+ if (e.nativeEvent) {
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ e.nativeEvent._circleButtonClick = true;
167
+ }
168
+ e.stopPropagation();
169
+ e.preventDefault();
170
+ yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
171
+ if (handleAddByEmail) {
172
+ console.log('[VrtxEmailInvitations] Calling handleAddByEmail');
173
+ handleAddByEmail();
174
+ }
175
+ }),
176
+ onClick: (e) => {
177
+ console.log('[VrtxEmailInvitations] Circle button onClick - preventing default');
178
+ e.stopPropagation();
179
+ e.preventDefault();
180
+ },
181
+ onClickCapture: (e) => {
182
+ console.log('[VrtxEmailInvitations] Circle button onClickCapture - preventing default');
183
+ e.stopPropagation();
184
+ e.preventDefault();
185
+ },
186
+ }} style={Object.assign({ position: 'absolute', right: 8, bottom: '8%', transform: [{ translateY: -12 }], width: 24, height: 24, borderRadius: 12, backgroundColor: '#606971ff', justifyContent: 'center', alignItems: 'center', shadowColor: '#2196F3', shadowOffset: { width: 0, height: 0 }, shadowOpacity: 0.8, shadowRadius: 8, elevation: 99999, zIndex: 99999 }, (isWeb && {
187
+ boxShadow: '0 0 12px 3px rgba(118, 122, 125, 0.6)',
188
+ }))} activeOpacity={0.7} onPress={(e) => __awaiter(this, void 0, void 0, function* () {
189
+ console.log('[VrtxEmailInvitations] Circle button pressed - switching to email view');
190
+ // Mark the event so EditableWrapper ignores it
191
+ if (e) {
192
+ e._circleButtonClick = true;
193
+ if (e.nativeEvent) {
194
+ e.nativeEvent._circleButtonClick = true;
195
+ }
196
+ }
197
+ yield (triggerHaptic === null || triggerHaptic === void 0 ? void 0 : triggerHaptic('light'));
198
+ if (handleAddByEmail) {
199
+ handleAddByEmail();
200
+ }
201
+ })}>
202
+ <react_native_1.Text style={{ color: '#fff', fontSize: 14, fontWeight: 'bold' }}></react_native_1.Text>
203
+ </react_native_1.TouchableOpacity>)}
204
+ {/* Invisible spacer to ensure outline includes the circle button */}
205
+ {isEditMode && (<react_native_1.View style={{
206
+ position: 'absolute',
207
+ right: 0,
208
+ top: 0,
209
+ bottom: 0,
210
+ width: 40,
211
+ pointerEvents: 'none',
212
+ }}/>)}
213
+ </react_native_1.View>);
214
+ }
215
+ // On email view, render the full form
216
+ if (view !== 'email') {
217
+ return null;
218
+ }
219
+ return (<react_native_1.View key={block.id}>
220
+ {emails.length > 0 && (<react_native_1.View style={styles.emailChipsContainer}>
221
+ {emails.map((email, index) => (<ChipWrapper key={index} style={[styles.emailChip, mergedStyle, fallbackColor ? { backgroundColor: fallbackColor } : undefined]} gradientString={gradientString}>
222
+ <react_native_1.Text style={[styles.emailChipText, textStyle]}>{email}</react_native_1.Text>
223
+ <react_native_1.TouchableOpacity onPress={() => handleRemoveEmail(email)} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }} style={{ padding: 4 }}>
224
+ <react_native_1.Text style={[styles.emailChipRemove, { color: textColor }]}>×</react_native_1.Text>
225
+ </react_native_1.TouchableOpacity>
226
+ </ChipWrapper>))}
227
+ </react_native_1.View>)}
228
+
229
+ <react_native_1.TextInput ref={inputRef} style={[styles.input, lastInvalidEmail ? styles.inputInvalid : undefined]} placeholder={emails.length > 0 ? (((_h = (_g = (_f = block.settings) === null || _f === void 0 ? void 0 : _f.customizations) === null || _g === void 0 ? void 0 : _g['mobile.addAnotherPlaceholder']) === null || _h === void 0 ? void 0 : _h.textContent) || 'Add another email') : (((_l = (_k = (_j = block.settings) === null || _j === void 0 ? void 0 : _j.customizations) === null || _k === void 0 ? void 0 : _k['mobile.placeholder']) === null || _l === void 0 ? void 0 : _l.textContent) || 'Enter email addresses')} placeholderTextColor="#999" value={emailInput} onChangeText={handleChangeText} onSubmitEditing={() => {
230
+ var _a;
231
+ handleEmailSubmit();
232
+ // Keep keyboard open for entering more emails
233
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
234
+ }} onFocus={onEmailFieldFocus} onBlur={handleBlur} keyboardType="email-address" autoCapitalize="none" autoCorrect={false} returnKeyType="done" blurOnSubmit={false} autoFocus={true}/>
235
+
236
+ {/* Hint text below input */}
237
+ {(() => {
238
+ var _a, _b, _c;
239
+ const hintText = ((_c = (_b = (_a = block.settings) === null || _a === void 0 ? void 0 : _a.customizations) === null || _b === void 0 ? void 0 : _b['mobile.hint']) === null || _c === void 0 ? void 0 : _c.textContent) || 'Separate emails with spaces or commas';
240
+ return hintText ? (<react_native_1.Text style={styles.hintText}>{hintText}</react_native_1.Text>) : null;
241
+ })()}
242
+
243
+ {/* Submit button is now rendered separately in InviteFormCore */}
244
+ </react_native_1.View>);
245
+ }
246
+ const styles = react_native_1.StyleSheet.create({
247
+ emailChipsContainer: {
248
+ flexDirection: 'row',
249
+ flexWrap: 'wrap',
250
+ gap: 8,
251
+ marginBottom: 12,
252
+ },
253
+ emailChip: {
254
+ flexDirection: 'row',
255
+ alignItems: 'center',
256
+ backgroundColor: '#f0f0f0',
257
+ borderRadius: 16,
258
+ paddingHorizontal: 12,
259
+ paddingVertical: 6,
260
+ gap: 6,
261
+ },
262
+ emailChipText: {
263
+ fontSize: 14,
264
+ color: '#333',
265
+ },
266
+ emailChipRemove: {
267
+ fontSize: 20,
268
+ color: '#666',
269
+ fontWeight: '300',
270
+ },
271
+ input: {
272
+ borderWidth: 1,
273
+ borderColor: '#ddd',
274
+ borderRadius: 8,
275
+ padding: 12,
276
+ fontSize: 16,
277
+ backgroundColor: '#fff',
278
+ marginBottom: 4,
279
+ },
280
+ inputInvalid: {
281
+ borderColor: '#d9534f',
282
+ borderWidth: 1.5,
283
+ },
284
+ hintText: {
285
+ fontSize: 12,
286
+ color: '#999',
287
+ marginBottom: 12,
288
+ marginLeft: 4,
289
+ },
290
+ submitButtonContainer: {
291
+ marginTop: 16,
292
+ },
293
+ successMessageContainer: {
294
+ padding: 16,
295
+ backgroundColor: '#e8f5e9',
296
+ borderRadius: 8,
297
+ alignItems: 'center',
298
+ },
299
+ invitedText: {
300
+ color: '#2e7d32',
301
+ fontSize: 16,
302
+ fontWeight: '600',
303
+ },
304
+ button: {
305
+ paddingVertical: 12,
306
+ paddingHorizontal: 16,
307
+ borderRadius: 8,
308
+ flexDirection: 'row',
309
+ alignItems: 'center',
310
+ justifyContent: 'center',
311
+ gap: 8,
312
+ backgroundColor: '#f5f5f5',
313
+ },
314
+ submitButton: {
315
+ backgroundColor: '#007AFF',
316
+ },
317
+ fullButton: {
318
+ width: '100%',
319
+ },
320
+ submitButtonText: {
321
+ color: '#fff',
322
+ fontSize: 16,
323
+ fontWeight: '600',
324
+ },
325
+ buttonContainer: {
326
+ marginBottom: 16,
327
+ },
328
+ buttonIconContainer: {
329
+ width: 18,
330
+ height: 18,
331
+ alignItems: 'center',
332
+ justifyContent: 'center',
333
+ overflow: 'visible',
334
+ },
335
+ buttonText: {
336
+ color: '#333',
337
+ fontSize: 16,
338
+ fontWeight: '500',
339
+ },
340
+ });
341
+ //# sourceMappingURL=VrtxEmailInvitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VrtxEmailInvitations.js","sourceRoot":"","sources":["../../src/components/VrtxEmailInvitations.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport {\n View,\n Text,\n TextInput,\n TouchableOpacity,\n ActivityIndicator,\n StyleSheet,\n ViewStyle,\n Platform,\n} from 'react-native';\nimport type { ViewType } from '../hooks/useInvitationFormLogic';\n\nconst isWeb = Platform.OS === 'web';\n\n// Parse CSS linear-gradient to extract first color for fallback\nfunction parseGradientFirstColor(gradientString: string): string | null {\n if (!gradientString || !gradientString.includes('linear-gradient')) {\n return null;\n }\n\n const stopsRegex = /(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-z]+)\\s+(\\d+)%/i;\n const match = stopsRegex.exec(gradientString);\n\n if (match) {\n return match[1].trim();\n }\n\n return null;\n}\n\nexport interface VrtxEmailInvitationsProps {\n block: any;\n view: ViewType;\n emails: string[];\n emailInput: string;\n setEmailInput: (value: string) => void;\n handleEmailSubmit: (overrideEmail?: string) => void;\n handleRemoveEmail: (email: string) => void;\n submitButtonBlock?: any;\n handleSendInvitation?: () => Promise<void>;\n triggerHaptic?: (style: 'light' | 'medium' | 'heavy') => Promise<void>;\n loadingEmailInvite?: boolean;\n sendSuccess?: boolean;\n /** When set, the input briefly shows a red border to indicate invalid email */\n lastInvalidEmail?: string | null;\n EditableWrapper?: React.ComponentType<{\n children: React.ReactNode;\n componentId: string;\n componentType: string;\n node?: any;\n }>;\n // Analytics callbacks (optional)\n onEmailFieldFocus?: () => void;\n onEmailFieldBlur?: () => void;\n // Handler to navigate to email view\n handleAddByEmail?: () => void;\n renderIcon?: (props: any) => React.ReactNode;\n isEditMode?: boolean;\n}\n\n// Button wrapper component that handles gradients on web, solid color fallback on native\ninterface ButtonWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n onPress?: () => void;\n disabled?: boolean;\n}\n\nconst ButtonWrapper: React.FC<ButtonWrapperProps> = ({\n children,\n style,\n gradientString,\n onPress,\n disabled,\n}) => {\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return (\n <TouchableOpacity\n style={[...styleArray, { background: gradientString } as any]}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n }\n\n // On native, use first color from gradient as solid background\n const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return (\n <TouchableOpacity\n style={finalStyle}\n onPress={onPress}\n disabled={disabled}\n activeOpacity={0.7}\n >\n {children}\n </TouchableOpacity>\n );\n};\n\n// Chip wrapper component that handles gradients on web, solid color fallback on native\ninterface ChipWrapperProps {\n children: React.ReactNode;\n style: ViewStyle | ViewStyle[];\n gradientString: string | null;\n}\n\nconst ChipWrapper: React.FC<ChipWrapperProps> = ({ children, style, gradientString }) => {\n const styleArray = Array.isArray(style) ? style : [style];\n\n // On web, use CSS gradients directly\n if (gradientString && isWeb) {\n return <View style={[...styleArray, { background: gradientString } as any]}>{children}</View>;\n }\n\n // On native, use first color from gradient as solid background\n const fallbackColor = gradientString ? parseGradientFirstColor(gradientString) : null;\n const finalStyle = fallbackColor ? [...styleArray, { backgroundColor: fallbackColor }] : styleArray;\n\n return <View style={finalStyle}>{children}</View>;\n};\n\nexport function VrtxEmailInvitations({\n block,\n view,\n emails,\n emailInput,\n setEmailInput,\n handleEmailSubmit,\n handleRemoveEmail,\n submitButtonBlock,\n handleSendInvitation,\n triggerHaptic,\n loadingEmailInvite = false,\n sendSuccess = false,\n lastInvalidEmail = null,\n EditableWrapper,\n onEmailFieldFocus,\n onEmailFieldBlur,\n handleAddByEmail,\n renderIcon,\n isEditMode = false,\n}: VrtxEmailInvitationsProps) {\n const inputRef = React.useRef<any>(null);\n\n // Smart email input handler: detect delimiter characters (space, comma, semicolon)\n // and automatically convert valid emails into pills — best-practice multi-email UX.\n // Also handles paste of multiple emails separated by delimiters.\n const handleChangeText = React.useCallback((text: string) => {\n // Check if pasted text contains multiple emails (e.g. \"a@b.com, c@d.com\")\n const delimiterRegex = /[,;\\s]+/;\n if (delimiterRegex.test(text) && text.trim().includes('@')) {\n const parts = text.split(delimiterRegex).filter(Boolean);\n // If multiple parts, try to pill-ify all complete ones\n if (parts.length > 1) {\n for (const part of parts) {\n handleEmailSubmit(part.trim());\n }\n setEmailInput('');\n return;\n }\n }\n\n // Check if the last character typed is a delimiter\n const lastChar = text.slice(-1);\n const delimiters = [' ', ',', ';'];\n\n if (delimiters.includes(lastChar)) {\n const candidate = text.slice(0, -1).trim();\n if (candidate) {\n handleEmailSubmit(candidate);\n triggerHaptic?.('light');\n return;\n }\n // If nothing before the delimiter, ignore it\n return;\n }\n\n setEmailInput(text);\n }, [setEmailInput, handleEmailSubmit, triggerHaptic]);\n\n // Convert any pending text to a pill on blur\n const handleBlur = React.useCallback(() => {\n if (emailInput.trim()) {\n handleEmailSubmit(emailInput.trim());\n }\n onEmailFieldBlur?.();\n }, [emailInput, handleEmailSubmit, onEmailFieldBlur]);\n // Extract styles from block.style\n const blockStyle = block?.style || {};\n\n // Merge styles\n const mergedStyle = { ...blockStyle };\n\n // Extract gradient string and fallback color\n // On native, 'background' is a CSS property that doesn't work — convert solid colors to 'backgroundColor'\n const rawBackground = mergedStyle.background || null;\n const isGradient = rawBackground?.includes('gradient');\n const gradientString = isGradient ? rawBackground : null;\n const fallbackColor = isGradient\n ? parseGradientFirstColor(rawBackground)\n : rawBackground || mergedStyle.backgroundColor;\n\n // Extract text color\n const textColor = mergedStyle.color || '#333';\n\n // Create text style\n const textStyle = { ...mergedStyle, color: textColor };\n\n // Extract submit button styles and content if provided\n const submitButtonStyle = submitButtonBlock?.style || {};\n const submitButtonGradientString = submitButtonStyle.background || null;\n const submitButtonFallbackColor = submitButtonGradientString\n ? parseGradientFirstColor(submitButtonGradientString)\n : submitButtonStyle.backgroundColor;\n const submitButtonTextColor = submitButtonStyle.color || '#fff';\n\n const submitButtonText =\n submitButtonBlock?.textContent || submitButtonBlock?.attributes?.label || 'Invite';\n\n const handleSendInvitationWithHaptics = async () => {\n if (handleSendInvitation) {\n await triggerHaptic?.('light');\n await handleSendInvitation();\n }\n };\n\n const handleAddByEmailWithHaptics = async () => {\n if (handleAddByEmail) {\n await triggerHaptic?.('light');\n handleAddByEmail();\n }\n };\n\n // On main view, render as a button\n if (view === 'main') {\n return (\n <View\n key={block.id}\n style={{\n position: 'relative',\n }}\n >\n <ButtonWrapper\n style={[\n styles.button,\n styles.fullButton,\n {\n borderWidth: 1,\n borderColor: '#e0e0e0',\n },\n mergedStyle,\n fallbackColor ? { backgroundColor: fallbackColor } : undefined,\n ]}\n gradientString={gradientString}\n onPress={isEditMode ? undefined : handleAddByEmailWithHaptics}\n disabled={isEditMode}\n >\n {renderIcon && (\n <View style={styles.buttonIconContainer}>\n {renderIcon({ name: 'email', size: 18, color: textColor })}\n </View>\n )}\n <Text style={[styles.buttonText, { color: textColor }]}>\n {block.settings?.customizations?.['mobile.addByEmailButton']?.textContent || block.attributes?.label || 'Add by Email'}\n </Text>\n </ButtonWrapper>\n {/* Circle button for edit mode to preview the email form */}\n {isEditMode && (\n <TouchableOpacity\n {...({\n 'data-circle-button': 'true',\n onMouseDown: async (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onMouseDown - switching to email view');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e as any)._circleButtonClick = true;\n if (e.nativeEvent) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e.nativeEvent as any)._circleButtonClick = true;\n }\n e.stopPropagation();\n e.preventDefault();\n await triggerHaptic?.('light');\n if (handleAddByEmail) {\n console.log('[VrtxEmailInvitations] Calling handleAddByEmail');\n handleAddByEmail();\n }\n },\n onClick: (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onClick - preventing default');\n e.stopPropagation();\n e.preventDefault();\n },\n onClickCapture: (e: React.MouseEvent) => {\n console.log('[VrtxEmailInvitations] Circle button onClickCapture - preventing default');\n e.stopPropagation();\n e.preventDefault();\n },\n } as any)}\n style={{\n position: 'absolute',\n right: 8,\n bottom: '8%',\n transform: [{ translateY: -12 }],\n width: 24,\n height: 24,\n borderRadius: 12,\n backgroundColor: '#606971ff',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#2196F3',\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: 0.8,\n shadowRadius: 8,\n elevation: 99999,\n zIndex: 99999,\n ...(isWeb && {\n boxShadow: '0 0 12px 3px rgba(118, 122, 125, 0.6)',\n }),\n }}\n activeOpacity={0.7}\n onPress={async (e: any) => {\n console.log('[VrtxEmailInvitations] Circle button pressed - switching to email view');\n // Mark the event so EditableWrapper ignores it\n if (e) {\n e._circleButtonClick = true;\n if (e.nativeEvent) {\n e.nativeEvent._circleButtonClick = true;\n }\n }\n await triggerHaptic?.('light');\n if (handleAddByEmail) {\n handleAddByEmail();\n }\n }}\n >\n <Text style={{ color: '#fff', fontSize: 14, fontWeight: 'bold' }}></Text>\n </TouchableOpacity>\n )}\n {/* Invisible spacer to ensure outline includes the circle button */}\n {isEditMode && (\n <View\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: 40,\n pointerEvents: 'none',\n }}\n />\n )}\n </View>\n );\n }\n\n // On email view, render the full form\n if (view !== 'email') {\n return null;\n }\n\n return (\n <View key={block.id}>\n {emails.length > 0 && (\n <View style={styles.emailChipsContainer}>\n {emails.map((email, index) => (\n <ChipWrapper\n key={index}\n style={[styles.emailChip, mergedStyle, fallbackColor ? { backgroundColor: fallbackColor } : undefined]}\n gradientString={gradientString}\n >\n <Text style={[styles.emailChipText, textStyle]}>{email}</Text>\n <TouchableOpacity\n onPress={() => handleRemoveEmail(email)}\n hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}\n style={{ padding: 4 }}\n >\n <Text style={[styles.emailChipRemove, { color: textColor }]}>×</Text>\n </TouchableOpacity>\n </ChipWrapper>\n ))}\n </View>\n )}\n\n <TextInput\n ref={inputRef}\n style={[styles.input, lastInvalidEmail ? styles.inputInvalid : undefined]}\n placeholder={emails.length > 0 ? (block.settings?.customizations?.['mobile.addAnotherPlaceholder']?.textContent || 'Add another email') : (block.settings?.customizations?.['mobile.placeholder']?.textContent || 'Enter email addresses')}\n placeholderTextColor=\"#999\"\n value={emailInput}\n onChangeText={handleChangeText}\n onSubmitEditing={() => {\n handleEmailSubmit();\n // Keep keyboard open for entering more emails\n inputRef.current?.focus();\n }}\n onFocus={onEmailFieldFocus}\n onBlur={handleBlur}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"done\"\n blurOnSubmit={false}\n autoFocus={true}\n />\n\n {/* Hint text below input */}\n {(() => {\n const hintText = block.settings?.customizations?.['mobile.hint']?.textContent || 'Separate emails with spaces or commas';\n return hintText ? (\n <Text style={styles.hintText}>{hintText}</Text>\n ) : null;\n })()}\n\n {/* Submit button is now rendered separately in InviteFormCore */}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n emailChipsContainer: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n marginBottom: 12,\n },\n emailChip: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#f0f0f0',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 6,\n gap: 6,\n },\n emailChipText: {\n fontSize: 14,\n color: '#333',\n },\n emailChipRemove: {\n fontSize: 20,\n color: '#666',\n fontWeight: '300',\n },\n input: {\n borderWidth: 1,\n borderColor: '#ddd',\n borderRadius: 8,\n padding: 12,\n fontSize: 16,\n backgroundColor: '#fff',\n marginBottom: 4,\n },\n inputInvalid: {\n borderColor: '#d9534f',\n borderWidth: 1.5,\n },\n hintText: {\n fontSize: 12,\n color: '#999',\n marginBottom: 12,\n marginLeft: 4,\n },\n submitButtonContainer: {\n marginTop: 16,\n },\n successMessageContainer: {\n padding: 16,\n backgroundColor: '#e8f5e9',\n borderRadius: 8,\n alignItems: 'center',\n },\n invitedText: {\n color: '#2e7d32',\n fontSize: 16,\n fontWeight: '600',\n },\n button: {\n paddingVertical: 12,\n paddingHorizontal: 16,\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n backgroundColor: '#f5f5f5',\n },\n submitButton: {\n backgroundColor: '#007AFF',\n },\n fullButton: {\n width: '100%',\n },\n submitButtonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '600',\n },\n buttonContainer: {\n marginBottom: 16,\n },\n buttonIconContainer: {\n width: 18,\n height: 18,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'visible',\n },\n buttonText: {\n color: '#333',\n fontSize: 16,\n fontWeight: '500',\n },\n});\n"]}