@zezosoft/zezo-ott-react-native-ui-kit 1.0.7 → 1.0.9

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 (113) hide show
  1. package/README.md +1 -1
  2. package/lib/module/components/Account/Account.js +1 -1
  3. package/lib/module/components/Account/Account.js.map +1 -1
  4. package/lib/module/components/Auth/AuthProvider/AuthProvider.js +48 -19
  5. package/lib/module/components/Auth/AuthProvider/AuthProvider.js.map +1 -1
  6. package/lib/module/components/Auth/Login/LoginWithEmail.js +4 -2
  7. package/lib/module/components/Auth/Login/LoginWithEmail.js.map +1 -1
  8. package/lib/module/components/Auth/OTP/OTP.js +15 -1
  9. package/lib/module/components/Auth/OTP/OTP.js.map +1 -1
  10. package/lib/module/components/Auth/SignUp/SignUp.js +4 -2
  11. package/lib/module/components/Auth/SignUp/SignUp.js.map +1 -1
  12. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js +6 -32
  13. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js.map +1 -1
  14. package/lib/module/components/BlurView/BlurView.js +171 -0
  15. package/lib/module/components/BlurView/BlurView.js.map +1 -0
  16. package/lib/module/components/BlurView/index.js +9 -0
  17. package/lib/module/components/BlurView/index.js.map +1 -0
  18. package/lib/module/components/Content/Card/Styles/Four.js +1 -1
  19. package/lib/module/components/Content/Card/Styles/Four.js.map +1 -1
  20. package/lib/module/components/Content/Content.js +4 -2
  21. package/lib/module/components/Content/Content.js.map +1 -1
  22. package/lib/module/components/ContentView/ContentView.js +4 -2
  23. package/lib/module/components/ContentView/ContentView.js.map +1 -1
  24. package/lib/module/components/ContentView/components/MiniInfo.js +64 -19
  25. package/lib/module/components/ContentView/components/MiniInfo.js.map +1 -1
  26. package/lib/module/components/Settings/AppSettings.js +1 -1
  27. package/lib/module/components/Settings/AppSettings.js.map +1 -1
  28. package/lib/module/components/Subscription/SubOne.js +353 -19
  29. package/lib/module/components/Subscription/SubOne.js.map +1 -1
  30. package/lib/module/components/TabBar/One.js +71 -108
  31. package/lib/module/components/TabBar/One.js.map +1 -1
  32. package/lib/module/components/TabBar/Three.js +63 -78
  33. package/lib/module/components/TabBar/Three.js.map +1 -1
  34. package/lib/module/components/TabBar/Two.js +110 -106
  35. package/lib/module/components/TabBar/Two.js.map +1 -1
  36. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js +324 -0
  37. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js.map +1 -0
  38. package/lib/module/components/User/index.js +2 -1
  39. package/lib/module/components/User/index.js.map +1 -1
  40. package/lib/module/components/index.js +1 -0
  41. package/lib/module/components/index.js.map +1 -1
  42. package/lib/module/hooks/useNavigationMode.js +34 -0
  43. package/lib/module/hooks/useNavigationMode.js.map +1 -0
  44. package/lib/module/utils/Spacing.js +26 -0
  45. package/lib/module/utils/Spacing.js.map +1 -0
  46. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts +1 -0
  47. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts.map +1 -1
  48. package/lib/typescript/src/components/Auth/Login/LoginWithEmail.d.ts.map +1 -1
  49. package/lib/typescript/src/components/Auth/OTP/OTP.d.ts +2 -0
  50. package/lib/typescript/src/components/Auth/OTP/OTP.d.ts.map +1 -1
  51. package/lib/typescript/src/components/Auth/SignUp/SignUp.d.ts.map +1 -1
  52. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts.map +1 -1
  53. package/lib/typescript/src/components/Auth/index.d.ts +2 -0
  54. package/lib/typescript/src/components/Auth/index.d.ts.map +1 -1
  55. package/lib/typescript/src/components/BlurView/BlurView.d.ts +48 -0
  56. package/lib/typescript/src/components/BlurView/BlurView.d.ts.map +1 -0
  57. package/lib/typescript/src/components/BlurView/index.d.ts +7 -0
  58. package/lib/typescript/src/components/BlurView/index.d.ts.map +1 -0
  59. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts.map +1 -1
  60. package/lib/typescript/src/components/Content/Content.d.ts.map +1 -1
  61. package/lib/typescript/src/components/ContentView/ContentView.d.ts +1 -1
  62. package/lib/typescript/src/components/ContentView/ContentView.d.ts.map +1 -1
  63. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts +17 -1
  64. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts.map +1 -1
  65. package/lib/typescript/src/components/Subscription/SubOne.d.ts +6 -0
  66. package/lib/typescript/src/components/Subscription/SubOne.d.ts.map +1 -1
  67. package/lib/typescript/src/components/Subscription/index.d.ts.map +1 -1
  68. package/lib/typescript/src/components/TabBar/One.d.ts +2 -2
  69. package/lib/typescript/src/components/TabBar/One.d.ts.map +1 -1
  70. package/lib/typescript/src/components/TabBar/Three.d.ts +3 -2
  71. package/lib/typescript/src/components/TabBar/Three.d.ts.map +1 -1
  72. package/lib/typescript/src/components/TabBar/Two.d.ts +13 -4
  73. package/lib/typescript/src/components/TabBar/Two.d.ts.map +1 -1
  74. package/lib/typescript/src/components/TabBar/index.d.ts +1 -1
  75. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts +50 -0
  76. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts.map +1 -0
  77. package/lib/typescript/src/components/User/index.d.ts +2 -1
  78. package/lib/typescript/src/components/User/index.d.ts.map +1 -1
  79. package/lib/typescript/src/components/index.d.ts +1 -0
  80. package/lib/typescript/src/components/index.d.ts.map +1 -1
  81. package/lib/typescript/src/hooks/useNavigationMode.d.ts +14 -0
  82. package/lib/typescript/src/hooks/useNavigationMode.d.ts.map +1 -0
  83. package/lib/typescript/src/types/content/content-view.types.d.ts +2 -0
  84. package/lib/typescript/src/types/content/content-view.types.d.ts.map +1 -1
  85. package/lib/typescript/src/types/content/index.d.ts +1 -1
  86. package/lib/typescript/src/types/content/index.d.ts.map +1 -1
  87. package/lib/typescript/src/utils/Spacing.d.ts +16 -0
  88. package/lib/typescript/src/utils/Spacing.d.ts.map +1 -0
  89. package/package.json +9 -5
  90. package/src/components/Account/Account.tsx +1 -1
  91. package/src/components/Auth/AuthProvider/AuthProvider.tsx +82 -37
  92. package/src/components/Auth/Login/LoginWithEmail.tsx +9 -2
  93. package/src/components/Auth/OTP/OTP.tsx +37 -1
  94. package/src/components/Auth/SignUp/SignUp.tsx +9 -2
  95. package/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.tsx +2 -33
  96. package/src/components/BlurView/BlurView.tsx +199 -0
  97. package/src/components/BlurView/index.ts +7 -0
  98. package/src/components/Content/Card/Styles/Four.tsx +3 -1
  99. package/src/components/Content/Content.tsx +5 -4
  100. package/src/components/ContentView/ContentView.tsx +8 -1
  101. package/src/components/ContentView/components/MiniInfo.tsx +99 -22
  102. package/src/components/Settings/AppSettings.tsx +1 -1
  103. package/src/components/Subscription/SubOne.tsx +431 -16
  104. package/src/components/TabBar/One.tsx +79 -141
  105. package/src/components/TabBar/Three.tsx +84 -99
  106. package/src/components/TabBar/Two.tsx +139 -110
  107. package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +439 -0
  108. package/src/components/User/index.ts +8 -1
  109. package/src/components/index.ts +1 -0
  110. package/src/hooks/useNavigationMode.ts +35 -0
  111. package/src/types/content/content-view.types.ts +5 -0
  112. package/src/types/content/index.ts +1 -5
  113. package/src/utils/Spacing.ts +27 -0
