jfs-components 0.1.0 → 0.1.8

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 (392) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
  3. package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +1 -1
  4. package/lib/commonjs/components/Balance/Balance.js +17 -12
  5. package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
  6. package/lib/commonjs/components/Card/Card.js +2 -1
  7. package/lib/commonjs/components/CardFeedback/CardFeedback.js +2 -1
  8. package/lib/commonjs/components/CcCard/CcCard.js +470 -0
  9. package/lib/commonjs/components/Checkbox/Checkbox.js +6 -4
  10. package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
  11. package/lib/commonjs/components/CompareTable/CompareTable.js +372 -0
  12. package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
  13. package/lib/commonjs/components/Drawer/Drawer.js +13 -4
  14. package/lib/commonjs/components/DropdownInput/DropdownInput.js +36 -4
  15. package/lib/commonjs/components/FormField/FormField.js +4 -3
  16. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +62 -2
  17. package/lib/commonjs/components/Image/Image.js +11 -5
  18. package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
  19. package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
  20. package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
  21. package/lib/commonjs/components/Overlay/Overlay.js +92 -0
  22. package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
  23. package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
  24. package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.js +263 -0
  25. package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.web.js +116 -0
  26. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +353 -0
  27. package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +161 -0
  28. package/lib/commonjs/components/Radio/Radio.js +5 -5
  29. package/lib/commonjs/components/Slider/Slider.js +473 -0
  30. package/lib/commonjs/components/TextInput/TextInput.js +15 -9
  31. package/lib/commonjs/components/TextSegment/TextSegment.js +118 -0
  32. package/lib/commonjs/components/docs/modeControls.js +116 -0
  33. package/lib/commonjs/components/index.js +70 -0
  34. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
  35. package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
  36. package/lib/commonjs/design-tokens/figma-modes.generated.js +420 -0
  37. package/lib/commonjs/design-tokens/index.js +11 -0
  38. package/lib/commonjs/icons/registry.js +1 -1
  39. package/lib/commonjs/utils/react-utils.js +22 -0
  40. package/lib/module/components/Accordion/Accordion.js +1 -2
  41. package/lib/module/components/AmountInput/AmountInput.js +6 -4
  42. package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
  43. package/lib/module/components/Balance/Balance.js +18 -13
  44. package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
  45. package/lib/module/components/Card/Card.js +1 -2
  46. package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
  47. package/lib/module/components/CcCard/CcCard.js +464 -0
  48. package/lib/module/components/Checkbox/Checkbox.js +6 -6
  49. package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
  50. package/lib/module/components/CompareTable/CompareTable.js +367 -0
  51. package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
  52. package/lib/module/components/Drawer/Drawer.js +12 -4
  53. package/lib/module/components/DropdownInput/DropdownInput.js +37 -5
  54. package/lib/module/components/FormField/FormField.js +5 -4
  55. package/lib/module/components/FullscreenModal/FullscreenModal.js +64 -5
  56. package/lib/module/components/Image/Image.js +11 -5
  57. package/lib/module/components/InputSearch/InputSearch.js +6 -4
  58. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +1 -2
  59. package/lib/module/components/LottiePlayer/loadNativeLottieView.js +8 -13
  60. package/lib/module/components/MoneyValue/MoneyValue.js +1 -2
  61. package/lib/module/components/NoteInput/NoteInput.js +7 -6
  62. package/lib/module/components/OTP/OTP.js +1 -2
  63. package/lib/module/components/Overlay/Overlay.js +87 -0
  64. package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
  65. package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
  66. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
  67. package/lib/module/components/ProductMerchandisingCard/GlassFill.js +257 -0
  68. package/lib/module/components/ProductMerchandisingCard/GlassFill.web.js +111 -0
  69. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +347 -0
  70. package/lib/module/components/ProjectionMarker/ProjectionMarker.js +156 -0
  71. package/lib/module/components/Radio/Radio.js +5 -4
  72. package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
  73. package/lib/module/components/Section/Section.js +1 -2
  74. package/lib/module/components/Slider/Slider.js +468 -0
  75. package/lib/module/components/TextInput/TextInput.js +16 -12
  76. package/lib/module/components/TextSegment/TextSegment.js +113 -0
  77. package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
  78. package/lib/module/components/docs/modeControls.js +111 -0
  79. package/lib/module/components/index.js +10 -0
  80. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
  81. package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
  82. package/lib/module/design-tokens/figma-modes.generated.js +416 -0
  83. package/lib/module/design-tokens/index.js +2 -1
  84. package/lib/module/icons/registry.js +1 -1
  85. package/lib/module/utils/react-utils.js +21 -1
  86. package/lib/typescript/src/components/Accordion/Accordion.d.ts +2 -1
  87. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +2 -1
  88. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +2 -1
  89. package/lib/typescript/src/components/ActionFooter/ActionFooter.d.ts +2 -1
  90. package/lib/typescript/src/components/ActionTile/ActionTile.d.ts +2 -1
  91. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +2 -1
  92. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +5 -3
  93. package/lib/typescript/src/components/AppBar/AppBar.d.ts +2 -1
  94. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +3 -2
  95. package/lib/typescript/src/components/Attached/Attached.d.ts +2 -1
  96. package/lib/typescript/src/components/Avatar/Avatar.d.ts +2 -1
  97. package/lib/typescript/src/components/AvatarGroup/AvatarGroup.d.ts +2 -1
  98. package/lib/typescript/src/components/Badge/Badge.d.ts +2 -1
  99. package/lib/typescript/src/components/Balance/Balance.d.ts +2 -1
  100. package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
  101. package/lib/typescript/src/components/BottomNav/BottomNav.d.ts +2 -1
  102. package/lib/typescript/src/components/BottomNavItem/BottomNavItem.d.ts +2 -1
  103. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +2 -1
  104. package/lib/typescript/src/components/BubbleChart/BubbleChart.d.ts +2 -1
  105. package/lib/typescript/src/components/Button/Button.d.ts +2 -1
  106. package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +2 -1
  107. package/lib/typescript/src/components/Card/Card.d.ts +3 -2
  108. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +2 -1
  109. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +2 -1
  110. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +2 -1
  111. package/lib/typescript/src/components/CardFeedback/CardFeedback.d.ts +7 -6
  112. package/lib/typescript/src/components/CardFinancialCondition/CardFinancialCondition.d.ts +2 -1
  113. package/lib/typescript/src/components/CardInsight/CardInsight.d.ts +2 -1
  114. package/lib/typescript/src/components/CardProviderInfo/CardProviderInfo.d.ts +2 -1
  115. package/lib/typescript/src/components/Carousel/Carousel.d.ts +4 -3
  116. package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
  117. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +5 -3
  118. package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
  119. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +4 -3
  120. package/lib/typescript/src/components/ChipGroup/ChipGroup.d.ts +2 -1
  121. package/lib/typescript/src/components/ChipSelect/ChipSelect.d.ts +2 -1
  122. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +2 -1
  123. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +2 -1
  124. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +2 -1
  125. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +2 -1
  126. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +88 -0
  127. package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
  128. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +3 -2
  129. package/lib/typescript/src/components/CoverageRing/CoverageRing.d.ts +2 -1
  130. package/lib/typescript/src/components/DebitCard/DebitCard.d.ts +2 -1
  131. package/lib/typescript/src/components/Disclaimer/Disclaimer.d.ts +2 -1
  132. package/lib/typescript/src/components/Divider/Divider.d.ts +2 -1
  133. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +4 -3
  134. package/lib/typescript/src/components/DonutChartSummary/DonutChartSummary.d.ts +3 -2
  135. package/lib/typescript/src/components/Drawer/Drawer.d.ts +15 -1
  136. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +3 -2
  137. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +22 -2
  138. package/lib/typescript/src/components/EmptyState/EmptyState.d.ts +2 -1
  139. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +2 -1
  140. package/lib/typescript/src/components/FilterBar/FilterBar.d.ts +3 -2
  141. package/lib/typescript/src/components/Form/Form.d.ts +2 -1
  142. package/lib/typescript/src/components/FormField/FormField.d.ts +4 -3
  143. package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +2 -1
  144. package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
  145. package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
  146. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
  147. package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
  148. package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
  149. package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
  150. package/lib/typescript/src/components/Image/Image.d.ts +17 -1
  151. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +25 -3
  152. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +2 -1
  153. package/lib/typescript/src/components/LazyList/LazyList.d.ts +2 -1
  154. package/lib/typescript/src/components/LinearMeter/LinearMeter.d.ts +3 -2
  155. package/lib/typescript/src/components/LinearProgress/LinearProgress.d.ts +2 -1
  156. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +2 -1
  157. package/lib/typescript/src/components/ListItem/ListItem.d.ts +2 -1
  158. package/lib/typescript/src/components/LottieIntroBlock/LottieIntroBlock.d.ts +2 -1
  159. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.d.ts +2 -1
  160. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.web.d.ts +2 -1
  161. package/lib/typescript/src/components/MediaCard/MediaCard.d.ts +6 -5
  162. package/lib/typescript/src/components/MerchantProfile/MerchantProfile.d.ts +2 -1
  163. package/lib/typescript/src/components/MessageField/MessageField.d.ts +2 -1
  164. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +2 -1
  165. package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +2 -1
  166. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +4 -3
  167. package/lib/typescript/src/components/NavArrow/NavArrow.d.ts +2 -1
  168. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +21 -3
  169. package/lib/typescript/src/components/Nudge/Nudge.d.ts +2 -1
  170. package/lib/typescript/src/components/Numpad/Numpad.d.ts +2 -1
  171. package/lib/typescript/src/components/OTP/OTP.d.ts +3 -2
  172. package/lib/typescript/src/components/Overlay/Overlay.d.ts +52 -0
  173. package/lib/typescript/src/components/PageHero/PageHero.d.ts +2 -1
  174. package/lib/typescript/src/components/PaymentFeedback/PaymentFeedback.d.ts +2 -1
  175. package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
  176. package/lib/typescript/src/components/PlanComparisonCard/PlanComparisonCard.d.ts +2 -1
  177. package/lib/typescript/src/components/Popup/Popup.d.ts +2 -1
  178. package/lib/typescript/src/components/PortfolioHero/PortfolioHero.d.ts +2 -1
  179. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +2 -1
  180. package/lib/typescript/src/components/ProductLabel/ProductLabel.d.ts +2 -1
  181. package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.d.ts +56 -0
  182. package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.web.d.ts +27 -0
  183. package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +81 -0
  184. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +2 -1
  185. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
  186. package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +82 -0
  187. package/lib/typescript/src/components/Radio/Radio.d.ts +5 -3
  188. package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
  189. package/lib/typescript/src/components/RangeTrack/RangeTrack.d.ts +3 -2
  190. package/lib/typescript/src/components/RechargeCard/RechargeCard.d.ts +2 -1
  191. package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +2 -1
  192. package/lib/typescript/src/components/Screen/Screen.d.ts +2 -1
  193. package/lib/typescript/src/components/Section/Section.d.ts +3 -2
  194. package/lib/typescript/src/components/SegmentedControl/SegmentedControl.d.ts +2 -1
  195. package/lib/typescript/src/components/SegmentedTrack/SegmentedTrack.d.ts +4 -3
  196. package/lib/typescript/src/components/Slider/Slider.d.ts +99 -0
  197. package/lib/typescript/src/components/Slot/Slot.d.ts +2 -1
  198. package/lib/typescript/src/components/Spinner/Spinner.d.ts +2 -1
  199. package/lib/typescript/src/components/StatGroup/StatGroup.d.ts +2 -1
  200. package/lib/typescript/src/components/StatItem/StatItem.d.ts +2 -1
  201. package/lib/typescript/src/components/StatusHero/StatusHero.d.ts +2 -1
  202. package/lib/typescript/src/components/Stepper/Step.d.ts +2 -1
  203. package/lib/typescript/src/components/Stepper/StepLabel.d.ts +2 -1
  204. package/lib/typescript/src/components/Stepper/Stepper.d.ts +2 -1
  205. package/lib/typescript/src/components/StrengthIndicator/StrengthIndicator.d.ts +2 -1
  206. package/lib/typescript/src/components/SuggestiveSearch/SuggestiveSearch.d.ts +2 -1
  207. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +2 -1
  208. package/lib/typescript/src/components/SupportText/SupportText.d.ts +2 -1
  209. package/lib/typescript/src/components/SupportText/SupportTextIcon.d.ts +2 -1
  210. package/lib/typescript/src/components/SwappableAmount/SwappableAmount.d.ts +2 -1
  211. package/lib/typescript/src/components/Tabs/TabItem.d.ts +2 -1
  212. package/lib/typescript/src/components/Tabs/Tabs.d.ts +2 -1
  213. package/lib/typescript/src/components/TestimonialsCard/TestimonialsCard.d.ts +2 -1
  214. package/lib/typescript/src/components/Text/Text.d.ts +2 -1
  215. package/lib/typescript/src/components/TextInput/TextInput.d.ts +12 -31
  216. package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +100 -0
  217. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +2 -1
  218. package/lib/typescript/src/components/Title/Title.d.ts +2 -1
  219. package/lib/typescript/src/components/Toast/Toast.d.ts +2 -1
  220. package/lib/typescript/src/components/Toast/ToastProvider.d.ts +2 -1
  221. package/lib/typescript/src/components/Toast/useToast.d.ts +3 -2
  222. package/lib/typescript/src/components/Toggle/Toggle.d.ts +2 -1
  223. package/lib/typescript/src/components/Tooltip/Tooltip.d.ts +2 -1
  224. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +2 -1
  225. package/lib/typescript/src/components/TransactionDetails/TransactionDetails.d.ts +3 -2
  226. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +2 -1
  227. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +2 -1
  228. package/lib/typescript/src/components/VStack/VStack.d.ts +2 -1
  229. package/lib/typescript/src/components/docs/modeControls.d.ts +28 -0
  230. package/lib/typescript/src/components/index.d.ts +11 -1
  231. package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
  232. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +284 -0
  233. package/lib/typescript/src/design-tokens/index.d.ts +1 -0
  234. package/lib/typescript/src/icons/registry.d.ts +1 -1
  235. package/lib/typescript/src/skeleton/Skeleton.d.ts +2 -1
  236. package/lib/typescript/src/utils/react-utils.d.ts +12 -1
  237. package/package.json +4 -2
  238. package/src/components/Accordion/Accordion.tsx +2 -1
  239. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +2 -1
  240. package/src/components/AccountCard/AccountCard.tsx +2 -1
  241. package/src/components/ActionFooter/ActionFooter.tsx +2 -1
  242. package/src/components/ActionTile/ActionTile.tsx +2 -1
  243. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +2 -1
  244. package/src/components/AmountInput/AmountInput.tsx +9 -6
  245. package/src/components/AppBar/AppBar.tsx +2 -1
  246. package/src/components/AreaLineChart/AreaLineChart.tsx +8 -7
  247. package/src/components/Attached/Attached.tsx +2 -1
  248. package/src/components/Avatar/Avatar.tsx +3 -2
  249. package/src/components/AvatarGroup/AvatarGroup.tsx +2 -1
  250. package/src/components/Badge/Badge.tsx +2 -1
  251. package/src/components/Balance/Balance.tsx +18 -12
  252. package/src/components/BenefitCard/BenefitCard.tsx +309 -0
  253. package/src/components/BottomNav/BottomNav.tsx +2 -1
  254. package/src/components/BottomNavItem/BottomNavItem.tsx +3 -2
  255. package/src/components/BrandChip/BrandChip.tsx +3 -2
  256. package/src/components/BubbleChart/BubbleChart.tsx +2 -1
  257. package/src/components/Button/Button.tsx +3 -2
  258. package/src/components/ButtonGroup/ButtonGroup.tsx +2 -1
  259. package/src/components/Card/Card.tsx +4 -3
  260. package/src/components/CardAdvisory/CardAdvisory.tsx +3 -2
  261. package/src/components/CardBankAccount/CardBankAccount.tsx +2 -1
  262. package/src/components/CardCTA/CardCTA.tsx +3 -2
  263. package/src/components/CardFeedback/CardFeedback.tsx +11 -10
  264. package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +3 -2
  265. package/src/components/CardInsight/CardInsight.tsx +2 -1
  266. package/src/components/CardProviderInfo/CardProviderInfo.tsx +2 -1
  267. package/src/components/Carousel/Carousel.tsx +5 -4
  268. package/src/components/CcCard/CcCard.tsx +598 -0
  269. package/src/components/Checkbox/Checkbox.tsx +7 -5
  270. package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
  271. package/src/components/CheckboxItem/CheckboxItem.tsx +7 -5
  272. package/src/components/ChipGroup/ChipGroup.tsx +2 -1
  273. package/src/components/ChipSelect/ChipSelect.tsx +2 -1
  274. package/src/components/CircularProgressBar/CircularProgressBar.tsx +2 -1
  275. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +2 -1
  276. package/src/components/CircularRating/CircularRating.tsx +3 -2
  277. package/src/components/ClusterBubble/ClusterBubble.tsx +2 -1
  278. package/src/components/CompareTable/CompareTable.tsx +477 -0
  279. package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
  280. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +3 -2
  281. package/src/components/CoverageRing/CoverageRing.tsx +2 -1
  282. package/src/components/DebitCard/DebitCard.tsx +2 -1
  283. package/src/components/Disclaimer/Disclaimer.tsx +2 -1
  284. package/src/components/Divider/Divider.tsx +2 -1
  285. package/src/components/DonutChart/DonutChart.tsx +6 -5
  286. package/src/components/DonutChartSummary/DonutChartSummary.tsx +3 -2
  287. package/src/components/Drawer/Drawer.tsx +21 -1
  288. package/src/components/Dropdown/Dropdown.tsx +4 -3
  289. package/src/components/DropdownInput/DropdownInput.tsx +60 -7
  290. package/src/components/EmptyState/EmptyState.tsx +2 -1
  291. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +2 -1
  292. package/src/components/FilterBar/FilterBar.tsx +3 -2
  293. package/src/components/Form/Form.tsx +2 -1
  294. package/src/components/FormField/FormField.tsx +8 -6
  295. package/src/components/FullscreenModal/FullscreenModal.tsx +68 -10
  296. package/src/components/Gauge/Gauge.tsx +2 -1
  297. package/src/components/HStack/HStack.tsx +2 -1
  298. package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
  299. package/src/components/Icon/Icon.tsx +3 -2
  300. package/src/components/IconButton/IconButton.tsx +3 -2
  301. package/src/components/IconCapsule/IconCapsule.tsx +3 -2
  302. package/src/components/Image/Image.tsx +29 -5
  303. package/src/components/InputSearch/InputSearch.tsx +11 -7
  304. package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -2
  305. package/src/components/LazyList/LazyList.tsx +2 -1
  306. package/src/components/LinearMeter/LinearMeter.tsx +3 -2
  307. package/src/components/LinearProgress/LinearProgress.tsx +2 -1
  308. package/src/components/ListGroup/ListGroup.tsx +2 -1
  309. package/src/components/ListItem/ListItem.tsx +3 -2
  310. package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +2 -1
  311. package/src/components/LottiePlayer/LottiePlayer.tsx +3 -2
  312. package/src/components/LottiePlayer/LottiePlayer.web.tsx +3 -2
  313. package/src/components/LottiePlayer/loadNativeLottieView.tsx +9 -13
  314. package/src/components/MediaCard/MediaCard.tsx +7 -6
  315. package/src/components/MerchantProfile/MerchantProfile.tsx +2 -1
  316. package/src/components/MessageField/MessageField.tsx +3 -2
  317. package/src/components/MetricLegendItem/MetricLegendItem.tsx +2 -1
  318. package/src/components/MoneyValue/MoneyValue.tsx +2 -1
  319. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +5 -4
  320. package/src/components/NavArrow/NavArrow.tsx +3 -2
  321. package/src/components/NoteInput/NoteInput.tsx +10 -7
  322. package/src/components/Nudge/Nudge.tsx +3 -2
  323. package/src/components/Numpad/Numpad.tsx +2 -1
  324. package/src/components/OTP/OTP.tsx +3 -2
  325. package/src/components/Overlay/Overlay.tsx +114 -0
  326. package/src/components/PageHero/PageHero.tsx +2 -1
  327. package/src/components/PaymentFeedback/PaymentFeedback.tsx +2 -1
  328. package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
  329. package/src/components/PlanComparisonCard/PlanComparisonCard.tsx +2 -1
  330. package/src/components/Popup/Popup.tsx +2 -1
  331. package/src/components/PortfolioHero/PortfolioHero.tsx +2 -1
  332. package/src/components/PoweredByLabel/PoweredByLabel.tsx +2 -1
  333. package/src/components/ProductLabel/ProductLabel.tsx +2 -1
  334. package/src/components/ProductMerchandisingCard/GlassFill.tsx +276 -0
  335. package/src/components/ProductMerchandisingCard/GlassFill.web.tsx +127 -0
  336. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +423 -0
  337. package/src/components/ProductOverview/ProductOverview.tsx +2 -1
  338. package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
  339. package/src/components/ProjectionMarker/ProjectionMarker.tsx +277 -0
  340. package/src/components/Radio/Radio.tsx +7 -5
  341. package/src/components/RangeTrack/RangeTrack.tsx +3 -2
  342. package/src/components/RechargeCard/RechargeCard.tsx +2 -1
  343. package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +2 -1
  344. package/src/components/Screen/Screen.tsx +2 -1
  345. package/src/components/Section/Section.tsx +6 -5
  346. package/src/components/SegmentedControl/SegmentedControl.tsx +3 -2
  347. package/src/components/SegmentedTrack/SegmentedTrack.tsx +5 -4
  348. package/src/components/Slider/Slider.tsx +628 -0
  349. package/src/components/Slot/Slot.tsx +2 -1
  350. package/src/components/Spinner/Spinner.tsx +2 -1
  351. package/src/components/StatGroup/StatGroup.tsx +3 -2
  352. package/src/components/StatItem/StatItem.tsx +2 -1
  353. package/src/components/StatusHero/StatusHero.tsx +2 -1
  354. package/src/components/Stepper/Step.tsx +2 -1
  355. package/src/components/Stepper/StepLabel.tsx +2 -1
  356. package/src/components/Stepper/Stepper.tsx +2 -1
  357. package/src/components/StrengthIndicator/StrengthIndicator.tsx +2 -1
  358. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +4 -3
  359. package/src/components/SummaryTile/SummaryTile.tsx +2 -1
  360. package/src/components/SupportText/SupportText.tsx +2 -1
  361. package/src/components/SupportText/SupportTextIcon.tsx +2 -1
  362. package/src/components/SwappableAmount/SwappableAmount.tsx +2 -1
  363. package/src/components/Tabs/TabItem.tsx +2 -1
  364. package/src/components/Tabs/Tabs.tsx +2 -1
  365. package/src/components/TestimonialsCard/TestimonialsCard.tsx +2 -1
  366. package/src/components/Text/Text.tsx +2 -1
  367. package/src/components/TextInput/TextInput.tsx +18 -13
  368. package/src/components/TextSegment/TextSegment.tsx +166 -0
  369. package/src/components/ThreadHero/ThreadHero.tsx +2 -1
  370. package/src/components/Title/Title.tsx +2 -1
  371. package/src/components/Toast/Toast.tsx +2 -1
  372. package/src/components/Toast/ToastProvider.tsx +2 -1
  373. package/src/components/Toast/useToast.ts +3 -2
  374. package/src/components/Toggle/Toggle.tsx +2 -1
  375. package/src/components/Tooltip/Tooltip.tsx +3 -2
  376. package/src/components/TransactionBubble/TransactionBubble.tsx +2 -1
  377. package/src/components/TransactionDetails/TransactionDetails.tsx +3 -2
  378. package/src/components/TransactionStatus/TransactionStatus.tsx +3 -2
  379. package/src/components/UpiHandle/UpiHandle.tsx +3 -2
  380. package/src/components/VStack/VStack.tsx +2 -1
  381. package/src/components/docs/modeControls.tsx +122 -0
  382. package/src/components/index.ts +11 -1
  383. package/src/design-tokens/Coin Variables-variables-full.json +1 -1
  384. package/src/design-tokens/JFSThemeProvider.tsx +4 -3
  385. package/src/design-tokens/figma-modes.generated.ts +425 -0
  386. package/src/design-tokens/index.ts +1 -0
  387. package/src/icons/registry.ts +1 -1
  388. package/src/skeleton/Skeleton.tsx +2 -1
  389. package/src/utils/react-utils.ts +26 -2
  390. package/lib/typescript/scripts/extract-component-tokens.d.ts +0 -9
  391. package/lib/typescript/scripts/generate-component-docs.d.ts +0 -9
  392. package/lib/typescript/scripts/generate-icon-registry.d.ts +0 -3
