@zezosoft/zezo-ott-react-native-ui-kit 1.0.8 → 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 (106) 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/BlurView/BlurView.js +171 -0
  13. package/lib/module/components/BlurView/BlurView.js.map +1 -0
  14. package/lib/module/components/BlurView/index.js +9 -0
  15. package/lib/module/components/BlurView/index.js.map +1 -0
  16. package/lib/module/components/Content/Card/Styles/Four.js +1 -1
  17. package/lib/module/components/Content/Card/Styles/Four.js.map +1 -1
  18. package/lib/module/components/Content/Content.js +4 -2
  19. package/lib/module/components/Content/Content.js.map +1 -1
  20. package/lib/module/components/ContentView/ContentView.js +4 -2
  21. package/lib/module/components/ContentView/ContentView.js.map +1 -1
  22. package/lib/module/components/ContentView/components/MiniInfo.js +64 -19
  23. package/lib/module/components/ContentView/components/MiniInfo.js.map +1 -1
  24. package/lib/module/components/Settings/AppSettings.js +1 -1
  25. package/lib/module/components/Settings/AppSettings.js.map +1 -1
  26. package/lib/module/components/Subscription/SubOne.js +340 -13
  27. package/lib/module/components/Subscription/SubOne.js.map +1 -1
  28. package/lib/module/components/TabBar/One.js +71 -108
  29. package/lib/module/components/TabBar/One.js.map +1 -1
  30. package/lib/module/components/TabBar/Three.js +63 -78
  31. package/lib/module/components/TabBar/Three.js.map +1 -1
  32. package/lib/module/components/TabBar/Two.js +110 -106
  33. package/lib/module/components/TabBar/Two.js.map +1 -1
  34. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js +324 -0
  35. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js.map +1 -0
  36. package/lib/module/components/User/index.js +2 -1
  37. package/lib/module/components/User/index.js.map +1 -1
  38. package/lib/module/components/index.js +1 -0
  39. package/lib/module/components/index.js.map +1 -1
  40. package/lib/module/hooks/useNavigationMode.js +34 -0
  41. package/lib/module/hooks/useNavigationMode.js.map +1 -0
  42. package/lib/module/utils/Spacing.js +26 -0
  43. package/lib/module/utils/Spacing.js.map +1 -0
  44. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts +1 -0
  45. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts.map +1 -1
  46. package/lib/typescript/src/components/Auth/Login/LoginWithEmail.d.ts.map +1 -1
  47. package/lib/typescript/src/components/Auth/OTP/OTP.d.ts +2 -0
  48. package/lib/typescript/src/components/Auth/OTP/OTP.d.ts.map +1 -1
  49. package/lib/typescript/src/components/Auth/SignUp/SignUp.d.ts.map +1 -1
  50. package/lib/typescript/src/components/Auth/index.d.ts +2 -0
  51. package/lib/typescript/src/components/Auth/index.d.ts.map +1 -1
  52. package/lib/typescript/src/components/BlurView/BlurView.d.ts +48 -0
  53. package/lib/typescript/src/components/BlurView/BlurView.d.ts.map +1 -0
  54. package/lib/typescript/src/components/BlurView/index.d.ts +7 -0
  55. package/lib/typescript/src/components/BlurView/index.d.ts.map +1 -0
  56. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts.map +1 -1
  57. package/lib/typescript/src/components/Content/Content.d.ts.map +1 -1
  58. package/lib/typescript/src/components/ContentView/ContentView.d.ts +1 -1
  59. package/lib/typescript/src/components/ContentView/ContentView.d.ts.map +1 -1
  60. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts +17 -1
  61. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts.map +1 -1
  62. package/lib/typescript/src/components/Subscription/SubOne.d.ts +6 -0
  63. package/lib/typescript/src/components/Subscription/SubOne.d.ts.map +1 -1
  64. package/lib/typescript/src/components/Subscription/index.d.ts.map +1 -1
  65. package/lib/typescript/src/components/TabBar/One.d.ts +2 -2
  66. package/lib/typescript/src/components/TabBar/One.d.ts.map +1 -1
  67. package/lib/typescript/src/components/TabBar/Three.d.ts +3 -2
  68. package/lib/typescript/src/components/TabBar/Three.d.ts.map +1 -1
  69. package/lib/typescript/src/components/TabBar/Two.d.ts +13 -4
  70. package/lib/typescript/src/components/TabBar/Two.d.ts.map +1 -1
  71. package/lib/typescript/src/components/TabBar/index.d.ts +1 -1
  72. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts +50 -0
  73. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts.map +1 -0
  74. package/lib/typescript/src/components/User/index.d.ts +2 -1
  75. package/lib/typescript/src/components/User/index.d.ts.map +1 -1
  76. package/lib/typescript/src/components/index.d.ts +1 -0
  77. package/lib/typescript/src/components/index.d.ts.map +1 -1
  78. package/lib/typescript/src/hooks/useNavigationMode.d.ts +14 -0
  79. package/lib/typescript/src/hooks/useNavigationMode.d.ts.map +1 -0
  80. package/lib/typescript/src/types/content/content-view.types.d.ts +2 -0
  81. package/lib/typescript/src/types/content/content-view.types.d.ts.map +1 -1
  82. package/lib/typescript/src/utils/Spacing.d.ts +16 -0
  83. package/lib/typescript/src/utils/Spacing.d.ts.map +1 -0
  84. package/package.json +9 -5
  85. package/src/components/Account/Account.tsx +1 -1
  86. package/src/components/Auth/AuthProvider/AuthProvider.tsx +82 -37
  87. package/src/components/Auth/Login/LoginWithEmail.tsx +9 -2
  88. package/src/components/Auth/OTP/OTP.tsx +37 -1
  89. package/src/components/Auth/SignUp/SignUp.tsx +9 -2
  90. package/src/components/BlurView/BlurView.tsx +199 -0
  91. package/src/components/BlurView/index.ts +7 -0
  92. package/src/components/Content/Card/Styles/Four.tsx +3 -1
  93. package/src/components/Content/Content.tsx +5 -4
  94. package/src/components/ContentView/ContentView.tsx +8 -1
  95. package/src/components/ContentView/components/MiniInfo.tsx +99 -22
  96. package/src/components/Settings/AppSettings.tsx +1 -1
  97. package/src/components/Subscription/SubOne.tsx +422 -11
  98. package/src/components/TabBar/One.tsx +79 -141
  99. package/src/components/TabBar/Three.tsx +84 -99
  100. package/src/components/TabBar/Two.tsx +139 -110
  101. package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +439 -0
  102. package/src/components/User/index.ts +8 -1
  103. package/src/components/index.ts +1 -0
  104. package/src/hooks/useNavigationMode.ts +35 -0
  105. package/src/types/content/content-view.types.ts +5 -0
  106. 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 = {
@@ -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
 
@@ -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
  );
