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
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+
3
+ import React, { useMemo } from 'react';
4
+ import { View, Text, Pressable, StyleSheet } from 'react-native';
5
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
7
+ import Title from '../Title/Title';
8
+ import Divider from '../Divider/Divider';
9
+ import Button from '../Button/Button';
10
+ import Image from '../Image/Image';
11
+ import Icon from '../Icon/Icon';
12
+
13
+ /**
14
+ * A single metric column inside the card's stats row: a small title, a bold
15
+ * value and an optional muted caption.
16
+ */
17
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
+ /**
19
+ * PdpCcCard — Figma node 5352:935 ("PDP cc card").
20
+ *
21
+ * A centered white product/PDP card composed from the shared design-system
22
+ * primitives so it stays in sync with the rest of the library:
23
+ *
24
+ * - **Media** — a top image slot (`Image`, rounded via `image/radius`). Pass
25
+ * `imageSource` for the default image or `media` for a full slot override.
26
+ * - **Title** — a centered headline + subtitle rendered through the shared
27
+ * {@link Title} component (`title/*`, `pageSubtitle/*` tokens).
28
+ * - **Metrics** — a row of {@link PdpCcCardMetric} columns (title / value /
29
+ * caption) separated by vertical `Divider`s (`metricdata/*` tokens).
30
+ * - **CTA** — a small tonal {@link Button} (`Button / Size: S`,
31
+ * `AppearanceBrand: Secondary`, `Emphasis: Medium`) with a leading icon.
32
+ *
33
+ * All defaults can be overridden via `modes`.
34
+ */
35
+ function PdpCcCard({
36
+ imageSource,
37
+ imageWidth = 100,
38
+ imageHeight = 60,
39
+ media,
40
+ title = 'Title',
41
+ subtitle = 'Subtitle',
42
+ metrics = DEFAULT_METRICS,
43
+ buttonLabel = 'button',
44
+ buttonIcon = 'ic_add_circle',
45
+ onButtonPress,
46
+ button,
47
+ showButton = true,
48
+ onPress,
49
+ width = 344,
50
+ modes = EMPTY_MODES,
51
+ style,
52
+ accessibilityLabel
53
+ }) {
54
+ const tokens = useMemo(() => resolveTokens(modes), [modes]);
55
+
56
+ // The CTA uses the brand "Secondary" appearance at "Medium" emphasis (lilac
57
+ // fill + purple label) and the small size — matching the design. A
58
+ // consumer-supplied `modes` value still wins via spread order.
59
+ const ctaModes = useMemo(() => ({
60
+ AppearanceBrand: 'Secondary',
61
+ Emphasis: 'Medium',
62
+ 'Button / Size': 'S',
63
+ ...modes
64
+ }), [modes]);
65
+ const buttonForeground = useMemo(() => asStr(getVariableByName('button/foreground', ctaModes), '#5d00b5'), [ctaModes]);
66
+ const mediaNode = media ? cloneChildrenWithModes(media, modes) : /*#__PURE__*/_jsx(Image, {
67
+ imageSource: imageSource,
68
+ width: imageWidth,
69
+ height: imageHeight,
70
+ borderRadius: tokens.imageRadius,
71
+ resizeMode: "cover",
72
+ accessibilityElementsHidden: true,
73
+ importantForAccessibility: "no"
74
+ });
75
+ const ctaNode = button ? cloneChildrenWithModes(button, ctaModes) : /*#__PURE__*/_jsx(Button, {
76
+ label: buttonLabel,
77
+ modes: ctaModes,
78
+ onPress: onButtonPress,
79
+ leading: buttonIcon ? /*#__PURE__*/_jsx(Icon, {
80
+ iconName: buttonIcon,
81
+ size: tokens.buttonIconSize,
82
+ color: buttonForeground
83
+ }) : undefined
84
+ });
85
+ const content = /*#__PURE__*/_jsxs(_Fragment, {
86
+ children: [/*#__PURE__*/_jsx(View, {
87
+ style: styles.mediaSlot,
88
+ children: mediaNode
89
+ }), /*#__PURE__*/_jsx(Title, {
90
+ title: title,
91
+ subtitle: subtitle,
92
+ textAlign: "Center",
93
+ modes: modes
94
+ }), metrics.length > 0 ? /*#__PURE__*/_jsx(View, {
95
+ style: styles.metricsRow,
96
+ children: metrics.map((metric, index) => /*#__PURE__*/_jsxs(React.Fragment, {
97
+ children: [index > 0 ? /*#__PURE__*/_jsx(Divider, {
98
+ direction: "vertical",
99
+ modes: modes,
100
+ style: styles.metricDivider
101
+ }) : null, /*#__PURE__*/_jsx(Metricdata, {
102
+ metric: metric,
103
+ tokens: tokens
104
+ })]
105
+ }, index))
106
+ }) : null, showButton ? ctaNode : null]
107
+ });
108
+ const containerStyle = useMemo(() => ({
109
+ ...tokens.container,
110
+ width
111
+ }), [tokens.container, width]);
112
+ if (onPress) {
113
+ return /*#__PURE__*/_jsx(Pressable, {
114
+ style: ({
115
+ pressed
116
+ }) => [containerStyle, pressed ? styles.pressed : null, style],
117
+ accessibilityRole: "button",
118
+ accessibilityLabel: accessibilityLabel ?? title,
119
+ onPress: onPress,
120
+ children: content
121
+ });
122
+ }
123
+ return /*#__PURE__*/_jsx(View, {
124
+ style: [containerStyle, style],
125
+ accessibilityLabel: accessibilityLabel,
126
+ children: content
127
+ });
128
+ }
129
+
130
+ // ---------------------------------------------------------------------------
131
+ // Metricdata — internal metric column (Figma node 5352:256)
132
+ // ---------------------------------------------------------------------------
133
+
134
+ function Metricdata({
135
+ metric,
136
+ tokens
137
+ }) {
138
+ return /*#__PURE__*/_jsxs(View, {
139
+ style: tokens.metric,
140
+ children: [metric.title != null ? /*#__PURE__*/_jsx(Text, {
141
+ style: tokens.metricTitle,
142
+ children: metric.title
143
+ }) : null, metric.value != null ? /*#__PURE__*/_jsx(Text, {
144
+ style: tokens.metricValue,
145
+ children: metric.value
146
+ }) : null, metric.caption != null ? /*#__PURE__*/_jsx(Text, {
147
+ style: tokens.metricCaption,
148
+ children: metric.caption
149
+ }) : null]
150
+ });
151
+ }
152
+
153
+ // ---------------------------------------------------------------------------
154
+ // Tokens / static styles
155
+ // ---------------------------------------------------------------------------
156
+
157
+ function asNum(raw, fallback) {
158
+ const n = typeof raw === 'number' ? raw : parseFloat(raw);
159
+ return Number.isFinite(n) ? n : fallback;
160
+ }
161
+ function asStr(raw, fallback) {
162
+ return raw != null ? String(raw) : fallback;
163
+ }
164
+ function resolveTokens(modes) {
165
+ // NOTE: token names are passed as string literals DIRECTLY to
166
+ // getVariableByName so the `extract-component-tokens` script can statically
167
+ // collect them for the generated docs. Do not refactor these into a helper
168
+ // that receives the name as a variable.
169
+ const background = asStr(getVariableByName('PDPcccard/bg/color', modes), '#ffffff');
170
+ const paddingHorizontal = asNum(getVariableByName('PDPcccard/padding/horizontal', modes), 16);
171
+ const paddingVertical = asNum(getVariableByName('PDPcccard/padding/vertical', modes), 20);
172
+ const gap = asNum(getVariableByName('PDPcccard/gap', modes), 12);
173
+ const imageRadius = asNum(getVariableByName('image/radius', modes), 8);
174
+ const buttonIconSize = asNum(getVariableByName('button/iconSize', modes), 16);
175
+ const metricGap = asNum(getVariableByName('metricdata/gap', modes), 4);
176
+ const metricPadH = asNum(getVariableByName('metricdata/padding/horizontal', modes), 10);
177
+ const metricPadV = asNum(getVariableByName('metricdata/padding/vertical', modes), 10);
178
+ const titleColor = asStr(getVariableByName('metricdata/title/color', modes), '#000000');
179
+ const titleSize = asNum(getVariableByName('metricdata/title/fontsize', modes), 12);
180
+ const titleFamily = asStr(getVariableByName('metricdata/title/fontfamily', modes), 'JioType Var');
181
+ const titleWeight = asStr(getVariableByName('metricdata/title/fontweight', modes), '400');
182
+ const valueColor = asStr(getVariableByName('metricdata/value/color', modes), '#000000');
183
+ const valueSize = asNum(getVariableByName('metricdata/value/fontsize', modes), 20);
184
+ const valueFamily = asStr(getVariableByName('metricdata/value/fontfamily', modes), 'JioType Var');
185
+ const valueWeight = asStr(getVariableByName('metricdata/value/fontweight', modes), '700');
186
+ const captionColor = asStr(getVariableByName('metricdata/caption/color', modes), '#777777');
187
+ const captionSize = asNum(getVariableByName('metricdata/caption/fontsize', modes), 12);
188
+ const captionFamily = asStr(getVariableByName('metricdata/caption/fontfamily', modes), 'JioType Var');
189
+ const captionWeight = asStr(getVariableByName('metricdata/caption/fontweight', modes), '500');
190
+ return {
191
+ container: {
192
+ backgroundColor: background,
193
+ paddingHorizontal,
194
+ paddingVertical,
195
+ gap,
196
+ flexDirection: 'column',
197
+ alignItems: 'center',
198
+ justifyContent: 'center'
199
+ },
200
+ imageRadius,
201
+ buttonIconSize,
202
+ metric: {
203
+ flex: 1,
204
+ gap: metricGap,
205
+ paddingHorizontal: metricPadH,
206
+ paddingVertical: metricPadV,
207
+ alignItems: 'center',
208
+ justifyContent: 'center'
209
+ },
210
+ metricTitle: {
211
+ color: titleColor,
212
+ fontSize: titleSize,
213
+ fontFamily: titleFamily,
214
+ fontWeight: titleWeight,
215
+ lineHeight: Math.round(titleSize * 1.2),
216
+ textAlign: 'center',
217
+ includeFontPadding: false
218
+ },
219
+ metricValue: {
220
+ color: valueColor,
221
+ fontSize: valueSize,
222
+ fontFamily: valueFamily,
223
+ fontWeight: valueWeight,
224
+ lineHeight: Math.round(valueSize * 1.2),
225
+ textAlign: 'center',
226
+ includeFontPadding: false
227
+ },
228
+ metricCaption: {
229
+ color: captionColor,
230
+ fontSize: captionSize,
231
+ fontFamily: captionFamily,
232
+ fontWeight: captionWeight,
233
+ lineHeight: Math.round(captionSize * 1.2),
234
+ textAlign: 'center',
235
+ includeFontPadding: false
236
+ }
237
+ };
238
+ }
239
+ const DEFAULT_METRICS = [{
240
+ title: 'Title',
241
+ value: 'Value',
242
+ caption: 'caption'
243
+ }, {
244
+ title: 'Title',
245
+ value: 'Value',
246
+ caption: 'caption'
247
+ }];
248
+ const styles = StyleSheet.create({
249
+ mediaSlot: {
250
+ alignSelf: 'stretch',
251
+ alignItems: 'center',
252
+ justifyContent: 'center'
253
+ },
254
+ metricsRow: {
255
+ alignSelf: 'stretch',
256
+ flexDirection: 'row',
257
+ alignItems: 'stretch'
258
+ },
259
+ metricDivider: {
260
+ alignSelf: 'center',
261
+ height: '70%'
262
+ },
263
+ pressed: {
264
+ opacity: 0.92
265
+ }
266
+ });
267
+ export default PdpCcCard;
@@ -5,9 +5,8 @@ import { View, Text, Pressable, Platform } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
7
7
  import Icon from '../../icons/Icon';
