zelune 1.6.2 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/bin/cli.mjs +13 -54
- package/dist/assets/CheckoutScreen-6IdrpKgm.js +229 -0
- package/dist/assets/HomeScreen-Dxe9L4I2.js +316 -0
- package/dist/assets/LoginScreen-Dp1awI4F.js +189 -0
- package/dist/assets/ProductDetailScreen-Wa5_nlRP.js +196 -0
- package/dist/assets/ProfileScreen-riAU6vVh.js +185 -0
- package/dist/assets/index-hEzd4JVy.js +44697 -0
- package/{index.html → dist/index.html} +3 -7
- package/mcp/server.mjs +1370 -34
- package/package.json +10 -17
- package/plugin.json +1 -1
- package/socket.yml +11 -0
- package/mcp/server.ts +0 -446
- package/plugins/viteReactNativeFallbackPlugin.ts +0 -519
- package/plugins/viteRnSourceInject.ts +0 -117
- package/plugins/viteVirtualScreensPlugin.ts +0 -216
- package/src/canvas/CanvasApp.tsx +0 -1655
- package/src/canvas/FlowArrowsLayer.tsx +0 -239
- package/src/canvas/InspectorPanel.tsx +0 -1494
- package/src/canvas/ScreenArtboard.tsx +0 -1491
- package/src/canvas/types.ts +0 -23
- package/src/main.tsx +0 -80
- package/src/runtime/MockNavigationContext.tsx +0 -1795
- package/src/runtime/ScreenErrorBoundary.tsx +0 -86
- package/src/runtime/nativewindShim.ts +0 -997
- package/src/runtime/reactNativeShim.ts +0 -240
- package/src/screens/CheckoutScreen.tsx +0 -229
- package/src/screens/HomeScreen.tsx +0 -288
- package/src/screens/LoginScreen.tsx +0 -176
- package/src/screens/ProductDetailScreen.tsx +0 -207
- package/src/screens/ProfileScreen.tsx +0 -172
- package/src/screens/index.ts +0 -1
- package/src/server/apiMiddleware.ts +0 -375
- package/src/server/astEngine.ts +0 -2553
- package/src/vite-env.d.ts +0 -7
- package/tsconfig.json +0 -23
- package/vite.config.ts +0 -340
- /package/{src/styles.css → dist/assets/index-C7nrS82N.css} +0 -0
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import React, { useRef } from 'react';
|
|
2
|
-
import * as RNW from 'react-native-web';
|
|
3
|
-
import { withNativeWind } from './nativewindShim';
|
|
4
|
-
|
|
5
|
-
export * from 'react-native-web';
|
|
6
|
-
|
|
7
|
-
// Wrap core React Native primitives with NativeWind className -> style support
|
|
8
|
-
export const View = withNativeWind(RNW.View as unknown as React.ComponentType<Record<string, unknown>>, 'View');
|
|
9
|
-
export const Text = withNativeWind(RNW.Text as unknown as React.ComponentType<Record<string, unknown>>, 'Text');
|
|
10
|
-
export const Pressable = withNativeWind(
|
|
11
|
-
RNW.Pressable as unknown as React.ComponentType<Record<string, unknown>>,
|
|
12
|
-
'Pressable'
|
|
13
|
-
);
|
|
14
|
-
export const TouchableOpacity = withNativeWind(
|
|
15
|
-
RNW.TouchableOpacity as unknown as React.ComponentType<Record<string, unknown>>,
|
|
16
|
-
'TouchableOpacity'
|
|
17
|
-
);
|
|
18
|
-
export const TouchableHighlight = withNativeWind(
|
|
19
|
-
RNW.TouchableHighlight as unknown as React.ComponentType<Record<string, unknown>>,
|
|
20
|
-
'TouchableHighlight'
|
|
21
|
-
);
|
|
22
|
-
export const TouchableWithoutFeedback = withNativeWind(
|
|
23
|
-
RNW.TouchableWithoutFeedback as unknown as React.ComponentType<Record<string, unknown>>,
|
|
24
|
-
'TouchableWithoutFeedback'
|
|
25
|
-
);
|
|
26
|
-
export const ScrollView = withNativeWind(
|
|
27
|
-
RNW.ScrollView as unknown as React.ComponentType<Record<string, unknown>>,
|
|
28
|
-
'ScrollView'
|
|
29
|
-
);
|
|
30
|
-
export const FlatList = withNativeWind(
|
|
31
|
-
RNW.FlatList as unknown as React.ComponentType<Record<string, unknown>>,
|
|
32
|
-
'FlatList'
|
|
33
|
-
);
|
|
34
|
-
export const SectionList = withNativeWind(
|
|
35
|
-
RNW.SectionList as unknown as React.ComponentType<Record<string, unknown>>,
|
|
36
|
-
'SectionList'
|
|
37
|
-
);
|
|
38
|
-
export const KeyboardAvoidingView = withNativeWind(
|
|
39
|
-
RNW.KeyboardAvoidingView as unknown as React.ComponentType<Record<string, unknown>>,
|
|
40
|
-
'KeyboardAvoidingView'
|
|
41
|
-
);
|
|
42
|
-
export const TextInput = withNativeWind(
|
|
43
|
-
RNW.TextInput as unknown as React.ComponentType<Record<string, unknown>>,
|
|
44
|
-
'TextInput'
|
|
45
|
-
);
|
|
46
|
-
export const Image = withNativeWind(
|
|
47
|
-
RNW.Image as unknown as React.ComponentType<Record<string, unknown>>,
|
|
48
|
-
'Image'
|
|
49
|
-
);
|
|
50
|
-
export const ImageBackground = withNativeWind(
|
|
51
|
-
RNW.ImageBackground as unknown as React.ComponentType<Record<string, unknown>>,
|
|
52
|
-
'ImageBackground'
|
|
53
|
-
);
|
|
54
|
-
export const SafeAreaView = withNativeWind(
|
|
55
|
-
RNW.SafeAreaView as unknown as React.ComponentType<Record<string, unknown>>,
|
|
56
|
-
'SafeAreaView'
|
|
57
|
-
);
|
|
58
|
-
export const ActivityIndicator = withNativeWind(
|
|
59
|
-
RNW.ActivityIndicator as unknown as React.ComponentType<Record<string, unknown>>,
|
|
60
|
-
'ActivityIndicator'
|
|
61
|
-
);
|
|
62
|
-
export const Modal = withNativeWind(
|
|
63
|
-
RNW.Modal as unknown as React.ComponentType<Record<string, unknown>>,
|
|
64
|
-
'Modal'
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
// Pin mobile artboard dimensions (393x852 iPhone 15 Pro) so Dimensions.get('window')
|
|
68
|
-
// and useWindowDimensions() never return the desktop browser's 1440x900 window size.
|
|
69
|
-
const ARTBOARD_DIMENSIONS = {
|
|
70
|
-
width: 393,
|
|
71
|
-
height: 852,
|
|
72
|
-
scale: 3,
|
|
73
|
-
fontScale: 1,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export const Dimensions = {
|
|
77
|
-
get: (_dim?: 'window' | 'screen' | string) => ARTBOARD_DIMENSIONS,
|
|
78
|
-
set: () => undefined,
|
|
79
|
-
addEventListener: () => ({ remove: () => undefined }),
|
|
80
|
-
removeEventListener: () => undefined,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export function useWindowDimensions() {
|
|
84
|
-
return ARTBOARD_DIMENSIONS;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function useAnimatedValue(initialValue = 0): RNW.Animated.Value {
|
|
88
|
-
const ref = useRef<RNW.Animated.Value | null>(null);
|
|
89
|
-
if (!ref.current) {
|
|
90
|
-
ref.current = new RNW.Animated.Value(initialValue);
|
|
91
|
-
}
|
|
92
|
-
return ref.current;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export const PermissionsAndroid = {
|
|
96
|
-
PERMISSIONS: new Proxy({} as Record<string, string>, {
|
|
97
|
-
get: (_target, prop) => String(prop),
|
|
98
|
-
}),
|
|
99
|
-
RESULTS: {
|
|
100
|
-
GRANTED: 'granted',
|
|
101
|
-
DENIED: 'denied',
|
|
102
|
-
NEVER_ASK_AGAIN: 'never_ask_again',
|
|
103
|
-
},
|
|
104
|
-
check: async () => true,
|
|
105
|
-
request: async () => 'granted',
|
|
106
|
-
requestMultiple: async () => ({}),
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export const ToastAndroid = {
|
|
110
|
-
SHORT: 2000,
|
|
111
|
-
LONG: 3500,
|
|
112
|
-
TOP: 0,
|
|
113
|
-
BOTTOM: 1,
|
|
114
|
-
CENTER: 2,
|
|
115
|
-
show: () => undefined,
|
|
116
|
-
showWithGravity: () => undefined,
|
|
117
|
-
showWithGravityAndOffset: () => undefined,
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
export const ActionSheetIOS = {
|
|
121
|
-
showActionSheetWithOptions: () => undefined,
|
|
122
|
-
showShareActionSheetWithOptions: () => undefined,
|
|
123
|
-
dismissActionSheet: () => undefined,
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export const InputAccessoryView: React.FC<{ children?: React.ReactNode }> = ({ children }) =>
|
|
127
|
-
React.createElement(React.Fragment, null, children);
|
|
128
|
-
|
|
129
|
-
export const DrawerLayoutAndroid: React.FC<{
|
|
130
|
-
children?: React.ReactNode;
|
|
131
|
-
style?: unknown;
|
|
132
|
-
}> = ({ children, style }) =>
|
|
133
|
-
React.createElement(RNW.View, { style: [{ flex: 1 }, style] as never }, children);
|
|
134
|
-
|
|
135
|
-
export const TurboModuleRegistry = {
|
|
136
|
-
get: () => ({}),
|
|
137
|
-
getEnforcing: () => ({}),
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
export function requireNativeComponent(viewName: string) {
|
|
141
|
-
const Comp: React.FC<{ children?: React.ReactNode; style?: unknown }> = ({
|
|
142
|
-
children,
|
|
143
|
-
style,
|
|
144
|
-
}) => React.createElement(RNW.View, { style: style as never }, children);
|
|
145
|
-
Comp.displayName = viewName;
|
|
146
|
-
return Comp;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export const codegenNativeComponent = requireNativeComponent;
|
|
150
|
-
|
|
151
|
-
export function PlatformColor(...names: string[]): string {
|
|
152
|
-
const first = (names[0] ?? '').toLowerCase();
|
|
153
|
-
if (first.includes('background')) return '#0F172A';
|
|
154
|
-
if (first.includes('label') || first.includes('text')) return '#F8FAFC';
|
|
155
|
-
return '#6366F1';
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function DynamicColorIOS(tuple: { light?: string; dark?: string }): string {
|
|
159
|
-
return tuple?.dark ?? tuple?.light ?? '#6366F1';
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export const DevSettings = {
|
|
163
|
-
addMenuItem: () => undefined,
|
|
164
|
-
reload: () => undefined,
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
export const Systrace = {
|
|
168
|
-
isEnabled: () => false,
|
|
169
|
-
beginEvent: () => undefined,
|
|
170
|
-
endEvent: () => undefined,
|
|
171
|
-
beginAsyncEvent: () => 0,
|
|
172
|
-
endAsyncEvent: () => undefined,
|
|
173
|
-
counterEvent: () => undefined,
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
export const Networking = {
|
|
177
|
-
addListener: () => ({ remove: () => undefined }),
|
|
178
|
-
sendRequest: () => undefined,
|
|
179
|
-
abortRequest: () => undefined,
|
|
180
|
-
clearCookies: () => undefined,
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
export const Settings = {
|
|
184
|
-
get: () => undefined,
|
|
185
|
-
set: () => undefined,
|
|
186
|
-
watchKeys: () => 0,
|
|
187
|
-
clearWatch: () => undefined,
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const ReactNativeDefault = new Proxy(
|
|
191
|
-
{
|
|
192
|
-
...RNW,
|
|
193
|
-
View,
|
|
194
|
-
Text,
|
|
195
|
-
Pressable,
|
|
196
|
-
TouchableOpacity,
|
|
197
|
-
TouchableHighlight,
|
|
198
|
-
TouchableWithoutFeedback,
|
|
199
|
-
ScrollView,
|
|
200
|
-
FlatList,
|
|
201
|
-
SectionList,
|
|
202
|
-
KeyboardAvoidingView,
|
|
203
|
-
TextInput,
|
|
204
|
-
Image,
|
|
205
|
-
ImageBackground,
|
|
206
|
-
SafeAreaView,
|
|
207
|
-
ActivityIndicator,
|
|
208
|
-
Modal,
|
|
209
|
-
Dimensions,
|
|
210
|
-
useWindowDimensions,
|
|
211
|
-
useAnimatedValue,
|
|
212
|
-
PermissionsAndroid,
|
|
213
|
-
ToastAndroid,
|
|
214
|
-
ActionSheetIOS,
|
|
215
|
-
InputAccessoryView,
|
|
216
|
-
DrawerLayoutAndroid,
|
|
217
|
-
TurboModuleRegistry,
|
|
218
|
-
requireNativeComponent,
|
|
219
|
-
codegenNativeComponent,
|
|
220
|
-
PlatformColor,
|
|
221
|
-
DynamicColorIOS,
|
|
222
|
-
DevSettings,
|
|
223
|
-
Systrace,
|
|
224
|
-
Networking,
|
|
225
|
-
Settings,
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
get(target, prop) {
|
|
229
|
-
if (prop in target) {
|
|
230
|
-
return target[prop as keyof typeof target];
|
|
231
|
-
}
|
|
232
|
-
if (typeof prop === 'string' && /^[A-Z]/.test(prop)) {
|
|
233
|
-
return requireNativeComponent(prop);
|
|
234
|
-
}
|
|
235
|
-
return () => undefined;
|
|
236
|
-
},
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
|
|
240
|
-
export default ReactNativeDefault;
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
View,
|
|
4
|
-
Text,
|
|
5
|
-
TouchableOpacity,
|
|
6
|
-
StyleSheet,
|
|
7
|
-
} from 'react-native';
|
|
8
|
-
import { useNavigation } from '../runtime/MockNavigationContext';
|
|
9
|
-
|
|
10
|
-
export default function CheckoutScreen() {
|
|
11
|
-
const navigation = useNavigation();
|
|
12
|
-
|
|
13
|
-
return (
|
|
14
|
-
<View style={styles.container}>
|
|
15
|
-
<View style={styles.headerRow}>
|
|
16
|
-
<TouchableOpacity
|
|
17
|
-
activeOpacity={0.78}
|
|
18
|
-
style={styles.backButton}
|
|
19
|
-
onPress={() => navigation.navigate('ProductDetail')}
|
|
20
|
-
>
|
|
21
|
-
<Text style={styles.backButtonText}>← Spec Sheet</Text>
|
|
22
|
-
</TouchableOpacity>
|
|
23
|
-
<Text style={styles.headerTitle}>Dispatch & Settlement</Text>
|
|
24
|
-
</View>
|
|
25
|
-
|
|
26
|
-
<View style={styles.orderCard}>
|
|
27
|
-
<Text style={styles.sectionHeading}>MANIFEST // ORDER #CH-8841</Text>
|
|
28
|
-
<View style={styles.itemRow}>
|
|
29
|
-
<View>
|
|
30
|
-
<Text style={styles.itemName}>Chronos Studio Pro</Text>
|
|
31
|
-
<Text style={styles.itemVariant}>Obsidian Anodized · Unit 01</Text>
|
|
32
|
-
</View>
|
|
33
|
-
<Text style={styles.itemPrice}>$349.00</Text>
|
|
34
|
-
</View>
|
|
35
|
-
|
|
36
|
-
<View style={styles.divider} />
|
|
37
|
-
|
|
38
|
-
<View style={styles.summaryRow}>
|
|
39
|
-
<Text style={styles.summaryLabel}>Priority Courier Dispatch</Text>
|
|
40
|
-
<Text style={styles.summaryFree}>INCLUDED</Text>
|
|
41
|
-
</View>
|
|
42
|
-
<View style={styles.summaryRow}>
|
|
43
|
-
<Text style={styles.summaryLabel}>Import & Acoustic Levy</Text>
|
|
44
|
-
<Text style={styles.summaryValue}>$28.80</Text>
|
|
45
|
-
</View>
|
|
46
|
-
<View style={styles.totalRow}>
|
|
47
|
-
<Text style={styles.totalLabel}>Total Settlement</Text>
|
|
48
|
-
<Text style={styles.totalAmount}>$377.80</Text>
|
|
49
|
-
</View>
|
|
50
|
-
</View>
|
|
51
|
-
|
|
52
|
-
<View style={styles.paymentCard}>
|
|
53
|
-
<Text style={styles.sectionHeading}>CRYPTOGRAPHIC AUTHORIZATION</Text>
|
|
54
|
-
<View style={styles.cardMethodRow}>
|
|
55
|
-
<View style={styles.cardBrandBadge}>
|
|
56
|
-
<Text style={styles.cardBrandText}>G-PAY</Text>
|
|
57
|
-
</View>
|
|
58
|
-
<View>
|
|
59
|
-
<Text style={styles.cardNumber}>Hardware Token ·••• 4829</Text>
|
|
60
|
-
<Text style={styles.cardSub}>Biometric enclave signature ready</Text>
|
|
61
|
-
</View>
|
|
62
|
-
</View>
|
|
63
|
-
</View>
|
|
64
|
-
|
|
65
|
-
<TouchableOpacity
|
|
66
|
-
activeOpacity={0.78}
|
|
67
|
-
style={styles.confirmButton}
|
|
68
|
-
onPress={() => navigation.navigate('Home')}
|
|
69
|
-
>
|
|
70
|
-
<Text style={styles.confirmButtonText}>Authorize $377.80 Settlement</Text>
|
|
71
|
-
</TouchableOpacity>
|
|
72
|
-
</View>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const styles = StyleSheet.create({
|
|
77
|
-
container: {
|
|
78
|
-
flex: 1,
|
|
79
|
-
backgroundColor: '#0A0B0E',
|
|
80
|
-
padding: 20,
|
|
81
|
-
justifyContent: 'space-between',
|
|
82
|
-
},
|
|
83
|
-
headerRow: {
|
|
84
|
-
flexDirection: 'row',
|
|
85
|
-
justifyContent: 'space-between',
|
|
86
|
-
alignItems: 'center',
|
|
87
|
-
marginTop: 6,
|
|
88
|
-
},
|
|
89
|
-
backButton: {
|
|
90
|
-
backgroundColor: '#13161E',
|
|
91
|
-
paddingHorizontal: 12,
|
|
92
|
-
paddingVertical: 9,
|
|
93
|
-
borderRadius: 8,
|
|
94
|
-
borderWidth: 1,
|
|
95
|
-
borderColor: '#222836',
|
|
96
|
-
},
|
|
97
|
-
backButtonText: {
|
|
98
|
-
color: '#E2E8F0',
|
|
99
|
-
fontSize: 12,
|
|
100
|
-
fontWeight: '600',
|
|
101
|
-
},
|
|
102
|
-
headerTitle: {
|
|
103
|
-
color: '#F8FAFC',
|
|
104
|
-
fontSize: 16,
|
|
105
|
-
fontWeight: '700',
|
|
106
|
-
letterSpacing: -0.2,
|
|
107
|
-
},
|
|
108
|
-
orderCard: {
|
|
109
|
-
backgroundColor: '#11141C',
|
|
110
|
-
borderRadius: 16,
|
|
111
|
-
padding: 18,
|
|
112
|
-
gap: 12,
|
|
113
|
-
borderWidth: 1,
|
|
114
|
-
borderColor: '#1E2433',
|
|
115
|
-
},
|
|
116
|
-
sectionHeading: {
|
|
117
|
-
color: '#38BDF8',
|
|
118
|
-
fontSize: 10,
|
|
119
|
-
fontWeight: '700',
|
|
120
|
-
letterSpacing: 1,
|
|
121
|
-
},
|
|
122
|
-
itemRow: {
|
|
123
|
-
flexDirection: 'row',
|
|
124
|
-
justifyContent: 'space-between',
|
|
125
|
-
alignItems: 'center',
|
|
126
|
-
},
|
|
127
|
-
itemName: {
|
|
128
|
-
color: '#F8FAFC',
|
|
129
|
-
fontSize: 15,
|
|
130
|
-
fontWeight: '600',
|
|
131
|
-
},
|
|
132
|
-
itemVariant: {
|
|
133
|
-
color: '#64748B',
|
|
134
|
-
fontSize: 12,
|
|
135
|
-
marginTop: 2,
|
|
136
|
-
},
|
|
137
|
-
itemPrice: {
|
|
138
|
-
color: '#F8FAFC',
|
|
139
|
-
fontSize: 15,
|
|
140
|
-
fontWeight: '700',
|
|
141
|
-
},
|
|
142
|
-
divider: {
|
|
143
|
-
height: 1,
|
|
144
|
-
backgroundColor: '#1E2433',
|
|
145
|
-
marginVertical: 4,
|
|
146
|
-
},
|
|
147
|
-
summaryRow: {
|
|
148
|
-
flexDirection: 'row',
|
|
149
|
-
justifyContent: 'space-between',
|
|
150
|
-
},
|
|
151
|
-
summaryLabel: {
|
|
152
|
-
color: '#94A3B8',
|
|
153
|
-
fontSize: 13,
|
|
154
|
-
},
|
|
155
|
-
summaryFree: {
|
|
156
|
-
color: '#10B981',
|
|
157
|
-
fontSize: 11,
|
|
158
|
-
fontWeight: '700',
|
|
159
|
-
letterSpacing: 0.6,
|
|
160
|
-
},
|
|
161
|
-
summaryValue: {
|
|
162
|
-
color: '#E2E8F0',
|
|
163
|
-
fontSize: 13,
|
|
164
|
-
fontWeight: '600',
|
|
165
|
-
},
|
|
166
|
-
totalRow: {
|
|
167
|
-
flexDirection: 'row',
|
|
168
|
-
justifyContent: 'space-between',
|
|
169
|
-
alignItems: 'center',
|
|
170
|
-
marginTop: 4,
|
|
171
|
-
},
|
|
172
|
-
totalLabel: {
|
|
173
|
-
color: '#F8FAFC',
|
|
174
|
-
fontSize: 14,
|
|
175
|
-
fontWeight: '700',
|
|
176
|
-
},
|
|
177
|
-
totalAmount: {
|
|
178
|
-
color: '#38BDF8',
|
|
179
|
-
fontSize: 20,
|
|
180
|
-
fontWeight: '700',
|
|
181
|
-
},
|
|
182
|
-
paymentCard: {
|
|
183
|
-
backgroundColor: '#11141C',
|
|
184
|
-
borderRadius: 14,
|
|
185
|
-
padding: 16,
|
|
186
|
-
gap: 10,
|
|
187
|
-
borderWidth: 1,
|
|
188
|
-
borderColor: '#1E2433',
|
|
189
|
-
},
|
|
190
|
-
cardMethodRow: {
|
|
191
|
-
flexDirection: 'row',
|
|
192
|
-
alignItems: 'center',
|
|
193
|
-
gap: 12,
|
|
194
|
-
},
|
|
195
|
-
cardBrandBadge: {
|
|
196
|
-
backgroundColor: '#161A26',
|
|
197
|
-
borderWidth: 1,
|
|
198
|
-
borderColor: '#262D3D',
|
|
199
|
-
paddingHorizontal: 10,
|
|
200
|
-
paddingVertical: 8,
|
|
201
|
-
borderRadius: 7,
|
|
202
|
-
},
|
|
203
|
-
cardBrandText: {
|
|
204
|
-
color: '#38BDF8',
|
|
205
|
-
fontSize: 10,
|
|
206
|
-
fontWeight: '700',
|
|
207
|
-
letterSpacing: 0.8,
|
|
208
|
-
},
|
|
209
|
-
cardNumber: {
|
|
210
|
-
color: '#F8FAFC',
|
|
211
|
-
fontSize: 14,
|
|
212
|
-
fontWeight: '600',
|
|
213
|
-
},
|
|
214
|
-
cardSub: {
|
|
215
|
-
color: '#64748B',
|
|
216
|
-
fontSize: 12,
|
|
217
|
-
},
|
|
218
|
-
confirmButton: {
|
|
219
|
-
backgroundColor: '#F8FAFC',
|
|
220
|
-
borderRadius: 10,
|
|
221
|
-
paddingVertical: 15,
|
|
222
|
-
alignItems: 'center',
|
|
223
|
-
},
|
|
224
|
-
confirmButtonText: {
|
|
225
|
-
color: '#08090C',
|
|
226
|
-
fontSize: 14,
|
|
227
|
-
fontWeight: '700',
|
|
228
|
-
},
|
|
229
|
-
});
|