@one_deploy/sdk 1.0.7 → 1.2.0

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 (106) hide show
  1. package/README.md +339 -0
  2. package/dist/ForexPoolDataGenerator--__twRwl.d.mts +76 -0
  3. package/dist/ForexPoolDataGenerator-eUgwsU_B.d.ts +76 -0
  4. package/dist/OneForexTradeHistory-TlKxjbFF.d.ts +250 -0
  5. package/dist/OneForexTradeHistory-iDySMcw0.d.mts +250 -0
  6. package/dist/components/index.d.mts +539 -0
  7. package/dist/components/index.d.ts +539 -0
  8. package/dist/components/index.js +7295 -0
  9. package/dist/components/index.js.map +1 -0
  10. package/dist/components/index.mjs +7243 -0
  11. package/dist/components/index.mjs.map +1 -0
  12. package/dist/config/index.d.mts +1 -0
  13. package/dist/config/index.d.ts +1 -0
  14. package/dist/console-BfTMA7ah.d.mts +504 -0
  15. package/dist/console-BfTMA7ah.d.ts +504 -0
  16. package/dist/hooks/index.d.mts +323 -1
  17. package/dist/hooks/index.d.ts +323 -1
  18. package/dist/hooks/index.js +3223 -0
  19. package/dist/hooks/index.js.map +1 -1
  20. package/dist/hooks/index.mjs +3204 -1
  21. package/dist/hooks/index.mjs.map +1 -1
  22. package/dist/index.d.mts +18 -352
  23. package/dist/index.d.ts +18 -352
  24. package/dist/index.js +8646 -574
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +8449 -432
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/providers/index.d.mts +31 -31
  29. package/dist/providers/index.d.ts +31 -31
  30. package/dist/providers/index.js +140 -153
  31. package/dist/providers/index.js.map +1 -1
  32. package/dist/providers/index.mjs +100 -109
  33. package/dist/providers/index.mjs.map +1 -1
  34. package/dist/react-native.d.mts +8 -144
  35. package/dist/react-native.d.ts +8 -144
  36. package/dist/react-native.js +2640 -689
  37. package/dist/react-native.js.map +1 -1
  38. package/dist/react-native.mjs +2610 -691
  39. package/dist/react-native.mjs.map +1 -1
  40. package/dist/services/index.d.mts +85 -4
  41. package/dist/services/index.d.ts +85 -4
  42. package/dist/services/index.js +1621 -0
  43. package/dist/services/index.js.map +1 -1
  44. package/dist/services/index.mjs +1619 -1
  45. package/dist/services/index.mjs.map +1 -1
  46. package/dist/types/index.d.mts +203 -1
  47. package/dist/types/index.d.ts +203 -1
  48. package/dist/types/index.js +275 -0
  49. package/dist/types/index.js.map +1 -1
  50. package/dist/types/index.mjs +251 -0
  51. package/dist/types/index.mjs.map +1 -1
  52. package/dist/useForexTrading-BleeSor8.d.mts +80 -0
  53. package/dist/useForexTrading-ZgW_G40Q.d.ts +80 -0
  54. package/package.json +9 -2
  55. package/src/components/OneConnectButton.tsx +24 -1
  56. package/src/components/OneNFTGallery.tsx +13 -7
  57. package/src/components/OneOfframpWidget.tsx +4 -3
  58. package/src/components/OnePayWidget.tsx +10 -1
  59. package/src/components/OneSendWidget.tsx +3 -3
  60. package/src/components/OneSwapWidget.tsx +4 -4
  61. package/src/components/OneTransactionButton.tsx +28 -3
  62. package/src/components/OneWalletBalance.tsx +1 -1
  63. package/src/components/ai/OneChainSelector.tsx +63 -336
  64. package/src/components/ai/OneForexCapitalSplit.tsx +112 -0
  65. package/src/components/ai/OneForexConsoleView.tsx +90 -0
  66. package/src/components/ai/OneForexPairSelector.tsx +101 -0
  67. package/src/components/ai/OneForexPoolCard.tsx +105 -0
  68. package/src/components/ai/OneForexTradeHistory.tsx +107 -0
  69. package/src/components/ai/OnePairSelector.tsx +77 -434
  70. package/src/components/ai/console/OneAIQuantConsole.tsx +423 -0
  71. package/src/components/ai/console/OneAgentCard.tsx +383 -0
  72. package/src/components/ai/console/OneAgentConsole.tsx +469 -0
  73. package/src/components/ai/console/OneDecisionTimeline.tsx +433 -0
  74. package/src/components/ai/console/OneMetricsDashboard.tsx +493 -0
  75. package/src/components/ai/console/OnePositionCard.tsx +406 -0
  76. package/src/components/ai/console/OnePositionDetail.tsx +600 -0
  77. package/src/components/ai/console/OneRiskIndicator.tsx +464 -0
  78. package/src/components/ai/console/OneTradingConsole.tsx +660 -0
  79. package/src/components/ai/console/index.ts +17 -0
  80. package/src/components/ai/index.ts +10 -0
  81. package/src/hooks/index.ts +46 -0
  82. package/src/hooks/useAIDecisions.ts +280 -0
  83. package/src/hooks/useAIPositions.ts +349 -0
  84. package/src/hooks/useAIQuantConsole.ts +283 -0
  85. package/src/hooks/useAIRiskStatus.ts +276 -0
  86. package/src/hooks/useAITrading.ts +190 -0
  87. package/src/hooks/useBotSimulation.ts +201 -0
  88. package/src/hooks/useForexTrading.ts +430 -0
  89. package/src/hooks/useTradingConsole.ts +243 -0
  90. package/src/index.ts +123 -5
  91. package/src/providers/OneProvider.tsx +181 -5
  92. package/src/providers/index.ts +22 -8
  93. package/src/react-native.ts +41 -0
  94. package/src/services/forex/BotSimulationEngine.ts +968 -0
  95. package/src/services/forex/ForexPoolDataGenerator.ts +542 -0
  96. package/src/services/forex/ForexSimulationEngine.ts +482 -0
  97. package/src/services/forex/index.ts +21 -0
  98. package/src/services/index.ts +16 -0
  99. package/src/types/aiTrading.ts +151 -0
  100. package/src/types/console.ts +380 -0
  101. package/src/types/forex.ts +282 -0
  102. package/src/types/index.ts +106 -0
  103. package/dist/price-CgqXPnT3.d.ts +0 -13
  104. package/dist/price-ClbLHHjv.d.mts +0 -13
  105. package/dist/supabase-BT0c7q9e.d.mts +0 -82
  106. package/dist/supabase-BT0c7q9e.d.ts +0 -82
