jfs-components 0.0.99 → 0.1.2

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 (335) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +1 -1
  3. package/lib/commonjs/components/Balance/Balance.js +17 -12
  4. package/lib/commonjs/components/Card/Card.js +2 -1
  5. package/lib/commonjs/components/CardFeedback/CardFeedback.js +2 -1
  6. package/lib/commonjs/components/Checkbox/Checkbox.js +2 -1
  7. package/lib/commonjs/components/Drawer/Drawer.js +13 -4
  8. package/lib/commonjs/components/Dropdown/Dropdown.js +37 -18
  9. package/lib/commonjs/components/DropdownInput/DropdownInput.js +1 -1
  10. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +65 -4
  11. package/lib/commonjs/components/Image/Image.js +11 -5
  12. package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
  13. package/lib/commonjs/components/Overlay/Overlay.js +92 -0
  14. package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
  15. package/lib/commonjs/components/TestimonialsCard/TestimonialsCard.js +121 -0
  16. package/lib/commonjs/components/TextInput/TextInput.js +2 -1
  17. package/lib/commonjs/components/docs/modeControls.js +116 -0
  18. package/lib/commonjs/components/index.js +14 -0
  19. package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
  20. package/lib/commonjs/design-tokens/figma-modes.generated.js +391 -0
  21. package/lib/commonjs/design-tokens/index.js +11 -0
  22. package/lib/commonjs/icons/registry.js +1 -1
  23. package/lib/module/components/Accordion/Accordion.js +1 -2
  24. package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
  25. package/lib/module/components/Balance/Balance.js +18 -13
  26. package/lib/module/components/Card/Card.js +1 -2
  27. package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
  28. package/lib/module/components/Checkbox/Checkbox.js +1 -2
  29. package/lib/module/components/Drawer/Drawer.js +12 -4
  30. package/lib/module/components/Dropdown/Dropdown.js +37 -18
  31. package/lib/module/components/DropdownInput/DropdownInput.js +1 -1
  32. package/lib/module/components/FullscreenModal/FullscreenModal.js +67 -7
  33. package/lib/module/components/Image/Image.js +11 -5
  34. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +1 -2
  35. package/lib/module/components/LottiePlayer/loadNativeLottieView.js +8 -13
  36. package/lib/module/components/MoneyValue/MoneyValue.js +1 -2
  37. package/lib/module/components/OTP/OTP.js +1 -2
  38. package/lib/module/components/Overlay/Overlay.js +87 -0
  39. package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
  40. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
  41. package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
  42. package/lib/module/components/Section/Section.js +1 -2
  43. package/lib/module/components/TestimonialsCard/TestimonialsCard.js +116 -0
  44. package/lib/module/components/TextInput/TextInput.js +1 -2
  45. package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
  46. package/lib/module/components/docs/modeControls.js +111 -0
  47. package/lib/module/components/index.js +2 -0
  48. package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
  49. package/lib/module/design-tokens/figma-modes.generated.js +387 -0
  50. package/lib/module/design-tokens/index.js +2 -1
  51. package/lib/module/icons/registry.js +1 -1
  52. package/lib/module/utils/react-utils.js +0 -1
  53. package/lib/typescript/scripts/extract-component-tokens.d.ts +1 -1
  54. package/lib/typescript/scripts/generate-mode-types.d.ts +2 -0
  55. package/lib/typescript/scripts/retype-modes.d.cts +2 -0
  56. package/lib/typescript/src/components/Accordion/Accordion.d.ts +2 -1
  57. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +2 -1
  58. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +2 -1
  59. package/lib/typescript/src/components/ActionFooter/ActionFooter.d.ts +2 -1
  60. package/lib/typescript/src/components/ActionTile/ActionTile.d.ts +2 -1
  61. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +2 -1
  62. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +2 -1
  63. package/lib/typescript/src/components/AppBar/AppBar.d.ts +2 -1
  64. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +3 -2
  65. package/lib/typescript/src/components/Attached/Attached.d.ts +2 -1
  66. package/lib/typescript/src/components/Avatar/Avatar.d.ts +2 -1
  67. package/lib/typescript/src/components/AvatarGroup/AvatarGroup.d.ts +2 -1
  68. package/lib/typescript/src/components/Badge/Badge.d.ts +2 -1
  69. package/lib/typescript/src/components/Balance/Balance.d.ts +2 -1
  70. package/lib/typescript/src/components/BottomNav/BottomNav.d.ts +2 -1
  71. package/lib/typescript/src/components/BottomNavItem/BottomNavItem.d.ts +2 -1
  72. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +2 -1
  73. package/lib/typescript/src/components/BubbleChart/BubbleChart.d.ts +2 -1
  74. package/lib/typescript/src/components/Button/Button.d.ts +2 -1
  75. package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +2 -1
  76. package/lib/typescript/src/components/Card/Card.d.ts +3 -2
  77. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +2 -1
  78. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +2 -1
  79. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +2 -1
  80. package/lib/typescript/src/components/CardFeedback/CardFeedback.d.ts +7 -6
  81. package/lib/typescript/src/components/CardFinancialCondition/CardFinancialCondition.d.ts +2 -1
  82. package/lib/typescript/src/components/CardInsight/CardInsight.d.ts +2 -1
  83. package/lib/typescript/src/components/CardProviderInfo/CardProviderInfo.d.ts +2 -1
  84. package/lib/typescript/src/components/Carousel/Carousel.d.ts +4 -3
  85. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +2 -1
  86. package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
  87. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -1
  88. package/lib/typescript/src/components/ChipGroup/ChipGroup.d.ts +2 -1
  89. package/lib/typescript/src/components/ChipSelect/ChipSelect.d.ts +2 -1
  90. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +2 -1
  91. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +2 -1
  92. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +2 -1
  93. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +2 -1
  94. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +3 -2
  95. package/lib/typescript/src/components/CoverageRing/CoverageRing.d.ts +2 -1
  96. package/lib/typescript/src/components/DebitCard/DebitCard.d.ts +2 -1
  97. package/lib/typescript/src/components/Disclaimer/Disclaimer.d.ts +2 -1
  98. package/lib/typescript/src/components/Divider/Divider.d.ts +2 -1
  99. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +4 -3
  100. package/lib/typescript/src/components/DonutChartSummary/DonutChartSummary.d.ts +3 -2
  101. package/lib/typescript/src/components/Drawer/Drawer.d.ts +15 -1
  102. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +3 -2
  103. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +2 -1
  104. package/lib/typescript/src/components/EmptyState/EmptyState.d.ts +2 -1
  105. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +2 -1
  106. package/lib/typescript/src/components/FilterBar/FilterBar.d.ts +3 -2
  107. package/lib/typescript/src/components/Form/Form.d.ts +2 -1
  108. package/lib/typescript/src/components/FormField/FormField.d.ts +2 -1
  109. package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +9 -2
  110. package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
  111. package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
  112. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
  113. package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
  114. package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
  115. package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
  116. package/lib/typescript/src/components/Image/Image.d.ts +17 -1
  117. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +2 -1
  118. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +2 -1
  119. package/lib/typescript/src/components/LazyList/LazyList.d.ts +2 -1
  120. package/lib/typescript/src/components/LinearMeter/LinearMeter.d.ts +3 -2
  121. package/lib/typescript/src/components/LinearProgress/LinearProgress.d.ts +2 -1
  122. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +2 -1
  123. package/lib/typescript/src/components/ListItem/ListItem.d.ts +2 -1
  124. package/lib/typescript/src/components/LottieIntroBlock/LottieIntroBlock.d.ts +2 -1
  125. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.d.ts +2 -1
  126. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.web.d.ts +2 -1
  127. package/lib/typescript/src/components/MediaCard/MediaCard.d.ts +6 -5
  128. package/lib/typescript/src/components/MerchantProfile/MerchantProfile.d.ts +2 -1
  129. package/lib/typescript/src/components/MessageField/MessageField.d.ts +2 -1
  130. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +2 -1
  131. package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +2 -1
  132. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +4 -3
  133. package/lib/typescript/src/components/NavArrow/NavArrow.d.ts +2 -1
  134. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +2 -1
  135. package/lib/typescript/src/components/Nudge/Nudge.d.ts +2 -1
  136. package/lib/typescript/src/components/Numpad/Numpad.d.ts +2 -1
  137. package/lib/typescript/src/components/OTP/OTP.d.ts +3 -2
  138. package/lib/typescript/src/components/Overlay/Overlay.d.ts +52 -0
  139. package/lib/typescript/src/components/PageHero/PageHero.d.ts +2 -1
  140. package/lib/typescript/src/components/PaymentFeedback/PaymentFeedback.d.ts +2 -1
  141. package/lib/typescript/src/components/PlanComparisonCard/PlanComparisonCard.d.ts +2 -1
  142. package/lib/typescript/src/components/Popup/Popup.d.ts +2 -1
  143. package/lib/typescript/src/components/PortfolioHero/PortfolioHero.d.ts +2 -1
  144. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +2 -1
  145. package/lib/typescript/src/components/ProductLabel/ProductLabel.d.ts +2 -1
  146. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +2 -1
  147. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
  148. package/lib/typescript/src/components/Radio/Radio.d.ts +2 -1
  149. package/lib/typescript/src/components/RangeTrack/RangeTrack.d.ts +3 -2
  150. package/lib/typescript/src/components/RechargeCard/RechargeCard.d.ts +2 -1
  151. package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +2 -1
  152. package/lib/typescript/src/components/Screen/Screen.d.ts +2 -1
  153. package/lib/typescript/src/components/Section/Section.d.ts +3 -2
  154. package/lib/typescript/src/components/SegmentedControl/SegmentedControl.d.ts +2 -1
  155. package/lib/typescript/src/components/SegmentedTrack/SegmentedTrack.d.ts +4 -3
  156. package/lib/typescript/src/components/Slot/Slot.d.ts +2 -1
  157. package/lib/typescript/src/components/Spinner/Spinner.d.ts +2 -1
  158. package/lib/typescript/src/components/StatGroup/StatGroup.d.ts +2 -1
  159. package/lib/typescript/src/components/StatItem/StatItem.d.ts +2 -1
  160. package/lib/typescript/src/components/StatusHero/StatusHero.d.ts +2 -1
  161. package/lib/typescript/src/components/Stepper/Step.d.ts +2 -1
  162. package/lib/typescript/src/components/Stepper/StepLabel.d.ts +2 -1
  163. package/lib/typescript/src/components/Stepper/Stepper.d.ts +2 -1
  164. package/lib/typescript/src/components/StrengthIndicator/StrengthIndicator.d.ts +2 -1
  165. package/lib/typescript/src/components/SuggestiveSearch/SuggestiveSearch.d.ts +2 -1
  166. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +2 -1
  167. package/lib/typescript/src/components/SupportText/SupportText.d.ts +2 -1
  168. package/lib/typescript/src/components/SupportText/SupportTextIcon.d.ts +2 -1
  169. package/lib/typescript/src/components/SwappableAmount/SwappableAmount.d.ts +2 -1
  170. package/lib/typescript/src/components/Tabs/TabItem.d.ts +2 -1
  171. package/lib/typescript/src/components/Tabs/Tabs.d.ts +2 -1
  172. package/lib/typescript/src/components/TestimonialsCard/TestimonialsCard.d.ts +52 -0
  173. package/lib/typescript/src/components/Text/Text.d.ts +2 -1
  174. package/lib/typescript/src/components/TextInput/TextInput.d.ts +3 -2
  175. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +2 -1
  176. package/lib/typescript/src/components/Title/Title.d.ts +2 -1
  177. package/lib/typescript/src/components/Toast/Toast.d.ts +2 -1
  178. package/lib/typescript/src/components/Toast/ToastProvider.d.ts +2 -1
  179. package/lib/typescript/src/components/Toast/useToast.d.ts +3 -2
  180. package/lib/typescript/src/components/Toggle/Toggle.d.ts +2 -1
  181. package/lib/typescript/src/components/Tooltip/Tooltip.d.ts +2 -1
  182. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +2 -1
  183. package/lib/typescript/src/components/TransactionDetails/TransactionDetails.d.ts +3 -2
  184. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +2 -1
  185. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +2 -1
  186. package/lib/typescript/src/components/VStack/VStack.d.ts +2 -1
  187. package/lib/typescript/src/components/docs/modeControls.d.ts +28 -0
  188. package/lib/typescript/src/components/index.d.ts +2 -0
  189. package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
  190. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +264 -0
  191. package/lib/typescript/src/design-tokens/index.d.ts +1 -0
  192. package/lib/typescript/src/icons/registry.d.ts +1 -1
  193. package/lib/typescript/src/skeleton/Skeleton.d.ts +2 -1
  194. package/lib/typescript/src/utils/react-utils.d.ts +2 -1
  195. package/package.json +3 -2
  196. package/src/components/Accordion/Accordion.tsx +2 -1
  197. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +2 -1
  198. package/src/components/AccountCard/AccountCard.tsx +2 -1
  199. package/src/components/ActionFooter/ActionFooter.tsx +2 -1
  200. package/src/components/ActionTile/ActionTile.tsx +2 -1
  201. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +2 -1
  202. package/src/components/AmountInput/AmountInput.tsx +2 -1
  203. package/src/components/AppBar/AppBar.tsx +2 -1
  204. package/src/components/AreaLineChart/AreaLineChart.tsx +8 -7
  205. package/src/components/Attached/Attached.tsx +2 -1
  206. package/src/components/Avatar/Avatar.tsx +3 -2
  207. package/src/components/AvatarGroup/AvatarGroup.tsx +2 -1
  208. package/src/components/Badge/Badge.tsx +2 -1
  209. package/src/components/Balance/Balance.tsx +18 -12
  210. package/src/components/BottomNav/BottomNav.tsx +2 -1
  211. package/src/components/BottomNavItem/BottomNavItem.tsx +3 -2
  212. package/src/components/BrandChip/BrandChip.tsx +3 -2
  213. package/src/components/BubbleChart/BubbleChart.tsx +2 -1
  214. package/src/components/Button/Button.tsx +3 -2
  215. package/src/components/ButtonGroup/ButtonGroup.tsx +2 -1
  216. package/src/components/Card/Card.tsx +4 -3
  217. package/src/components/CardAdvisory/CardAdvisory.tsx +3 -2
  218. package/src/components/CardBankAccount/CardBankAccount.tsx +2 -1
  219. package/src/components/CardCTA/CardCTA.tsx +3 -2
  220. package/src/components/CardFeedback/CardFeedback.tsx +11 -10
  221. package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +3 -2
  222. package/src/components/CardInsight/CardInsight.tsx +2 -1
  223. package/src/components/CardProviderInfo/CardProviderInfo.tsx +2 -1
  224. package/src/components/Carousel/Carousel.tsx +5 -4
  225. package/src/components/Checkbox/Checkbox.tsx +2 -1
  226. package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
  227. package/src/components/CheckboxItem/CheckboxItem.tsx +2 -1
  228. package/src/components/ChipGroup/ChipGroup.tsx +2 -1
  229. package/src/components/ChipSelect/ChipSelect.tsx +2 -1
  230. package/src/components/CircularProgressBar/CircularProgressBar.tsx +2 -1
  231. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +2 -1
  232. package/src/components/CircularRating/CircularRating.tsx +3 -2
  233. package/src/components/ClusterBubble/ClusterBubble.tsx +2 -1
  234. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +3 -2
  235. package/src/components/CoverageRing/CoverageRing.tsx +2 -1
  236. package/src/components/DebitCard/DebitCard.tsx +2 -1
  237. package/src/components/Disclaimer/Disclaimer.tsx +2 -1
  238. package/src/components/Divider/Divider.tsx +2 -1
  239. package/src/components/DonutChart/DonutChart.tsx +6 -5
  240. package/src/components/DonutChartSummary/DonutChartSummary.tsx +3 -2
  241. package/src/components/Drawer/Drawer.tsx +21 -1
  242. package/src/components/Dropdown/Dropdown.tsx +42 -21
  243. package/src/components/DropdownInput/DropdownInput.tsx +5 -4
  244. package/src/components/EmptyState/EmptyState.tsx +2 -1
  245. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +2 -1
  246. package/src/components/FilterBar/FilterBar.tsx +3 -2
  247. package/src/components/Form/Form.tsx +2 -1
  248. package/src/components/FormField/FormField.tsx +3 -2
  249. package/src/components/FullscreenModal/FullscreenModal.tsx +77 -12
  250. package/src/components/Gauge/Gauge.tsx +2 -1
  251. package/src/components/HStack/HStack.tsx +2 -1
  252. package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
  253. package/src/components/Icon/Icon.tsx +3 -2
  254. package/src/components/IconButton/IconButton.tsx +3 -2
  255. package/src/components/IconCapsule/IconCapsule.tsx +3 -2
  256. package/src/components/Image/Image.tsx +29 -5
  257. package/src/components/InputSearch/InputSearch.tsx +3 -2
  258. package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -2
  259. package/src/components/LazyList/LazyList.tsx +2 -1
  260. package/src/components/LinearMeter/LinearMeter.tsx +3 -2
  261. package/src/components/LinearProgress/LinearProgress.tsx +2 -1
  262. package/src/components/ListGroup/ListGroup.tsx +2 -1
  263. package/src/components/ListItem/ListItem.tsx +3 -2
  264. package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +2 -1
  265. package/src/components/LottiePlayer/LottiePlayer.tsx +3 -2
  266. package/src/components/LottiePlayer/LottiePlayer.web.tsx +3 -2
  267. package/src/components/LottiePlayer/loadNativeLottieView.tsx +9 -13
  268. package/src/components/MediaCard/MediaCard.tsx +7 -6
  269. package/src/components/MerchantProfile/MerchantProfile.tsx +2 -1
  270. package/src/components/MessageField/MessageField.tsx +3 -2
  271. package/src/components/MetricLegendItem/MetricLegendItem.tsx +2 -1
  272. package/src/components/MoneyValue/MoneyValue.tsx +2 -1
  273. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +5 -4
  274. package/src/components/NavArrow/NavArrow.tsx +3 -2
  275. package/src/components/NoteInput/NoteInput.tsx +2 -1
  276. package/src/components/Nudge/Nudge.tsx +3 -2
  277. package/src/components/Numpad/Numpad.tsx +2 -1
  278. package/src/components/OTP/OTP.tsx +3 -2
  279. package/src/components/Overlay/Overlay.tsx +114 -0
  280. package/src/components/PageHero/PageHero.tsx +2 -1
  281. package/src/components/PaymentFeedback/PaymentFeedback.tsx +2 -1
  282. package/src/components/PlanComparisonCard/PlanComparisonCard.tsx +2 -1
  283. package/src/components/Popup/Popup.tsx +2 -1
  284. package/src/components/PortfolioHero/PortfolioHero.tsx +2 -1
  285. package/src/components/PoweredByLabel/PoweredByLabel.tsx +2 -1
  286. package/src/components/ProductLabel/ProductLabel.tsx +2 -1
  287. package/src/components/ProductOverview/ProductOverview.tsx +2 -1
  288. package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
  289. package/src/components/Radio/Radio.tsx +2 -1
  290. package/src/components/RangeTrack/RangeTrack.tsx +3 -2
  291. package/src/components/RechargeCard/RechargeCard.tsx +2 -1
  292. package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +2 -1
  293. package/src/components/Screen/Screen.tsx +2 -1
  294. package/src/components/Section/Section.tsx +6 -5
  295. package/src/components/SegmentedControl/SegmentedControl.tsx +3 -2
  296. package/src/components/SegmentedTrack/SegmentedTrack.tsx +5 -4
  297. package/src/components/Slot/Slot.tsx +2 -1
  298. package/src/components/Spinner/Spinner.tsx +2 -1
  299. package/src/components/StatGroup/StatGroup.tsx +3 -2
  300. package/src/components/StatItem/StatItem.tsx +2 -1
  301. package/src/components/StatusHero/StatusHero.tsx +2 -1
  302. package/src/components/Stepper/Step.tsx +2 -1
  303. package/src/components/Stepper/StepLabel.tsx +2 -1
  304. package/src/components/Stepper/Stepper.tsx +2 -1
  305. package/src/components/StrengthIndicator/StrengthIndicator.tsx +2 -1
  306. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +4 -3
  307. package/src/components/SummaryTile/SummaryTile.tsx +2 -1
  308. package/src/components/SupportText/SupportText.tsx +2 -1
  309. package/src/components/SupportText/SupportTextIcon.tsx +2 -1
  310. package/src/components/SwappableAmount/SwappableAmount.tsx +2 -1
  311. package/src/components/Tabs/TabItem.tsx +2 -1
  312. package/src/components/Tabs/Tabs.tsx +2 -1
  313. package/src/components/TestimonialsCard/TestimonialsCard.tsx +163 -0
  314. package/src/components/Text/Text.tsx +2 -1
  315. package/src/components/TextInput/TextInput.tsx +3 -2
  316. package/src/components/ThreadHero/ThreadHero.tsx +2 -1
  317. package/src/components/Title/Title.tsx +2 -1
  318. package/src/components/Toast/Toast.tsx +2 -1
  319. package/src/components/Toast/ToastProvider.tsx +2 -1
  320. package/src/components/Toast/useToast.ts +3 -2
  321. package/src/components/Toggle/Toggle.tsx +2 -1
  322. package/src/components/Tooltip/Tooltip.tsx +3 -2
  323. package/src/components/TransactionBubble/TransactionBubble.tsx +2 -1
  324. package/src/components/TransactionDetails/TransactionDetails.tsx +3 -2
  325. package/src/components/TransactionStatus/TransactionStatus.tsx +3 -2
  326. package/src/components/UpiHandle/UpiHandle.tsx +3 -2
  327. package/src/components/VStack/VStack.tsx +2 -1
  328. package/src/components/docs/modeControls.tsx +122 -0
  329. package/src/components/index.ts +2 -0
  330. package/src/design-tokens/JFSThemeProvider.tsx +4 -3
  331. package/src/design-tokens/figma-modes.generated.ts +396 -0
  332. package/src/design-tokens/index.ts +1 -0
  333. package/src/icons/registry.ts +1 -1
  334. package/src/skeleton/Skeleton.tsx +2 -1
  335. package/src/utils/react-utils.ts +3 -2