@@ -3,18 +3,22 @@
3
3
  * @lastModified Mon 21 Jul 2025 at 04:55 PM
4
4
  */
5
5
 
6
- import React, { memo, useCallback, useMemo } from 'react';
6
+ import React, { memo, useCallback, useMemo, useState } from 'react';
7
7
  import {
8
8
  View,
9
9
  StyleSheet,
10
10
  TouchableOpacity,
11
11
  ActivityIndicator,
12
+ ScrollView,
13
+ Dimensions,
12
14
  } from 'react-native';
13
15
  import Carousel from 'react-native-reanimated-carousel';
14
- import { scale, verticalScale } from 'react-native-size-matters';
16
+ import { scale, verticalScale, moderateScale } from 'react-native-size-matters';
15
17
  import LinearGradient from 'react-native-linear-gradient';
16
18
  import SkeletonPlaceholder from 'react-native-skeleton-placeholder';
17
19
  import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
20
+ import Modal from 'react-native-modal';
21
+ import { X } from 'lucide-react-native';
18
22
  import { Text } from '../Text';
19
23
  import AppHeader from '../Headers/AppHeader';
20
24
  import { useInternalTheme } from '../../theme/hook/useInternalTheme';
@@ -30,6 +34,12 @@ export type Plan = {
30
34
  platforms: string;
31
35
  benefits?: string[];
32
36
  isPopular?: boolean;
37
+ extraDetails?: {
38
+ description?: string;
39
+ features?: string[];
40
+ terms?: string;
41
+ [key: string]: any;
42
+ };
33
43
  };
