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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
4
4
  import { Dimensions, Modal, Platform, Pressable, StyleSheet, Text, View } from 'react-native';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
@@ -16,6 +16,12 @@ const IS_WEB = Platform.OS === 'web';
16
16
  // Types
17
17
  // ---------------------------------------------------------------------------
18
18
 
19
+ /**
20
+ * Imperative handle exposed via `ref`. Lets the consumer drive the dropdown
21
+ * from outside — e.g. close it when an Android hardware/system button is
22
+ * pressed, or open it programmatically from a sibling control.
23
+ */
24
+
19
25
  // ---------------------------------------------------------------------------
20
26
  // Token resolution
21
27
  // ---------------------------------------------------------------------------
@@ -119,7 +125,7 @@ function collectOptionsFromChildren(children) {
119
125
  // Component
120
126
  // ---------------------------------------------------------------------------
121
127
 
122
- function DropdownInput({
128
+ const DropdownInput = /*#__PURE__*/forwardRef(function DropdownInput({
123
129
  label,
124
130
  placeholder = 'Select an option',
125
131
  items,
@@ -150,7 +156,7 @@ function DropdownInput({
150
156
  accessibilityHint,
151
157
  onFocus,
152
158
  onBlur
153
- }) {
159
+ }, ref) {
154
160
  // ---------------- Modes ----------------
155
161
  const {
156
162
  modes: globalModes
@@ -264,6 +270,32 @@ function DropdownInput({
264
270
  measure();
265
271
  }, [measure]);
266
272
 
273
+ // ---------------- Imperative handle ----------------
274
+ useImperativeHandle(ref, () => ({
275
+ open: () => {
276
+ if (isDisabled || isReadOnly) return;
277
+ measure();
278
+ setOpenState(true);
279
+ },
280
+ close: closeMenu,
281
+ toggle: () => {
282
+ if (isDisabled || isReadOnly) return;
283
+ measure();
284
+ toggleMenu();
285
+ },
286
+ focus: () => {
287
+ ;
288
+ triggerRef.current?.focus?.();
289
+ },
290
+ blur: () => {
291
+ ;
292
+ triggerRef.current?.blur?.();
293
+ },
294
+ measureInWindow: callback => {
295
+ triggerRef.current?.measureInWindow(callback);
296
+ }
297
+ }), [isDisabled, isReadOnly, measure, setOpenState, closeMenu, toggleMenu]);
298
+
267
299
  // ---------------- Popup positioning ----------------
268
300
  const [menuSize, setMenuSize] = useState(null);
269
301
  const handleMenuLayout = useCallback(e => {
@@ -531,7 +563,7 @@ function DropdownInput({
531
563
  transparent: true,
532
564
  statusBarTranslucent: true,
533
565
  navigationBarTranslucent: true,
534
- animationType: "fade",
566
+ animationType: "none",
535
567
  onRequestClose: closeMenu,
536
568
  children: /*#__PURE__*/_jsx(Pressable, {
537
569
  style: StyleSheet.absoluteFill,
@@ -558,7 +590,7 @@ function DropdownInput({
558
590
  })
559
591
  })]
560
592
  });
561
- }
593
+ });
562
594
  const webNoOutline = {
563
595
  outlineStyle: 'none',
564
596
  outlineWidth: 0,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import React, { useCallback, useMemo, useState } from 'react';
3
+ import React, { forwardRef, useCallback, useMemo, useState } from 'react';
4
4
  import { View, Text, TextInput as RNTextInput } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
@@ -156,7 +156,7 @@ function firstError(error) {
156
156
  // Component
157
157
  // ---------------------------------------------------------------------------
158
158
 
159
- function FormField({
159
+ const FormField = /*#__PURE__*/forwardRef(function FormField({
160
160
  label,
161
161
  placeholder,
162
162
  value,
@@ -184,7 +184,7 @@ function FormField({
184
184
  accessibilityLabel,
185
185
  accessibilityHint,
186
186
  testID
187
- }) {
187
+ }, ref) {
188
188
  // -- Form context integration -------------------------------------------
189
189
  const formCtx = useFormContext();
190
190
  const formError = name && formCtx ? firstError(formCtx.validationErrors[name]) : undefined;
@@ -341,6 +341,7 @@ function FormField({
341
341
  importantForAccessibility: "no",
342
342
  children: processedLeading
343
343
  }), /*#__PURE__*/_jsx(RNTextInput, {
344
+ ref: ref,
344
345
  style: [inputTextStyles, inputTextStyle],
345
346
  value: value ?? '',
346
347
  onChangeText: handleChangeText,
@@ -370,5 +371,5 @@ function FormField({
370
371
  modes: modes
371
372
  })]
372
373
  });
373
- }
374
+ });
374
375
  export default FormField;
@@ -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
  });
@@ -248,7 +247,57 @@ function FullscreenModal({
248
247
  useNativeDriver: true
249
248
  }), [scrollY]);
250
249
  const heroTranslateY = useMemo(() => Animated.multiply(scrollY, -1), [scrollY]);
251
- 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]);
252
301
  const processedChildren = useMemo(() => children ? cloneChildrenWithModes(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
253
302
 
254
303
  // The hero text region always reserves `heroHeight` and anchors its content
@@ -301,8 +350,18 @@ function FullscreenModal({
301
350
  return /*#__PURE__*/_jsxs(View, {
302
351
  style: [rootStyle, style],
303
352
  testID: testID,
353
+ onLayout: onContainerLayout,
304
354
  children: [processedHeroMedia ? /*#__PURE__*/_jsx(Animated.View, {
305
- 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, {
306
365
  transform: [{
307
366
  translateY: heroTranslateY
308
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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import React, { useState } from 'react';
3
+ import React, { forwardRef, useState } from 'react';
4
4
  import { View, Text, Pressable } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { EMPTY_MODES } from '../../utils/react-utils';
@@ -48,7 +48,7 @@ function SupportText({
48
48
  })]
49
49
  });
50
50
  }
51
- export default function InputSearch({
51
+ const InputSearch = /*#__PURE__*/forwardRef(function InputSearch({
52
52
  supportText = true,
53
53
  supportTextLabel = "Support Text",
54
54
  supportTextIcon = "ic_info",
@@ -63,7 +63,7 @@ export default function InputSearch({
63
63
  trailing,
64
64
  inputStyle,
65
65
  ...rest
66
- }) {
66
+ }, ref) {
67
67
  const [isFocused, setIsFocused] = useState(false);
68
68
 
69
69
  // Hardcode InputState based on the state prop, ignoring any external InputState passed in modes
@@ -118,6 +118,7 @@ export default function InputSearch({
118
118
  gap: formFieldGap
119
119
  }, containerStyle],
120
120
  children: [/*#__PURE__*/_jsx(TextInput, {
121
+ ref: ref,
121
122
  placeholder: placeholder,
122
123
  value: value || '',
123
124
  onChangeText: onChangeText || (() => {}),
@@ -137,4 +138,5 @@ export default function InputSearch({
137
138
  modes: componentModes
138
139
  })]
139
140
  });
140
- }
141
+ });
142
+ export default InputSearch;
@@ -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: '$',
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
 
3
- import React, { useState, useRef } from 'react';
3
+ import React, { forwardRef, useState, useRef } from 'react';
4
4
  import { View, TextInput as RNTextInput, Text, Pressable } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
- import { EMPTY_MODES } from '../../utils/react-utils';
6
+ import { EMPTY_MODES, mergeRefs } from '../../utils/react-utils';
7
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  /**
9
9
  * NoteInput component representing an interactive "Add note" badge style field.
10
10
  * Allows the user to click, clears the placeholder text, and shows a blinking cursor when focused.
11
11
  */
12
- export default function NoteInput({
12
+ const NoteInput = /*#__PURE__*/forwardRef(function NoteInput({
13
13
  value = '',
14
14
  placeholder = 'Add note',
15
15
  onChangeText,
@@ -20,7 +20,7 @@ export default function NoteInput({
20
20
  onFocus,
21
21
  onBlur,
22
22
  ...rest
23
- }) {
23
+ }, ref) {
24
24
  const [internalFocused, setInternalFocused] = useState(false);
25
25
  const inputRef = useRef(null);
26
26
 
@@ -92,7 +92,7 @@ export default function NoteInput({
92
92
  importantForAccessibility: "no",
93
93
  children: internalFocused ? value || ' ' : value || placeholder
94
94
  }), /*#__PURE__*/_jsx(RNTextInput, {
95
- ref: inputRef,
95
+ ref: mergeRefs(inputRef, ref),
96
96
  value: value,
97
97
  onChangeText: onChangeText,
98
98
  placeholder: internalFocused ? '' : placeholder,
@@ -112,4 +112,5 @@ export default function NoteInput({
112
112
  })]
113
113
  })
114
114
  });
115
- }
115
+ });
116
+ export default NoteInput;
@@ -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);