@@ -1,40 +1,35 @@
1
1
  /**
2
- * OnePairSelector - Trading pair selection component with dropdown style
3
- * Part of ONE Ecosystem SDK - Responsive design for desktop and mobile
2
+ * OnePairSelector - Trading pair selection component for AI trading
3
+ * Part of ONE Ecosystem SDK - can be used by any ecosystem partner
4
4
  */
5
5
 
6
- import React, { useState } from 'react';
7
- import { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle, Modal, ScrollView, Pressable, Dimensions, Platform } from 'react-native';
6
+ import React from 'react';
7
+ import { View, Text, StyleSheet, TouchableOpacity, ViewStyle, TextStyle } from 'react-native';
8
8
 
9
9
  // Common trading pairs with icons
10
- export const PAIR_CONFIG: Record<string, { symbol: string; name: string; icon: string; color: string }> = {
11
- 'BTC': { symbol: 'BTC/USDT', name: 'Bitcoin', icon: '₿', color: '#F7931A' },
12
- 'ETH': { symbol: 'ETH/USDT', name: 'Ethereum', icon: 'Ξ', color: '#627EEA' },
13
- 'BNB': { symbol: 'BNB/USDT', name: 'BNB', icon: '◆', color: '#F3BA2F' },
14
- 'SOL': { symbol: 'SOL/USDT', name: 'Solana', icon: '◎', color: '#9945FF' },
15
- 'XRP': { symbol: 'XRP/USDT', name: 'Ripple', icon: '✕', color: '#23292F' },
16
- 'DOGE': { symbol: 'DOGE/USDT', name: 'Dogecoin', icon: 'Ð', color: '#C2A633' },
17
- 'ADA': { symbol: 'ADA/USDT', name: 'Cardano', icon: '₳', color: '#0033AD' },
18
- 'AVAX': { symbol: 'AVAX/USDT', name: 'Avalanche', icon: '▲', color: '#E84142' },
19
- 'DOT': { symbol: 'DOT/USDT', name: 'Polkadot', icon: '●', color: '#E6007A' },
20
- 'MATIC': { symbol: 'MATIC/USDT', name: 'Polygon', icon: '⬡', color: '#8247E5' },
21
- 'LINK': { symbol: 'LINK/USDT', name: 'Chainlink', icon: '◇', color: '#375BD2' },
22
- 'UNI': { symbol: 'UNI/USDT', name: 'Uniswap', icon: '🦄', color: '#FF007A' },
23
- 'ATOM': { symbol: 'ATOM/USDT', name: 'Cosmos', icon: '⚛', color: '#2E3148' },
24
- 'LTC': { symbol: 'LTC/USDT', name: 'Litecoin', icon: 'Ł', color: '#345D9D' },
25
- 'ARB': { symbol: 'ARB/USDT', name: 'Arbitrum', icon: '◆', color: '#28A0F0' },
26
- 'OP': { symbol: 'OP/USDT', name: 'Optimism', icon: '◉', color: '#FF0420' },
10
+ export const PAIR_ICONS: Record<string, string> = {
11
+ 'BTC/USDT': '₿',
12
+ 'ETH/USDT': 'Ξ',
13
+ 'SOL/USDT': '',
14
+ 'BNB/USDT': '',
15
+ 'XRP/USDT': '✕',
16
+ 'DOGE/USDT': 'Ð',
17
+ 'ADA/USDT': '',
18
+ 'AVAX/USDT': '▲',
19
+ 'DOT/USDT': '●',
20
+ 'MATIC/USDT': '⬡',
21
+ 'LINK/USDT': '◇',
22
+ 'UNI/USDT': '🦄',
23
+ 'ATOM/USDT': '⚛',
24
+ 'LTC/USDT': 'Ł',
25
+ 'ARB/USDT': '◆',
26
+ 'OP/USDT': '◉',
27
27
  };
28
28
 
29
- // Legacy mapping for backward compatibility
30
- export const PAIR_ICONS: Record<string, string> = Object.fromEntries(
31
- Object.entries(PAIR_CONFIG).map(([key, value]) => [`${key}/USDT`, value.icon])
32
- );
33
-
34
29
  export interface OnePairSelectorProps {
35
- /** List of supported trading pair IDs (e.g., 'BTC', 'ETH') */
30
+ /** List of supported trading pairs */
36
31
  supportedPairs: string[];
37
- /** Currently selected pair IDs */
32
+ /** Currently selected pairs */
38
33
  selectedPairs: string[];
39
34
  /** Callback when pair selection changes */
40
35
  onTogglePair: (pair: string) => void;
@@ -48,19 +43,12 @@ export interface OnePairSelectorProps {
48
43
  minSelections?: number;
49
44
  /** Maximum allowed selections (0 = unlimited) */
50
45
  maxSelections?: number;
51
- /** Placeholder text */
52
- placeholder?: string;
53
46
  /** Custom styles */
54
47
  style?: ViewStyle;
55
48
  /** Custom title style */
56
49
  titleStyle?: TextStyle;
57
50
  }
58
51
 
59
- const isDesktop = () => {
60
- const { width } = Dimensions.get('window');
61
- return Platform.OS === 'web' && width >= 768;
62
- };
63
-
64
52
  export const OnePairSelector: React.FC<OnePairSelectorProps> = ({
65
53
  supportedPairs,
66
54
  selectedPairs,
@@ -70,20 +58,18 @@ export const OnePairSelector: React.FC<OnePairSelectorProps> = ({
70
58
  subtitle,
71
59
  minSelections = 1,
72
60
  maxSelections = 0,
73
- placeholder = 'Select trading pairs...',
74
61
  style,
75
62
  titleStyle,
76
63
  }) => {
77
- const [isOpen, setIsOpen] = useState(false);
78
- const desktop = isDesktop();
79
-
80
64
  const handleToggle = (pair: string) => {
81
65
  const isSelected = selectedPairs.includes(pair);
82
66
 
67
+ // Prevent deselecting below minimum
83
68
  if (isSelected && selectedPairs.length <= minSelections) {
84
69
  return;
85
70
  }
86
71
 
72
+ // Prevent selecting above maximum
87
73
  if (!isSelected && maxSelections > 0 && selectedPairs.length >= maxSelections) {
88
74
  return;
89
75
  }
@@ -91,190 +77,50 @@ export const OnePairSelector: React.FC<OnePairSelectorProps> = ({
91
77
  onTogglePair(pair);
92
78
  };
93
79
 
94
- const getPairInfo = (pair: string) => {
95
- return PAIR_CONFIG[pair] || { symbol: `${pair}/USDT`, name: pair, icon: '●', color: '#888' };
96
- };
97
-
98
- // Desktop: Inline grid display
99
- if (desktop) {
100
- return (
101
- <View style={[styles.container, style]}>
102
- {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}
103
- {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}
104
-
105
- <View style={styles.desktopGrid}>
106
- {supportedPairs.map((pair) => {
107
- const pairInfo = getPairInfo(pair);
108
- const isSelected = selectedPairs.includes(pair);
109
- const isDisabled = !isSelected && maxSelections > 0 && selectedPairs.length >= maxSelections;
110
-
111
- return (
112
- <TouchableOpacity
113
- key={pair}
114
- style={[
115
- styles.desktopChip,
116
- isSelected && styles.desktopChipSelected,
117
- isSelected && { borderColor: accentColor, backgroundColor: accentColor + '12' },
118
- isDisabled && styles.desktopChipDisabled,
119
- ]}
120
- onPress={() => handleToggle(pair)}
121
- activeOpacity={isDisabled ? 1 : 0.7}
122
- >
123
- <View style={[styles.desktopIconBg, { backgroundColor: pairInfo.color + '20' }]}>
124
- <Text style={[styles.desktopIcon, { color: pairInfo.color }]}>{pairInfo.icon}</Text>
125
- </View>
126
- <View>
127
- <Text style={[
128
- styles.desktopChipText,
129
- isSelected && { color: accentColor, fontWeight: '600' },
130
- isDisabled && styles.desktopTextDisabled,
131
- ]}>
132
- {pair}
133
- </Text>
134
- <Text style={[styles.desktopChipSubtext, isDisabled && styles.desktopTextDisabled]}>
135
- {pairInfo.name}
136
- </Text>
137
- </View>
138
- {isSelected && (
139
- <View style={[styles.desktopCheckbox, { backgroundColor: accentColor }]}>
140
- <Text style={styles.desktopCheckIcon}>✓</Text>
141
- </View>
142
- )}
143
- </TouchableOpacity>
144
- );
145
- })}
146
- </View>
147
-
148
- <View style={styles.infoRow}>
149
- <Text style={[styles.selectedCount, { color: accentColor }]}>
150
- {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected
151
- </Text>
152
- {(minSelections > 0 || maxSelections > 0) && (
153
- <Text style={styles.limitText}>
154
- {minSelections > 0 && `min: ${minSelections}`}
155
- {minSelections > 0 && maxSelections > 0 && ' / '}
156
- {maxSelections > 0 && `max: ${maxSelections}`}
157
- </Text>
158
- )}
159
- </View>
160
- </View>
161
- );
162
- }
163
-
164
- // Mobile: Dropdown modal
165
80
  return (
166
81
  <View style={[styles.container, style]}>
167
82
  {title && <Text style={[styles.title, titleStyle]}>{title}</Text>}
168
83
  {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}
169
84
 
170
- <TouchableOpacity
171
- style={[styles.dropdownTrigger, { borderColor: isOpen ? accentColor : '#e5e5e5' }]}
172
- onPress={() => setIsOpen(true)}
173
- activeOpacity={0.7}
174
- >
175
- <View style={styles.selectedPreview}>
176
- {selectedPairs.slice(0, 4).map((pair) => {
177
- const pairInfo = getPairInfo(pair);
178
- return (
179
- <View key={pair} style={[styles.previewChip, { backgroundColor: pairInfo.color + '20' }]}>
180
- <Text style={[styles.previewIcon, { color: pairInfo.color }]}>{pairInfo.icon}</Text>
181
- </View>
182
- );
183
- })}
184
- {selectedPairs.length > 4 && (
185
- <View style={styles.previewMore}>
186
- <Text style={styles.previewMoreText}>+{selectedPairs.length - 4}</Text>
187
- </View>
188
- )}
189
- {selectedPairs.length === 0 && (
190
- <Text style={styles.placeholderText}>{placeholder}</Text>
191
- )}
192
- </View>
193
- <Text style={styles.dropdownArrow}>{isOpen ? '▲' : '▼'}</Text>
194
- </TouchableOpacity>
195
-
196
- <View style={styles.infoRow}>
197
- <Text style={[styles.selectedCount, { color: accentColor }]}>
198
- {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected
199
- </Text>
200
- {(minSelections > 0 || maxSelections > 0) && (
201
- <Text style={styles.limitText}>
202
- {minSelections > 0 && `min: ${minSelections}`}
203
- {minSelections > 0 && maxSelections > 0 && ' / '}
204
- {maxSelections > 0 && `max: ${maxSelections}`}
205
- </Text>
206
- )}
207
- </View>
208
-
209
- <Modal
210
- visible={isOpen}
211
- transparent
212
- animationType="fade"
213
- onRequestClose={() => setIsOpen(false)}
214
- >
215
- <Pressable style={styles.modalOverlay} onPress={() => setIsOpen(false)}>
216
- <View style={styles.modalContent}>
217
- <View style={styles.modalHeader}>
218
- <Text style={styles.modalTitle}>{title || 'Select Trading Pairs'}</Text>
219
- <TouchableOpacity onPress={() => setIsOpen(false)}>
220
- <Text style={styles.modalClose}>✕</Text>
221
- </TouchableOpacity>
222
- </View>
223
-
224
- <ScrollView style={styles.optionsList} showsVerticalScrollIndicator={false}>
225
- {supportedPairs.map((pair) => {
226
- const pairInfo = getPairInfo(pair);
227
- const isSelected = selectedPairs.includes(pair);
228
- const isDisabled = !isSelected && maxSelections > 0 && selectedPairs.length >= maxSelections;
229
-
230
- return (
231
- <TouchableOpacity
232
- key={pair}
233
- style={[
234
- styles.optionItem,
235
- isSelected && styles.optionItemSelected,
236
- isSelected && { backgroundColor: accentColor + '10', borderColor: accentColor },
237
- isDisabled && styles.optionItemDisabled,
238
- ]}
239
- onPress={() => handleToggle(pair)}
240
- activeOpacity={isDisabled ? 1 : 0.7}
241
- >
242
- <View style={[styles.optionIconBg, { backgroundColor: pairInfo.color + '20' }]}>
243
- <Text style={[styles.optionIcon, { color: pairInfo.color }]}>{pairInfo.icon}</Text>
244
- </View>
245
- <View style={styles.optionTextContainer}>
246
- <Text style={[
247
- styles.optionSymbol,
248
- isSelected && { color: accentColor, fontWeight: '600' },
249
- isDisabled && styles.optionTextDisabled,
250
- ]}>
251
- {pair}
252
- </Text>
253
- <Text style={[styles.optionName, isDisabled && styles.optionTextDisabled]}>
254
- {pairInfo.name}
255
- </Text>
256
- </View>
257
- {isSelected ? (
258
- <View style={[styles.checkbox, { backgroundColor: accentColor }]}>
259
- <Text style={styles.checkboxIcon}>✓</Text>
260
- </View>
261
- ) : (
262
- <View style={[styles.checkboxEmpty, isDisabled && styles.checkboxDisabled]} />
263
- )}
264
- </TouchableOpacity>
265
- );
266
- })}
267
- </ScrollView>
85
+ <View style={styles.pairsContainer}>
86
+ {supportedPairs.map((pair) => {
87
+ const isSelected = selectedPairs.includes(pair);
88
+ const icon = PAIR_ICONS[pair] || '●';
89
+ const baseSymbol = pair.split('/')[0];
268
90
 
91
+ return (
269
92
  <TouchableOpacity
270
- style={[styles.doneButton, { backgroundColor: accentColor }]}
271
- onPress={() => setIsOpen(false)}
93
+ key={pair}
94
+ style={[
95
+ styles.pairChip,
96
+ isSelected && styles.pairChipSelected,
97
+ isSelected && { backgroundColor: accentColor + '15', borderColor: accentColor }
98
+ ]}
99
+ onPress={() => handleToggle(pair)}
100
+ activeOpacity={0.7}
272
101
  >
273
- <Text style={styles.doneButtonText}>Done ({selectedPairs.length})</Text>
102
+ <Text style={styles.pairIcon}>{icon}</Text>
103
+ <Text style={[
104
+ styles.pairText,
105
+ isSelected && { color: accentColor, fontWeight: '600' }
106
+ ]}>
107
+ {baseSymbol}
108
+ </Text>
109
+ {isSelected && (
110
+ <Text style={[styles.checkmark, { color: accentColor }]}>✓</Text>
111
+ )}
274
112
  </TouchableOpacity>
275
- </View>
276
- </Pressable>
277
- </Modal>
113
+ );
114
+ })}
115
+ </View>
116
+
117
+ <View style={styles.selectedInfo}>
118
+ <Text style={styles.selectedText}>
119
+ {selectedPairs.length} pair{selectedPairs.length !== 1 ? 's' : ''} selected
120
+ {minSelections > 0 && ` (min: ${minSelections})`}
121
+ {maxSelections > 0 && ` (max: ${maxSelections})`}
122
+ </Text>
123
+ </View>
278
124
  </View>
279
125
  );
280
126
  };
@@ -294,245 +140,42 @@ const styles = StyleSheet.create({
294
140
  color: '#666',
295
141
  marginBottom: 12,
296
142
  },
297
- // Desktop styles
298
- desktopGrid: {
143
+ pairsContainer: {
299
144
  flexDirection: 'row',
300
145
  flexWrap: 'wrap',
301
- gap: 10,
302
- },
303
- desktopChip: {
304
- flexDirection: 'row',
305
- alignItems: 'center',
306
- paddingHorizontal: 14,
307
- paddingVertical: 10,
308
- backgroundColor: '#fff',
309
- borderRadius: 10,
310
- borderWidth: 2,
311
- borderColor: '#e8e8e8',
312
- gap: 10,
313
- cursor: 'pointer' as any,
314
- minWidth: 140,
146
+ gap: 8,
315
147
  },
316
- desktopChipSelected: {
317
- borderWidth: 2,
318
- },
319
- desktopChipDisabled: {
320
- opacity: 0.5,
321
- },
322
- desktopIconBg: {
323
- width: 36,
324
- height: 36,
325
- borderRadius: 18,
326
- alignItems: 'center',
327
- justifyContent: 'center',
328
- },
329
- desktopIcon: {
330
- fontSize: 16,
331
- fontWeight: '700',
332
- },
333
- desktopChipText: {
334
- fontSize: 14,
335
- fontWeight: '500',
336
- color: '#333',
337
- },
338
- desktopChipSubtext: {
339
- fontSize: 11,
340
- color: '#888',
341
- marginTop: 1,
342
- },
343
- desktopTextDisabled: {
344
- color: '#bbb',
345
- },
346
- desktopCheckbox: {
347
- width: 20,
348
- height: 20,
349
- borderRadius: 10,
350
- alignItems: 'center',
351
- justifyContent: 'center',
352
- marginLeft: 'auto' as any,
353
- },
354
- desktopCheckIcon: {
355
- fontSize: 12,
356
- color: '#fff',
357
- fontWeight: '700',
358
- },
359
- // Mobile dropdown styles
360
- dropdownTrigger: {
148
+ pairChip: {
361
149
  flexDirection: 'row',
362
150
  alignItems: 'center',
363
- justifyContent: 'space-between',
364
- paddingHorizontal: 14,
365
- paddingVertical: 12,
151
+ paddingHorizontal: 12,
152
+ paddingVertical: 8,
366
153
  backgroundColor: '#fff',
367
- borderRadius: 12,
368
- borderWidth: 2,
154
+ borderRadius: 8,
155
+ borderWidth: 1,
369
156
  borderColor: '#e5e5e5',
370
- minHeight: 52,
371
- },
372
- selectedPreview: {
373
- flex: 1,
374
- flexDirection: 'row',
375
- alignItems: 'center',
376
157
  gap: 6,
377
158
  },
378
- previewChip: {
379
- width: 32,
380
- height: 32,
381
- borderRadius: 16,
382
- alignItems: 'center',
383
- justifyContent: 'center',
159
+ pairChipSelected: {
160
+ borderWidth: 2,
384
161
  },
385
- previewIcon: {
162
+ pairIcon: {
386
163
  fontSize: 14,
387
- fontWeight: '700',
388
164
  },
389
- previewMore: {
390
- paddingHorizontal: 8,
391
- paddingVertical: 4,
392
- backgroundColor: '#f0f0f0',
393
- borderRadius: 8,
394
- },
395
- previewMoreText: {
396
- fontSize: 12,
165
+ pairText: {
166
+ fontSize: 14,
397
167
  color: '#666',
398
- fontWeight: '600',
399
168
  },
400
- placeholderText: {
169
+ checkmark: {
401
170
  fontSize: 14,
402
- color: '#999',
403
- },
404
- dropdownArrow: {
405
- fontSize: 12,
406
- color: '#888',
407
- marginLeft: 8,
408
- },
409
- infoRow: {
410
- flexDirection: 'row',
411
- justifyContent: 'space-between',
412
- alignItems: 'center',
413
- marginTop: 6,
414
- },
415
- selectedCount: {
416
- fontSize: 12,
417
- fontWeight: '500',
418
- },
419
- limitText: {
420
- fontSize: 11,
421
- color: '#888',
422
- },
423
- // Modal styles
424
- modalOverlay: {
425
- flex: 1,
426
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
427
- justifyContent: 'center',
428
- alignItems: 'center',
429
- },
430
- modalContent: {
431
- width: '85%',
432
- maxWidth: 340,
433
- maxHeight: '75%',
434
- backgroundColor: '#fff',
435
- borderRadius: 16,
436
- overflow: 'hidden',
437
- },
438
- modalHeader: {
439
- flexDirection: 'row',
440
- justifyContent: 'space-between',
441
- alignItems: 'center',
442
- paddingHorizontal: 16,
443
- paddingVertical: 14,
444
- borderBottomWidth: 1,
445
- borderBottomColor: '#f0f0f0',
446
- },
447
- modalTitle: {
448
- fontSize: 18,
449
- fontWeight: '700',
450
- color: '#1a1a1a',
451
- },
452
- modalClose: {
453
- fontSize: 20,
454
- color: '#888',
455
- padding: 4,
456
- },
457
- optionsList: {
458
- padding: 8,
459
- },
460
- optionItem: {
461
- flexDirection: 'row',
462
- alignItems: 'center',
463
- paddingHorizontal: 12,
464
- paddingVertical: 12,
465
- borderRadius: 10,
466
- borderWidth: 1,
467
- borderColor: 'transparent',
468
- marginBottom: 6,
469
- gap: 12,
470
- },
471
- optionItemSelected: {
472
- borderWidth: 1,
473
- },
474
- optionItemDisabled: {
475
- opacity: 0.5,
476
- },
477
- optionIconBg: {
478
- width: 40,
479
- height: 40,
480
- borderRadius: 20,
481
- alignItems: 'center',
482
- justifyContent: 'center',
483
- },
484
- optionIcon: {
485
- fontSize: 18,
486
171
  fontWeight: '700',
487
172
  },
488
- optionTextContainer: {
489
- flex: 1,
490
- },
491
- optionSymbol: {
492
- fontSize: 15,
493
- fontWeight: '500',
494
- color: '#333',
173
+ selectedInfo: {
174
+ marginTop: 8,
175
+ paddingVertical: 4,
495
176
  },
496
- optionName: {
177
+ selectedText: {
497
178
  fontSize: 12,
498
179
  color: '#888',
499
- marginTop: 1,
500
- },
501
- optionTextDisabled: {
502
- color: '#bbb',
503
- },
504
- checkbox: {
505
- width: 24,
506
- height: 24,
507
- borderRadius: 12,
508
- alignItems: 'center',
509
- justifyContent: 'center',
510
- },
511
- checkboxIcon: {
512
- fontSize: 14,
513
- color: '#fff',
514
- fontWeight: '700',
515
- },
516
- checkboxEmpty: {
517
- width: 24,
518
- height: 24,
519
- borderRadius: 12,
520
- borderWidth: 2,
521
- borderColor: '#ddd',
522
- },
523
- checkboxDisabled: {
524
- borderColor: '#eee',
525
- },
526
- doneButton: {
527
- marginHorizontal: 16,
528
- marginVertical: 12,
529
- paddingVertical: 14,
530
- borderRadius: 10,
531
- alignItems: 'center',
532
- },
533
- doneButtonText: {
534
- fontSize: 16,
535
- fontWeight: '600',
536
- color: '#fff',
537
180
  },
538
181
  });