@@ -306,7 +571,10 @@ const styles = StyleSheet.create({
306
571
  cardTitle: {
307
572
  fontSize: RFValue(17),
308
573
  fontWeight: '700',
574
+ maxWidth: '50%',
575
+ marginHorizontal: 'auto',
309
576
  marginBottom: verticalScale(8),
577
+ textAlign: 'center',
310
578
  },
311
579
  price: {
312
580
  fontSize: RFValue(43),
@@ -328,7 +596,8 @@ const styles = StyleSheet.create({
328
596
  marginTop: verticalScale(8),
329
597
  alignItems: 'flex-start',
330
598
  justifyContent: 'center',
331
- paddingHorizontal: scale(16),
599
+ width: '60%',
600
+ marginHorizontal: 'auto',
332
601
  },
333
602
  benefit: {
334
603
  fontSize: RFValue(12),
@@ -372,16 +641,158 @@ const styles = StyleSheet.create({
372
641
  },
373
642
  popularBadge: {
374
643
  position: 'absolute',
375
- top: verticalScale(12),
376
- right: scale(12),
377
- paddingHorizontal: scale(10),
378
- paddingVertical: verticalScale(4),
644
+ top: verticalScale(10),
645
+ right: scale(10),
646
+ paddingHorizontal: scale(6),
647
+ paddingVertical: verticalScale(3),
379
648
  borderRadius: scale(12),
380
649
  zIndex: 10,
381
650
  },
382
651
  popularText: {
383
- fontSize: RFValue(12),
652
+ fontSize: RFValue(9),
384
653
  textTransform: 'uppercase',
385
654
  fontWeight: '700',
386
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
+ },
387
798
  });