@@ -16,6 +16,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
16
16
  import { EMPTY_MODES } from '../../utils/react-utils'
17
17
  import Skeleton from '../../skeleton/Skeleton'
18
18
  import { useSkeleton } from '../../skeleton/SkeletonGroup'
19
+ import type { Modes } from '../../design-tokens'
19
20
 
20
21
  const avatarImage = require('./31595e70c4181263f9971590224b12934b280c9b.png')
21
22
 
@@ -63,7 +64,7 @@ interface AvatarTokens {
63
64
  monogramTextStyle: TextStyle;
64
65
  }
65
66
 
66
- function resolveAvatarTokens(modes: Record<string, any>, isMonogram: boolean): AvatarTokens {
67
+ function resolveAvatarTokens(modes: Modes, isMonogram: boolean): AvatarTokens {
67
68
  const size = (getVariableByName('avatar/size', modes) || 29) as number
68
69
  const radiusRaw = (getVariableByName('avatar/radius', modes) || 9999) as number
69
70
  const backgroundColor = getVariableByName('avatar/background', modes) || '#dbcfff'
@@ -131,7 +132,7 @@ function resolveAvatarTokens(modes: Record<string, any>, isMonogram: boolean): A
131
132
  export type AvatarProps = {
132
133
  monogram?: string;
133
134
  style?: 'Image' | 'Monogram';
134
- modes?: Record<string, any>;
135
+ modes?: Modes;
135
136
  imageSource?: ImageSourcePropType | string;
136
137
  accessibilityLabel?: string;
137
138
  onPress?: () => void;
@@ -4,9 +4,10 @@ import MaskedView from '@react-native-masked-view/masked-view';
4
4
  import Svg, { Path } from 'react-native-svg';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils';
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  type AvatarGroupProps = {
9
- modes?: Record<string, any>;
10
+ modes?: Modes;
10
11
  children?: React.ReactNode;
11
12
  style?: ViewStyle;
12
13
  } & React.ComponentProps<typeof View>;
@@ -10,12 +10,13 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { EMPTY_MODES } from '../../utils/react-utils'
11
11
  import Skeleton from '../../skeleton/Skeleton'
12
12
  import { useSkeleton } from '../../skeleton/SkeletonGroup'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  type BadgeProps = {
15
16
  /** Visible label text shown inside the badge */
16
17
  label?: string
17
18
  /** Modes used to resolve design tokens (e.g. Appearance, Size) */
18
- modes?: Record<string, any>
19
+ modes?: Modes
19
20
  /** Optional press handler to make the badge interactive */
20
21
  onPress?: () => void
21
22
  accessibilityLabel?: string
@@ -2,7 +2,16 @@ import React from 'react'
2
2
  import { View, Text, type StyleProp, type ViewStyle, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import MoneyValue from '../MoneyValue/MoneyValue'
5
- import { EMPTY_MODES } from '../../utils/react-utils'
5
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
6
+ import type { Modes } from '../../design-tokens'
7
+
8
+ // The Balance design renders its money value at the 36 px / 900-weight scale.
9
+ // The `moneyValue/*` tokens alias into the `Context3` collection, where the
10
+ // `Balance & Cards` mode supplies those larger values. Applied *before* the
11
+ // caller's `modes` so any consumer can still override individual keys.
12
+ const DEFAULT_MONEY_VALUE_MODES: Record<string, string> = {
13
+ Context3: 'Balance & Cards',
14
+ }
6
15
 
7
16
  export type BalanceProps = {
8
17
  /**
@@ -23,7 +32,7 @@ export type BalanceProps = {
23
32
  /**
24
33
  * Mode configuration for design tokens.
25
34
  */
26
- modes?: Record<string, any>;
35
+ modes?: Modes;
27
36
  /**
28
37
  * Optional style overrides for the container.
29
38
  */
@@ -58,7 +67,7 @@ function Balance({
58
67
  // Title styles
59
68
  const titleColor = getVariableByName('balance/title/foreground', modes) ?? '#0c0d10'
60
69
  const titleFontSize = getVariableByName('balance/title/fontSize', modes) ?? 14
61
- const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'System'
70
+ const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'JioType Var'
62
71
  const titleLineHeight = getVariableByName('balance/title/lineHeight', modes) ?? 18
63
72
  const titleFontWeightValue = getVariableByName('balance/title/fontWeight', modes) ?? 500
64
73
  const titleFontWeight = typeof titleFontWeightValue === 'number'
@@ -79,13 +88,10 @@ function Balance({
79
88
  fontWeight: titleFontWeight as any,
80
89
  }
81
90
 
82
- // Handle slot children or default content
83
- const content = React.Children.map(children, (child) => {
84
- if (React.isValidElement(child)) {
85
- return React.cloneElement(child, { modes } as any)
86
- }
87
- return child
88
- })
91
+ // The money value renders at the Balance & Cards scale. Merge the default
92
+ // context mode first so the caller's `modes` can still override it, and
93
+ // force that context onto any slotted children so custom money values match.
94
+ const moneyValueModes: Modes = { ...DEFAULT_MONEY_VALUE_MODES, ...modes }
89
95
 
90
96
  return (
91
97
  <View style={[containerStyle, style]} data-node-id="1986:6203">
@@ -93,12 +99,12 @@ function Balance({
93
99
  {title}
94
100
  </Text>
95
101
  {children ? (
96
- content
102
+ cloneChildrenWithModes(children, modes, DEFAULT_MONEY_VALUE_MODES)
97
103
  ) : (
98
104
  <MoneyValue
99
105
  value={amount}
100
106
  currency={currency}
101
- modes={modes}
107
+ modes={moneyValueModes}
102
108
  />
103
109
  )}
104
110
  </View>
@@ -0,0 +1,309 @@
1
+ import React, { useMemo } from 'react'
2
+ import {
3
+ View,
4
+ Text as RNText,
5
+ Pressable,
6
+ StyleSheet,
7
+ type ViewStyle,
8
+ type TextStyle,
9
+ type StyleProp,
10
+ } from 'react-native'
11
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
13
+ import Icon from '../Icon/Icon'
14
+ import Text from '../Text/Text'
15
+ import ListItem from '../ListItem/ListItem'
16
+ import Divider from '../Divider/Divider'
17
+ import Button from '../Button/Button'
18
+ import type { Modes } from '../../design-tokens'
19
+
20
+ /**
21
+ * A single benefit row rendered with the shared `ListItem` primitive: a
22
+ * leading icon, a title and an optional right-aligned trailing value.
23
+ */
24
+ export interface BenefitCardItem {
25
+ /** Registry icon name for the leading glyph (e.g. `'ic_jewellery_diamond'`). */
26
+ icon?: string
27
+ /** Per-item override for the leading icon color. Defaults to the brand token. */
28
+ iconColor?: string
29
+ /** Full override for the leading node. Takes precedence over `icon`. */
30
+ leading?: React.ReactNode
31
+ /** Row title (e.g. `"JioPoints"`). */
32
+ title: string
33
+ /** Optional right-aligned trailing value (e.g. `"Up to 2000 pts"`). */
34
+ trailingText?: string
35
+ /** Full override for the trailing node. Takes precedence over `trailingText`. */
36
+ trailing?: React.ReactNode
37
+ /** Makes the row pressable. */
38
+ onPress?: () => void
39
+ }
40
+
41
+ export interface BenefitCardProps {
42
+ /** Header section title (e.g. `"You will earn"`). */
43
+ headerTitle?: string
44
+ /**
45
+ * Highlighted item shown directly under the header title (icon + title +
46
+ * optional trailing value). Rendered above the divider.
47
+ */
48
+ headerItem?: BenefitCardItem
49
+ /**
50
+ * Toggles the whole header section (title + item + divider). Mirrors the
51
+ * Figma `showHeader` property. Defaults to `true`.
52
+ */
53
+ showHeader?: boolean
54
+ /** Body section title (e.g. `"Upgrade to JioFinance+ and earn more"`). */
55
+ bodyTitle?: string
56
+ /**
57
+ * Body benefit rows. Ignored when `children` is provided (the slot wins).
58
+ */
59
+ items?: BenefitCardItem[]
60
+ /**
61
+ * Real slot for the body "list wrap". When provided, these children render
62
+ * instead of `items`; `modes` (plus the `List Item Style: Minimal` style)
63
+ * cascade into every child automatically.
64
+ */
65
+ children?: React.ReactNode
66
+ /** CTA button label. Defaults to `"Upgrade"`. */
67
+ buttonLabel?: string
68
+ /** CTA press handler. */
69
+ onButtonPress?: () => void
70
+ /** Full override for the CTA. Takes precedence over `buttonLabel`. */
71
+ button?: React.ReactNode
72
+ /**
73
+ * Toggles the CTA button. Mirrors the Figma `showButton` property.
74
+ * Defaults to `true`.
75
+ */
76
+ showButton?: boolean
77
+ /** Press handler for the whole card. When set, the card becomes pressable. */
78
+ onPress?: () => void
79
+ /** Card width. Defaults to the Figma spec (`344`). Pass `'100%'` to fill the parent. */
80
+ width?: number | `${number}%`
81
+ /** Modes object for design-token resolution. Cascaded to all children. */
82
+ modes?: Modes
83
+ /** Style overrides for the card container. */
84
+ style?: StyleProp<ViewStyle>
85
+ /** Accessibility label for the card. */
86
+ accessibilityLabel?: string
87
+ }
88
+
89
+ /**
90
+ * BenefitCard — Figma node 5352:1077 ("Benefit Card").
91
+ *
92
+ * A white, rounded card that summarises the rewards a user will earn. It is
93
+ * composed entirely from the shared design-system primitives so it stays in
94
+ * sync with the rest of the library:
95
+ *
96
+ * - **Header** — a section title + a single highlighted {@link ListItem}
97
+ * (leading `Icon`, title, right-aligned trailing value) followed by a
98
+ * `Divider`.
99
+ * - **Body** — a section title + a column of benefit {@link ListItem}s. The
100
+ * list is a real slot: pass `children` to fully control it, or `items` for
101
+ * the declarative path.
102
+ * - **CTA** — a small {@link Button} (Figma `Button / Size = S`).
103
+ *
104
+ * The list rows resolve through the `List Item Style: Minimal` mode (12px /
105
+ * regular title, 4px gap, no padding) and the leading icons use the
106
+ * `AppearanceBrand: Secondary` brand color, exactly matching the design. All
107
+ * three defaults can be overridden via `modes`.
108
+ */
109
+ function BenefitCard({
110
+ headerTitle = 'You will earn',
111
+ headerItem,
112
+ showHeader = true,
113
+ bodyTitle = 'Upgrade to JioFinance+ and earn more',
114
+ items,
115
+ children,
116
+ buttonLabel = 'Upgrade',
117
+ onButtonPress,
118
+ button,
119
+ showButton = true,
120
+ onPress,
121
+ width = 344,
122
+ modes = EMPTY_MODES,
123
+ style,
124
+ accessibilityLabel,
125
+ }: BenefitCardProps) {
126
+ const tokens = useMemo(() => resolveTokens(modes), [modes])
127
+
128
+ // Sub-component modes. Consumer-supplied `modes` always win via spread order.
129
+ const listItemModes = useMemo<Modes>(() => ({ 'List Item Style': 'Minimal', ...modes }), [modes])
130
+ const iconModes = useMemo<Modes>(() => ({ AppearanceBrand: 'Secondary', ...modes }), [modes])
131
+ const trailingTextModes = useMemo<Modes>(
132
+ () => ({ 'Text Sizes': 'Small', Weight: 'Regular', ...modes }),
133
+ [modes]
134
+ )
135
+ const ctaModes = useMemo<Modes>(() => ({ 'Button / Size': 'S', ...modes }), [modes])
136
+
137
+ const renderItem = (item: BenefitCardItem, key: React.Key) => {
138
+ const leading =
139
+ item.leading ??
140
+ (item.icon != null ? (
141
+ <Icon iconName={item.icon} color={item.iconColor} modes={iconModes} />
142
+ ) : null)
143
+
144
+ const trailing =
145
+ item.trailing ??
146
+ (item.trailingText != null ? (
147
+ <Text modes={trailingTextModes}>{item.trailingText}</Text>
148
+ ) : undefined)
149
+
150
+ return (
151
+ <ListItem
152
+ key={key}
153
+ layout="Horizontal"
154
+ navArrow={false}
155
+ showSupportText={false}
156
+ title={item.title}
157
+ leading={leading}
158
+ trailing={trailing}
159
+ onPress={item.onPress}
160
+ modes={listItemModes}
161
+ />
162
+ )
163
+ }
164
+
165
+ const headerNode =
166
+ showHeader && (headerTitle != null || headerItem != null) ? (
167
+ <View style={styles.section}>
168
+ <View style={styles.cardHeader}>
169
+ {headerTitle != null ? <RNText style={tokens.title}>{headerTitle}</RNText> : null}
170
+ {headerItem != null ? renderItem(headerItem, 'header-item') : null}
171
+ </View>
172
+ <Divider modes={modes} />
173
+ </View>
174
+ ) : null
175
+
176
+ const bodyList = children
177
+ ? cloneChildrenWithModes(children, listItemModes)
178
+ : (items ?? DEFAULT_ITEMS).map((item, index) => renderItem(item, index))
179
+
180
+ const ctaNode = button ?? (
181
+ <Button label={buttonLabel} modes={ctaModes} onPress={onButtonPress} />
182
+ )
183
+
184
+ const containerStyle = useMemo<ViewStyle>(
185
+ () => ({ ...tokens.container, width }),
186
+ [tokens.container, width]
187
+ )
188
+
189
+ const content = (
190
+ <>
191
+ {headerNode}
192
+ <View style={tokens.body}>
193
+ {bodyTitle != null ? <RNText style={tokens.title}>{bodyTitle}</RNText> : null}
194
+ <View style={tokens.listWrap}>{bodyList}</View>
195
+ </View>
196
+ {showButton ? ctaNode : null}
197
+ </>
198
+ )
199
+
200
+ if (onPress) {
201
+ return (
202
+ <Pressable
203
+ style={({ pressed }) => [containerStyle, pressed ? styles.pressed : null, style]}
204
+ accessibilityRole="button"
205
+ accessibilityLabel={accessibilityLabel ?? headerTitle ?? bodyTitle}
206
+ onPress={onPress}
207
+ >
208
+ {content}
209
+ </Pressable>
210
+ )
211
+ }
212
+
213
+ return (
214
+ <View style={[containerStyle, style]} accessibilityLabel={accessibilityLabel}>
215
+ {content}
216
+ </View>
217
+ )
218
+ }
219
+
220
+ // ---------------------------------------------------------------------------
221
+ // Tokens / static styles
222
+ // ---------------------------------------------------------------------------
223
+
224
+ // The "card header" inner gap (title -> highlighted item) is a fixed 4px in
225
+ // the Figma node and has no dedicated token.
226
+ const CARD_HEADER_GAP = 4
227
+
228
+ interface ResolvedTokens {
229
+ container: ViewStyle
230
+ body: ViewStyle
231
+ listWrap: ViewStyle
232
+ title: TextStyle
233
+ }
234
+
235
+ function asNum(raw: unknown, fallback: number): number {
236
+ const n = typeof raw === 'number' ? raw : parseFloat(raw as string)
237
+ return Number.isFinite(n) ? n : fallback
238
+ }
239
+
240
+ function asStr(raw: unknown, fallback: string): string {
241
+ return raw != null ? String(raw) : fallback
242
+ }
243
+
244
+ function resolveTokens(modes: Modes): ResolvedTokens {
245
+ // NOTE: token names are passed as string literals DIRECTLY to
246
+ // getVariableByName so the `extract-component-tokens` script can statically
247
+ // collect them for the generated docs. Do not refactor these into a helper
248
+ // that receives the name as a variable.
249
+ const background = asStr(getVariableByName('benefitCard/background', modes), '#ffffff')
250
+ const paddingHorizontal = asNum(getVariableByName('benefitCard/padding/horizontal', modes), 12)
251
+ const paddingVertical = asNum(getVariableByName('benefitCard/padding/vertical', modes), 12)
252
+ const radius = asNum(getVariableByName('benefitCard/radius', modes), 12)
253
+ const gap = asNum(getVariableByName('benefitCard/gap', modes), 8)
254
+
255
+ const titleColor = asStr(getVariableByName('benefitCard/title/foreground', modes), '#000000')
256
+ const titleSize = asNum(getVariableByName('benefitCard/title/fontsize', modes), 14)
257
+ const titleFamily = asStr(getVariableByName('benefitCard/title/fontFamily', modes), 'JioType Var')
258
+ const titleWeight = asStr(getVariableByName('benefitCard/title/fontWeight', modes), '500')
259
+
260
+ return {
261
+ container: {
262
+ backgroundColor: background,
263
+ paddingHorizontal,
264
+ paddingVertical,
265
+ borderRadius: radius,
266
+ gap,
267
+ flexDirection: 'column',
268
+ alignItems: 'flex-start',
269
+ },
270
+ body: {
271
+ alignSelf: 'stretch',
272
+ gap,
273
+ },
274
+ listWrap: {
275
+ alignSelf: 'stretch',
276
+ gap,
277
+ },
278
+ title: {
279
+ color: titleColor,
280
+ fontSize: titleSize,
281
+ fontFamily: titleFamily,
282
+ fontWeight: titleWeight as TextStyle['fontWeight'],
283
+ lineHeight: 20,
284
+ letterSpacing: -0.5,
285
+ includeFontPadding: false as any,
286
+ },
287
+ }
288
+ }
289
+
290
+ const DEFAULT_ITEMS: BenefitCardItem[] = [
291
+ { icon: 'ic_card', title: 'Up to ₹5000 cashback' },
292
+ { icon: 'ic_card', title: '25% extra JioPoints' },
293
+ ]
294
+
295
+ const styles = StyleSheet.create({
296
+ section: {
297
+ alignSelf: 'stretch',
298
+ gap: 8,
299
+ },
300
+ cardHeader: {
301
+ alignSelf: 'stretch',
302
+ gap: CARD_HEADER_GAP,
303
+ },
304
+ pressed: {
305
+ opacity: 0.92,
306
+ },
307
+ })
308
+
309
+ export default BenefitCard
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import BottomNavItem from '../BottomNavItem/BottomNavItem'
6
6
  import { EMPTY_MODES } from '../../utils/react-utils'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  type BottomNavProps = {
9
10
  /**
@@ -20,7 +21,7 @@ type BottomNavProps = {
20
21
  */
21
22
  children?: React.ReactNode;
22
23
 
23
- modes?: Record<string, any>;
24
+ modes?: Modes;
24
25
  style?: StyleProp<ViewStyle>;
25
26
  accessibilityLabel?: string;
26
27
  accessibilityHint?: string;
@@ -15,11 +15,12 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
15
15
  import Icon from '../../icons/Icon'
16
16
  import { usePressableWebSupport, type SafePressableProps, type WebAccessibilityProps } from '../../utils/web-platform-utils'
17
17
  import { EMPTY_MODES } from '../../utils/react-utils'
18
+ import type { Modes } from '../../design-tokens'
18
19
 
19
20
  type BottomNavItemProps = SafePressableProps & {
20
21
  iconName?: string;
21
22
  label?: string;
22
- modes?: Record<string, any>;
23
+ modes?: Modes;
23
24
  onPress?: () => void;
24
25
  disabled?: boolean;
25
26
  style?: StyleProp<ViewStyle>;
@@ -51,7 +52,7 @@ interface BottomNavItemTokens {
51
52
  }
52
53
 
53
54
  function resolveBottomNavItemTokens(
54
- modes: Record<string, any>,
55
+ modes: Modes,
55
56
  disabled: boolean,
56
57
  iconColorOverride?: string,
57
58
  iconSizeOverride?: number,
@@ -12,6 +12,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
12
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
13
13
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
14
14
  import Avatar from '../Avatar/Avatar'
15
+ import type { Modes } from '../../design-tokens'
15
16
 
16
17
  export type BrandChipProps = {
17
18
  /** Visible label (e.g. `"Axis Bank • 0245"`). */
@@ -30,7 +31,7 @@ export type BrandChipProps = {
30
31
  /** Optional press handler — when provided, the chip becomes a `Pressable`. */
31
32
  onPress?: () => void
32
33
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
33
- modes?: Record<string, any>
34
+ modes?: Modes
34
35
  /** Container style override. */
35
36
  style?: StyleProp<ViewStyle>
36
37
  /** Label style override. */
@@ -64,7 +65,7 @@ const toFontWeight = (
64
65
  return fallback
65
66
  }
66
67
 
67
- function resolveBrandChipTokens(modes: Record<string, any>): BrandChipTokens {
68
+ function resolveBrandChipTokens(modes: Modes): BrandChipTokens {
68
69
  const background =
69
70
  (getVariableByName('brandChip/background', modes) as string | null) ??
70
71
  '#ffffff'
@@ -7,6 +7,7 @@ import {
7
7
  type ViewStyle,
8
8
  } from 'react-native'
9
9
  import { EMPTY_MODES } from '../../utils/react-utils'
10
+ import type { Modes } from '../../design-tokens'
10
11
  import ClusterBubble, {
11
12
  type ClusterBubbleLabelDirection,
12
13
  type ClusterBubbleLabelPlacement,
@@ -78,7 +79,7 @@ export type BubbleChartProps = {
78
79
  /** Notified when a bubble is pressed. Makes every bubble pressable. */
79
80
  onBubblePress?: (datum: BubbleDatum, index: number) => void
80
81
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
81
- modes?: Record<string, any>
82
+ modes?: Modes
82
83
  /** Container style override. */
83
84
  style?: StyleProp<ViewStyle>
84
85
  /** Accessibility label for the whole chart. */
@@ -16,6 +16,7 @@ import { EMPTY_MODES } from '../../utils/react-utils'
16
16
  import Icon from '../../icons/Icon'
17
17
  import Skeleton from '../../skeleton/Skeleton'
18
18
  import { useSkeleton } from '../../skeleton/SkeletonGroup'
19
+ import type { Modes } from '../../design-tokens'
19
20
 
20
21
  export type ButtonProps = SafePressableProps & {
21
22
  label?: string;
@@ -44,7 +45,7 @@ export type ButtonProps = SafePressableProps & {
44
45
  * Takes precedence over `trailing` if both are provided.
45
46
  */
46
47
  icon?: string;
47
- modes?: Record<string, any>;
48
+ modes?: Modes;
48
49
  onPress?: () => void;
49
50
  disabled?: boolean;
50
51
  style?: StyleProp<ViewStyle>;
@@ -112,7 +113,7 @@ interface ButtonTokens {
112
113
  accessoryOffset: number;
113
114
  }
114
115
 
115
- function resolveButtonTokens(modes: Record<string, any>, disabled: boolean): ButtonTokens {
116
+ function resolveButtonTokens(modes: Modes, disabled: boolean): ButtonTokens {
116
117
  const backgroundColor = getVariableByName('button/background', modes) || '#cfa159'
117
118
  const borderColor = getVariableByName('button/border/color', modes) || 'rgba(255,255,255,0)'
118
119
  const borderWidth = getVariableByName('button/border/size', modes)
@@ -7,6 +7,7 @@ import {
7
7
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
8
8
  import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils'
9
9
  import IconButton from '../IconButton/IconButton'
10
+ import type { Modes } from '../../design-tokens'
10
11
 
11
12
  export type ButtonGroupProps = {
12
13
  /**
@@ -18,7 +19,7 @@ export type ButtonGroupProps = {
18
19
  * Mode configuration for design tokens (e.g., {"Button / Size": "M", "Appearance": "high"})
19
20
  * These modes are passed down to all child components.
20
21
  */
21
- modes?: Record<string, any>;
22
+ modes?: Modes;
22
23
  /**
23
24
  * Additional styles for the container
24
25
  */
@@ -2,13 +2,14 @@ import React, { createContext, useContext, isValidElement, cloneElement, useMemo
2
2
  import { View, Text, StyleSheet, type ViewStyle, type TextStyle, type StyleProp } from 'react-native';
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
4
4
  import { EMPTY_MODES } from '../../utils/react-utils';
5
+ import type { Modes } from '../../design-tokens'
5
6
 
6
7
  /**
7
8
  * Context to share 'modes' with child components like Card.Title and Card.SupportText.
8
9
  * This ensures that nested components can resolve their tokens correctly without
9
10
  * needing explicit mode prop passing for every child.
10
11
  */
11
- const CardContext = createContext<{ modes?: Record<string, any> }>({});
12
+ const CardContext = createContext<{ modes?: Modes }>({});
12
13
 
13
14
  export interface CardProps {
14
15
  /**
@@ -28,7 +29,7 @@ export interface CardProps {
28
29
  /**
29
30
  * Modes object for token resolution (e.g. { "Mode": "Dark" }).
30
31
  */
31
- modes?: Record<string, any>;
32
+ modes?: Modes;
32
33
  /**
33
34
  * Aspect ratio for the media slot container.
34
35
  * Default is based on Figma design 154/116 (~1.328).
@@ -151,7 +152,7 @@ export function Card({
151
152
  export interface CardTextProps {
152
153
  children?: React.ReactNode;
153
154
  style?: StyleProp<TextStyle>;
154
- modes?: Record<string, any>;
155
+ modes?: Modes;
155
156
  }
156
157
 
157
158
  /**
@@ -12,6 +12,7 @@ import Icon from '../../icons/Icon'
12
12
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
13
13
  import CircularProgressBar from '../CircularProgressBar/CircularProgressBar'
14
14
  import Nudge from '../Nudge/Nudge'
15
+ import type { Modes } from '../../design-tokens'
15
16
 
16
17
  type CardAdvisoryBaseProps = Omit<React.ComponentProps<typeof View>, 'children' | 'style'>
17
18
 
@@ -41,7 +42,7 @@ export type CardAdvisoryProps = CardAdvisoryBaseProps & {
41
42
  /** Optional slot replacing the bottom nudge. Receives `modes` recursively. */
42
43
  nudgeSlot?: React.ReactNode
43
44
  /** Design token modes forwarded to token lookups and child components. */
44
- modes?: Record<string, any>
45
+ modes?: Modes
45
46
  /** Optional container style override. */
46
47
  style?: StyleProp<ViewStyle>
47
48
  /** Optional main content row style override. */
@@ -94,7 +95,7 @@ const toFontWeight = (value: unknown, fallback: TextStyle['fontWeight']) => {
94
95
  return fallback
95
96
  }
96
97
 
97
- function resolveCardAdvisoryTokens(modes: Record<string, any>): CardAdvisoryTokens {
98
+ function resolveCardAdvisoryTokens(modes: Modes): CardAdvisoryTokens {
98
99
  const width = toNumber(getVariableByName('cardAdvisory/width', modes), 360)
99
100
  const gap = toNumber(getVariableByName('cardAdvisory/gap', modes), 16)
100
101
  const paddingHorizontal = toNumber(getVariableByName('cardAdvisory/padding/horizontal', modes), 0)
@@ -12,6 +12,7 @@ import Badge from '../Badge/Badge'
12
12
  import Button from '../Button/Button'
13
13
  import InstitutionBadge from '../InstitutionBadge/InstitutionBadge'
14
14
  import type { UnifiedSource } from '../../utils/MediaSource'
15
+ import type { Modes } from '../../design-tokens'
15
16
 
16
17
  export type CardBankAccountItem = {
17
18
  /** Left-aligned label text (e.g. "Account type"). */
@@ -74,7 +75,7 @@ export type CardBankAccountProps = {
74
75
  * out of the box. Caller-supplied modes are merged on top and can
75
76
  * override any of the default keys.
76
77
  */
77
- modes?: Record<string, any>
78
+ modes?: Modes
78
79
  /** Container style override. */
79
80
  style?: StyleProp<ViewStyle>
80
81
  /** Accessibility label for the card region. */
@@ -8,12 +8,13 @@ import Button from '../Button/Button'
8
8
  import Badge from '../Badge/Badge'
9
9
  import ButtonGroup from '../ButtonGroup/ButtonGroup'
10
10
  import IconButton from '../IconButton/IconButton'
11
+ import type { Modes } from '../../design-tokens'
11
12
 
12
13
  export type CardCTAType = 'cta' | 'rating'
13
14
 
14
15
  const optionalTokenAvailability = new Map<string, boolean>()
15
16
 
16
- function getOptionalVariableByName<T>(name: string, modes: Record<string, any>, fallback: T): T {
17
+ function getOptionalVariableByName<T>(name: string, modes: Modes, fallback: T): T {
17
18
  let isAvailable = optionalTokenAvailability.get(name)
18
19
 
19
20
  if (isAvailable === undefined) {
@@ -50,7 +51,7 @@ export type CardCTAProps = {
50
51
  /** Callback for the default dislike action */
51
52
  onPressDislike?: () => void;
52
53
  /** Mode configuration for design token resolution */
53
- modes?: Record<string, any>;
54
+ modes?: Modes;
54
55
  /** Slot: replaces the default icon area (right side) */
55
56
  iconSlot?: React.ReactNode;
56
57
  /** Slot: replaces the default Button */