jfs-components 0.1.12 → 0.1.18

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 (592) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/lib/commonjs/components/ActionFooter/ActionFooter.js +7 -24
  3. package/lib/commonjs/components/ActionTile/ActionTile.js +10 -10
  4. package/lib/commonjs/components/AmountInput/AmountInput.js +3 -3
  5. package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +2 -2
  6. package/lib/commonjs/components/Attached/Attached.js +1 -1
  7. package/lib/commonjs/components/Avatar/Avatar.js +10 -10
  8. package/lib/commonjs/components/AvatarGroup/AvatarGroup.js +50 -29
  9. package/lib/commonjs/components/Badge/Badge.js +12 -12
  10. package/lib/commonjs/components/BenefitCard/BenefitCard.js +95 -21
  11. package/lib/commonjs/components/BottomNav/BottomNav.js +2 -2
  12. package/lib/commonjs/components/BottomNavItem/BottomNavItem.js +3 -3
  13. package/lib/commonjs/components/Button/Button.js +31 -19
  14. package/lib/commonjs/components/Card/Card.js +20 -20
  15. package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +6 -6
  16. package/lib/commonjs/components/CardCTA/CardCTA.js +21 -21
  17. package/lib/commonjs/components/CardFeedback/CardFeedback.js +18 -18
  18. package/lib/commonjs/components/CardFinancialCondition/CardFinancialCondition.js +7 -7
  19. package/lib/commonjs/components/CardInsight/CardInsight.js +1 -2
  20. package/lib/commonjs/components/Carousel/Carousel.js +18 -12
  21. package/lib/commonjs/components/CarouselCardAccounts/CarouselCardAccounts.js +75 -0
  22. package/lib/commonjs/components/Checkbox/Checkbox.js +6 -13
  23. package/lib/commonjs/components/ChipGroup/ChipGroup.js +1 -1
  24. package/lib/commonjs/components/ChipSelect/ChipSelect.js +11 -11
  25. package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +5 -5
  26. package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +8 -8
  27. package/lib/commonjs/components/CircularRating/CircularRating.js +3 -3
  28. package/lib/commonjs/components/CompareTable/CompareTable.js +16 -16
  29. package/lib/commonjs/components/DebitCard/DebitCard.js +18 -18
  30. package/lib/commonjs/components/Disclaimer/Disclaimer.js +5 -5
  31. package/lib/commonjs/components/DonutChart/DonutChart.js +11 -11
  32. package/lib/commonjs/components/Drawer/Drawer.js +60 -60
  33. package/lib/commonjs/components/Dropdown/Dropdown.js +22 -23
  34. package/lib/commonjs/components/DropdownInput/DropdownInput.js +10 -10
  35. package/lib/commonjs/components/EmptyState/EmptyState.js +14 -14
  36. package/lib/commonjs/components/FilterBar/FilterBar.js +2 -2
  37. package/lib/commonjs/components/Form/Form.js +3 -3
  38. package/lib/commonjs/components/FormField/FormField.js +6 -6
  39. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +24 -24
  40. package/lib/commonjs/components/Gauge/Gauge.js +8 -8
  41. package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +10 -10
  42. package/lib/commonjs/components/Icon/Icon.js +6 -6
  43. package/lib/commonjs/components/IconCapsule/IconCapsule.js +7 -7
  44. package/lib/commonjs/components/InputSearch/InputSearch.js +9 -9
  45. package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +3 -3
  46. package/lib/commonjs/components/ListGroup/ListGroup.js +8 -8
  47. package/lib/commonjs/components/ListItem/ListItem.js +10 -10
  48. package/lib/commonjs/components/LottieIntroBlock/LottieIntroBlock.js +13 -13
  49. package/lib/commonjs/components/LottiePlayer/LottiePlayer.js +2 -2
  50. package/lib/commonjs/components/LottiePlayer/LottiePlayer.web.js +2 -2
  51. package/lib/commonjs/components/MediaCard/MediaCard.js +21 -21
  52. package/lib/commonjs/components/MessageField/MessageField.js +8 -8
  53. package/lib/commonjs/components/MoneyValue/MoneyValue.js +7 -7
  54. package/lib/commonjs/components/NavArrow/NavArrow.js +8 -8
  55. package/lib/commonjs/components/NoteInput/NoteInput.js +12 -12
  56. package/lib/commonjs/components/Nudge/Nudge.js +20 -20
  57. package/lib/commonjs/components/OTP/OTP.js +15 -15
  58. package/lib/commonjs/components/PageHero/PageHero.js +16 -16
  59. package/lib/commonjs/components/PaymentFeedback/PaymentFeedback.js +23 -23
  60. package/lib/commonjs/components/Popup/Popup.js +1 -1
  61. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +64 -60
  62. package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +5 -5
  63. package/lib/commonjs/components/Radio/Radio.js +8 -8
  64. package/lib/commonjs/components/RechargeCard/RechargeCard.js +31 -31
  65. package/lib/commonjs/components/SavingsGoalSummary/SavingsGoalSummary.js +59 -12
  66. package/lib/commonjs/components/ScrollArea/ScrollArea.js +126 -0
  67. package/lib/commonjs/components/Section/Section.js +24 -24
  68. package/lib/commonjs/components/StatusHero/StatusHero.js +14 -14
  69. package/lib/commonjs/components/Stepper/Step.js +16 -16
  70. package/lib/commonjs/components/Stepper/StepLabel.js +16 -16
  71. package/lib/commonjs/components/Stepper/Stepper.js +3 -3
  72. package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -10
  73. package/lib/commonjs/components/SupportText/SupportText.js +6 -6
  74. package/lib/commonjs/components/SupportText/SupportTextIcon.js +2 -2
  75. package/lib/commonjs/components/Text/Text.js +14 -2
  76. package/lib/commonjs/components/TextInput/TextInput.js +14 -14
  77. package/lib/commonjs/components/TextSegment/TextSegment.js +14 -2
  78. package/lib/commonjs/components/ThreadHero/ThreadHero.js +17 -17
  79. package/lib/commonjs/components/Title/Title.js +38 -16
  80. package/lib/commonjs/components/Toast/Toast.js +15 -15
  81. package/lib/commonjs/components/Toggle/Toggle.js +3 -11
  82. package/lib/commonjs/components/Tooltip/Tooltip.js +12 -12
  83. package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +13 -13
  84. package/lib/commonjs/components/TransactionDetails/TransactionDetails.js +10 -10
  85. package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +9 -9
  86. package/lib/commonjs/components/UpiHandle/UpiHandle.js +15 -15
  87. package/lib/commonjs/components/index.js +14 -0
  88. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
  89. package/lib/commonjs/design-tokens/figma-modes.generated.js +50 -42
  90. package/lib/commonjs/icons/components/Icon4g.js +19 -0
  91. package/lib/commonjs/icons/components/Icon4gltedata.js +19 -0
  92. package/lib/commonjs/icons/components/Icon5g.js +19 -0
  93. package/lib/commonjs/icons/components/Icon5gdoubleplus.js +19 -0
  94. package/lib/commonjs/icons/components/Icon5gplus.js +19 -0
  95. package/lib/commonjs/icons/components/IconAdblocker.js +19 -0
  96. package/lib/commonjs/icons/components/IconAdblockplus.js +19 -0
  97. package/lib/commonjs/icons/components/IconAnalytics.js +19 -0
  98. package/lib/commonjs/icons/components/IconAnalyticsdata.js +19 -0
  99. package/lib/commonjs/icons/components/IconAnalyticspiechart.js +19 -0
  100. package/lib/commonjs/icons/components/IconAnalyticspiecharttree.js +19 -0
  101. package/lib/commonjs/icons/components/IconAnalyticspiecharttwo.js +19 -0
  102. package/lib/commonjs/icons/components/IconCompoundinterest.js +19 -0
  103. package/lib/commonjs/icons/components/IconConsumptionaccounted.js +19 -0
  104. package/lib/commonjs/icons/components/IconConsumptionaverage.js +19 -0
  105. package/lib/commonjs/icons/components/IconConsumptionhigh.js +19 -0
  106. package/lib/commonjs/icons/components/IconConsumptionlow.js +19 -0
  107. package/lib/commonjs/icons/components/IconConsumptionunaccounted.js +19 -0
  108. package/lib/commonjs/icons/components/IconCsvdoc.js +19 -0
  109. package/lib/commonjs/icons/components/IconDatabase.js +19 -0
  110. package/lib/commonjs/icons/components/IconDigitalecosystem.js +19 -0
  111. package/lib/commonjs/icons/components/IconDigitalselfservice.js +19 -0
  112. package/lib/commonjs/icons/components/IconDistribution.js +19 -0
  113. package/lib/commonjs/icons/components/IconDocument.js +19 -0
  114. package/lib/commonjs/icons/components/IconDocumentdoc.js +19 -0
  115. package/lib/commonjs/icons/components/IconDocumentjpg.js +19 -0
  116. package/lib/commonjs/icons/components/IconDocumentodt.js +19 -0
  117. package/lib/commonjs/icons/components/IconDocumentpdf.js +19 -0
  118. package/lib/commonjs/icons/components/IconDocumentpng.js +19 -0
  119. package/lib/commonjs/icons/components/IconDocumentraw.js +19 -0
  120. package/lib/commonjs/icons/components/IconDocumentrtf.js +19 -0
  121. package/lib/commonjs/icons/components/IconDocumentsettings.js +19 -0
  122. package/lib/commonjs/icons/components/IconDocumenttif.js +19 -0
  123. package/lib/commonjs/icons/components/IconDocumenttxt.js +19 -0
  124. package/lib/commonjs/icons/components/IconDocumentunknown.js +19 -0
  125. package/lib/commonjs/icons/components/IconDocumentxls.js +19 -0
  126. package/lib/commonjs/icons/components/IconDocumentxlsx.js +19 -0
  127. package/lib/commonjs/icons/components/IconFilerequest.js +19 -0
  128. package/lib/commonjs/icons/components/IconFilesend.js +19 -0
  129. package/lib/commonjs/icons/components/IconFileshare.js +19 -0
  130. package/lib/commonjs/icons/components/IconFindinpage.js +19 -0
  131. package/lib/commonjs/icons/components/IconFolder.js +19 -0
  132. package/lib/commonjs/icons/components/IconFolderbookmarks.js +19 -0
  133. package/lib/commonjs/icons/components/IconFolderfavorites.js +19 -0
  134. package/lib/commonjs/icons/components/IconFolderlocked.js +19 -0
  135. package/lib/commonjs/icons/components/IconFoldermovefiles.js +19 -0
  136. package/lib/commonjs/icons/components/IconFolderpublic.js +19 -0
  137. package/lib/commonjs/icons/components/IconFolderrated.js +19 -0
  138. package/lib/commonjs/icons/components/IconFolderrequest.js +19 -0
  139. package/lib/commonjs/icons/components/IconForm.js +19 -0
  140. package/lib/commonjs/icons/components/IconFormadd.js +19 -0
  141. package/lib/commonjs/icons/components/IconForms.js +19 -0
  142. package/lib/commonjs/icons/components/IconGraphincreasing.js +19 -0
  143. package/lib/commonjs/icons/components/IconGraphlow.js +19 -0
  144. package/lib/commonjs/icons/components/IconGraphtable.js +19 -0
  145. package/lib/commonjs/icons/components/IconHealthreport.js +19 -0
  146. package/lib/commonjs/icons/components/IconHubmode.js +19 -0
  147. package/lib/commonjs/icons/components/IconInfrastructure.js +19 -0
  148. package/lib/commonjs/icons/components/IconInterestlow.js +19 -0
  149. package/lib/commonjs/icons/components/IconLte.js +19 -0
  150. package/lib/commonjs/icons/components/IconNetworkfuture.js +19 -0
  151. package/lib/commonjs/icons/components/IconPagesettings.js +19 -0
  152. package/lib/commonjs/icons/components/IconPptxdoc.js +19 -0
  153. package/lib/commonjs/icons/components/IconPreferrednumber.js +19 -0
  154. package/lib/commonjs/icons/components/IconPremiumnumber.js +19 -0
  155. package/lib/commonjs/icons/components/IconProjection.js +19 -0
  156. package/lib/commonjs/icons/components/IconRequest.js +19 -0
  157. package/lib/commonjs/icons/components/IconRoutestraffic.js +19 -0
  158. package/lib/commonjs/icons/components/IconTechnology.js +19 -0
  159. package/lib/commonjs/icons/components/IconVolte.js +19 -0
  160. package/lib/commonjs/icons/components/IconVonr.js +19 -0
  161. package/lib/commonjs/icons/components/IconVowifi.js +19 -0
  162. package/lib/commonjs/icons/components/IconVpndata.js +19 -0
  163. package/lib/commonjs/icons/components/index.js +803 -0
  164. package/lib/commonjs/icons/registry.js +2 -2
  165. package/lib/commonjs/utils/GlassFill/GlassFill.js +69 -73
  166. package/lib/commonjs/utils/index.js +25 -0
  167. package/lib/commonjs/utils/react-utils.js +62 -0
  168. package/lib/commonjs/utils/shadow.js +200 -0
  169. package/lib/module/components/ActionFooter/ActionFooter.js +7 -24
  170. package/lib/module/components/ActionTile/ActionTile.js +10 -10
  171. package/lib/module/components/AmountInput/AmountInput.js +3 -3
  172. package/lib/module/components/AreaLineChart/AreaLineChart.js +2 -2
  173. package/lib/module/components/Attached/Attached.js +1 -1
  174. package/lib/module/components/Avatar/Avatar.js +10 -10
  175. package/lib/module/components/AvatarGroup/AvatarGroup.js +52 -30
  176. package/lib/module/components/Badge/Badge.js +12 -12
  177. package/lib/module/components/BenefitCard/BenefitCard.js +95 -21
  178. package/lib/module/components/BottomNav/BottomNav.js +2 -2
  179. package/lib/module/components/BottomNavItem/BottomNavItem.js +3 -3
  180. package/lib/module/components/Button/Button.js +32 -20
  181. package/lib/module/components/Card/Card.js +20 -20
  182. package/lib/module/components/CardAdvisory/CardAdvisory.js +6 -6
  183. package/lib/module/components/CardCTA/CardCTA.js +21 -21
  184. package/lib/module/components/CardFeedback/CardFeedback.js +18 -18
  185. package/lib/module/components/CardFinancialCondition/CardFinancialCondition.js +7 -7
  186. package/lib/module/components/CardInsight/CardInsight.js +1 -2
  187. package/lib/module/components/Carousel/Carousel.js +18 -12
  188. package/lib/module/components/CarouselCardAccounts/CarouselCardAccounts.js +71 -0
  189. package/lib/module/components/Checkbox/Checkbox.js +2 -9
  190. package/lib/module/components/ChipGroup/ChipGroup.js +1 -1
  191. package/lib/module/components/ChipSelect/ChipSelect.js +11 -11
  192. package/lib/module/components/CircularProgressBar/CircularProgressBar.js +5 -5
  193. package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +8 -8
  194. package/lib/module/components/CircularRating/CircularRating.js +3 -3
  195. package/lib/module/components/CompareTable/CompareTable.js +16 -16
  196. package/lib/module/components/DebitCard/DebitCard.js +18 -18
  197. package/lib/module/components/Disclaimer/Disclaimer.js +5 -5
  198. package/lib/module/components/DonutChart/DonutChart.js +11 -11
  199. package/lib/module/components/Drawer/Drawer.js +60 -60
  200. package/lib/module/components/Dropdown/Dropdown.js +22 -23
  201. package/lib/module/components/DropdownInput/DropdownInput.js +10 -10
  202. package/lib/module/components/EmptyState/EmptyState.js +14 -14
  203. package/lib/module/components/FilterBar/FilterBar.js +2 -2
  204. package/lib/module/components/Form/Form.js +3 -3
  205. package/lib/module/components/FormField/FormField.js +6 -6
  206. package/lib/module/components/FullscreenModal/FullscreenModal.js +24 -24
  207. package/lib/module/components/Gauge/Gauge.js +8 -8
  208. package/lib/module/components/HoldingsCard/HoldingsCard.js +10 -10
  209. package/lib/module/components/Icon/Icon.js +6 -6
  210. package/lib/module/components/IconCapsule/IconCapsule.js +7 -7
  211. package/lib/module/components/InputSearch/InputSearch.js +9 -9
  212. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -3
  213. package/lib/module/components/ListGroup/ListGroup.js +8 -8
  214. package/lib/module/components/ListItem/ListItem.js +10 -10
  215. package/lib/module/components/LottieIntroBlock/LottieIntroBlock.js +13 -13
  216. package/lib/module/components/LottiePlayer/LottiePlayer.js +2 -2
  217. package/lib/module/components/LottiePlayer/LottiePlayer.web.js +2 -2
  218. package/lib/module/components/MediaCard/MediaCard.js +21 -21
  219. package/lib/module/components/MessageField/MessageField.js +8 -8
  220. package/lib/module/components/MoneyValue/MoneyValue.js +7 -7
  221. package/lib/module/components/NavArrow/NavArrow.js +8 -8
  222. package/lib/module/components/NoteInput/NoteInput.js +12 -12
  223. package/lib/module/components/Nudge/Nudge.js +20 -20
  224. package/lib/module/components/OTP/OTP.js +15 -15
  225. package/lib/module/components/PageHero/PageHero.js +16 -16
  226. package/lib/module/components/PaymentFeedback/PaymentFeedback.js +23 -23
  227. package/lib/module/components/Popup/Popup.js +1 -1
  228. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +66 -62
  229. package/lib/module/components/ProgressBadge/ProgressBadge.js +5 -5
  230. package/lib/module/components/Radio/Radio.js +9 -9
  231. package/lib/module/components/RechargeCard/RechargeCard.js +31 -31
  232. package/lib/module/components/SavingsGoalSummary/SavingsGoalSummary.js +60 -13
  233. package/lib/module/components/ScrollArea/ScrollArea.js +121 -0
  234. package/lib/module/components/Section/Section.js +24 -24
  235. package/lib/module/components/StatusHero/StatusHero.js +14 -14
  236. package/lib/module/components/Stepper/Step.js +16 -16
  237. package/lib/module/components/Stepper/StepLabel.js +16 -16
  238. package/lib/module/components/Stepper/Stepper.js +3 -3
  239. package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -10
  240. package/lib/module/components/SupportText/SupportText.js +6 -6
  241. package/lib/module/components/SupportText/SupportTextIcon.js +2 -2
  242. package/lib/module/components/Text/Text.js +15 -3
  243. package/lib/module/components/TextInput/TextInput.js +14 -14
  244. package/lib/module/components/TextSegment/TextSegment.js +15 -3
  245. package/lib/module/components/ThreadHero/ThreadHero.js +17 -17
  246. package/lib/module/components/Title/Title.js +39 -17
  247. package/lib/module/components/Toast/Toast.js +15 -15
  248. package/lib/module/components/Toggle/Toggle.js +4 -12
  249. package/lib/module/components/Tooltip/Tooltip.js +12 -12
  250. package/lib/module/components/TransactionBubble/TransactionBubble.js +13 -13
  251. package/lib/module/components/TransactionDetails/TransactionDetails.js +10 -10
  252. package/lib/module/components/TransactionStatus/TransactionStatus.js +9 -9
  253. package/lib/module/components/UpiHandle/UpiHandle.js +15 -15
  254. package/lib/module/components/index.js +2 -0
  255. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
  256. package/lib/module/design-tokens/figma-modes.generated.js +50 -42
  257. package/lib/module/icons/components/Icon4g.js +12 -0
  258. package/lib/module/icons/components/Icon4gltedata.js +12 -0
  259. package/lib/module/icons/components/Icon5g.js +12 -0
  260. package/lib/module/icons/components/Icon5gdoubleplus.js +12 -0
  261. package/lib/module/icons/components/Icon5gplus.js +12 -0
  262. package/lib/module/icons/components/IconAdblocker.js +12 -0
  263. package/lib/module/icons/components/IconAdblockplus.js +12 -0
  264. package/lib/module/icons/components/IconAnalytics.js +12 -0
  265. package/lib/module/icons/components/IconAnalyticsdata.js +12 -0
  266. package/lib/module/icons/components/IconAnalyticspiechart.js +12 -0
  267. package/lib/module/icons/components/IconAnalyticspiecharttree.js +12 -0
  268. package/lib/module/icons/components/IconAnalyticspiecharttwo.js +12 -0
  269. package/lib/module/icons/components/IconCompoundinterest.js +12 -0
  270. package/lib/module/icons/components/IconConsumptionaccounted.js +12 -0
  271. package/lib/module/icons/components/IconConsumptionaverage.js +12 -0
  272. package/lib/module/icons/components/IconConsumptionhigh.js +12 -0
  273. package/lib/module/icons/components/IconConsumptionlow.js +12 -0
  274. package/lib/module/icons/components/IconConsumptionunaccounted.js +12 -0
  275. package/lib/module/icons/components/IconCsvdoc.js +12 -0
  276. package/lib/module/icons/components/IconDatabase.js +12 -0
  277. package/lib/module/icons/components/IconDigitalecosystem.js +12 -0
  278. package/lib/module/icons/components/IconDigitalselfservice.js +12 -0
  279. package/lib/module/icons/components/IconDistribution.js +12 -0
  280. package/lib/module/icons/components/IconDocument.js +12 -0
  281. package/lib/module/icons/components/IconDocumentdoc.js +12 -0
  282. package/lib/module/icons/components/IconDocumentjpg.js +12 -0
  283. package/lib/module/icons/components/IconDocumentodt.js +12 -0
  284. package/lib/module/icons/components/IconDocumentpdf.js +12 -0
  285. package/lib/module/icons/components/IconDocumentpng.js +12 -0
  286. package/lib/module/icons/components/IconDocumentraw.js +12 -0
  287. package/lib/module/icons/components/IconDocumentrtf.js +12 -0
  288. package/lib/module/icons/components/IconDocumentsettings.js +12 -0
  289. package/lib/module/icons/components/IconDocumenttif.js +12 -0
  290. package/lib/module/icons/components/IconDocumenttxt.js +12 -0
  291. package/lib/module/icons/components/IconDocumentunknown.js +12 -0
  292. package/lib/module/icons/components/IconDocumentxls.js +12 -0
  293. package/lib/module/icons/components/IconDocumentxlsx.js +12 -0
  294. package/lib/module/icons/components/IconFilerequest.js +12 -0
  295. package/lib/module/icons/components/IconFilesend.js +12 -0
  296. package/lib/module/icons/components/IconFileshare.js +12 -0
  297. package/lib/module/icons/components/IconFindinpage.js +12 -0
  298. package/lib/module/icons/components/IconFolder.js +12 -0
  299. package/lib/module/icons/components/IconFolderbookmarks.js +12 -0
  300. package/lib/module/icons/components/IconFolderfavorites.js +12 -0
  301. package/lib/module/icons/components/IconFolderlocked.js +12 -0
  302. package/lib/module/icons/components/IconFoldermovefiles.js +12 -0
  303. package/lib/module/icons/components/IconFolderpublic.js +12 -0
  304. package/lib/module/icons/components/IconFolderrated.js +12 -0
  305. package/lib/module/icons/components/IconFolderrequest.js +12 -0
  306. package/lib/module/icons/components/IconForm.js +12 -0
  307. package/lib/module/icons/components/IconFormadd.js +12 -0
  308. package/lib/module/icons/components/IconForms.js +12 -0
  309. package/lib/module/icons/components/IconGraphincreasing.js +12 -0
  310. package/lib/module/icons/components/IconGraphlow.js +12 -0
  311. package/lib/module/icons/components/IconGraphtable.js +12 -0
  312. package/lib/module/icons/components/IconHealthreport.js +12 -0
  313. package/lib/module/icons/components/IconHubmode.js +12 -0
  314. package/lib/module/icons/components/IconInfrastructure.js +12 -0
  315. package/lib/module/icons/components/IconInterestlow.js +12 -0
  316. package/lib/module/icons/components/IconLte.js +12 -0
  317. package/lib/module/icons/components/IconNetworkfuture.js +12 -0
  318. package/lib/module/icons/components/IconPagesettings.js +12 -0
  319. package/lib/module/icons/components/IconPptxdoc.js +12 -0
  320. package/lib/module/icons/components/IconPreferrednumber.js +12 -0
  321. package/lib/module/icons/components/IconPremiumnumber.js +12 -0
  322. package/lib/module/icons/components/IconProjection.js +12 -0
  323. package/lib/module/icons/components/IconRequest.js +12 -0
  324. package/lib/module/icons/components/IconRoutestraffic.js +12 -0
  325. package/lib/module/icons/components/IconTechnology.js +12 -0
  326. package/lib/module/icons/components/IconVolte.js +12 -0
  327. package/lib/module/icons/components/IconVonr.js +12 -0
  328. package/lib/module/icons/components/IconVowifi.js +12 -0
  329. package/lib/module/icons/components/IconVpndata.js +12 -0
  330. package/lib/module/icons/components/index.js +73 -0
  331. package/lib/module/icons/registry.js +2 -2
  332. package/lib/module/utils/GlassFill/GlassFill.js +69 -72
  333. package/lib/module/utils/index.js +2 -1
  334. package/lib/module/utils/react-utils.js +61 -0
  335. package/lib/module/utils/shadow.js +194 -0
  336. package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +33 -4
  337. package/lib/typescript/src/components/Carousel/Carousel.d.ts +11 -1
  338. package/lib/typescript/src/components/CarouselCardAccounts/CarouselCardAccounts.d.ts +57 -0
  339. package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +11 -1
  340. package/lib/typescript/src/components/ScrollArea/ScrollArea.d.ts +77 -0
  341. package/lib/typescript/src/components/Text/Text.d.ts +12 -3
  342. package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +12 -3
  343. package/lib/typescript/src/components/Title/Title.d.ts +12 -2
  344. package/lib/typescript/src/components/index.d.ts +2 -0
  345. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +23 -15
  346. package/lib/typescript/src/icons/components/Icon4g.d.ts +3 -0
  347. package/lib/typescript/src/icons/components/Icon4gltedata.d.ts +3 -0
  348. package/lib/typescript/src/icons/components/Icon5g.d.ts +3 -0
  349. package/lib/typescript/src/icons/components/Icon5gdoubleplus.d.ts +3 -0
  350. package/lib/typescript/src/icons/components/Icon5gplus.d.ts +3 -0
  351. package/lib/typescript/src/icons/components/IconAdblocker.d.ts +3 -0
  352. package/lib/typescript/src/icons/components/IconAdblockplus.d.ts +3 -0
  353. package/lib/typescript/src/icons/components/IconAnalytics.d.ts +3 -0
  354. package/lib/typescript/src/icons/components/IconAnalyticsdata.d.ts +3 -0
  355. package/lib/typescript/src/icons/components/IconAnalyticspiechart.d.ts +3 -0
  356. package/lib/typescript/src/icons/components/IconAnalyticspiecharttree.d.ts +3 -0
  357. package/lib/typescript/src/icons/components/IconAnalyticspiecharttwo.d.ts +3 -0
  358. package/lib/typescript/src/icons/components/IconCompoundinterest.d.ts +3 -0
  359. package/lib/typescript/src/icons/components/IconConsumptionaccounted.d.ts +3 -0
  360. package/lib/typescript/src/icons/components/IconConsumptionaverage.d.ts +3 -0
  361. package/lib/typescript/src/icons/components/IconConsumptionhigh.d.ts +3 -0
  362. package/lib/typescript/src/icons/components/IconConsumptionlow.d.ts +3 -0
  363. package/lib/typescript/src/icons/components/IconConsumptionunaccounted.d.ts +3 -0
  364. package/lib/typescript/src/icons/components/IconCsvdoc.d.ts +3 -0
  365. package/lib/typescript/src/icons/components/IconDatabase.d.ts +3 -0
  366. package/lib/typescript/src/icons/components/IconDigitalecosystem.d.ts +3 -0
  367. package/lib/typescript/src/icons/components/IconDigitalselfservice.d.ts +3 -0
  368. package/lib/typescript/src/icons/components/IconDistribution.d.ts +3 -0
  369. package/lib/typescript/src/icons/components/IconDocument.d.ts +3 -0
  370. package/lib/typescript/src/icons/components/IconDocumentdoc.d.ts +3 -0
  371. package/lib/typescript/src/icons/components/IconDocumentjpg.d.ts +3 -0
  372. package/lib/typescript/src/icons/components/IconDocumentodt.d.ts +3 -0
  373. package/lib/typescript/src/icons/components/IconDocumentpdf.d.ts +3 -0
  374. package/lib/typescript/src/icons/components/IconDocumentpng.d.ts +3 -0
  375. package/lib/typescript/src/icons/components/IconDocumentraw.d.ts +3 -0
  376. package/lib/typescript/src/icons/components/IconDocumentrtf.d.ts +3 -0
  377. package/lib/typescript/src/icons/components/IconDocumentsettings.d.ts +3 -0
  378. package/lib/typescript/src/icons/components/IconDocumenttif.d.ts +3 -0
  379. package/lib/typescript/src/icons/components/IconDocumenttxt.d.ts +3 -0
  380. package/lib/typescript/src/icons/components/IconDocumentunknown.d.ts +3 -0
  381. package/lib/typescript/src/icons/components/IconDocumentxls.d.ts +3 -0
  382. package/lib/typescript/src/icons/components/IconDocumentxlsx.d.ts +3 -0
  383. package/lib/typescript/src/icons/components/IconFilerequest.d.ts +3 -0
  384. package/lib/typescript/src/icons/components/IconFilesend.d.ts +3 -0
  385. package/lib/typescript/src/icons/components/IconFileshare.d.ts +3 -0
  386. package/lib/typescript/src/icons/components/IconFindinpage.d.ts +3 -0
  387. package/lib/typescript/src/icons/components/IconFolder.d.ts +3 -0
  388. package/lib/typescript/src/icons/components/IconFolderbookmarks.d.ts +3 -0
  389. package/lib/typescript/src/icons/components/IconFolderfavorites.d.ts +3 -0
  390. package/lib/typescript/src/icons/components/IconFolderlocked.d.ts +3 -0
  391. package/lib/typescript/src/icons/components/IconFoldermovefiles.d.ts +3 -0
  392. package/lib/typescript/src/icons/components/IconFolderpublic.d.ts +3 -0
  393. package/lib/typescript/src/icons/components/IconFolderrated.d.ts +3 -0
  394. package/lib/typescript/src/icons/components/IconFolderrequest.d.ts +3 -0
  395. package/lib/typescript/src/icons/components/IconForm.d.ts +3 -0
  396. package/lib/typescript/src/icons/components/IconFormadd.d.ts +3 -0
  397. package/lib/typescript/src/icons/components/IconForms.d.ts +3 -0
  398. package/lib/typescript/src/icons/components/IconGraphincreasing.d.ts +3 -0
  399. package/lib/typescript/src/icons/components/IconGraphlow.d.ts +3 -0
  400. package/lib/typescript/src/icons/components/IconGraphtable.d.ts +3 -0
  401. package/lib/typescript/src/icons/components/IconHealthreport.d.ts +3 -0
  402. package/lib/typescript/src/icons/components/IconHubmode.d.ts +3 -0
  403. package/lib/typescript/src/icons/components/IconInfrastructure.d.ts +3 -0
  404. package/lib/typescript/src/icons/components/IconInterestlow.d.ts +3 -0
  405. package/lib/typescript/src/icons/components/IconLte.d.ts +3 -0
  406. package/lib/typescript/src/icons/components/IconNetworkfuture.d.ts +3 -0
  407. package/lib/typescript/src/icons/components/IconPagesettings.d.ts +3 -0
  408. package/lib/typescript/src/icons/components/IconPptxdoc.d.ts +3 -0
  409. package/lib/typescript/src/icons/components/IconPreferrednumber.d.ts +3 -0
  410. package/lib/typescript/src/icons/components/IconPremiumnumber.d.ts +3 -0
  411. package/lib/typescript/src/icons/components/IconProjection.d.ts +3 -0
  412. package/lib/typescript/src/icons/components/IconRequest.d.ts +3 -0
  413. package/lib/typescript/src/icons/components/IconRoutestraffic.d.ts +3 -0
  414. package/lib/typescript/src/icons/components/IconTechnology.d.ts +3 -0
  415. package/lib/typescript/src/icons/components/IconVolte.d.ts +3 -0
  416. package/lib/typescript/src/icons/components/IconVonr.d.ts +3 -0
  417. package/lib/typescript/src/icons/components/IconVowifi.d.ts +3 -0
  418. package/lib/typescript/src/icons/components/IconVpndata.d.ts +3 -0
  419. package/lib/typescript/src/icons/components/index.d.ts +73 -0
  420. package/lib/typescript/src/icons/registry.d.ts +1 -1
  421. package/lib/typescript/src/utils/GlassFill/GlassFill.d.ts +11 -4
  422. package/lib/typescript/src/utils/index.d.ts +2 -0
  423. package/lib/typescript/src/utils/react-utils.d.ts +40 -1
  424. package/lib/typescript/src/utils/shadow.d.ts +72 -0
  425. package/package.json +2 -2
  426. package/src/components/ActionFooter/ActionFooter.tsx +8 -26
  427. package/src/components/ActionTile/ActionTile.tsx +10 -10
  428. package/src/components/AmountInput/AmountInput.tsx +3 -3
  429. package/src/components/AreaLineChart/AreaLineChart.tsx +2 -2
  430. package/src/components/Attached/Attached.tsx +1 -1
  431. package/src/components/Avatar/Avatar.tsx +10 -10
  432. package/src/components/AvatarGroup/AvatarGroup.tsx +53 -27
  433. package/src/components/Badge/Badge.tsx +12 -13
  434. package/src/components/BenefitCard/BenefitCard.tsx +120 -27
  435. package/src/components/BottomNav/BottomNav.tsx +2 -2
  436. package/src/components/BottomNavItem/BottomNavItem.tsx +3 -3
  437. package/src/components/Button/Button.tsx +30 -20
  438. package/src/components/Card/Card.tsx +20 -20
  439. package/src/components/CardAdvisory/CardAdvisory.tsx +6 -6
  440. package/src/components/CardCTA/CardCTA.tsx +21 -21
  441. package/src/components/CardFeedback/CardFeedback.tsx +18 -18
  442. package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +7 -10
  443. package/src/components/CardInsight/CardInsight.tsx +1 -3
  444. package/src/components/Carousel/Carousel.tsx +29 -12
  445. package/src/components/CarouselCardAccounts/CarouselCardAccounts.tsx +113 -0
  446. package/src/components/Checkbox/Checkbox.tsx +2 -8
  447. package/src/components/ChipGroup/ChipGroup.tsx +1 -1
  448. package/src/components/ChipSelect/ChipSelect.tsx +11 -11
  449. package/src/components/CircularProgressBar/CircularProgressBar.tsx +5 -5
  450. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +8 -8
  451. package/src/components/CircularRating/CircularRating.tsx +3 -3
  452. package/src/components/CompareTable/CompareTable.tsx +16 -16
  453. package/src/components/DebitCard/DebitCard.tsx +22 -22
  454. package/src/components/Disclaimer/Disclaimer.tsx +5 -5
  455. package/src/components/DonutChart/DonutChart.tsx +11 -45
  456. package/src/components/Drawer/Drawer.tsx +80 -71
  457. package/src/components/Dropdown/Dropdown.tsx +23 -28
  458. package/src/components/DropdownInput/DropdownInput.tsx +10 -17
  459. package/src/components/EmptyState/EmptyState.tsx +14 -14
  460. package/src/components/FilterBar/FilterBar.tsx +2 -2
  461. package/src/components/Form/Form.tsx +3 -3
  462. package/src/components/FormField/FormField.tsx +6 -11
  463. package/src/components/FullscreenModal/FullscreenModal.tsx +24 -24
  464. package/src/components/Gauge/Gauge.tsx +8 -8
  465. package/src/components/HoldingsCard/HoldingsCard.tsx +10 -10
  466. package/src/components/Icon/Icon.tsx +6 -6
  467. package/src/components/IconCapsule/IconCapsule.tsx +7 -7
  468. package/src/components/InputSearch/InputSearch.tsx +9 -9
  469. package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -6
  470. package/src/components/ListGroup/ListGroup.tsx +8 -8
  471. package/src/components/ListItem/ListItem.tsx +10 -10
  472. package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +13 -16
  473. package/src/components/LottiePlayer/LottiePlayer.tsx +2 -2
  474. package/src/components/LottiePlayer/LottiePlayer.web.tsx +2 -2
  475. package/src/components/MediaCard/MediaCard.tsx +21 -21
  476. package/src/components/MessageField/MessageField.tsx +8 -16
  477. package/src/components/MoneyValue/MoneyValue.tsx +7 -7
  478. package/src/components/NavArrow/NavArrow.tsx +8 -8
  479. package/src/components/NoteInput/NoteInput.tsx +12 -12
  480. package/src/components/Nudge/Nudge.tsx +20 -20
  481. package/src/components/OTP/OTP.tsx +16 -16
  482. package/src/components/PageHero/PageHero.tsx +16 -16
  483. package/src/components/PaymentFeedback/PaymentFeedback.tsx +27 -27
  484. package/src/components/Popup/Popup.tsx +1 -1
  485. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +76 -47
  486. package/src/components/ProgressBadge/ProgressBadge.tsx +5 -5
  487. package/src/components/Radio/Radio.tsx +8 -9
  488. package/src/components/RechargeCard/RechargeCard.tsx +31 -31
  489. package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +105 -13
  490. package/src/components/ScrollArea/ScrollArea.tsx +200 -0
  491. package/src/components/Section/Section.tsx +26 -26
  492. package/src/components/StatusHero/StatusHero.tsx +14 -14
  493. package/src/components/Stepper/Step.tsx +16 -18
  494. package/src/components/Stepper/StepLabel.tsx +16 -27
  495. package/src/components/Stepper/Stepper.tsx +3 -4
  496. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -20
  497. package/src/components/SupportText/SupportText.tsx +6 -6
  498. package/src/components/SupportText/SupportTextIcon.tsx +2 -2
  499. package/src/components/Text/Text.tsx +23 -5
  500. package/src/components/TextInput/TextInput.tsx +14 -14
  501. package/src/components/TextSegment/TextSegment.tsx +22 -4
  502. package/src/components/ThreadHero/ThreadHero.tsx +17 -17
  503. package/src/components/Title/Title.tsx +44 -18
  504. package/src/components/Toast/Toast.tsx +15 -15
  505. package/src/components/Toggle/Toggle.tsx +5 -10
  506. package/src/components/Tooltip/Tooltip.tsx +12 -12
  507. package/src/components/TransactionBubble/TransactionBubble.tsx +15 -15
  508. package/src/components/TransactionDetails/TransactionDetails.tsx +10 -10
  509. package/src/components/TransactionStatus/TransactionStatus.tsx +9 -9
  510. package/src/components/UpiHandle/UpiHandle.tsx +15 -15
  511. package/src/components/index.ts +2 -0
  512. package/src/design-tokens/Coin Variables-variables-full.json +1 -1
  513. package/src/design-tokens/figma-modes.generated.ts +50 -42
  514. package/src/icons/components/Icon4g.tsx +11 -0
  515. package/src/icons/components/Icon4gltedata.tsx +11 -0
  516. package/src/icons/components/Icon5g.tsx +11 -0
  517. package/src/icons/components/Icon5gdoubleplus.tsx +11 -0
  518. package/src/icons/components/Icon5gplus.tsx +11 -0
  519. package/src/icons/components/IconAdblocker.tsx +11 -0
  520. package/src/icons/components/IconAdblockplus.tsx +11 -0
  521. package/src/icons/components/IconAnalytics.tsx +11 -0
  522. package/src/icons/components/IconAnalyticsdata.tsx +11 -0
  523. package/src/icons/components/IconAnalyticspiechart.tsx +11 -0
  524. package/src/icons/components/IconAnalyticspiecharttree.tsx +11 -0
  525. package/src/icons/components/IconAnalyticspiecharttwo.tsx +11 -0
  526. package/src/icons/components/IconCompoundinterest.tsx +11 -0
  527. package/src/icons/components/IconConsumptionaccounted.tsx +11 -0
  528. package/src/icons/components/IconConsumptionaverage.tsx +11 -0
  529. package/src/icons/components/IconConsumptionhigh.tsx +11 -0
  530. package/src/icons/components/IconConsumptionlow.tsx +11 -0
  531. package/src/icons/components/IconConsumptionunaccounted.tsx +11 -0
  532. package/src/icons/components/IconCsvdoc.tsx +11 -0
  533. package/src/icons/components/IconDatabase.tsx +11 -0
  534. package/src/icons/components/IconDigitalecosystem.tsx +11 -0
  535. package/src/icons/components/IconDigitalselfservice.tsx +11 -0
  536. package/src/icons/components/IconDistribution.tsx +11 -0
  537. package/src/icons/components/IconDocument.tsx +11 -0
  538. package/src/icons/components/IconDocumentdoc.tsx +11 -0
  539. package/src/icons/components/IconDocumentjpg.tsx +11 -0
  540. package/src/icons/components/IconDocumentodt.tsx +11 -0
  541. package/src/icons/components/IconDocumentpdf.tsx +11 -0
  542. package/src/icons/components/IconDocumentpng.tsx +11 -0
  543. package/src/icons/components/IconDocumentraw.tsx +11 -0
  544. package/src/icons/components/IconDocumentrtf.tsx +11 -0
  545. package/src/icons/components/IconDocumentsettings.tsx +11 -0
  546. package/src/icons/components/IconDocumenttif.tsx +11 -0
  547. package/src/icons/components/IconDocumenttxt.tsx +11 -0
  548. package/src/icons/components/IconDocumentunknown.tsx +11 -0
  549. package/src/icons/components/IconDocumentxls.tsx +11 -0
  550. package/src/icons/components/IconDocumentxlsx.tsx +11 -0
  551. package/src/icons/components/IconFilerequest.tsx +11 -0
  552. package/src/icons/components/IconFilesend.tsx +11 -0
  553. package/src/icons/components/IconFileshare.tsx +11 -0
  554. package/src/icons/components/IconFindinpage.tsx +11 -0
  555. package/src/icons/components/IconFolder.tsx +11 -0
  556. package/src/icons/components/IconFolderbookmarks.tsx +11 -0
  557. package/src/icons/components/IconFolderfavorites.tsx +11 -0
  558. package/src/icons/components/IconFolderlocked.tsx +11 -0
  559. package/src/icons/components/IconFoldermovefiles.tsx +11 -0
  560. package/src/icons/components/IconFolderpublic.tsx +11 -0
  561. package/src/icons/components/IconFolderrated.tsx +11 -0
  562. package/src/icons/components/IconFolderrequest.tsx +11 -0
  563. package/src/icons/components/IconForm.tsx +11 -0
  564. package/src/icons/components/IconFormadd.tsx +11 -0
  565. package/src/icons/components/IconForms.tsx +11 -0
  566. package/src/icons/components/IconGraphincreasing.tsx +11 -0
  567. package/src/icons/components/IconGraphlow.tsx +11 -0
  568. package/src/icons/components/IconGraphtable.tsx +11 -0
  569. package/src/icons/components/IconHealthreport.tsx +11 -0
  570. package/src/icons/components/IconHubmode.tsx +11 -0
  571. package/src/icons/components/IconInfrastructure.tsx +11 -0
  572. package/src/icons/components/IconInterestlow.tsx +11 -0
  573. package/src/icons/components/IconLte.tsx +11 -0
  574. package/src/icons/components/IconNetworkfuture.tsx +11 -0
  575. package/src/icons/components/IconPagesettings.tsx +11 -0
  576. package/src/icons/components/IconPptxdoc.tsx +11 -0
  577. package/src/icons/components/IconPreferrednumber.tsx +11 -0
  578. package/src/icons/components/IconPremiumnumber.tsx +11 -0
  579. package/src/icons/components/IconProjection.tsx +11 -0
  580. package/src/icons/components/IconRequest.tsx +11 -0
  581. package/src/icons/components/IconRoutestraffic.tsx +11 -0
  582. package/src/icons/components/IconTechnology.tsx +11 -0
  583. package/src/icons/components/IconVolte.tsx +11 -0
  584. package/src/icons/components/IconVonr.tsx +11 -0
  585. package/src/icons/components/IconVowifi.tsx +11 -0
  586. package/src/icons/components/IconVpndata.tsx +11 -0
  587. package/src/icons/components/index.ts +73 -0
  588. package/src/icons/registry.ts +293 -1
  589. package/src/utils/GlassFill/GlassFill.tsx +59 -56
  590. package/src/utils/index.ts +2 -0
  591. package/src/utils/react-utils.ts +72 -1
  592. package/src/utils/shadow.ts +219 -0