@@ -6,9 +6,8 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
6
6
  import Icon from '../../icons/Icon';
7
7
  import { usePressableWebSupport } from '../../utils/web-platform-utils';
8
8
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
9
-
10
- // Enable LayoutAnimation on Android
11
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ // Enable LayoutAnimation on Android
12
11
  if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
13
12
  UIManager.setLayoutAnimationEnabledExperimental(true);
14
13
  }
@@ -92,7 +92,7 @@ const defaultFormatX = label => String(label);
92
92
  * @component
93
93
  */
94
94
  function AreaLineChart({
95
- series,
95
+ series = [],
96
96
  xLabels,
97
97
  yMin,
98
98
  yMax,
@@ -4,8 +4,15 @@ import React from 'react';
4
4
  import { View, Text } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import MoneyValue from '../MoneyValue/MoneyValue';
7
- import { EMPTY_MODES } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
8
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ // The Balance design renders its money value at the 36 px / 900-weight scale.
10
+ // The `moneyValue/*` tokens alias into the `Context3` collection, where the
11
+ // `Balance & Cards` mode supplies those larger values. Applied *before* the
12
+ // caller's `modes` so any consumer can still override individual keys.
13
+ const DEFAULT_MONEY_VALUE_MODES = {
14
+ Context3: 'Balance & Cards'
15
+ };
9
16
  /**
10
17
  * Balance component that displays a title and a monetary value.
11
18
  *
@@ -29,7 +36,7 @@ function Balance({
29
36
  // Title styles
30
37
  const titleColor = getVariableByName('balance/title/foreground', modes) ?? '#0c0d10';
31
38
  const titleFontSize = getVariableByName('balance/title/fontSize', modes) ?? 14;
32
- const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'System';
39
+ const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'JioType Var';
33
40
  const titleLineHeight = getVariableByName('balance/title/lineHeight', modes) ?? 18;
34
41
  const titleFontWeightValue = getVariableByName('balance/title/fontWeight', modes) ?? 500;
35
42
  const titleFontWeight = typeof titleFontWeightValue === 'number' ? titleFontWeightValue.toString() : titleFontWeightValue;
@@ -46,15 +53,13 @@ function Balance({
46
53
  fontWeight: titleFontWeight
47
54
  };
48
55
 
49
- // Handle slot children or default content
50
- const content = React.Children.map(children, child => {
51
- if (/*#__PURE__*/React.isValidElement(child)) {
52
- return /*#__PURE__*/React.cloneElement(child, {
53
- modes
54
- });
55
- }
56
- return child;
57
- });
56
+ // The money value renders at the Balance & Cards scale. Merge the default
57
+ // context mode first so the caller's `modes` can still override it, and
58
+ // force that context onto any slotted children so custom money values match.
59
+ const moneyValueModes = {
60
+ ...DEFAULT_MONEY_VALUE_MODES,
61
+ ...modes
62
+ };
58
63
  return /*#__PURE__*/_jsxs(View, {
59
64
  style: [containerStyle, style],
60
65
  "data-node-id": "1986:6203",
@@ -62,10 +67,10 @@ function Balance({
62
67
  style: titleStyle,
63
68
  "data-node-id": "1986:2613",
64
69
  children: title
65
- }), children ? content : /*#__PURE__*/_jsx(MoneyValue, {
70
+ }), children ? cloneChildrenWithModes(children, modes, DEFAULT_MONEY_VALUE_MODES) : /*#__PURE__*/_jsx(MoneyValue, {
66
71
  value: amount,
67
72
  currency: currency,
68
- modes: modes
73
+ modes: moneyValueModes
69
74
  })]
70
75
  });