8
-
9
- /** Figma grid: label column 1.8fr, each plan column 1fr. */
10
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ /** Figma grid: label column 1.8fr, each plan column 1fr. */
11
10
  const LABEL_COLUMN_FR = 1.8;
12
11
  const PLAN_COLUMN_FR = 1;
13
12
 
@@ -6,10 +6,9 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
7
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
8
8
  import MediaSource from '../../utils/MediaSource';
9
-
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  // Default bundled FINVU brand logo, matching the Figma reference so the
11
11
  // component renders correctly out of the box without any image prop.
12
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
12
  const DEFAULT_LOGO = require('./finvu.png');
14
13
  const DEFAULT_LABEL = 'Powered by RBI-regulated account aggregator';
15
14
  const DEFAULT_IMAGE_WIDTH = 33;
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ import React, { useId } from 'react';
4
+ import { View, StyleSheet, Platform, UIManager } from 'react-native';
5
+ import { BlurView } from '@react-native-community/blur';
6
+ import MaskedView from '@react-native-masked-view/masked-view';
7
+ import Svg, { Defs, LinearGradient, Stop, Rect } from 'react-native-svg';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ const DEFAULT_FALLBACK_DARK = '#1414174a';
10
+ const DEFAULT_FALLBACK_LIGHT = '#ffffff66';
11
+
12
+ // The native view-manager name registered by `@react-native-community/blur`
13
+ // (`AndroidBlurView` on Android, `BlurView` on iOS).
14
+ const NATIVE_BLUR_NAME = Platform.OS === 'android' ? 'AndroidBlurView' : 'BlurView';
15
+
16
+ /**
17
+ * Alpha stop on a layer's vertical reveal mask. `offset` is the vertical
18
+ * position (0 = top of the surface, 1 = bottom); `opacity` is the mask alpha
19
+ * there (0 = layer hidden / fully clear, 1 = layer fully applied).
20
+ *
21
+ * Using several stops (rather than a single linear 0 → 1 ramp) lets each layer
22
+ * EASE in, so the blur swells smoothly toward the bottom instead of appearing
23
+ * along a hard horizontal seam. That soft S-curve is what gives the surface its
24
+ * "glass" feel rather than a flat translucent panel.
25
+ */
26
+
27
+ /**
28
+ * A single layer of the progressive ramp.
29
+ * - `stops` describe how this layer is revealed from top to bottom.
30
+ * - `amount` is this layer's share (0–1) of the max `blurAmount`.
31
+ *
32
+ * We stack just TWO layers on both platforms: a faint base blur that covers
33
+ * most of the footer and a slightly stronger accent concentrated near the
34
+ * bottom. Keeping the overlap shallow avoids compounding the dark tint of
35
+ * multiple `BlurView`s (which is what made the earlier 3-layer ramp read as a
36
+ * heavy block), while still giving a genuine variable-radius result — the blur
37
+ * radius grows toward the bottom where the two layers overlap.
38
+ */
39
+
40
+ // Base reveal: a faint trace of blur begins near the very top and grows
41
+ // steadily downward, so the upper half still carries visible glass rather than
42
+ // snapping clear. Also reused for the no-native-blur fallback scrim.
43
+ const BASE_MASK_STOPS = [{
44
+ offset: 0.0,
45
+ opacity: 0
46
+ }, {
47
+ offset: 0.08,
48
+ opacity: 0.12
49
+ }, {
50
+ offset: 0.35,
51
+ opacity: 0.4
52
+ }, {
53
+ offset: 0.65,
54
+ opacity: 0.8
55
+ }, {
56
+ offset: 1.0,
57
+ opacity: 1
58
+ }];
59
+ const PROGRESSIVE_LAYERS = [{
60
+ amount: 0.65,
61
+ stops: BASE_MASK_STOPS
62
+ },
63
+ // Accent: the strongest blur, gathering over the lower portion for depth.
64
+ {
65
+ amount: 1.0,
66
+ stops: [{
67
+ offset: 0.0,
68
+ opacity: 0
69
+ }, {
70
+ offset: 0.3,
71
+ opacity: 0.15
72
+ }, {
73
+ offset: 0.65,
74
+ opacity: 0.65
75
+ }, {
76
+ offset: 1.0,
77
+ opacity: 1
78
+ }]
79
+ }];
80
+
81
+ /**
82
+ * Probe ONCE whether the native blur view is actually present in this binary.
83
+ *
84
+ * `@react-native-community/blur` is a peer dependency so its JS always imports,
85
+ * but on a build where the native module was never linked (e.g. `pod install`
86
+ * wasn't run on iOS) rendering `<BlurView>` shows React Native's red
87
+ * "Unimplemented component <BlurView>" placeholder. Detecting availability up
88
+ * front lets us fall back to a tinted scrim instead of crashing the surface.
89
+ *
90
+ * - New architecture (bridgeless): `getViewManagerConfig` raises a soft error,
91
+ * so we MUST use `hasViewManagerConfig` -> Fabric component registry.
92
+ * - Old architecture (Paper): `getViewManagerConfig` returns null when the
93
+ * view manager isn't registered.
94
+ */
95
+ const NATIVE_BLUR_SUPPORTED = (() => {
96
+ try {
97
+ const um = UIManager;
98
+ if (typeof um.hasViewManagerConfig === 'function') {
99
+ return um.hasViewManagerConfig(NATIVE_BLUR_NAME) === true;
100
+ }
101
+ if (typeof um.getViewManagerConfig === 'function') {
102
+ return um.getViewManagerConfig(NATIVE_BLUR_NAME) != null;
103
+ }
104
+ } catch {
105
+ // Any probe failure -> treat blur as unavailable and use the fallback.
106
+ }
107
+ return false;
108
+ })();
109
+
110
+ /**
111
+ * Vertical alpha-gradient mask drawn with `react-native-svg`. `MaskedView`
112
+ * reveals its child in proportion to this mask's alpha, so feeding it an eased
113
+ * multi-stop gradient makes the layer's blur swell in smoothly from top to
114
+ * bottom instead of along a hard seam.
115
+ */
116
+ function GradientMask({
117
+ id,
118
+ stops
119
+ }) {
120
+ return /*#__PURE__*/_jsxs(Svg, {
121
+ width: "100%",
122
+ height: "100%",
123
+ children: [/*#__PURE__*/_jsx(Defs, {
124
+ children: /*#__PURE__*/_jsx(LinearGradient, {
125
+ id: id,
126
+ x1: "0",
127
+ y1: "0",
128
+ x2: "0",
129
+ y2: "1",
130
+ children: stops.map((s, i) => /*#__PURE__*/_jsx(Stop, {
131
+ offset: s.offset,
132
+ stopColor: "#000000",
133
+ stopOpacity: s.opacity
134
+ }, i))
135
+ })
136
+ }), /*#__PURE__*/_jsx(Rect, {
137
+ x: "0",
138
+ y: "0",
139
+ width: "100%",
140
+ height: "100%",
141
+ fill: `url(#${id})`
142
+ })]
143
+ });
144
+ }
145
+
146
+ /**
147
+ * Glass / frosted surface for native (iOS + Android).
148
+ *
149
+ * Why this lives in its own platform-split file (mirrors `MediaCard/GlassFill`):
150
+ * - `@react-native-community/blur` is a native-only module; importing it on
151
+ * web throws because it references native components not registered there.
152
+ * Metro's platform-extension resolution picks `GlassFill.tsx` for native
153
+ * and `GlassFill.web.tsx` for web, keeping the web bundle native-free.
154
+ * - Centralizes the `intensity` (0–100) -> `blurAmount` (0–32) mapping so the
155
+ * Figma `blur/minimal` token semantics survive across platforms.
156
+ *
157
+ * On iOS (with the pod installed) this is a real `UIVisualEffectView` (true
158
+ * OS-level live blur). On Android it uses the community blur view. When the
159
+ * native module isn't linked in the running binary, the component degrades to
160
+ * a translucent tinted scrim (`reducedTransparencyFallbackColor` / fallback
161
+ * color) instead of rendering the "Unimplemented component" placeholder.
162
+ */
163
+ function GlassFill({
164
+ tint = 'dark',
165
+ intensity = 50,
166
+ overlayColor,
167
+ progressive = false,
168
+ style
169
+ }) {
170
+ const rawId = useId();
171
+ const maskId = `glass-mask-${rawId.replace(/[^a-zA-Z0-9_-]/g, '')}`;
172
+ const blurType = tint === 'light' ? 'light' : 'dark';
173
+ const uniformBlurAmount = Math.max(0, Math.min(32, Math.round(intensity * 0.32)));
174
+ const fallbackColor = overlayColor ?? (tint === 'light' ? DEFAULT_FALLBACK_LIGHT : DEFAULT_FALLBACK_DARK);
175
+
176
+ // ----- Progressive (variable) blur -------------------------------------
177
+ if (progressive) {
178
+ // Peak blur radius (at the bottom). Full strength so the frosted glass
179
+ // is clearly engaged where the layers overlap, while the eased masks
180
+ // keep the top of the surface fully clear.
181
+ const peakBlur = Math.max(1, Math.min(32, Math.round(intensity * 0.32)));
182
+
183
+ // Native blur not linked -> tint eases from transparent (top) to a soft
184
+ // fallback color (bottom) so the surface still reads as gentle glass.
185
+ if (!NATIVE_BLUR_SUPPORTED) {
186
+ return /*#__PURE__*/_jsx(View, {
187
+ style: [StyleSheet.absoluteFill, style],
188
+ pointerEvents: "none",
189
+ children: /*#__PURE__*/_jsx(MaskedView, {
190
+ style: StyleSheet.absoluteFill,
191
+ maskElement: /*#__PURE__*/_jsx(GradientMask, {
192
+ id: `${maskId}-fb`,
193
+ stops: BASE_MASK_STOPS
194
+ }),
195
+ children: /*#__PURE__*/_jsx(View, {
196
+ style: [StyleSheet.absoluteFill, {
197
+ backgroundColor: fallbackColor
198
+ }]
199
+ })
200
+ })
201
+ });
202
+ }
203
+ return /*#__PURE__*/_jsx(View, {
204
+ style: [StyleSheet.absoluteFill, style],
205
+ pointerEvents: "none",
206
+ children: PROGRESSIVE_LAYERS.map((layer, i) => {
207
+ const amount = Math.max(1, Math.round(peakBlur * layer.amount));
208
+ return /*#__PURE__*/_jsx(MaskedView, {
209
+ style: StyleSheet.absoluteFill,
210
+ maskElement: /*#__PURE__*/_jsx(GradientMask, {
211
+ id: `${maskId}-${i}`,
212
+ stops: layer.stops
213
+ }),
214
+ children: /*#__PURE__*/_jsx(BlurView, {
215
+ style: StyleSheet.absoluteFill,
216
+ blurType: blurType,
217
+ blurAmount: amount,
218
+ reducedTransparencyFallbackColor: fallbackColor
219
+ })
220
+ }, i);
221
+ })
222
+ });
223
+ }
224
+
225
+ // ----- Uniform blur (default) ------------------------------------------
226
+ // Native blur not linked in this build -> render a translucent tinted scrim
227
+ // so the surface still reads as frosted glass and never shows RN's
228
+ // "Unimplemented component <BlurView>" box.
229
+ if (!NATIVE_BLUR_SUPPORTED) {
230
+ return /*#__PURE__*/_jsx(View, {
231
+ style: [StyleSheet.absoluteFill, {
232
+ backgroundColor: fallbackColor
233
+ }, style],
234
+ pointerEvents: "none"
235
+ });
236
+ }
237
+ return /*#__PURE__*/_jsxs(View, {
238
+ style: [StyleSheet.absoluteFill, style],
239
+ pointerEvents: "none",
240
+ children: [/*#__PURE__*/_jsx(BlurView, {
241
+ style: StyleSheet.absoluteFill,
242
+ blurType: blurType,
243
+ blurAmount: uniformBlurAmount,
244
+ reducedTransparencyFallbackColor: fallbackColor
245
+ }), overlayColor != null ? /*#__PURE__*/_jsx(View, {
246
+ style: [StyleSheet.absoluteFill, {
247
+ backgroundColor: overlayColor
248
+ }]
249
+ }) : null, Platform.OS === 'android' ? /*#__PURE__*/_jsx(View, {
250
+ style: [StyleSheet.absoluteFill, {
251
+ backgroundColor: 'rgba(255,255,255,0.03)',
252
+ opacity: 0.6
253
+ }]
254
+ }) : null]
255
+ });
256
+ }
257
+ export default GlassFill;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { View, StyleSheet } from 'react-native';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ const DEFAULT_FALLBACK_DARK = '#1414174a';
7
+ const DEFAULT_FALLBACK_LIGHT = '#ffffff66';
8
+
9
+ // Mirror of the native ramp (see GlassFill.tsx). Each layer is a `mask-image`
10
+ // gradient whose alpha stops (0 = top, 1 = bottom) ease the blur in; `amount`
11
+ // is the layer's share of the max blur. Two gently-overlapping layers (faint
12
+ // base + bottom accent) keep the surface subtle and glass-like rather than a
13
+ // heavy frosted block.
14
+
15
+ const PROGRESSIVE_LAYERS = [{
16
+ amount: 0.65,
17
+ stops: [{
18
+ offset: 0.0,
19
+ opacity: 0
20
+ }, {
21
+ offset: 0.08,
22
+ opacity: 0.12
23
+ }, {
24
+ offset: 0.35,
25
+ opacity: 0.4
26
+ }, {
27
+ offset: 0.65,
28
+ opacity: 0.8
29
+ }, {
30
+ offset: 1.0,
31
+ opacity: 1
32
+ }]
33
+ }, {
34
+ amount: 1.0,
35
+ stops: [{
36
+ offset: 0.0,
37
+ opacity: 0
38
+ }, {
39
+ offset: 0.3,
40
+ opacity: 0.15
41
+ }, {
42
+ offset: 0.65,
43
+ opacity: 0.65
44
+ }, {
45
+ offset: 1.0,
46
+ opacity: 1
47
+ }]
48
+ }];
49
+ function toGradient(stops) {
50
+ const parts = stops.map(s => `rgba(0,0,0,${s.opacity}) ${Math.round(s.offset * 100)}%`).join(', ');
51
+ return `linear-gradient(to bottom, ${parts})`;
52
+ }
53
+
54
+ /**
55
+ * Web counterpart of `GlassFill`.
56
+ *
57
+ * `@react-native-community/blur` ships no web implementation, so on web we
58
+ * render a translucent `View` with `backdrop-filter: blur()`. Native bundles
59
+ * pick up `GlassFill.tsx` instead via Metro's platform resolver; the web
60
+ * bundle picks up this file, so the native-only module is never imported here.
61
+ */
62
+ function GlassFill({
63
+ tint = 'dark',
64
+ intensity = 50,
65
+ overlayColor,
66
+ progressive = false,
67
+ style
68
+ }) {
69
+ // intensity 0-100 -> ~0-32px CSS blur, kept in parity with the native scale.
70
+ const blurPx = Math.max(0, Math.min(32, Math.round(intensity * 0.32)));
71
+ const tintColor = overlayColor ?? (tint === 'light' ? DEFAULT_FALLBACK_LIGHT : DEFAULT_FALLBACK_DARK);
72
+ if (progressive) {
73
+ // Full peak blur (parity with native) so the frosted glass is clearly
74
+ // engaged at the bottom; the eased masks keep the top fully clear.
75
+ const peakPx = Math.max(1, Math.min(32, Math.round(intensity * 0.32)));
76
+ return /*#__PURE__*/_jsx(View, {
77
+ style: [StyleSheet.absoluteFill, style],
78
+ pointerEvents: "none",
79
+ children: PROGRESSIVE_LAYERS.map((layer, i) => {
80
+ const px = Math.max(1, Math.round(peakPx * layer.amount));
81
+ const gradient = toGradient(layer.stops);
82
+ // web-only CSS (backdrop-filter / mask-image); cast because
83
+ // these keys aren't in RN's ViewStyle.
84
+ const webStyle = {
85
+ backdropFilter: `blur(${px}px)`,
86
+ WebkitBackdropFilter: `blur(${px}px)`,
87
+ maskImage: gradient,
88
+ WebkitMaskImage: gradient
89
+ };
90
+ return /*#__PURE__*/_jsx(View, {
91
+ style: [StyleSheet.absoluteFill, webStyle],
92
+ pointerEvents: "none"
93
+ }, i);
94
+ })
95
+ });
96
+ }
97
+ return /*#__PURE__*/_jsx(View, {
98
+ style: [StyleSheet.absoluteFill, {
99
+ backgroundColor: tintColor
100
+ },
101
+ // backdrop-filter is web-only CSS; ignored by RN on native
102
+ // (we never bundle this file there anyway).
103
+ // @ts-ignore web-only style
104
+ {
105
+ backdropFilter: `blur(${blurPx}px)`,
106
+ WebkitBackdropFilter: `blur(${blurPx}px)`
107
+ }, style],
108
+ pointerEvents: "none"
109
+ });
110
+ }
111
+ export default GlassFill;