34
44
 
35
45
  type SubscriptionSliderOneProps = {
@@ -62,7 +72,7 @@ const SubscriptionSliderOne = ({
62
72
  subscribeButtonText = 'Subscribe',
63
73
  subscribeLoadingId,
64
74
  plans,
65
- errorMessage,
75
+ errorMessage = 'Something went wrong',
66
76
  isLoading = false,
67
77
  onBackPress = () => {},
68
78
  header,
@@ -71,6 +81,8 @@ const SubscriptionSliderOne = ({
71
81
  }: SubscriptionSliderOneProps) => {
72
82
  const { theme: appliedTheme } = useInternalTheme(theme);
73
83
  const colors = appliedTheme.colors;
84
+ const [selectedPlan, setSelectedPlan] = useState<Plan | null>(null);
85
+ const [isModalVisible, setIsModalVisible] = useState(false);
74
86
  const parsePrice = (price: string) =>
75
87
  parseFloat(price.replace(/[^\d.]/g, '')) || 0;
76
88
  const sortedPlans = useMemo(() => {
@@ -113,6 +125,16 @@ const SubscriptionSliderOne = ({
113
125
  [colors.skeletonBaseColor, colors.skeletonHighlightColor]
114
126
  );
115
127
 
128
+ const openDetailsModal = useCallback((plan: Plan) => {
129
+ setSelectedPlan(plan);
130
+ setIsModalVisible(true);
131
+ }, []);
132
+
133
+ const closeDetailsModal = useCallback(() => {
134
+ setIsModalVisible(false);
135
+ setSelectedPlan(null);
136
+ }, []);
137
+
116
138
  const renderPlan = useCallback(
117
139
  ({ item }: { item: Plan }) => (
118
140
  <View style={styles.cardContainer}>
@@ -133,7 +155,10 @@ const SubscriptionSliderOne = ({
133
155
  </View>
134
156
  )}
135
157
 
136
- <Text style={[styles.cardTitle, { color: colors.white }]}>
158
+ <Text
159
+ numberOfLines={1}
160
+ style={[styles.cardTitle, { color: colors.white }]}
161
+ >
137
162
  {item.title}
138
163
  </Text>
139
164
  <Text style={[styles.price, { color: colors.white }]}>
@@ -147,13 +172,30 @@ const SubscriptionSliderOne = ({
147
172
  </Text>
148
173
  {!!item.benefits?.length && (
149
174
  <View style={styles.benefitsContainer}>
150
- {item.benefits.map((benefit, i) => (
151
- <Text key={i} style={[styles.benefit, { color: colors.white }]}>
175
+ {item.benefits.slice(0, 4).map((benefit, i) => (
176
+ <Text
177
+ key={i}
178
+ numberOfLines={1}
179
+ style={[styles.benefit, { color: colors.white }]}
180
+ >
152
181
  • {benefit}
153
182
  </Text>
154
183
  ))}
155
184
  </View>
156
185
  )}
186
+ {(item.benefits?.length || item.extraDetails) && (
187
+ <TouchableOpacity
188
+ style={styles.viewDetailsButton}
189
+ onPress={() => openDetailsModal(item)}
190
+ activeOpacity={0.7}
191
+ >
192
+ <Text style={[styles.viewDetailsText, { color: colors.white }]}>
193
+ {item.benefits && item.benefits.length > 4
194
+ ? 'View More Details'
195
+ : 'View Details'}
196
+ </Text>
197
+ </TouchableOpacity>
198
+ )}
157
199
  <TouchableOpacity
158
200
  style={[styles.subscribeButton, { backgroundColor: colors.button }]}
159
201
  onPress={() => onSubscribe?.(item)}
@@ -182,6 +224,7 @@ const SubscriptionSliderOne = ({
182
224
  onSubscribe,
183
225
  subscribeButtonText,
184
226
  subscribeLoadingId,
227
+ openDetailsModal,
185
228
  ]
186
229
  );
187
230
 
@@ -201,10 +244,10 @@ const SubscriptionSliderOne = ({
201
244
  {header.subTitle}
202
245
  </Text>
203
246
 
204
- {errorMessage ? (
205
- <Text style={[styles.errorMessage, { color: colors.error }]}>
206
- {errorMessage}
207
- </Text>
247
+ {!plans || (plans.length === 0 && !isLoading && errorMessage) ? (
248
+ <View style={styles.errorMessage}>
249
+ <Text style={{ color: colors.error }}>{errorMessage}</Text>
250
+ </View>
208
251
  ) : (
209
252
  <Carousel
210
253
  width={CAROUSEL_WIDTH}
@@ -247,6 +290,228 @@ const SubscriptionSliderOne = ({
247
290
  )}
248
291
  </View>
249
292
  )}
293
+
294
+ {/* Details Modal */}
295
+ <Modal
296
+ isVisible={isModalVisible}
297
+ onBackdropPress={closeDetailsModal}
298
+ onBackButtonPress={closeDetailsModal}
299
+ backdropOpacity={0.35}
300
+ useNativeDriver={true}
301
+ onSwipeComplete={closeDetailsModal}
302
+ propagateSwipe
303
+ style={styles.modal}
304
+ >
305
+ <View
306
+ style={[styles.modalContent, { backgroundColor: colors.surface }]}
307
+ >
308
+ <View style={styles.modalHeader}>
309
+ <Text style={[styles.modalTitle, { color: colors.textPrimary }]}>
310
+ {selectedPlan?.title || 'Plan Details'}
311
+ </Text>
312
+ <TouchableOpacity
313
+ onPress={closeDetailsModal}
314
+ style={[
315
+ styles.modalCloseButton,
316
+ { backgroundColor: colors.background },
317
+ ]}
318
+ activeOpacity={0.7}
319
+ >
320
+ <X size={scale(20)} color={colors.textPrimary} />
321
+ </TouchableOpacity>
322
+ </View>
323
+
324
+ <ScrollView
325
+ style={styles.modalScrollView}
326
+ contentContainerStyle={styles.modalScrollContent}
327
+ showsVerticalScrollIndicator={false}
328
+ bounces={false}
329
+ scrollEventThrottle={16}
330
+ keyboardShouldPersistTaps="handled"
331
+ removeClippedSubviews={false}
332
+ nestedScrollEnabled={true}
333
+ >
334
+ {selectedPlan && (
335
+ <>
336
+ <View style={[styles.modalSection, styles.modalFirstSection]}>
337
+ <View
338
+ style={[
339
+ styles.priceHighlightBox,
340
+ { backgroundColor: colors.background },
341
+ ]}
342
+ >
343
+ <Text
344
+ style={[
345
+ styles.modalPriceLabel,
346
+ { color: colors.textSecondary },
347
+ ]}
348
+ >
349
+ PRICING
350
+ </Text>
351
+ <Text
352
+ style={[
353
+ styles.modalPriceValue,
354
+ { color: colors.primary },
355
+ ]}
356
+ >
357
+ {selectedPlan.price}
358
+ </Text>
359
+ <Text
360
+ style={[
361
+ styles.modalPriceDuration,
362
+ { color: colors.textSecondary },
363
+ ]}
364
+ >
365
+ per {selectedPlan.duration}
366
+ </Text>
367
+ </View>
368
+ </View>
369
+
370
+ <View style={[styles.modalSection]}>
371
+ <Text
372
+ style={[
373
+ styles.modalSectionTitle,
374
+ { color: colors.textPrimary },
375
+ ]}
376
+ >
377
+ Available On
378
+ </Text>
379
+ <View
380
+ style={[
381
+ styles.platformBadge,
382
+ {
383
+ backgroundColor: colors.surface,
384
+ borderColor: colors.primary,
385
+ },
386
+ ]}
387
+ >
388
+ <Text
389
+ style={[
390
+ styles.platformBadgeText,
391
+ { color: colors.textPrimary },
392
+ ]}
393
+ >
394
+ {selectedPlan.platforms}
395
+ </Text>
396
+ </View>
397
+ </View>
398
+
399
+ {selectedPlan.benefits &&
400
+ selectedPlan.benefits.length > 0 && (
401
+ <View style={styles.modalSection}>
402
+ <Text
403
+ style={[
404
+ styles.modalSectionTitle,
405
+ { color: colors.textPrimary },
406
+ ]}
407
+ >
408
+ Benefits
409
+ </Text>
410
+ {selectedPlan.benefits.map((benefit, index) => (
411
+ <View key={index} style={styles.benefitRow}>
412
+ <Text
413
+ style={[
414
+ styles.benefitBullet,
415
+ { color: colors.primary },
416
+ ]}
417
+ >
418
+
419
+ </Text>
420
+ <Text
421
+ style={[
422
+ styles.benefitText,
423
+ { color: colors.textSecondary },
424
+ ]}
425
+ >
426
+ {benefit}
427
+ </Text>
428
+ </View>
429
+ ))}
430
+ </View>
431
+ )}
432
+
433
+ {selectedPlan.extraDetails?.description && (
434
+ <View style={styles.modalSection}>
435
+ <Text
436
+ style={[
437
+ styles.modalSectionTitle,
438
+ { color: colors.textPrimary },
439
+ ]}
440
+ >
441
+ Description
442
+ </Text>
443
+ <Text
444
+ style={[
445
+ styles.modalSectionValue,
446
+ { color: colors.textSecondary },
447
+ ]}
448
+ >
449
+ {selectedPlan.extraDetails.description}
450
+ </Text>
451
+ </View>
452
+ )}
453
+
454
+ {selectedPlan.extraDetails?.features &&
455
+ selectedPlan.extraDetails.features.length > 0 && (
456
+ <View style={styles.modalSection}>
457
+ <Text
458
+ style={[
459
+ styles.modalSectionTitle,
460
+ { color: colors.textPrimary },
461
+ ]}
462
+ >
463
+ Features
464
+ </Text>
465
+ {selectedPlan.extraDetails.features.map(
466
+ (feature, index) => (
467
+ <View key={index} style={styles.benefitRow}>
468
+ <Text
469
+ style={[
470
+ styles.benefitBullet,
471
+ { color: colors.primary },
472
+ ]}
473
+ >
474
+
475
+ </Text>
476
+ <Text
477
+ style={[
478
+ styles.benefitText,
479
+ { color: colors.textSecondary },
480
+ ]}
481
+ >
482
+ {feature}
483
+ </Text>
484
+ </View>
485
+ )
486
+ )}
487
+ </View>
488
+ )}
489
+
490
+ {selectedPlan.extraDetails?.terms && (
491
+ <View style={styles.modalSection}>
492
+ <Text
493
+ style={[
494
+ styles.modalSectionTitle,
495
+ { color: colors.textPrimary },
496
+ ]}
497
+ >
498
+ Terms & Conditions
499
+ </Text>
500
+ <Text
501
+ style={[
502
+ styles.modalSectionValue,
503
+ { color: colors.textSecondary },
504
+ ]}
505
+ >
506
+ {selectedPlan.extraDetails.terms}
507
+ </Text>
508
+ </View>
509
+ )}
510
+ </>
511
+ )}
512
+ </ScrollView>
513
+ </View>
514
+ </Modal>
250
515
  </View>
251
516
  </View>
252
517
  );
@@ -276,9 +541,13 @@ const styles = StyleSheet.create({
276
541
  marginHorizontal: scale(16),
277
542
  },
278
543
  errorMessage: {
544
+ height: CAROUSEL_HEIGHT,
279
545
  fontSize: RFValue(13),
280
546
  fontWeight: '600',
281
547
  textAlign: 'center',
548
+ textAlignVertical: 'center',
549
+ justifyContent: 'center',
550
+ alignItems: 'center',
282
551
  marginVertical: verticalScale(12),
283
552
  },
284
553
 
@@ -302,7 +571,10 @@ const styles = StyleSheet.create({
302
571
  cardTitle: {
303
572
  fontSize: RFValue(17),
304
573
  fontWeight: '700',
574
+ maxWidth: '50%',
575
+ marginHorizontal: 'auto',
305
576
  marginBottom: verticalScale(8),
577
+ textAlign: 'center',
306
578
  },
307
579
  price: {
308
580
  fontSize: RFValue(43),
@@ -324,7 +596,8 @@ const styles = StyleSheet.create({
324
596
  marginTop: verticalScale(8),
325
597
  alignItems: 'flex-start',
326
598
  justifyContent: 'center',
327
- paddingHorizontal: scale(16),
599
+ width: '60%',
600
+ marginHorizontal: 'auto',
328
601
  },
329
602
  benefit: {
330
603
  fontSize: RFValue(12),
@@ -368,16 +641,158 @@ const styles = StyleSheet.create({
368
641
  },
369
642
  popularBadge: {
370
643
  position: 'absolute',
371
- top: verticalScale(12),
372
- right: scale(12),
373
- paddingHorizontal: scale(10),
374
- paddingVertical: verticalScale(4),
644
+ top: verticalScale(10),
645
+ right: scale(10),
646
+ paddingHorizontal: scale(6),
647
+ paddingVertical: verticalScale(3),
375
648
  borderRadius: scale(12),
376
649
  zIndex: 10,
377
650
  },
378
651
  popularText: {
379
- fontSize: RFValue(12),
652
+ fontSize: RFValue(9),
380
653
  textTransform: 'uppercase',
381
654
  fontWeight: '700',
382
655
  },
656
+ viewDetailsButton: {
657
+ marginTop: verticalScale(8),
658
+ paddingVertical: verticalScale(6),
659
+ paddingHorizontal: scale(20),
660
+ alignItems: 'center',
661
+ justifyContent: 'center',
662
+ },
663
+ viewDetailsText: {
664
+ fontSize: RFValue(12),
665
+ fontWeight: '600',
666
+ textDecorationLine: 'underline',
667
+ },
668
+ modal: {
669
+ margin: 0,
670
+ justifyContent: 'flex-end',
671
+ zIndex: 1000,
672
+ },
673
+
674
+ modalContent: {
675
+ borderTopLeftRadius: moderateScale(24),
676
+ borderTopRightRadius: moderateScale(24),
677
+ maxHeight: Dimensions.get('window').height * 0.85,
678
+ minHeight: Dimensions.get('window').height * 0.4,
679
+ paddingBottom: verticalScale(20),
680
+ shadowColor: '#000',
681
+ shadowOffset: { width: 0, height: -4 },
682
+ shadowOpacity: 0.15,
683
+ shadowRadius: 12,
684
+ elevation: 8,
685
+ overflow: 'hidden',
686
+ },
687
+ modalHeader: {
688
+ flexDirection: 'row',
689
+ justifyContent: 'space-between',
690
+ alignItems: 'center',
691
+ paddingHorizontal: scale(20),
692
+ paddingTop: verticalScale(16),
693
+ paddingBottom: verticalScale(5),
694
+ borderBottomWidth: StyleSheet.hairlineWidth,
695
+ borderBottomColor: 'rgba(0,0,0,0.08)',
696
+ },
697
+ modalTitle: {
698
+ fontSize: RFValue(17),
699
+ fontWeight: '700',
700
+ flex: 1,
701
+ letterSpacing: 0.2,
702
+ },
703
+ modalCloseButton: {
704
+ width: scale(30),
705
+ height: scale(30),
706
+ borderRadius: scale(20),
707
+ justifyContent: 'center',
708
+ alignItems: 'center',
709
+ marginLeft: scale(12),
710
+ },
711
+ modalScrollView: {
712
+ paddingHorizontal: scale(20),
713
+ paddingTop: verticalScale(16),
714
+ },
715
+ modalScrollContent: {
716
+ paddingBottom: verticalScale(24),
717
+ flexGrow: 1,
718
+ },
719
+ modalSection: {
720
+ marginBottom: verticalScale(10),
721
+ paddingBottom: verticalScale(16),
722
+ borderBottomWidth: StyleSheet.hairlineWidth,
723
+ borderBottomColor: 'rgba(0,0,0,0.06)',
724
+ },
725
+ modalFirstSection: {
726
+ marginTop: 0,
727
+ },
728
+ modalSectionTitle: {
729
+ fontSize: RFValue(15),
730
+ fontWeight: '700',
731
+ marginBottom: verticalScale(10),
732
+ letterSpacing: 0.3,
733
+ opacity: 0.9,
734
+ },
735
+ modalSectionValue: {
736
+ fontSize: RFValue(15),
737
+ lineHeight: RFValue(20),
738
+ letterSpacing: 0.2,
739
+ opacity: 0.85,
740
+ },
741
+ benefitRow: {
742
+ flexDirection: 'row',
743
+ alignItems: 'center',
744
+ marginBottom: verticalScale(10),
745
+ paddingRight: scale(8),
746
+ paddingLeft: scale(4),
747
+ },
748
+ benefitBullet: {
749
+ fontSize: RFValue(16),
750
+ marginRight: scale(10),
751
+ fontWeight: '600',
752
+ },
753
+ benefitText: {
754
+ fontSize: RFValue(12),
755
+ flex: 1,
756
+ letterSpacing: 0.2,
757
+ textTransform: 'capitalize',
758
+ opacity: 0.85,
759
+ },
760
+ priceHighlightBox: {
761
+ borderRadius: scale(16),
762
+ padding: scale(20),
763
+ alignItems: 'center',
764
+ justifyContent: 'center',
765
+ },
766
+ modalPriceLabel: {
767
+ fontSize: RFValue(12),
768
+ fontWeight: '700',
769
+ letterSpacing: 1.2,
770
+ marginBottom: verticalScale(8),
771
+ opacity: 0.7,
772
+ },
773
+ modalPriceValue: {
774
+ fontSize: RFValue(36),
775
+ fontWeight: '800',
776
+ marginBottom: verticalScale(4),
777
+ letterSpacing: -0.5,
778
+ },
779
+ modalPriceDuration: {
780
+ fontSize: RFValue(14),
781
+ fontWeight: '500',
782
+ opacity: 0.7,
783
+ },
784
+ platformBadge: {
785
+ alignSelf: 'flex-start',
786
+ paddingHorizontal: scale(12),
787
+ paddingVertical: verticalScale(8),
788
+ borderRadius: scale(12),
789
+ borderWidth: 1,
790
+ borderColor: 'rgba(0,0,0,0.08)',
791
+ },
792
+ platformBadgeText: {
793
+ fontSize: RFValue(12),
794
+ fontWeight: '600',
795
+ letterSpacing: 0.3,
796
+ textTransform: 'capitalize',
797
+ },
383
798
  });