71
76
  }
@@ -4,13 +4,12 @@ import React, { createContext, useContext, isValidElement, cloneElement } from '
4
4
  import { View, Text } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { EMPTY_MODES } from '../../utils/react-utils';
7
-
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  /**
9
9
  * Context to share 'modes' with child components like Card.Title and Card.SupportText.
10
10
  * This ensures that nested components can resolve their tokens correctly without
11
11
  * needing explicit mode prop passing for every child.
12
12
  */
13
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
13
  const CardContext = /*#__PURE__*/createContext({});
15
14
  /**
16
15
  * Card component implementation from Figma node 765:6186.
@@ -4,11 +4,10 @@ import React, { createContext, useContext, isValidElement, cloneElement } from '
4
4
  import { View, Text } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import IconComponent from '../../icons/Icon';
7
-
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
8
  /**
9
9
  * Context to share 'modes' with child components.
10
10
  */
11
- import { jsx as _jsx } from "react/jsx-runtime";
12
11
  const CardFeedbackContext = /*#__PURE__*/createContext({});
13
12
  /**
14
13
  * CardFeedback component from Figma node 1280:4481.
@@ -5,13 +5,12 @@ import { Pressable, Platform, View } from 'react-native';
5
5
  import Svg, { Path } from 'react-native-svg';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
7
7
  import { EMPTY_MODES } from '../../utils/react-utils';
8
-
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
9
  /**
10
10
  * Tracks whether the last user interaction was a keyboard event (Tab).
11
11
  * Capture-phase document listeners fire before any element-level handlers,
12
12
  * so the flag is always up-to-date when onFocus runs.
13
13
  */