@@ -4,15 +4,21 @@ import {
4
4
  Text,
5
5
  Pressable,
6
6
  StyleSheet,
7
- Platform,
8
- Image as RNImage,
9
7
  type ViewStyle,
10
8
  type TextStyle,
11
9
  type StyleProp,
12
10
  type ImageSourcePropType,
13
11
  } from 'react-native'
14
- import MaskedView from '@react-native-masked-view/masked-view'
15
- import Svg, { Defs, LinearGradient, Stop, Rect } from 'react-native-svg'
12
+ import Svg, {
13
+ Defs,
14
+ LinearGradient,
15
+ Stop,
16
+ Rect,
17
+ Mask,
18
+ Filter,
19
+ FeGaussianBlur,
20
+ Image as SvgImage,
21
+ } from 'react-native-svg'
16
22
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
17
23
  import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
18
24
  import Avatar from '../Avatar/Avatar'
@@ -138,7 +144,9 @@ function ProductMerchandisingCard({
138
144
  const rawId = useId()
139
145
  const safeId = rawId.replace(/[^a-zA-Z0-9_-]/g, '')
140
146
  const scrimId = `pmc-footer-scrim-${safeId}`
147
+ const blurGradientId = `pmc-footer-blurgrad-${safeId}`
141
148
  const blurMaskId = `pmc-footer-blurmask-${safeId}`
149
+ const blurFilterId = `pmc-footer-blurfilter-${safeId}`
142
150
 
143
151
  const normalizedImageSource = useMemo(() => normalizeImageSource(imageSource), [imageSource])
144
152
 
@@ -234,41 +242,65 @@ function ProductMerchandisingCard({
234
242
 
235
243
  <View style={tokens.footer} pointerEvents="box-none">
236
244
  {/* Progressive blur — clear at the top of the footer, ramping to
237
- a soft blur at the bottom. Rather than the unmaintained native
238
- BlurView (which renders as a flat black tint on Android +
239
- Fabric and can hide the image on iOS), we reveal a *blurred
240
- copy of the card's own image* through a vertical gradient
241
- mask. `Image.blurRadius` is a built-in RN prop with a real
242
- Gaussian blur on BOTH iOS and Android and needs no native
243
- module. The blurred copy is pinned to the card's bottom at the
244
- full card height so it lines up pixel-for-pixel with the
245
- full-bleed background, and the mask makes the blur swell in
246
- smoothly toward the bottom (true progressive blur). */}
245
+ a soft blur at the bottom. We reveal a *blurred copy of the
246
+ card's own image* through a vertical gradient mask, rendered
247
+ entirely with `react-native-svg` (a Fabric/codegen-correct
248
+ native module that resolves on both the Old and New
249
+ architectures). The SVG `<Image>` is blurred by an
250
+ `<FeGaussianBlur>` filter (identical, resolution-independent
251
+ Gaussian on iOS, Android AND web) and revealed by a luminance
252
+ `<Mask>` fed a vertical gradient, so the blur swells in
253
+ smoothly toward the bottom. This deliberately avoids the
254
+ unmaintained `@react-native-masked-view/masked-view` (a legacy
255
+ Paper component that resolves to a plain object — and crashes
256
+ "Element type is invalid" — under the New Architecture interop)
257
+ and the flaky native `BlurView`. Because the mask is fully
258
+ transparent at the top, any minor crop mismatch between this
259
+ cover-fitted copy and the full-bleed background is invisible:
260
+ where they could differ, the blurred layer isn't drawn. */}
247
261
  {normalizedImageSource != null ? (
248
262
  <View style={StyleSheet.absoluteFill} pointerEvents="none">
249
- <MaskedView
250
- style={StyleSheet.absoluteFill}
251
- maskElement={
252
- <Svg width="100%" height="100%">
253
- <Defs>
254
- <LinearGradient id={blurMaskId} x1="0" y1="0" x2="0" y2="1">
255
- <Stop offset="0" stopColor="#000000" stopOpacity={0} />
256
- <Stop offset="0.35" stopColor="#000000" stopOpacity={0.5} />
257
- <Stop offset="0.7" stopColor="#000000" stopOpacity={0.92} />
258
- <Stop offset="1" stopColor="#000000" stopOpacity={1} />
259
- </LinearGradient>
260
- </Defs>
261
- <Rect x="0" y="0" width="100%" height="100%" fill={`url(#${blurMaskId})`} />
262
- </Svg>
263
- }
264
- >
265
- <RNImage
266
- source={normalizedImageSource}
267
- blurRadius={tokens.imageBlurRadius}
268
- resizeMode="cover"
269
- style={{ position: 'absolute', left: 0, right: 0, bottom: 0, width: '100%', height }}
263
+ <Svg width="100%" height="100%">
264
+ <Defs>
265
+ <Filter
266
+ id={blurFilterId}
267
+ x="-15%"
268
+ y="-15%"
269
+ width="130%"
270
+ height="130%"
271
+ >
272
+ <FeGaussianBlur
273
+ stdDeviation={tokens.imageBlurStdDeviation}
274
+ edgeMode="duplicate"
275
+ />
276
+ </Filter>
277
+ <LinearGradient id={blurGradientId} x1="0" y1="0" x2="0" y2="1">
278
+ <Stop offset="0" stopColor="#ffffff" stopOpacity={0} />
279
+ <Stop offset="0.35" stopColor="#ffffff" stopOpacity={0.5} />
280
+ <Stop offset="0.7" stopColor="#ffffff" stopOpacity={0.92} />
281
+ <Stop offset="1" stopColor="#ffffff" stopOpacity={1} />
282
+ </LinearGradient>
283
+ <Mask id={blurMaskId}>
284
+ <Rect
285
+ x="0"
286
+ y="0"
287
+ width="100%"
288
+ height="100%"
289
+ fill={`url(#${blurGradientId})`}
290
+ />
291
+ </Mask>
292
+ </Defs>
293
+ <SvgImage
294
+ href={normalizedImageSource as any}
295
+ x="0"
296
+ y="0"
297
+ width="100%"
298
+ height="100%"
299
+ preserveAspectRatio="xMidYMid slice"
300
+ filter={`url(#${blurFilterId})`}
301
+ mask={`url(#${blurMaskId})`}
270
302
  />
271
- </MaskedView>
303
+ </Svg>
272
304
  </View>
273
305
  ) : (
274
306
  <GlassFill tint="dark" intensity={tokens.blurIntensity} progressive />
@@ -348,7 +380,7 @@ const SPECIAL_BADGE_INTENSITY = 17 // ~5px CSS blur / ~2 native blurAmount
348
380
  interface ResolvedTokens {
349
381
  radius: number
350
382
  blurIntensity: number
351
- imageBlurRadius: number
383
+ imageBlurStdDeviation: number
352
384
  header: ViewStyle
353
385
  footer: ViewStyle
354
386
  textWrap: ViewStyle
@@ -394,20 +426,17 @@ function resolveTokens(modes: Modes): ResolvedTokens {
394
426
  const sbFamily = asStr(getVariableByName('productMerchandisingcard/specialbadge/text/fontfamily', modes), 'JioType Var')
395
427
  const sbWeight = asStr(getVariableByName('productMerchandisingcard/specialbadge/text/fontweight', modes), '500')
396
428
 
397
- // `Image.blurRadius` is interpreted differently per platform — iOS applies a
398
- // strong Gaussian while Android's IterativeBoxBlur is gentler at the same
399
- // numeric radius so we tune each platform to land on the same perceived
400
- // "minimal" frosted strength as the Figma design.
401
- const imageBlurRadius = Platform.select({
402
- ios: Math.max(6, Math.round(blurRadius * 0.5)),
403
- android: Math.max(12, Math.round(blurRadius * 0.95)),
404
- default: Math.max(8, Math.round(blurRadius * 0.6)),
405
- }) as number
429
+ // SVG `<FeGaussianBlur stdDeviation>` is resolution-independent and renders
430
+ // an identical Gaussian on iOS, Android and web so unlike the old
431
+ // `Image.blurRadius` path it needs no per-platform tuning. `stdDeviation` is
432
+ // roughly half a perceptual "blur radius", so we scale the `blur/minimal`
433
+ // token down to land on the same subtle frosted strength as the design.
434
+ const imageBlurStdDeviation = Math.max(4, Math.round(blurRadius * 0.35))
406
435
 
407
436
  return {
408
437
  radius,
409
438
  blurIntensity: Math.max(0, Math.min(100, Math.round(blurRadius * BLUR_INTENSITY_FACTOR))),
410
- imageBlurRadius,
439
+ imageBlurStdDeviation,
411
440
  header: {
412
441
  flexDirection: 'row',
413
442
  alignItems: 'flex-start',
@@ -62,9 +62,9 @@ function ProgressBadge({
62
62
  }: ProgressBadgeProps) {
63
63
  // Resolve layout tokens
64
64
  const backgroundColor =
65
- getVariableByName('progressBadge/background', modes) || '#ffffff'
65
+ getVariableByName('progressBadge/background', modes)
66
66
  const progressColor =
67
- getVariableByName('progressBadge/progress/color', modes) || '#ebebed'
67
+ getVariableByName('progressBadge/progress/color', modes)
68
68
  const gap = getVariableByName('progressBadge/gap', modes) ?? 12
69
69
  const paddingHorizontal =
70
70
  getVariableByName('progressBadge/padding/horizontal', modes) ?? 16
@@ -76,7 +76,7 @@ function ProgressBadge({
76
76
 
77
77
  // Resolve typography tokens
78
78
  const fontFamily =
79
- getVariableByName('progressBadge/fontFamily', modes) || 'JioType_Var:Medium'
79
+ getVariableByName('progressBadge/fontFamily', modes)
80
80
  const fontWeightRaw = getVariableByName('progressBadge/fontWeight', modes) ?? 500
81
81
  const fontWeight =
82
82
  typeof fontWeightRaw === 'number'
@@ -85,11 +85,11 @@ function ProgressBadge({
85
85
  const fontSize = getVariableByName('progressBadge/fontSize', modes) ?? 14
86
86
  const lineHeight = getVariableByName('progressBadge/lineHeight', modes) ?? 17
87
87
  const textColor =
88
- getVariableByName('progressBadge/foreground', modes) || '#000000'
88
+ getVariableByName('progressBadge/foreground', modes)
89
89
 
90
90
  // Resolve icon tokens
91
91
  const iconColor =
92
- getVariableByName('progressBadge/icon/color', modes) || '#f50030'
92
+ getVariableByName('progressBadge/icon/color', modes)
93
93
  const iconSize = getVariableByName('progressBadge/icon/size', modes) ?? 18
94
94
 
95
95
  const containerStyle: ViewStyle = {
@@ -3,13 +3,13 @@ import {
3
3
  Pressable,
4
4
  View,
5
5
  StyleSheet,
6
- Platform,
7
6
  ViewStyle,
8
7
  DimensionValue,
9
8
  StyleProp,
10
9
  } from 'react-native'
11
10
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
11
  import { EMPTY_MODES } from '../../utils/react-utils'
12
+ import { boxShadow } from '../../utils/shadow'
13
13
  import type { Modes } from '../../design-tokens'
14
14
 
15
15
  // ---------------------------------------------------------------------------
@@ -61,9 +61,9 @@ export const Radio = forwardRef<View, RadioProps>(function Radio({
61
61
  const [pressed, setPressed] = useState(false)
62
62
 
63
63
  // ---- Dimensions ----
64
- const widthStr = getVariableByName('radio/width', modes) || '18'
65
- const heightStr = getVariableByName('radio/height', modes) || '18'
66
- const selectorSizeStr = getVariableByName('radio/selector/size', modes) || '10'
64
+ const widthStr = getVariableByName('radio/width', modes)
65
+ const heightStr = getVariableByName('radio/height', modes)
66
+ const selectorSizeStr = getVariableByName('radio/selector/size', modes)
67
67
 
68
68
  const width = parseFloat(widthStr?.toString() || '18')
69
69
  const height = parseFloat(heightStr?.toString() || '18')
@@ -101,7 +101,7 @@ export const Radio = forwardRef<View, RadioProps>(function Radio({
101
101
  // ---- Colors & Border ----
102
102
 
103
103
  const resolveColor = (path: string, fallback: string) => {
104
- return getVariableByName(path, modes) || fallback
104
+ return getVariableByName(path, modes)
105
105
  }
106
106
 
107
107
  // Background Color
@@ -155,10 +155,9 @@ export const Radio = forwardRef<View, RadioProps>(function Radio({
155
155
  backgroundColor,
156
156
  justifyContent: 'center',
157
157
  alignItems: 'center',
158
- // Web shadow (ring)
159
- ...(Platform.OS === 'web' && shadowSize > 0 ? {
160
- boxShadow: `0px 0px 0px ${shadowSize}px ${shadowColor}`,
161
- } : {}),
158
+ // Focus/selected glow ring. Rendered via the unified boxShadow helper
159
+ // so it works on web + RN 0.76+ and degrades gracefully on older RN.
160
+ ...(shadowSize > 0 ? boxShadow(`0px 0px 0px ${shadowSize}px ${shadowColor}`) : {}),
162
161
  }
163
162
 
164
163
  const selectorStyle: ViewStyle = {
@@ -83,47 +83,47 @@ export default function RechargeCard({
83
83
  style,
84
84
  }: RechargeCardProps) {
85
85
  // Container Tokens (defaults mirror Figma node 2235:937).
86
- const backgroundColor = getVariableByName('rechargeCard/background', modes) || '#ffffff';
87
- const paddingHorizontal = parseInt(getVariableByName('rechargeCard/padding/horizontal', modes) || 16, 10);
88
- const paddingVertical = parseInt(getVariableByName('rechargeCard/padding/vertical', modes) || 20, 10);
89
- const gap = parseInt(getVariableByName('rechargeCard/gap', modes) || 20, 10);
90
- const radius = parseInt(getVariableByName('rechargeCard/radius', modes) || 20, 10);
91
- const minWidth = parseInt(getVariableByName('rechargeCard/minWidth', modes) || 312, 10);
92
- const strokeWidth = parseInt(getVariableByName('rechargeCard/strokeWidth', modes) || 1, 10);
93
- const strokeColor = getVariableByName('rechargeCard/stroke/color', modes) || '#ebebed';
86
+ const backgroundColor = getVariableByName('rechargeCard/background', modes);
87
+ const paddingHorizontal = parseInt(getVariableByName('rechargeCard/padding/horizontal', modes), 10);
88
+ const paddingVertical = parseInt(getVariableByName('rechargeCard/padding/vertical', modes), 10);
89
+ const gap = parseInt(getVariableByName('rechargeCard/gap', modes), 10);
90
+ const radius = parseInt(getVariableByName('rechargeCard/radius', modes), 10);
91
+ const minWidth = parseInt(getVariableByName('rechargeCard/minWidth', modes), 10);
92
+ const strokeWidth = parseInt(getVariableByName('rechargeCard/strokeWidth', modes), 10);
93
+ const strokeColor = getVariableByName('rechargeCard/stroke/color', modes);
94
94
 
95
95
  // Header Tokens
96
- const headerGap = parseInt(getVariableByName('rechargeCard/header/gap', modes) || 4, 10);
97
- const titleColor = getVariableByName('rechargeCard/title/color', modes) || '#000000';
98
- const titleFontSize = parseInt(getVariableByName('rechargeCard/title/fontSize', modes) || 12, 10);
99
- const titleFontFamily = getVariableByName('rechargeCard/title/fontFamily', modes) || 'JioType Var';
100
- const titleLineHeight = parseInt(getVariableByName('rechargeCard/title/lineHeight', modes) || 14, 10);
101
- const titleFontWeight = getVariableByName('rechargeCard/title/fontWeight', modes) || '700';
96
+ const headerGap = parseInt(getVariableByName('rechargeCard/header/gap', modes), 10);
97
+ const titleColor = getVariableByName('rechargeCard/title/color', modes);
98
+ const titleFontSize = parseInt(getVariableByName('rechargeCard/title/fontSize', modes), 10);
99
+ const titleFontFamily = getVariableByName('rechargeCard/title/fontFamily', modes);
100
+ const titleLineHeight = parseInt(getVariableByName('rechargeCard/title/lineHeight', modes), 10);
101
+ const titleFontWeight = getVariableByName('rechargeCard/title/fontWeight', modes);
102
102
 
103
103
  // Specs Tokens
104
- const specsGap = parseInt(getVariableByName('rechargeCard/specs/gap', modes) || 0, 10);
105
- const specItemGap = parseInt(getVariableByName('rechargeCard/specItem/gap', modes) || 4, 10);
104
+ const specsGap = parseInt(getVariableByName('rechargeCard/specs/gap', modes), 10);
105
+ const specItemGap = parseInt(getVariableByName('rechargeCard/specItem/gap', modes), 10);
106
106
 
107
107
  // Spec Label Tokens
108
- const specLabelColor = getVariableByName('rechargeCard/specItem/label/color', modes) || '#000000';
109
- const specLabelFontSize = parseInt(getVariableByName('rechargeCard/specItem/label/fontSize', modes) || 12, 10);
110
- const specLabelFontFamily = getVariableByName('rechargeCard/specItem/label/fontFamily', modes) || 'JioType Var';
111
- const specLabelLineHeight = parseInt(getVariableByName('rechargeCard/specItem/label/lineHeight', modes) || 14, 10);
112
- const specLabelFontWeight = getVariableByName('rechargeCard/specItem/label/fontWeight', modes) || '500';
108
+ const specLabelColor = getVariableByName('rechargeCard/specItem/label/color', modes);
109
+ const specLabelFontSize = parseInt(getVariableByName('rechargeCard/specItem/label/fontSize', modes), 10);
110
+ const specLabelFontFamily = getVariableByName('rechargeCard/specItem/label/fontFamily', modes);
111
+ const specLabelLineHeight = parseInt(getVariableByName('rechargeCard/specItem/label/lineHeight', modes), 10);
112
+ const specLabelFontWeight = getVariableByName('rechargeCard/specItem/label/fontWeight', modes);
113
113
 
114
114
  // Spec Value Tokens
115
- const specValueColor = getVariableByName('rechargeCard/specItem/value/color', modes) || '#000000';
116
- const specValueFontSize = parseInt(getVariableByName('rechargeCard/specItem/value/fontSize', modes) || 14, 10);
117
- const specValueFontFamily = getVariableByName('rechargeCard/specItem/value/fontFamily', modes) || 'JioType Var';
118
- const specValueLineHeight = parseInt(getVariableByName('rechargeCard/specItem/value/lineHeight', modes) || 17, 10);
119
- const specValueFontWeight = getVariableByName('rechargeCard/specItem/value/fontWeight', modes) || '500';
115
+ const specValueColor = getVariableByName('rechargeCard/specItem/value/color', modes);
116
+ const specValueFontSize = parseInt(getVariableByName('rechargeCard/specItem/value/fontSize', modes), 10);
117
+ const specValueFontFamily = getVariableByName('rechargeCard/specItem/value/fontFamily', modes);
118
+ const specValueLineHeight = parseInt(getVariableByName('rechargeCard/specItem/value/lineHeight', modes), 10);
119
+ const specValueFontWeight = getVariableByName('rechargeCard/specItem/value/fontWeight', modes);
120
120
 
121
121
  // Disclaimer Tokens
122
- const disclaimerColor = getVariableByName('rechargeCard/disclaimer/color', modes) || '#000000';
123
- const disclaimerFontSize = parseInt(getVariableByName('rechargeCard/disclaimer/fontSize', modes) || 10, 10);
124
- const disclaimerFontFamily = getVariableByName('rechargeCard/disclaimer/fontFamily', modes) || 'JioType Var';
125
- const disclaimerLineHeight = parseInt(getVariableByName('rechargeCard/disclaimer/lineHeight', modes) || 13, 10);
126
- const disclaimerFontWeight = getVariableByName('rechargeCard/disclaimer/fontWeight', modes) || '400';
122
+ const disclaimerColor = getVariableByName('rechargeCard/disclaimer/color', modes);
123
+ const disclaimerFontSize = parseInt(getVariableByName('rechargeCard/disclaimer/fontSize', modes), 10);
124
+ const disclaimerFontFamily = getVariableByName('rechargeCard/disclaimer/fontFamily', modes);
125
+ const disclaimerLineHeight = parseInt(getVariableByName('rechargeCard/disclaimer/lineHeight', modes), 10);
126
+ const disclaimerFontWeight = getVariableByName('rechargeCard/disclaimer/fontWeight', modes);
127
127
 
128
128
  const resolveFontWeight = (weight: string | number) => typeof weight === 'number' ? weight.toString() : weight;
129
129
 
@@ -1,6 +1,7 @@
1
1
  import React, { useMemo } from 'react'
2
2
  import {
3
3
  View,
4
+ Text,
4
5
  type StyleProp,
5
6
  type ViewStyle,
6
7
  type TextStyle,
@@ -8,7 +9,6 @@ import {
8
9
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
9
10
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
10
11
  import { formatIndianNumber } from '../../utils/number-utils'
11
- import Title from '../Title/Title'
12
12
  import LinearProgress from '../LinearProgress/LinearProgress'
13
13
  import MetricLegendItem from '../MetricLegendItem/MetricLegendItem'
14
14
  import type { Modes } from '../../design-tokens'
@@ -40,6 +40,14 @@ export type SavingsGoalSummaryItem = {
40
40
  }
41
41
 
42
42
  export type SavingsGoalSummaryProps = {
43
+ /**
44
+ * Optional caption rendered directly above the percentage value
45
+ * (e.g. `"Credit usage"`), matching the Figma `savingsGoalSummary/label`
46
+ * slot. Pass a string for token-styled text, or any `ReactNode` for full
47
+ * control. Omit (the default) to hide it — preserving the original
48
+ * value-only layout for existing callers.
49
+ */
50
+ label?: React.ReactNode
43
51
  /**
44
52
  * Currency symbol (e.g. `'₹'`, `'$'`) prefixed to every legend value.
45
53
  * Defaults to `'₹'`. The symbol is rendered as part of the formatted
@@ -82,6 +90,8 @@ export type SavingsGoalSummaryProps = {
82
90
  * computed from `current` / `target` and cannot be replaced.
83
91
  */
84
92
  titleStyle?: StyleProp<TextStyle>
93
+ /** Override styles for the `label` caption text (string labels only). */
94
+ labelStyle?: StyleProp<TextStyle>
85
95
  /** Override the inner legend container styles. */
86
96
  legendStyle?: StyleProp<ViewStyle>
87
97
  }
@@ -122,6 +132,7 @@ const DEFAULT_TARGET: SavingsGoalSummaryItem = {
122
132
  * @param {SavingsGoalSummaryProps} props
123
133
  */
124
134
  function SavingsGoalSummary({
135
+ label,
125
136
  currency = '₹',
126
137
  current = DEFAULT_CURRENT,
127
138
  target = DEFAULT_TARGET,
@@ -129,6 +140,7 @@ function SavingsGoalSummary({
129
140
  modes = EMPTY_MODES,
130
141
  style,
131
142
  titleStyle,
143
+ labelStyle,
132
144
  legendStyle,
133
145
  }: SavingsGoalSummaryProps) {
134
146
  // Merge caller modes on top of the defaults so callers can override
@@ -182,6 +194,66 @@ function SavingsGoalSummary({
182
194
  const legendGap =
183
195
  (getVariableByName('savingsGoalSummary/legend/gap', mergedModes) as number | null) ?? 16
184
196
 
197
+ // Percentage value typography — driven by the dedicated
198
+ // `savingsGoalSummary/value/*` tokens (Figma 29 / 900) rather than the
199
+ // generic `Title` tokens, so the value matches the design exactly.
200
+ const valueFontSize =
201
+ (getVariableByName('savingsGoalSummary/value/fontSize', mergedModes) as number | null) ?? 29
202
+ const valueFontFamily =
203
+ (getVariableByName('savingsGoalSummary/value/fontFamily', mergedModes) as string | null) ??
204
+ 'JioType Var'
205
+ const valueRawLineHeight =
206
+ (getVariableByName('savingsGoalSummary/value/lineHeight', mergedModes) as number | null) ?? 29
207
+ // The value tokens ship with `lineHeight === fontSize` (29/29); clamp to
208
+ // ~1.2x so descenders never clip on native (same guard `Title` uses).
209
+ const valueLineHeight = Math.max(valueRawLineHeight, Math.ceil(valueFontSize * 1.2))
210
+ const valueFontWeight = String(
211
+ getVariableByName('savingsGoalSummary/value/fontWeight', mergedModes) ?? 900,
212
+ ) as TextStyle['fontWeight']
213
+ const valueColor =
214
+ (getVariableByName('savingsGoalSummary/value/color', mergedModes) as string | null) ??
215
+ '#0d0d0f'
216
+
217
+ // Caption ("Credit usage") typography — `savingsGoalSummary/label/*`
218
+ // (Figma 12 / 400). Only rendered when a `label` is supplied.
219
+ const labelFontSize =
220
+ (getVariableByName('savingsGoalSummary/label/fontSize', mergedModes) as number | null) ?? 12
221
+ const labelFontFamily =
222
+ (getVariableByName('savingsGoalSummary/label/fontFamily', mergedModes) as string | null) ??
223
+ 'JioType Var'
224
+ const labelLineHeight =
225
+ (getVariableByName('savingsGoalSummary/label/lineHeight', mergedModes) as number | null) ?? 16
226
+ const labelFontWeight = String(
227
+ getVariableByName('savingsGoalSummary/label/fontWeight', mergedModes) ?? 400,
228
+ ) as TextStyle['fontWeight']
229
+ const labelColor =
230
+ (getVariableByName('savingsGoalSummary/label/color', mergedModes) as string | null) ??
231
+ '#0d0d0f'
232
+
233
+ const labelNode =
234
+ label == null || label === false ? null : typeof label === 'string' ? (
235
+ <Text
236
+ style={[
237
+ {
238
+ color: labelColor,
239
+ fontFamily: labelFontFamily,
240
+ fontSize: labelFontSize,
241
+ lineHeight: labelLineHeight,
242
+ fontWeight: labelFontWeight,
243
+ width: '100%',
244
+ },
245
+ labelStyle,
246
+ ]}
247
+ >
248
+ {label}
249
+ </Text>
250
+ ) : (
251
+ (() => {
252
+ const processed = cloneChildrenWithModes(label, mergedModes)
253
+ return processed.length === 1 ? processed[0] : processed
254
+ })()
255
+ )
256
+
185
257
  const customLegend = children
186
258
  ? cloneChildrenWithModes(children, mergedModes)
187
259
  : null
@@ -220,14 +292,32 @@ function SavingsGoalSummary({
220
292
  },
221
293
  style,
222
294
  ]}
223
- accessibilityLabel={`Savings goal progress, ${percentageLabel}`}
295
+ accessibilityLabel={
296
+ typeof label === 'string'
297
+ ? `${label}, ${percentageLabel}`
298
+ : `Savings goal progress, ${percentageLabel}`
299
+ }
224
300
  >
225
- <Title
226
- title={percentageLabel}
227
- modes={mergedModes}
228
- style={TITLE_CONTAINER_STYLE}
229
- textStyle={titleStyle}
230
- />
301
+ <View style={HEADER_GROUP_STYLE}>
302
+ {labelNode}
303
+ <Text
304
+ style={[
305
+ {
306
+ color: valueColor,
307
+ fontFamily: valueFontFamily,
308
+ fontSize: valueFontSize,
309
+ lineHeight: valueLineHeight,
310
+ fontWeight: valueFontWeight,
311
+ width: '100%',
312
+ },
313
+ titleStyle,
314
+ ]}
315
+ accessibilityElementsHidden={true}
316
+ importantForAccessibility="no"
317
+ >
318
+ {percentageLabel}
319
+ </Text>
320
+ </View>
231
321
 
232
322
  <LinearProgress value={resolvedProgress} modes={mergedModes} />
233
323
 
@@ -260,11 +350,13 @@ function formatLegendValue(value: number | undefined, currency: string): string
260
350
  return formatIndianNumber(value, { prefix: currency })
261
351
  }
262
352
 
263
- // Neutralise the `Title` component's default page-level padding so it sits
264
- // flush inside the summary card (the parent container owns spacing via `gap`).
265
- const TITLE_CONTAINER_STYLE: ViewStyle = {
266
- paddingHorizontal: 0,
267
- paddingVertical: 0,
353
+ // Groups the optional caption ("Credit usage") tightly above the percentage
354
+ // value. The parent container owns the larger spacing to the bar via `gap`,
355
+ // so this only needs the small label→value gap.
356
+ const HEADER_GROUP_STYLE: ViewStyle = {
357
+ width: '100%',
358
+ gap: 2,
359
+ alignItems: 'flex-start',
268
360
  }
269
361
 
270
362
  export default SavingsGoalSummary