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,9 +1,10 @@
1
- import React, { useState } from 'react'
2
- import { View, Text, Pressable, type StyleProp, type ViewStyle, type TextStyle, type TextInputProps as RNTextInputProps } from 'react-native'
1
+ import React, { forwardRef, useState } from 'react'
2
+ import { View, Text, Pressable, TextInput as RNTextInput, type StyleProp, type ViewStyle, type TextStyle, type TextInputProps as RNTextInputProps } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES } from '../../utils/react-utils'
5
5
  import Icon from '../../icons/Icon'
6
6
  import TextInput from '../TextInput/TextInput'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  /**
9
10
  * SupportText component derived from Figma design.
@@ -15,7 +16,7 @@ type SupportTextProps = {
15
16
  * Defaults to 'ic_info'.
16
17
  */
17
18
  iconName?: string;
18
- modes?: Record<string, any>;
19
+ modes?: Modes;
19
20
  style?: StyleProp<ViewStyle>;
20
21
  }
21
22
 
@@ -64,7 +65,7 @@ export type InputSearchProps = {
64
65
  * (e.g. 'ic_info', 'ic_cart'). Defaults to 'ic_info'.
65
66
  */
66
67
  supportTextIcon?: string;
67
- modes?: Record<string, any>;
68
+ modes?: Modes;
68
69
  containerStyle?: StyleProp<ViewStyle>;
69
70
 
70
71
  // Props to pass through to TextInput
@@ -80,7 +81,7 @@ export type InputSearchProps = {
80
81
  accessibilityHint?: string;
81
82
  } & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
82
83
 
83
- export default function InputSearch({
84
+ const InputSearch = forwardRef<RNTextInput, InputSearchProps>(function InputSearch({
84
85
  supportText = true,
85
86
  supportTextLabel = "Support Text",
86
87
  supportTextIcon = "ic_info",
@@ -95,7 +96,7 @@ export default function InputSearch({
95
96
  trailing,
96
97
  inputStyle,
97
98
  ...rest
98
- }: InputSearchProps) {
99
+ }: InputSearchProps, ref: React.Ref<RNTextInput>) {
99
100
  const [isFocused, setIsFocused] = useState(false)
100
101
 
101
102
  // Hardcode InputState based on the state prop, ignoring any external InputState passed in modes
@@ -155,6 +156,7 @@ export default function InputSearch({
155
156
  gap: formFieldGap,
156
157
  }, containerStyle]}>
157
158
  <TextInput
159
+ ref={ref}
158
160
  placeholder={placeholder}
159
161
  value={value || ''}
160
162
  onChangeText={onChangeText || (() => { })}
@@ -177,4 +179,6 @@ export default function InputSearch({
177
179
  )}
178
180
  </View>
179
181
  )
180
- }
182
+ })
183
+
184
+ export default InputSearch
@@ -10,6 +10,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
11
11
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
12
12
  import MediaSource, { type UnifiedSource } from '../../utils/MediaSource'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  // Default avatar asset (shared with the Avatar component) so that
15
16
  // InstitutionBadge has a sensible visual fallback when no `source` is
@@ -35,7 +36,7 @@ export type InstitutionBadgeProps = InstitutionBadgeBaseProps & {
35
36
  /** Slot replacing the default Avatar (e.g. for monogram avatars). Receives `modes` recursively. */
36
37
  avatarSlot?: React.ReactNode
37
38
  /** Design token modes forwarded to token lookups and the Avatar slot. */
38
- modes?: Record<string, any>
39
+ modes?: Modes
39
40
  /** Container style override. */
40
41
  style?: StyleProp<ViewStyle>
41
42
  /** Label style override. */
@@ -77,7 +78,7 @@ const toFontWeight = (value: unknown, fallback: TextStyle['fontWeight']) => {
77
78
  }
78
79
 
79
80
  function resolveInstitutionBadgeTokens(
80
- modes: Record<string, any>
81
+ modes: Modes
81
82
  ): InstitutionBadgeTokens {
82
83
  const gap = toNumber(getVariableByName('institutionBadge/gap', modes), 8)
83
84
 
@@ -2,10 +2,11 @@ import React from 'react'
2
2
  import { View, type StyleProp, type ViewStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
5
6
 
6
7
  type LazyListProps = {
7
8
  listGroupsSlot?: React.ReactNode;
8
- modes?: Record<string, any>;
9
+ modes?: Modes;
9
10
  style?: StyleProp<ViewStyle>;
10
11
  accessibilityLabel?: string;
11
12
  accessibilityHint?: string;
@@ -4,10 +4,11 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES } from '../../utils/react-utils'
5
5
  import MoneyValue from '../MoneyValue/MoneyValue'
6
6
  import LinearProgress from '../LinearProgress/LinearProgress'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  type LinearMeterLabelProps = {
9
10
  children: React.ReactNode
10
- modes?: Record<string, any>
11
+ modes?: Modes
11
12
  style?: StyleProp<TextStyle>
12
13
  } & React.ComponentProps<typeof Text>
13
14
 
@@ -41,7 +42,7 @@ const LinearMeterLabel = ({
41
42
 
42
43
  export type LinearMeterProps = {
43
44
  value?: number // 0 to 1
44
- modes?: Record<string, any>
45
+ modes?: Modes
45
46
  style?: StyleProp<ViewStyle>
46
47
  trackStyle?: StyleProp<ViewStyle>
47
48
  indicatorStyle?: StyleProp<ViewStyle>
@@ -7,12 +7,13 @@ import {
7
7
  } from 'react-native'
8
8
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
9
9
  import { EMPTY_MODES } from '../../utils/react-utils'
10
+ import type { Modes } from '../../design-tokens'
10
11
 
11
12
  export type LinearProgressProps = {
12
13
  /** Progress value between 0 and 1. Values are clamped. */
13
14
  value?: number
14
15
  /** Design token modes for theming */
15
- modes?: Record<string, any>
16
+ modes?: Modes
16
17
  /** Override container styles (the track wrapper) */
17
18
  style?: StyleProp<ViewStyle>
18
19
  /** Override the track styles */
@@ -7,12 +7,13 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
7
7
  * This ensures that all child components in slots receive the modes prop from the parent.
8
8
  */
9
9
  import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils'
10
+ import type { Modes } from '../../design-tokens'
10
11
 
11
12
  type ListGroupProps = {
12
13
  label?: string;
13
14
  listGroupSlot?: React.ReactNode;
14
15
  children?: React.ReactNode;
15
- modes?: Record<string, any>;
16
+ modes?: Modes;
16
17
  style?: StyleProp<ViewStyle>;
17
18
  accessibilityLabel?: string;
18
19
  accessibilityHint?: string;
@@ -14,6 +14,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
14
14
  import NavArrow from '../NavArrow/NavArrow'
15
15
  import { usePressableWebSupport, type WebAccessibilityProps } from '../../utils/web-platform-utils'
16
16
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
17
+ import type { Modes } from '../../design-tokens'
17
18
 
18
19
  type ListItemProps = {
19
20
  layout?: 'Vertical' | 'Horizontal';
@@ -33,7 +34,7 @@ type ListItemProps = {
33
34
  endSlot?: React.ReactNode;
34
35
  /** Whether to show the NavArrow on the far right (Horizontal layout only). Defaults to true. */
35
36
  navArrow?: boolean;
36
- modes?: Record<string, any>;
37
+ modes?: Modes;
37
38
  onPress?: () => void;
38
39
  style?: StyleProp<ViewStyle>;
39
40
  contentStyle?: StyleProp<ViewStyle>;
@@ -79,7 +80,7 @@ interface ListItemTokens {
79
80
  resolvedModes: Record<string, any>;
80
81
  }
81
82
 
82
- function resolveListItemTokens(modes: Record<string, any>): ListItemTokens {
83
+ function resolveListItemTokens(modes: Modes): ListItemTokens {
83
84
  // Modes used to cascade into slot children (leading / supportSlot / trailing).
84
85
  // We do NOT inject an `AppearanceBrand` default here: slot content such as
85
86
  // Buttons or Badges carry their own intended appearance, so forcing one onto
@@ -10,6 +10,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
11
11
  import Button from '../Button/Button'
12
12
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  const DEFAULT_MEDIA_SIZE = 117
15
16
 
@@ -40,7 +41,7 @@ export type LottieIntroBlockProps = {
40
41
  */
41
42
  buttonSlot?: React.ReactNode
42
43
  /** Mode configuration for design-token theming. */
43
- modes?: Record<string, any>
44
+ modes?: Modes
44
45
  /** Style overrides applied to the outer container. */
45
46
  style?: StyleProp<ViewStyle>
46
47
  testID?: string
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import { EMPTY_MODES } from '../../utils/react-utils'
6
6
  import { getNativeLottieView } from './loadNativeLottieView'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  /**
9
10
  * A parsed Lottie animation. The JSON object you get from
@@ -39,7 +40,7 @@ export type LottiePlayerProps = {
39
40
  /** Loop the animation. Defaults to `true`. */
40
41
  loop?: boolean
41
42
  /** Mode configuration for design-token theming. */
42
- modes?: Record<string, any>
43
+ modes?: Modes
43
44
  /** Style overrides applied to the underlying view. */
44
45
  style?: StyleProp<ViewStyle>
45
46
  /** Accessibility label. Lottie is decorative by default. */
@@ -51,7 +52,7 @@ const DEFAULT_SIZE = 117
51
52
 
52
53
  function resolveSize(
53
54
  size: LottiePlayerProps['size'],
54
- modes: Record<string, any>
55
+ modes: Modes
55
56
  ) {
56
57
  if (typeof size === 'number') return { width: size, height: size }
57
58
  if (size && typeof size === 'object') return size
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import { EMPTY_MODES } from '../../utils/react-utils'
6
6
  import { getWebLottieView } from './loadWebLottieView'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export type LottieAnimationSource = Record<string, unknown>
9
10
 
@@ -12,7 +13,7 @@ export type LottiePlayerProps = {
12
13
  size?: number | { width: number; height: number }
13
14
  autoPlay?: boolean
14
15
  loop?: boolean
15
- modes?: Record<string, any>
16
+ modes?: Modes
16
17
  style?: StyleProp<ViewStyle>
17
18
  accessibilityLabel?: string
18
19
  testID?: string
@@ -22,7 +23,7 @@ const DEFAULT_SIZE = 117
22
23
 
23
24
  function resolveSize(
24
25
  size: LottiePlayerProps['size'],
25
- modes: Record<string, any>
26
+ modes: Modes
26
27
  ) {
27
28
  if (typeof size === 'number') return { width: size, height: size }
28
29
  if (size && typeof size === 'object') return size
@@ -14,17 +14,6 @@ const INSTALL_HINT =
14
14
  ' npm install lottie-react-native\n' +
15
15
  ' cd ios && pod install'
16
16
 
17
- /**
18
- * Metro resolves `require('lottie-react-native')` at bundle time even inside
19
- * try/catch, which breaks apps that import `jfs-components` without having
20
- * the optional peer installed. Splitting the module id into a runtime string
21
- * keeps Metro from statically linking it — the native module is loaded only
22
- * when present in the consumer's node_modules.
23
- */
24
- function resolveNativeLottieModuleName() {
25
- return ['lottie', '-react', '-native'].join('')
26
- }
27
-
28
17
  function LottieUnavailableView({ style }: Pick<NativeLottieViewProps, 'style'>) {
29
18
  if (__DEV__) {
30
19
  return (
@@ -75,10 +64,17 @@ export function getNativeLottieView(): React.ComponentType<NativeLottieViewProps
75
64
  if (cachedView !== undefined) return cachedView
76
65
 
77
66
  try {
78
- const mod = require(resolveNativeLottieModuleName()) as {
67
+ // Static require so Metro resolves the module by its build-time numeric id.
68
+ // A runtime-constructed string path is NOT resolvable by Metro's `require`
69
+ // (it indexes modules by number, not path), so it would always throw and
70
+ // fall back to the install hint even when the package is installed. The
71
+ // dependency stays an *optional* peer: apps that use LottiePlayer install
72
+ // it; apps that don't simply never import this module.
73
+ const mod = require('lottie-react-native') as {
79
74
  default?: React.ComponentType<NativeLottieViewProps>
75
+ LottieView?: React.ComponentType<NativeLottieViewProps>
80
76
  }
81
- cachedView = mod.default ?? LottieUnavailable
77
+ cachedView = mod.default ?? mod.LottieView ?? LottieUnavailable
82
78
  } catch {
83
79
  cachedView = LottieUnavailable
84
80
  }
@@ -4,8 +4,9 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import Image from '../Image/Image'
5
5
  import GlassFill, { type GlassTint } from './GlassFill'
6
6
  import { EMPTY_MODES } from '../../utils/react-utils'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
- const MediaCardContext = createContext<{ modes?: Record<string, any> }>({})
9
+ const MediaCardContext = createContext<{ modes?: Modes }>({})
9
10
 
10
11
  export interface MediaCardProps {
11
12
  /**
@@ -34,7 +35,7 @@ export interface MediaCardProps {
34
35
  /**
35
36
  * Modes object for token resolution.
36
37
  */
37
- modes?: Record<string, any>
38
+ modes?: Modes
38
39
  /**
39
40
  * Style overrides for the card container.
40
41
  */
@@ -137,7 +138,7 @@ export function Header({ children, style }: { children?: React.ReactNode; style?
137
138
  * Title component.
138
139
  * Tokens: cardMedia/title/*
139
140
  */
140
- export function Title({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Record<string, any> }) {
141
+ export function Title({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Modes }) {
141
142
  const context = useContext(MediaCardContext)
142
143
  const modes = propModes || context.modes || {}
143
144
 
@@ -181,7 +182,7 @@ export function Title({ children, style, modes: propModes }: { children?: React.
181
182
  *
182
183
  * Tokens still drive the tint color, blur intensity and inner spacing.
183
184
  */
184
- export function Footer({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<ViewStyle>; modes?: Record<string, any> }) {
185
+ export function Footer({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<ViewStyle>; modes?: Modes }) {
185
186
  const context = useContext(MediaCardContext)
186
187
  const modes = propModes || context.modes || {}
187
188
 
@@ -245,7 +246,7 @@ export function Footer({ children, style, modes: propModes }: { children?: React
245
246
  * Footer Title
246
247
  * Tokens: cardMedia/footer/title/*
247
248
  */
248
- export function FooterTitle({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Record<string, any> }) {
249
+ export function FooterTitle({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Modes }) {
249
250
  const context = useContext(MediaCardContext)
250
251
  const modes = propModes || context.modes || {}
251
252
 
@@ -266,7 +267,7 @@ export function FooterTitle({ children, style, modes: propModes }: { children?:
266
267
  * Footer Subtitle
267
268
  * Tokens: cardMedia/footer/subtitle/*
268
269
  */
269
- export function FooterSubtitle({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Record<string, any> }) {
270
+ export function FooterSubtitle({ children, style, modes: propModes }: { children?: React.ReactNode; style?: StyleProp<TextStyle>; modes?: Modes }) {
270
271
  const context = useContext(MediaCardContext)
271
272
  const modes = propModes || context.modes || {}
272
273
 
@@ -9,6 +9,7 @@ import {
9
9
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { EMPTY_MODES } from '../../utils/react-utils'
11
11
  import Avatar, { type AvatarProps } from '../Avatar/Avatar'
12
+ import type { Modes } from '../../design-tokens'
12
13
 
13
14
  export type MerchantProfileProps = {
14
15
  /**
@@ -23,7 +24,7 @@ export type MerchantProfileProps = {
23
24
  * Mode configuration passed to the token resolver.
24
25
  * Also passed to the Avatar child component for consistent theming.
25
26
  */
26
- modes?: Record<string, any>
27
+ modes?: Modes
27
28
  /**
28
29
  * Optional style overrides for the container
29
30
  */
@@ -12,6 +12,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
12
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
13
13
  import { EMPTY_MODES } from '../../utils/react-utils'
14
14
  import { useFormContext } from '../Form/Form'
15
+ import type { Modes } from '../../design-tokens'
15
16
 
16
17
  // ---------------------------------------------------------------------------
17
18
  // Types
@@ -82,7 +83,7 @@ export type MessageFieldProps = {
82
83
  /** Auto-focus the textarea on mount. */
83
84
  autoFocus?: boolean
84
85
  /** Modes for design token resolution (e.g. `{ 'Color Mode': 'Light' }`). */
85
- modes?: Record<string, any>
86
+ modes?: Modes
86
87
  /** Style overrides for the outermost wrapper. */
87
88
  style?: StyleProp<ViewStyle>
88
89
  /** Style overrides for the textarea container (border/padding/etc). */
@@ -129,7 +130,7 @@ function firstError(error: string | string[] | undefined): string | undefined {
129
130
  return error
130
131
  }
131
132
 
132
- function useMessageFieldTokens(modes: Record<string, any>) {
133
+ function useMessageFieldTokens(modes: Modes) {
133
134
  return useMemo(() => {
134
135
  const wrapperGap = toNumber(getVariableByName('messageField/gap', modes), 8)
135
136
 
@@ -8,6 +8,7 @@ import {
8
8
  } from 'react-native'
9
9
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { EMPTY_MODES } from '../../utils/react-utils'
11
+ import type { Modes } from '../../design-tokens'
11
12
 
12
13
  export type MetricLegendItemProps = {
13
14
  /** The label text on the left (after the indicator). */
@@ -29,7 +30,7 @@ export type MetricLegendItemProps = {
29
30
  */
30
31
  indicatorShape?: 'dot' | 'line'
31
32
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
32
- modes?: Record<string, any>
33
+ modes?: Modes
33
34
  /** Override container styles. */
34
35
  style?: StyleProp<ViewStyle>
35
36
  /** Override the indicator (dot) styles. */
@@ -10,6 +10,7 @@ import {
10
10
  } from 'react-native'
11
11
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
12
  import { EMPTY_MODES } from '../../utils/react-utils'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  // Map of common ISO 4217 currency codes to display symbols
15
16
  const CURRENCY_SYMBOLS = {
@@ -58,7 +59,7 @@ export type MoneyValueProps = {
58
59
  /** When true, a blinking vertical cursor is shown at the end of the value text. */
59
60
  focused?: boolean
60
61
  /** Modes configuration mapped to Figma tokens. */
61
- modes?: Record<string, any>
62
+ modes?: Modes
62
63
  style?: StyleProp<ViewStyle>
63
64
  valueStyle?: StyleProp<TextStyle>
64
65
  currencyStyle?: StyleProp<TextStyle>
@@ -10,6 +10,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
10
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
11
11
  import { EMPTY_MODES } from '../../utils/react-utils'
12
12
  import MetricLegendItem from '../MetricLegendItem/MetricLegendItem'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  /**
15
16
  * The three semantic states a calendar glyph can be in. Maps 1:1 to the
@@ -37,7 +38,7 @@ export type MonthlyStatusGridMonth = {
37
38
  * Per-month design token mode overrides. Merged on top of the parent
38
39
  * `modes` and the per-month `Calendar Glyph State` derived from `status`.
39
40
  */
40
- modes?: Record<string, any>
41
+ modes?: Modes
41
42
  /** Per-month accessibility label. */
42
43
  accessibilityLabel?: string
43
44
  }
@@ -67,7 +68,7 @@ export type MonthlyStatusGridProps = {
67
68
  */
68
69
  legendStatuses?: MonthlyStatus[]
69
70
  /** Design token modes (e.g. `{ 'Color Mode': 'Light' }`). */
70
- modes?: Record<string, any>
71
+ modes?: Modes
71
72
  /** Container style override. */
72
73
  style?: StyleProp<ViewStyle>
73
74
  /** Style applied to the months section (the rows wrapper). */
@@ -162,7 +163,7 @@ export type CalendarGlyphProps = {
162
163
  */
163
164
  status?: MonthlyStatus
164
165
  /** Design token mode overrides. */
165
- modes?: Record<string, any>
166
+ modes?: Modes
166
167
  /** Container style override. */
167
168
  style?: StyleProp<ViewStyle>
168
169
  /** Label text style override. */
@@ -268,7 +269,7 @@ function CalendarGlyph({
268
269
  */
269
270
  function resolveStatusColors(
270
271
  status: MonthlyStatus,
271
- modes: Record<string, any>
272
+ modes: Modes
272
273
  ): { bg: string; fg: string; statusModes: Record<string, any> } {
273
274
  const statusModes = { ...modes, 'Calendar Glyph State': status }
274
275
  const bg =
@@ -14,6 +14,7 @@ import {
14
14
  type SafePressableProps,
15
15
  } from '../../utils/web-platform-utils'
16
16
  import { EMPTY_MODES } from '../../utils/react-utils'
17
+ import type { Modes } from '../../design-tokens'
17
18
 
18
19
  type NavArrowDirection = 'Back' | 'Forward' | 'Down'
19
20
 
@@ -33,7 +34,7 @@ type NavArrowProps = SafePressableProps & {
33
34
  /** Direction of the arrow: 'Back' (left chevron), 'Forward' (right chevron), or 'Down' */
34
35
  direction?: NavArrowDirection
35
36
  /** Modes used to resolve design tokens */
36
- modes?: Record<string, any>
37
+ modes?: Modes
37
38
  /** Optional additional container style */
38
39
  style?: StyleProp<ViewStyle>
39
40
  /** Accessibility label for the arrow */
@@ -55,7 +56,7 @@ interface NavArrowTokens {
55
56
  backgroundColor: string
56
57
  }
57
58
 
58
- function resolveNavArrowTokens(modes: Record<string, any>): NavArrowTokens {
59
+ function resolveNavArrowTokens(modes: Modes): NavArrowTokens {
59
60
  const iconColor =
60
61
  (getVariableByName('navArrow/icon/color', modes) as string) || '#24262b'
61
62
 
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect } from 'react'
1
+ import React, { forwardRef, useState, useRef } from 'react'
2
2
  import {
3
3
  View,
4
4
  TextInput as RNTextInput,
@@ -11,7 +11,8 @@ import {
11
11
  type TextInputProps,
12
12
  } from 'react-native'
13
13
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
14
- import { EMPTY_MODES } from '../../utils/react-utils'
14
+ import { EMPTY_MODES, mergeRefs } from '../../utils/react-utils'
15
+ import type { Modes } from '../../design-tokens'
15
16
 
16
17
  export type NoteInputProps = {
17
18
  /** The value of the text input */
@@ -21,7 +22,7 @@ export type NoteInputProps = {
21
22
  /** Callback when text changes */
22
23
  onChangeText?: (text: string) => void
23
24
  /** Design token modes (e.g., {'InputState': 'Idle', 'Color Mode': 'Light'}) */
24
- modes?: Record<string, any>
25
+ modes?: Modes
25
26
  /** Custom container style */
26
27
  style?: StyleProp<ViewStyle>
27
28
  /** Custom text input style */
@@ -34,7 +35,7 @@ export type NoteInputProps = {
34
35
  * NoteInput component representing an interactive "Add note" badge style field.
35
36
  * Allows the user to click, clears the placeholder text, and shows a blinking cursor when focused.
36
37
  */
37
- export default function NoteInput({
38
+ const NoteInput = forwardRef<RNTextInput, NoteInputProps>(function NoteInput({
38
39
  value = '',
39
40
  placeholder = 'Add note',
40
41
  onChangeText,
@@ -45,7 +46,7 @@ export default function NoteInput({
45
46
  onFocus,
46
47
  onBlur,
47
48
  ...rest
48
- }: NoteInputProps) {
49
+ }: NoteInputProps, ref: React.Ref<RNTextInput>) {
49
50
  const [internalFocused, setInternalFocused] = useState(false)
50
51
  const inputRef = useRef<RNTextInput>(null)
51
52
 
@@ -119,7 +120,7 @@ export default function NoteInput({
119
120
  {internalFocused ? (value || ' ') : (value || placeholder)}
120
121
  </Text>
121
122
  <RNTextInput
122
- ref={inputRef}
123
+ ref={mergeRefs(inputRef, ref)}
123
124
  value={value}
124
125
  onChangeText={onChangeText}
125
126
  placeholder={internalFocused ? '' : placeholder}
@@ -144,4 +145,6 @@ export default function NoteInput({
144
145
  </View>
145
146
  </Pressable>
146
147
  )
147
- }
148
+ })
149
+
150
+ export default NoteInput
@@ -5,6 +5,7 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils'
6
6
  import Button from '../Button/Button'
7
7
  import Icon from '../../icons/Icon'
8
+ import type { Modes } from '../../design-tokens'
8
9
 
9
10
  export type NudgeType = 'stacked-prominent' | 'stacked-detailed' | 'inline-compact'
10
11
 
@@ -31,7 +32,7 @@ export type NudgeProps = {
31
32
  /** Content slot — overrides default content, or provides detailed list content */
32
33
  children?: React.ReactNode;
33
34
  /** Mode configuration for design token resolution */
34
- modes?: Record<string, any>;
35
+ modes?: Modes;
35
36
  /** Optional container style overrides */
36
37
  style?: StyleProp<ViewStyle>;
37
38
  };
@@ -61,7 +62,7 @@ function toFontWeight(value: unknown, fallback: TextStyle['fontWeight']): TextSt
61
62
  return fallback
62
63
  }
63
64
 
64
- function resolveNudgeTokens(modes: Record<string, any>): NudgeTokens {
65
+ function resolveNudgeTokens(modes: Modes): NudgeTokens {
65
66
  const background = getVariableByName('nudge/background', modes) || '#f5f5f5'
66
67
  const radius = getVariableByName('nudge/radius', modes) || 12
67
68
  const paddingH = getVariableByName('nudge/padding/horizontal', modes) || 12
@@ -10,6 +10,7 @@ import {
10
10
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
11
11
  import { EMPTY_MODES } from '../../utils/react-utils'
12
12
  import Icon from '../../icons/Icon'
13
+ import type { Modes } from '../../design-tokens'
13
14
 
14
15
  export type NumpadKeyValue =
15
16
  | '0'
@@ -27,7 +28,7 @@ export type NumpadKeyValue =
27
28
 
28
29
  export interface NumpadProps {
29
30
  /** Design token modes for theming (e.g., {"Color Mode": "Light"}) */
30
- modes?: Record<string, any>
31
+ modes?: Modes
31
32
  /** Callback fired when any key is pressed */
32
33
  onKeyPress?: (key: NumpadKeyValue) => void
33
34
  /** Whether to show the decimal point key (default: true) */
@@ -14,6 +14,7 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
14
14
  import SupportText, { type SupportTextProps } from '../SupportText/SupportText'
15
15
  import Button from '../Button/Button'
16
16
  import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils'
17
+ import type { Modes } from '../../design-tokens'
17
18
 
18
19
  // Default mode overrides for the resend Button. Per design: a small,
19
20
  // low-emphasis, neutral-appearance button. Consumers can override any of
@@ -223,7 +224,7 @@ export type OTPResendConfig = {
223
224
  }
224
225
 
225
226
  export type OTPResendProps = OTPResendConfig & {
226
- modes?: Record<string, any>
227
+ modes?: Modes
227
228
  style?: StyleProp<ViewStyle>
228
229
  }
229
230
 
@@ -338,7 +339,7 @@ export type OTPProps = {
338
339
  /** Auto-focus the input on mount. */
339
340
  autoFocus?: boolean
340
341
  /** Design token modes for Figma token resolution. */
341
- modes?: Record<string, any>
342
+ modes?: Modes
342
343
  /** Container style override. */
343
344
  style?: StyleProp<ViewStyle>
344
345
  /** Optional SupportText rendered below the slots. Pass a string for the label or a ReactNode for full control. */