14
- import { jsx as _jsx } from "react/jsx-runtime";
15
14
  function useFocusVisible() {
16
15
  const [isFocusVisible, setIsFocusVisible] = useState(false);
17
16
  const hadKeyboardEventRef = useRef(false);
@@ -6,6 +6,7 @@ import { Gesture, GestureDetector, ScrollView } from 'react-native-gesture-handl
6
6
  import Animated, { runOnJS, useAnimatedProps, useAnimatedScrollHandler, useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated';
7
7
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
8
8
  import { EMPTY_MODES } from '../../utils/react-utils';
9
+ import Overlay from '../Overlay/Overlay';
9
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
11
  const AnimatedScrollView = Animated.createAnimatedComponent(ScrollView);
11
12
 
@@ -67,7 +68,9 @@ function DrawerInner({
67
68
  contentContainerStyle,
68
69
  showsVerticalScrollIndicator = false,
69
70
  bottomInset = 80,
70
- onStateChange
71
+ onStateChange,
72
+ showOverlay = false,
73
+ onOverlayPress
71
74
  }, ref) {
72
75
  const {
73
76
  height: screenHeight
@@ -365,10 +368,15 @@ function DrawerInner({
365
368
  // Per the standard react-native-gesture-handler architecture, a single
366
369
  // GestureHandlerRootView must wrap the app root; this overlay only needs to
367
370
  // let touches fall through where the sheet isn't.
368
- _jsx(View, {
371
+ _jsxs(View, {
369
372
  style: [styles.host, style],
370
373
  pointerEvents: "box-none",
371
- children: /*#__PURE__*/_jsx(GestureDetector, {
374
+ children: [showOverlay ? /*#__PURE__*/_jsx(Overlay, {
375
+ modes: modes,
376
+ ...(onOverlayPress ? {
377
+ onPress: onOverlayPress
378
+ } : {})
379
+ }) : null, /*#__PURE__*/_jsx(GestureDetector, {
372
380
  gesture: gesture,
373
381
  children: /*#__PURE__*/_jsx(Animated.View, {
374
382
  style: [styles.sheet, {
@@ -441,7 +449,7 @@ function DrawerInner({
441
449
  })]
442
450
  })
443
451
  })
444
- })
452
+ })]
445
453
  })
446
454
  );
447
455
  }
@@ -170,18 +170,34 @@ export function Dropdown({
170
170
  const shadowOffsetX = parseInt(getVariableByName('dropdown/shadow/offsetX', modes), 10) || 0;
171
171
  const shadowOffsetY = parseInt(getVariableByName('dropdown/shadow/offsetY', modes), 10) || 4;
172
172
  const shadowBlur = parseInt(getVariableByName('dropdown/shadow/blur', modes), 10) || 16;
173
- const containerStyle = {
173
+
174
+ // Shadow lives on the OUTER view, which must NOT set `overflow: 'hidden'`.
175
+ // On native, clipping a view also clips its shadow (iOS clips the layer
176
+ // shadow; Android clips the elevation shadow), so the soft popup shadow
177
+ // that renders fine on web (CSS box-shadow paints outside the box) would
178
+ // get cut off. The rounded-corner clipping is moved to a separate inner
179
+ // view below.
180
+ //
181
+ // The `boxShadow` style prop (RN 0.76+ / react-native-web) is used as the
182
+ // single source of truth so the designed color/offset/blur are honored on
183
+ // iOS, Android AND web. We intentionally do NOT also set the legacy
184
+ // `shadow*` / `elevation` props: on the new architecture (and web) those
185
+ // are translated into a box-shadow internally, so combining them with an
186
+ // explicit `boxShadow` would stack two shadows. Android's legacy
187
+ // `elevation` is also undesirable here because it ignores the shadow color
188
+ // and only paints a generic gray shadow.
189
+ const shadowStyle = {
174
190
  backgroundColor: background,
191
+ borderRadius: radius,
192
+ boxShadow: `${shadowOffsetX}px ${shadowOffsetY}px ${shadowBlur}px 0px ${shadowColor}`
193
+ };
194
+
195
+ // Inner view carries the rounded corners + clipping so list/scroll content
196
+ // stays inside the radius without affecting the outer view's shadow.
197
+ const clipStyle = {
175
198
  borderRadius: radius,
176
199
  overflow: 'hidden',
177
- shadowColor,
178
- shadowOffset: {
179
- width: shadowOffsetX,
180
- height: shadowOffsetY
181
- },
182
- shadowOpacity: 1,
183
- shadowRadius: shadowBlur / 2,
184
- elevation: 4
200
+ backgroundColor: background
185
201
  };
186
202
  const content = /*#__PURE__*/_jsx(View, {
187
203
  style: {
@@ -190,17 +206,20 @@ export function Dropdown({
190
206
  children: cloneChildrenWithModes(children, modes)
191
207
  });
192
208
  return /*#__PURE__*/_jsx(View, {
193
- style: [containerStyle, style],
209
+ style: [shadowStyle, style],
194
210
  accessibilityRole: "menu",
195
211
  accessibilityLabel: accessibilityLabel || 'Dropdown menu',
196
- children: maxHeight != null ? /*#__PURE__*/_jsx(ScrollView, {
197
- style: {
198
- maxHeight
199
- },
200
- showsVerticalScrollIndicator: true,
201
- keyboardShouldPersistTaps: "handled",
202
- children: content
203
- }) : content
212
+ children: /*#__PURE__*/_jsx(View, {
213
+ style: clipStyle,
214
+ children: maxHeight != null ? /*#__PURE__*/_jsx(ScrollView, {
215
+ style: {
216
+ maxHeight
217
+ },
218
+ showsVerticalScrollIndicator: true,
219
+ keyboardShouldPersistTaps: "handled",
220
+ children: content
221
+ }) : content
222
+ })
204
223
  });
205
224
  }
206
225
  export default Dropdown;
@@ -531,7 +531,7 @@ function DropdownInput({
531
531
  transparent: true,
532
532
  statusBarTranslucent: true,
533
533
  navigationBarTranslucent: true,
534
- animationType: "fade",
534
+ animationType: "none",
535
535
  onRequestClose: closeMenu,
536
536
  children: /*#__PURE__*/_jsx(Pressable, {
537
537
  style: StyleSheet.absoluteFill,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import React, { useMemo, useRef } from 'react';
3
+ import React, { useMemo, useRef, useState, useCallback } from 'react';
4
4
  import { View, Text, Animated } from 'react-native';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
@@ -11,7 +11,7 @@ import Disclaimer from '../Disclaimer/Disclaimer';
11
11
  import IconButton from '../IconButton/IconButton';
12
12
  import ActionFooter from '../ActionFooter/ActionFooter';
13
13
  import Slot from '../Slot/Slot';
14
-
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  // ---------------------------------------------------------------------------
16
16
  // Forced modes
17
17
  //
@@ -24,7 +24,6 @@ import Slot from '../Slot/Slot';
24
24
  // stays hot, and so `cloneChildrenWithModes` can use it as the
25
25
  // always-wins `forcedModes` argument.
26
26
  // ---------------------------------------------------------------------------
27
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
27
  const FULLSCREEN_MODAL_FORCED_MODES = Object.freeze({
29
28
  context5: 'Fullscreen Modal'
30
29
  });
@@ -184,6 +183,7 @@ function FullscreenModal({
184
183
  heroMedia,
185
184
  heroHeight = 420,
186
185
  showClose = true,
186
+ closeOffsetY = 0,
187
187
  onClose,
188
188
  closeAccessibilityLabel = 'Close',
189
189
  footer,
@@ -220,8 +220,8 @@ function FullscreenModal({
220
220
  // SafeAreaProvider — every inset is 0, so the layout is unchanged.
221
221
  const insets = useSafeAreaInsets();
222
222
  const closeButtonInsetStyle = useMemo(() => ({
223
- top: 12 + insets.top
224
- }), [insets.top]);
223
+ top: 12 + insets.top + closeOffsetY
224
+ }), [insets.top, closeOffsetY]);
225
225
  // Extend (not replace) the footer's token bottom padding by the bottom inset
226
226
  // so the action button never sits under the system navigation area.
227
227
  const footerInsetStyle = useMemo(() => {
@@ -247,7 +247,57 @@ function FullscreenModal({
247
247
  useNativeDriver: true
248
248
  }), [scrollY]);
249
249
  const heroTranslateY = useMemo(() => Animated.multiply(scrollY, -1), [scrollY]);
250
- const processedHeroMedia = useMemo(() => heroMedia ? cloneChildrenWithModes(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [heroMedia, modes]);
250
+
251
+ // The hero media is a full-bleed background pinned to the top of the modal.
252
+ // Its wrapper is absolutely positioned (`top/left/right: 0`) so it never
253
+ // contributes to scroll height. We measure the modal's own width so we can
254
+ // give the hero media a DEFINITE { width, height } box (see
255
+ // `processedHeroMedia` below) — relying on the media's own `width: '100%'` +
256
+ // `aspectRatio` is unreliable inside an indefinite-height absolute box (RN's
257
+ // `<Image>` falls back to its intrinsic width and leaves a gap), so we size
258
+ // it explicitly here instead.
259
+ const [containerWidth, setContainerWidth] = useState(0);
260
+ const onContainerLayout = useCallback(e => {
261
+ const w = e.nativeEvent.layout.width;
262
+ setContainerWidth(prev => prev !== w ? w : prev);
263
+ }, []);
264
+ const processedHeroMedia = useMemo(() => {
265
+ if (!heroMedia) return null;
266
+ // Defer rendering the hero until we have measured the modal width. This
267
+ // matters for image sharpness: React Native decodes a bitmap once, on the
268
+ // first render, and caches it. If we rendered the media before knowing the
269
+ // final box, that first decode would be sized/sampled for the wrong box and
270
+ // the cached (downsampled) bitmap would then just be scaled up — blurry.
271
+ // Rendering only once the explicit { width, height } box is known means the
272
+ // very first decode is already full-resolution for the correct box.
273
+ if (containerWidth <= 0) return null;
274
+ const withModes = cloneChildrenWithModes(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES);
275
+
276
+ // Force the hero to fill the modal width edge to edge, top-aligned, with the
277
+ // height derived from the media's native aspect ratio.
278
+ //
279
+ // Why we inject explicit width/height instead of relying on the media's own
280
+ // `width: '100%'` + `aspectRatio`: the hero wrapper is absolutely positioned
281
+ // with an INDEFINITE height, and in that layout context React Native's
282
+ // `<Image>` falls back to its INTRINSIC width (so a 361px-wide asset renders
283
+ // 361px wide and leaves a gap on the right) rather than stretching to the
284
+ // parent. By computing `height = containerWidth / ratio` here and passing a
285
+ // DEFINITE { width, height } box (which makes `<Image>` skip aspectRatio and
286
+ // cover-fit into that exact box), the hero always fills the width with the
287
+ // correct ratio-derived height.
288
+ return React.Children.map(withModes, child => {
289
+ if (! /*#__PURE__*/React.isValidElement(child)) return child;
290
+ const props = child.props;
291
+ const ratio = typeof props.ratio === 'number' && props.ratio > 0 ? props.ratio : undefined;
292
+ // Only size media that exposes a numeric `ratio` and hasn't already been
293
+ // given an explicit box by the caller.
294
+ if (ratio == null || props.width != null || props.height != null) return child;
295
+ return /*#__PURE__*/React.cloneElement(child, {
296
+ width: containerWidth,
297
+ height: containerWidth / ratio
298
+ });
299
+ });
300
+ }, [heroMedia, modes, containerWidth]);
251
301
  const processedChildren = useMemo(() => children ? cloneChildrenWithModes(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
252
302
 
253
303
  // The hero text region always reserves `heroHeight` and anchors its content
@@ -300,8 +350,18 @@ function FullscreenModal({
300
350
  return /*#__PURE__*/_jsxs(View, {
301
351
  style: [rootStyle, style],
302
352
  testID: testID,
353
+ onLayout: onContainerLayout,
303
354
  children: [processedHeroMedia ? /*#__PURE__*/_jsx(Animated.View, {
304
- style: [heroBackgroundStyle, {
355
+ style: [heroBackgroundStyle,
356
+ // Give the absolute wrapper a DEFINITE width (the measured modal
357
+ // width) so the media's `width: '100%'` + `aspectRatio` resolves to
358
+ // a true edge-to-edge fill with a ratio-derived height, top-aligned.
359
+ // Before the first layout pass `containerWidth` is 0 — fall back to
360
+ // stretching via `left/right: 0` so there is no flash of a mis-sized
361
+ // image.
362
+ containerWidth > 0 ? {
363
+ width: containerWidth
364
+ } : null, {
305
365
  transform: [{
306
366
  translateY: heroTranslateY
307
367
  }]
@@ -37,6 +37,7 @@ function Image({
37
37
  imageSource,
38
38
  ratio = DEFAULT_RATIO,
39
39
  resizeMode = 'cover',
40
+ resizeMethod,
40
41
  width,
41
42
  height,
42
43
  borderRadius,
@@ -47,11 +48,15 @@ function Image({
47
48
  loading
48
49
  }) {
49
50
  const source = useMemo(() => normalizeSource(imageSource), [imageSource]);
51
+
52
+ // Explicit { width, height } means a "fill an exact box" layout — typically a
53
+ // full-bleed hero/background where the asset is high-res and sharpness
54
+ // matters most. There, default to `'none'` (full-resolution, no pre-decode
55
+ // downsample) so detail is never thrown away. Aspect-ratio images keep the
56
+ // memory-safe `'scale'` default. A caller-supplied `resizeMethod` always wins.
57
+ const isExplicitBox = width != null && height != null;
58
+ const effectiveResizeMethod = resizeMethod ?? (isExplicitBox ? 'none' : 'scale');
50
59
  const layoutStyle = useMemo(() => {
51
- // If the caller has fully specified width AND height, they're doing a
52
- // non-aspect layout (e.g. "fill the parent") — respect that and skip
53
- // `aspectRatio` so it doesn't conflict.
54
- const isExplicitBox = width != null && height != null;
55
60
  const s = {
56
61
  width: width ?? '100%',
57
62
  ...(isExplicitBox ? {
@@ -65,7 +70,7 @@ function Image({
65
70
  };
66
71
  if (borderRadius != null) s.borderRadius = borderRadius;
67
72
  return s;
68
- }, [ratio, width, height, borderRadius]);
73
+ }, [ratio, width, height, borderRadius, isExplicitBox]);
69
74
  const {
70
75
  active: groupActive
71
76
  } = useSkeleton();
@@ -96,6 +101,7 @@ function Image({
96
101
  source: source,
97
102
  style: [layoutStyle, style],
98
103
  resizeMode: resizeMode,
104
+ resizeMethod: effectiveResizeMethod,
99
105
  accessibilityLabel: accessibilityLabel,
100
106
  accessibilityElementsHidden: accessibilityElementsHidden,
101
107
  importantForAccessibility: importantForAccessibility
@@ -6,11 +6,10 @@ 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 avatar asset (shared with the Avatar component) so that
11
11
  // InstitutionBadge has a sensible visual fallback when no `source` is
12
12
  // provided in stories or playgrounds.
13
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
13
  const DEFAULT_AVATAR_IMAGE = require('../Avatar/31595e70c4181263f9971590224b12934b280c9b.png');
15
14
  const toNumber = (value, fallback) => {
16
15
  if (typeof value === 'number') {
@@ -6,17 +6,6 @@ import { Text, View } from 'react-native';
6
6
  /** Props we forward to the underlying native Lottie view. */
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
8
8
  const INSTALL_HINT = 'LottiePlayer requires lottie-react-native in your app.\n' + ' npm install lottie-react-native\n' + ' cd ios && pod install';
9
-
10
- /**
11
- * Metro resolves `require('lottie-react-native')` at bundle time even inside
12
- * try/catch, which breaks apps that import `jfs-components` without having
13
- * the optional peer installed. Splitting the module id into a runtime string
14
- * keeps Metro from statically linking it — the native module is loaded only
15
- * when present in the consumer's node_modules.
16
- */
17
- function resolveNativeLottieModuleName() {
18
- return ['lottie', '-react', '-native'].join('');
19
- }
20
9
  function LottieUnavailableView({
21
10
  style
22
11
  }) {
@@ -60,8 +49,14 @@ let cachedView;
60
49
  export function getNativeLottieView() {
61
50
  if (cachedView !== undefined) return cachedView;
62
51
  try {
63
- const mod = require(resolveNativeLottieModuleName());
64
- cachedView = mod.default ?? LottieUnavailable;
52
+ // Static require so Metro resolves the module by its build-time numeric id.
53
+ // A runtime-constructed string path is NOT resolvable by Metro's `require`
54
+ // (it indexes modules by number, not path), so it would always throw and
55
+ // fall back to the install hint even when the package is installed. The
56
+ // dependency stays an *optional* peer: apps that use LottiePlayer install
57
+ // it; apps that don't simply never import this module.
58
+ const mod = require('lottie-react-native');
59
+ cachedView = mod.default ?? mod.LottieView ?? LottieUnavailable;
65
60
  } catch {
66
61
  cachedView = LottieUnavailable;
67
62
  }
@@ -4,9 +4,8 @@ import React, { useMemo, useEffect, useRef } from 'react';
4
4
  import { View, Text, Pressable, Animated } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { EMPTY_MODES } from '../../utils/react-utils';
7
-
8
- // Map of common ISO 4217 currency codes to display symbols
9
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ // Map of common ISO 4217 currency codes to display symbols
10
9
  const CURRENCY_SYMBOLS = {
11
10
  INR: '₹',
12
11
  USD: '$',
@@ -7,11 +7,10 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
7
  import SupportText from '../SupportText/SupportText';
8
8
  import Button from '../Button/Button';
9
9
  import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils';
10
-
10
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
11
  // Default mode overrides for the resend Button. Per design: a small,
12
12
  // low-emphasis, neutral-appearance button. Consumers can override any of
13
13
  // these via OTPResendConfig.resendButtonModes.
14
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
15
14
  const DEFAULT_RESEND_BUTTON_MODES = {
16
15
  AppearanceBrand: 'Neutral',
17
16
  'Button / Size': 'S',
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ import React, { useMemo } from 'react';
4
+ import { Pressable, StyleSheet, View } from 'react-native';
5
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
+ import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
+ import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ const PLACEMENT_STYLE = {
10
+ center: {
11
+ justifyContent: 'center',
12
+ alignItems: 'center'
13
+ },
14
+ top: {
15
+ justifyContent: 'flex-start',
16
+ alignItems: 'stretch'
17
+ },
18
+ bottom: {
19
+ justifyContent: 'flex-end',
20
+ alignItems: 'stretch'
21
+ },
22
+ stretch: {
23
+ justifyContent: 'center',
24
+ alignItems: 'stretch'
25
+ }
26
+ };
27
+
28
+ /**
29
+ * Overlay — a token-driven scrim that dims content behind an overlaid surface.
30
+ *
31
+ * Renders a semi-transparent backdrop using the `overlay/background` design
32
+ * token and optionally hosts content (e.g. a modal, sheet or dialog) on top.
33
+ * Pair it with a `Modal` for true full-screen overlays, or drop it inside any
34
+ * relatively-positioned container to dim just that region.
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <Overlay modes={modes} onPress={close}>
39
+ * <Card>Dialog content</Card>
40
+ * </Overlay>
41
+ * ```
42
+ */
43
+ function Overlay({
44
+ children,
45
+ contentPlacement = 'center',
46
+ onPress,
47
+ fill = true,
48
+ modes: propModes = EMPTY_MODES,
49
+ style,
50
+ ...rest
51
+ }) {
52
+ const {
53
+ modes: globalModes
54
+ } = useTokens();
55
+ const modes = useMemo(() => ({
56
+ ...globalModes,
57
+ ...propModes
58
+ }), [globalModes, propModes]);
59
+ const {
60
+ containerStyle,
61
+ processedChildren
62
+ } = useMemo(() => {
63
+ const backgroundColor = getVariableByName('overlay/background', modes) ?? 'rgba(0, 0, 0, 0.7)';
64
+ const container = {
65
+ backgroundColor,
66
+ overflow: 'hidden',
67
+ ...PLACEMENT_STYLE[contentPlacement]
68
+ };
69
+ const processed = children ? cloneChildrenWithModes(children, modes) : null;
70
+ return {
71
+ containerStyle: container,
72
+ processedChildren: processed
73
+ };
74
+ }, [children, modes, contentPlacement]);
75
+ return /*#__PURE__*/_jsxs(View, {
76
+ style: [fill && StyleSheet.absoluteFill, containerStyle, style],
77
+ accessibilityViewIsModal: true,
78
+ ...rest,
79
+ children: [onPress ? /*#__PURE__*/_jsx(Pressable, {
80
+ style: StyleSheet.absoluteFill,
81
+ onPress: onPress,
82
+ accessibilityRole: "button",
83
+ accessibilityLabel: "Dismiss overlay"
84
+ }) : null, processedChildren]
85
+ });
86
+ }
87
+ export default /*#__PURE__*/React.memo(Overlay);
@@ -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;
@@ -7,11 +7,10 @@ import AvatarGroup from '../AvatarGroup/AvatarGroup';
7
7
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
8
8
  import { EMPTY_MODES } from '../../utils/react-utils';
9
9
  import MoneyValue from '../MoneyValue/MoneyValue';
10
-
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
11
  // Defaults applied to the inner ButtonGroup so the card matches Figma out of
12
12
  // the box. They are spread *before* the caller's `modes` so any consumer can
13
13
  // override an individual key (e.g. swap the size to "M").
14
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
14
  const DEFAULT_BUTTON_GROUP_MODES = {
16
15
  AppearanceBrand: 'Secondary',
17
16
  'Button / Size': 'S',
@@ -9,10 +9,9 @@ import IconCapsule from '../IconCapsule/IconCapsule';
9
9
  import ListItem from '../ListItem/ListItem';
10
10
  import { usePressableWebSupport } from '../../utils/web-platform-utils';
11
11
  import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils';
12
-
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
13
  // Match Button: delay the press visual on iOS so a scroll-cancelled touch
14
14
  // never applies the "pressed" style. See Button.tsx for the rationale.
15
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
16
15
  const IS_WEB = Platform.OS === 'web';
17
16
  const IS_IOS = Platform.OS === 'ios';
18
17
  const HEADER_PRESS_DELAY = IS_IOS ? 130 : 0;