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
@@ -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 StatItemLabelPosition = 'Top' | 'Bottom'
13
14
 
@@ -25,7 +26,7 @@ export type StatItemProps = {
25
26
  */
26
27
  labelPosition?: StatItemLabelPosition
27
28
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
28
- modes?: Record<string, any>
29
+ modes?: Modes
29
30
  /** Override container styles. */
30
31
  style?: StyleProp<ViewStyle>
31
32
  /** Override the label text styles. */
@@ -5,6 +5,7 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import IconCapsule from '../IconCapsule/IconCapsule'
6
6
  import MoneyValue from '../MoneyValue/MoneyValue'
7
7
  import { EMPTY_MODES } from '../../utils/react-utils'
8
+ import type { Modes } from '../../design-tokens'
8
9
 
9
10
  export type StatusHeroProps = {
10
11
  /**
@@ -26,7 +27,7 @@ export type StatusHeroProps = {
26
27
  /** Currency symbol or ISO code for the default MoneyValue */
27
28
  currency?: string
28
29
  /** Mode configuration for design tokens */
29
- modes?: Record<string, any>
30
+ modes?: Modes
30
31
  style?: ViewStyle
31
32
  }
32
33
 
@@ -4,12 +4,13 @@ import Svg, { Path } from 'react-native-svg'
4
4
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
5
5
  import { StepLabel } from './StepLabel'
6
6
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export type StepStatus = 'number' | 'complete' | 'error' | 'warning'
9
10
 
10
11
  export type StepProps = {
11
12
  children?: React.ReactNode
12
- modes?: Record<string, any>
13
+ modes?: Modes
13
14
  style?: ViewStyle
14
15
  // Injected by Stepper, or provided manually
15
16
  index?: number
@@ -2,6 +2,7 @@ import React from 'react'
2
2
  import { View, Text, type ViewStyle, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
5
6
 
6
7
  export type StepLabelProps = {
7
8
  title?: string
@@ -9,7 +10,7 @@ export type StepLabelProps = {
9
10
  metaText?: string
10
11
  subtitle?: boolean
11
12
  meta?: boolean
12
- modes?: Record<string, any>
13
+ modes?: Modes
13
14
  style?: ViewStyle
14
15
  }
15
16
 
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { Step } from './Step'
5
5
  import { StepLabel } from './StepLabel'
6
6
  import { EMPTY_MODES } from '../../utils/react-utils'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export { Step, StepLabel }
9
10
  export type { StepProps, StepStatus } from './Step'
@@ -11,7 +12,7 @@ export type { StepLabelProps } from './StepLabel'
11
12
 
12
13
  export type StepperProps = {
13
14
  children?: React.ReactNode
14
- modes?: Record<string, any>
15
+ modes?: Modes
15
16
  style?: ViewStyle
16
17
  }
17
18
 
@@ -2,6 +2,7 @@ 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 } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
5
6
 
6
7
  /**
7
8
  * Confidence levels supported by the indicator. Mirrors the Figma `Confidence`
@@ -40,7 +41,7 @@ export type StrengthIndicatorProps = {
40
41
  */
41
42
  confidence?: StrengthIndicatorConfidenceValue
42
43
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
43
- modes?: Record<string, any>
44
+ modes?: Modes
44
45
  /** Override container styles. */
45
46
  style?: StyleProp<ViewStyle>
46
47
  } & Omit<React.ComponentProps<typeof View>, 'style'>
@@ -23,6 +23,7 @@ import { EMPTY_MODES } from '../../utils/react-utils'
23
23
  import SupportText from '../SupportText/SupportText'
24
24
  import type { SupportTextStatus } from '../SupportText/SupportTextIcon'
25
25
  import Dropdown, { DropdownItem } from '../Dropdown/Dropdown'
26
+ import type { Modes } from '../../design-tokens'
26
27
 
27
28
  const IS_WEB = Platform.OS === 'web'
28
29
 
@@ -134,7 +135,7 @@ export type SuggestiveSearchProps = {
134
135
  /** Replaces `supportText` when `isInvalid` is true. */
135
136
  errorMessage?: string
136
137
  /** Modes for design token resolution. */
137
- modes?: Record<string, any>
138
+ modes?: Modes
138
139
  /** Style overrides for the outermost wrapper. */
139
140
  style?: StyleProp<ViewStyle>
140
141
  /** Style overrides for the input row. */
@@ -180,7 +181,7 @@ const defaultFilter = (query: string, option: SuggestiveSearchOption) =>
180
181
  // Token resolution
181
182
  // ---------------------------------------------------------------------------
182
183
 
183
- function useFormFieldTokens(modes: Record<string, any>) {
184
+ function useFormFieldTokens(modes: Modes) {
184
185
  return useMemo(() => {
185
186
  const labelColor =
186
187
  (getVariableByName('formField/label/color', modes) as string) ||
@@ -261,7 +262,7 @@ function useFormFieldTokens(modes: Record<string, any>) {
261
262
  }, [modes])
262
263
  }
263
264
 
264
- function useDropdownItemTextTokens(modes: Record<string, any>) {
265
+ function useDropdownItemTextTokens(modes: Modes) {
265
266
  return useMemo(() => {
266
267
  const foreground =
267
268
  (getVariableByName('dropdownItem/foreground', modes) as string) ||
@@ -15,6 +15,7 @@ import NavArrow from '../NavArrow/NavArrow'
15
15
  import StrengthIndicator, {
16
16
  type StrengthIndicatorConfidenceValue,
17
17
  } from '../StrengthIndicator/StrengthIndicator'
18
+ import type { Modes } from '../../design-tokens'
18
19
 
19
20
  export type SummaryTileProps = {
20
21
  /** Bold heading shown at the top-left of the tile. */
@@ -50,7 +51,7 @@ export type SummaryTileProps = {
50
51
  */
51
52
  onPress?: () => void
52
53
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
53
- modes?: Record<string, any>
54
+ modes?: Modes
54
55
  /** Override container styles. */
55
56
  style?: StyleProp<ViewStyle>
56
57
  /** Override the title text styles. */
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
5
5
  import SupportTextIcon, { type SupportTextStatus } from './SupportTextIcon';
6
6
  import { EMPTY_MODES } from '../../utils/react-utils';
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export type SupportTextProps = {
9
10
  /**
@@ -27,7 +28,7 @@ export type SupportTextProps = {
27
28
  /**
28
29
  * Modes object for design token resolution.
29
30
  */
30
- modes?: Record<string, any>;
31
+ modes?: Modes;
31
32
 
32
33
  style?: StyleProp<ViewStyle>;
33
34
  };
@@ -3,12 +3,13 @@ import { View, type ViewStyle } from 'react-native';
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
4
4
  import Icon from '../../icons/Icon';
5
5
  import { EMPTY_MODES } from '../../utils/react-utils';
6
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  export type SupportTextStatus = 'Neutral' | 'Warning' | 'Error' | 'Success' | 'Loading';
8
9
 
9
10
  export type SupportTextIconProps = {
10
11
  status?: SupportTextStatus;
11
- modes?: Record<string, any>;
12
+ modes?: Modes;
12
13
  style?: ViewStyle;
13
14
  };
14
15
 
@@ -3,6 +3,7 @@ import { View, Text, type ViewStyle, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import Button from '../Button/Button'
5
5
  import { EMPTY_MODES } from '../../utils/react-utils'
6
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  export type SwappableAmountProps = {
8
9
  /** Large display value (e.g. "49g"). */
@@ -18,7 +19,7 @@ export type SwappableAmountProps = {
18
19
  /** Callback when the amount/swap button is pressed. */
19
20
  onAmountPress?: () => void
20
21
  /** Modes configuration for design token resolution. */
21
- modes?: Record<string, any>
22
+ modes?: Modes
22
23
  /** Container style override. */
23
24
  style?: ViewStyle
24
25
  }
@@ -9,6 +9,7 @@ import {
9
9
  } from 'react-native'
10
10
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
11
11
  import { EMPTY_MODES } from '../../utils/react-utils'
12
+ import type { Modes } from '../../design-tokens'
12
13
 
13
14
  export interface TabItemProps {
14
15
  /** Label text to display */
@@ -18,7 +19,7 @@ export interface TabItemProps {
18
19
  /** Callback when this tab item is pressed */
19
20
  onPress?: () => void
20
21
  /** Design token modes for theming */
21
- modes?: Record<string, any>
22
+ modes?: Modes
22
23
  /** Override container styles */
23
24
  style?: StyleProp<ViewStyle>
24
25
  /** Override label text styles */
@@ -8,6 +8,7 @@ import {
8
8
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
9
9
  import TabItem from './TabItem'
10
10
  import { EMPTY_MODES } from '../../utils/react-utils'
11
+ import type { Modes } from '../../design-tokens'
11
12
 
12
13
  export interface TabsProps {
13
14
  /**
@@ -16,7 +17,7 @@ export interface TabsProps {
16
17
  */
17
18
  children: React.ReactNode
18
19
  /** Design token modes for theming */
19
- modes?: Record<string, any>
20
+ modes?: Modes
20
21
  /**
21
22
  * When true, the tabs row scrolls horizontally (useful for many items).
22
23
  * @default false
@@ -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 TestimonialsCardProps = {
14
15
  /**
@@ -23,7 +24,7 @@ export type TestimonialsCardProps = {
23
24
  * Mode configuration passed to the token resolver. Also forwarded to the
24
25
  * Avatar child for consistent theming.
25
26
  */
26
- modes?: Record<string, any>
27
+ modes?: Modes
27
28
  /**
28
29
  * Optional style overrides for the card container.
29
30
  */
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES } from '../../utils/react-utils'
5
5
  import Skeleton from '../../skeleton/Skeleton'
6
6
  import { useSkeleton } from '../../skeleton/SkeletonGroup'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export type TextProps = {
9
10
  /**
@@ -20,7 +21,7 @@ export type TextProps = {
20
21
  /** Horizontal alignment of the text. */
21
22
  textAlign?: 'Left' | 'Center'
22
23
  /** Modes configuration for design token resolution. */
23
- modes?: Record<string, any>
24
+ modes?: Modes
24
25
  /** Style override for the text. */
25
26
  style?: StyleProp<TextStyle>
26
27
  /** Number of lines to limit the text to. */
@@ -1,8 +1,9 @@
1
- import React, { useRef, useState } from 'react'
1
+ import React, { forwardRef, useRef, useState } from 'react'
2
2
  import { Platform, Pressable, View, TextInput as RNTextInput, type StyleProp, type ViewStyle, type TextInputProps as RNTextInputProps, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import Icon from '../../icons/Icon'
5
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
5
+ import { EMPTY_MODES, cloneChildrenWithModes, mergeRefs } from '../../utils/react-utils'
6
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  /**
8
9
  * TextInput component that mirrors the Figma "textInput" component.
@@ -102,7 +103,7 @@ type TextInputProps = {
102
103
  leadingIconName?: string;
103
104
  leading?: React.ReactNode;
104
105
  trailing?: React.ReactNode;
105
- modes?: Record<string, any>;
106
+ modes?: Modes;
106
107
  style?: StyleProp<ViewStyle>;
107
108
  inputStyle?: StyleProp<TextStyle>;
108
109
  onFocus?: (e: any) => void;
@@ -111,7 +112,7 @@ type TextInputProps = {
111
112
  accessibilityHint?: string;
112
113
  } & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
113
114
 
114
- function TextInput({
115
+ const TextInputBase = forwardRef<RNTextInput, TextInputProps>(function TextInput({
115
116
  placeholder = '',
116
117
  value = '',
117
118
  onChangeText,
@@ -126,7 +127,7 @@ function TextInput({
126
127
  accessibilityLabel,
127
128
  accessibilityHint,
128
129
  ...rest
129
- }: TextInputProps) {
130
+ }: TextInputProps, ref: React.Ref<RNTextInput>) {
130
131
  // Track focus state to hide placeholder when focused
131
132
  const [isFocused, setIsFocused] = useState(false)
132
133
  const [isHovered, setIsHovered] = useState(false)
@@ -250,7 +251,7 @@ function TextInput({
250
251
  </View>
251
252
  )}
252
253
  <RNTextInput
253
- ref={inputRef}
254
+ ref={mergeRefs(inputRef, ref)}
254
255
  accessibilityLabel={undefined}
255
256
  accessibilityHint={accessibilityHint}
256
257
  placeholder={displayPlaceholder}
@@ -289,7 +290,7 @@ function TextInput({
289
290
  }
290
291
 
291
292
  return <View style={containerStyleArray}>{inner}</View>
292
- }
293
+ })
293
294
 
294
295
  /**
295
296
  * TextInput.Search component that mirrors the Figma "textInput.search" component.
@@ -315,7 +316,7 @@ type TextInputSearchProps = {
315
316
  value?: string;
316
317
  onChangeText?: (text: string) => void;
317
318
  leading?: React.ReactNode;
318
- modes?: Record<string, any>;
319
+ modes?: Modes;
319
320
  style?: StyleProp<ViewStyle>;
320
321
  inputStyle?: StyleProp<TextStyle>;
321
322
  accessibilityLabel?: string;
@@ -324,7 +325,7 @@ type TextInputSearchProps = {
324
325
  onBlur?: (e: any) => void;
325
326
  } & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
326
327
 
327
- function TextInputSearch({
328
+ const TextInputSearch = forwardRef<RNTextInput, TextInputSearchProps>(function TextInputSearch({
328
329
  placeholder = 'Search',
329
330
  value = '',
330
331
  onChangeText,
@@ -337,7 +338,7 @@ function TextInputSearch({
337
338
  onFocus,
338
339
  onBlur,
339
340
  ...rest
340
- }: TextInputSearchProps) {
341
+ }: TextInputSearchProps, ref: React.Ref<RNTextInput>) {
341
342
  // Resolve icon tokens for default search icon
342
343
  const iconColor = getVariableByName('textInput/icon/color', modes) || '#24262b'
343
344
  const iconSize = getVariableByName('textInput/icon/size', modes) || 18
@@ -378,10 +379,14 @@ function TextInputSearch({
378
379
  textInputProps.accessibilityHint = accessibilityHint
379
380
  }
380
381
 
381
- return <TextInput {...(textInputProps as TextInputProps)} />
382
- }
382
+ return <TextInput ref={ref} {...(textInputProps as TextInputProps)} />
383
+ })
383
384
 
384
- // Attach Search as a property of TextInput using namespace pattern
385
+ // Attach Search as a property of TextInput using namespace pattern. The base
386
+ // component is created via forwardRef, so we compose the static onto a typed
387
+ // alias to keep `TextInput.Search` strongly typed.
388
+ type TextInputComponent = typeof TextInputBase & { Search: typeof TextInputSearch }
389
+ const TextInput = TextInputBase as TextInputComponent
385
390
  TextInput.Search = TextInputSearch
386
391
 
387
392
  export default TextInput
@@ -0,0 +1,166 @@
1
+ import React, { useMemo } from 'react'
2
+ import { Text as RNText, type TextStyle, type StyleProp } from 'react-native'
3
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
6
+
7
+ /**
8
+ * A single coloured run inside a {@link TextSegment}. Each run can carry its own
9
+ * `modes`, so individual fragments of the same paragraph can resolve different
10
+ * design tokens (most commonly a different `text/foreground` colour) while still
11
+ * flowing — and wrapping — inline as one continuous line of text.
12
+ */
13
+ export type TextSegmentRun = {
14
+ /** The text for this run. Include trailing/leading spaces yourself when you want spacing between runs (inline text has no gap concept). */
15
+ text: string
16
+ /**
17
+ * Per-run mode overrides. Merged on top of the parent `TextSegment` modes, so
18
+ * a run only needs to specify what differs (e.g. `{ 'Text Appearance': 'Primary' }`
19
+ * to recolour just that fragment). Everything else is inherited.
20
+ */
21
+ modes?: Modes
22
+ /** Optional per-run style override applied last, on top of the token-resolved style. */
23
+ style?: StyleProp<TextStyle>
24
+ }
25
+
26
+ export type TextSegmentProps = {
27
+ /**
28
+ * Declarative, data-driven way to compose a multi-colour string. Each entry
29
+ * becomes an inline run. This is the simplest API when the segments are known
30
+ * up front:
31
+ *
32
+ * ```tsx
33
+ * <TextSegment segments={[
34
+ * { text: 'Upsell message ' },
35
+ * { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
36
+ * ]} />
37
+ * ```
38
+ *
39
+ * When both `segments` and `children` are provided, `children` win.
40
+ */
41
+ segments?: TextSegmentRun[]
42
+ /**
43
+ * Compositional alternative to {@link TextSegmentProps.segments}. Pass library
44
+ * `Text` elements (or plain strings) as children and they are rendered nested
45
+ * inside the same paragraph so they wrap together. The parent `modes` cascade
46
+ * down to every child via `cloneChildrenWithModes`, and each child may still
47
+ * override with its own `modes`:
48
+ *
49
+ * ```tsx
50
+ * <TextSegment>
51
+ * <Text>Upsell message </Text>
52
+ * <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
53
+ * </TextSegment>
54
+ * ```
55
+ */
56
+ children?: React.ReactNode
57
+ /** Horizontal alignment of the whole paragraph. */
58
+ textAlign?: 'Left' | 'Center'
59
+ /** Clamp the paragraph to this many lines (truncates with an ellipsis). Applies to the whole composed line, not per-run. */
60
+ numberOfLines?: number
61
+ /** Mode configuration used for the base style and cascaded to every run/child. */
62
+ modes?: Modes
63
+ /** Style override applied to the outer paragraph (e.g. width constraints to force wrapping). */
64
+ style?: StyleProp<TextStyle>
65
+ }
66
+
67
+ const TEXT_ALIGN_MAP: Record<NonNullable<TextSegmentProps['textAlign']>, TextStyle['textAlign']> = {
68
+ Left: 'left',
69
+ Center: 'center',
70
+ }
71
+
72
+ /**
73
+ * Resolves the `text/*` design tokens for a given modes object into an RN
74
+ * `TextStyle`. Shared by the outer paragraph and every inline run so a run that
75
+ * only overrides colour still inherits the family/size/weight/spacing.
76
+ */
77
+ function resolveTextStyle(modes: Modes): TextStyle {
78
+ return {
79
+ color: (getVariableByName('text/foreground', modes) ?? '#000000') as string,
80
+ fontFamily: (getVariableByName('text/fontFamily', modes) ?? 'JioType') as string,
81
+ fontSize: (getVariableByName('text/fontSize', modes) ?? 14) as number,
82
+ fontWeight: String(getVariableByName('text/fontWeight', modes) ?? '500') as TextStyle['fontWeight'],
83
+ lineHeight: (getVariableByName('text/lineHeight', modes) ?? 20) as number,
84
+ letterSpacing: (getVariableByName('text/letterSpacing', modes) ?? -0.5) as number,
85
+ }
86
+ }
87
+
88
+ /**
89
+ * TextSegment — composes several differently-styled text runs into a single
90
+ * paragraph that wraps as one continuous line.
91
+ *
92
+ * On the web you would reach for `<span>`s inside a `<p>`; the React Native
93
+ * equivalent is nesting `<Text>` inside a parent `<Text>`. That nesting is the
94
+ * whole trick: sibling `<View>`s would lay out as flex blocks and break onto
95
+ * rigid rows, but nested `<Text>` nodes flow inline and wrap naturally at word
96
+ * boundaries — exactly like a real paragraph — while each nested run keeps its
97
+ * own colour/weight resolved from its own `modes`.
98
+ *
99
+ * Two equivalent ways to author content:
100
+ * - **`segments` prop** — declarative array of `{ text, modes }` runs.
101
+ * - **`children`** — pass library `Text` elements (or strings); the parent
102
+ * `modes` cascade down and each child may override its own.
103
+ *
104
+ * @example Data-driven
105
+ * ```tsx
106
+ * <TextSegment
107
+ * segments={[
108
+ * { text: 'Upsell message ' },
109
+ * { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
110
+ * ]}
111
+ * />
112
+ * ```
113
+ *
114
+ * @example Compositional
115
+ * ```tsx
116
+ * <TextSegment numberOfLines={2}>
117
+ * <Text>Pay with </Text>
118
+ * <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
119
+ * <Text> and earn rewards on every transaction.</Text>
120
+ * </TextSegment>
121
+ * ```
122
+ */
123
+ function TextSegment({
124
+ segments,
125
+ children,
126
+ textAlign = 'Left',
127
+ numberOfLines,
128
+ modes = EMPTY_MODES,
129
+ style,
130
+ }: TextSegmentProps) {
131
+ const baseStyle = useMemo<TextStyle>(
132
+ () => ({ ...resolveTextStyle(modes), textAlign: TEXT_ALIGN_MAP[textAlign] }),
133
+ [modes, textAlign]
134
+ )
135
+
136
+ // children win over `segments` so the compositional API can always override.
137
+ const hasChildren = children !== undefined && children !== null && children !== false
138
+
139
+ const renderedSegments = useMemo(() => {
140
+ if (hasChildren || !segments?.length) return null
141
+ return segments.map((run, index) => {
142
+ // Parent modes first, then the run's own modes override them — mirrors the
143
+ // merge order used by `cloneChildrenWithModes` for the children API.
144
+ const runModes = run.modes ? { ...modes, ...run.modes } : modes
145
+ const runStyle = run.modes ? resolveTextStyle(runModes) : undefined
146
+ return (
147
+ <RNText key={index} style={[runStyle, run.style]}>
148
+ {run.text}
149
+ </RNText>
150
+ )
151
+ })
152
+ }, [segments, hasChildren, modes])
153
+
154
+ // The cascade: every child (and its descendants) receives the parent modes so
155
+ // nested library `Text` runs resolve their tokens against the same baseline,
156
+ // while still honouring any per-child `modes` override.
157
+ const content = hasChildren ? cloneChildrenWithModes(children, modes) : renderedSegments
158
+
159
+ return (
160
+ <RNText style={[baseStyle, style]} numberOfLines={numberOfLines}>
161
+ {content}
162
+ </RNText>
163
+ )
164
+ }
165
+
166
+ export default React.memo(TextSegment)
@@ -2,6 +2,7 @@ import React, { isValidElement, cloneElement, type ReactNode } from 'react'
2
2
  import { View, Text, type ViewStyle, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { EMPTY_MODES } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
5
6
 
6
7
  export type ThreadHeroProps = {
7
8
  /** Title text, e.g. "Subhash Rajan" */
@@ -13,7 +14,7 @@ export type ThreadHeroProps = {
13
14
  /** Slot for Avatar component */
14
15
  renderAvatar?: ReactNode
15
16
  /** Modes for design token resolution */
16
- modes?: Record<string, any>
17
+ modes?: Modes
17
18
  /** Optional container style */
18
19
  style?: ViewStyle
19
20
  }
@@ -3,6 +3,7 @@ import { View, Text, type StyleProp, type ViewStyle, type TextStyle } from 'reac
3
3
  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
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  export type TitleProps = {
8
9
  title?: string;
@@ -10,7 +11,7 @@ export type TitleProps = {
10
11
  subtitle?: string;
11
12
  /** Horizontal alignment of the title text. */
12
13
  textAlign?: 'Left' | 'Center';
13
- modes?: Record<string, any>;
14
+ modes?: Modes;
14
15
  style?: StyleProp<ViewStyle>;
15
16
  textStyle?: StyleProp<TextStyle>;
16
17
  /** Optional style overrides for the subtitle text. */
@@ -4,13 +4,14 @@ import Animated, { FadeIn, FadeOut, SlideInDown, SlideInUp } from 'react-native-
4
4
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
5
5
  import { closeToast, type ToastPlacement } from './useToast'
6
6
  import { EMPTY_MODES } from '../../utils/react-utils'
7
+ import type { Modes } from '../../design-tokens'
7
8
 
8
9
  export interface ToastProps {
9
10
  id: string
10
11
  title: string
11
12
  timeout?: number | undefined
12
13
  onClose?: (() => void) | undefined
13
- modes?: Record<string, any> | undefined
14
+ modes?: Modes | undefined
14
15
  placement?: ToastPlacement | undefined
15
16
  style?: StyleProp<ViewStyle> | undefined
16
17
  }
@@ -3,12 +3,13 @@ import { StyleSheet, View } from 'react-native'
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
4
4
  import { useToast, type ToastPlacement } from './useToast'
5
5
  import Toast from './Toast'
6
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  export interface ToastProviderProps {
8
9
  children: React.ReactNode
9
10
  maxVisibleToasts?: number
10
11
  placement?: ToastPlacement
11
- modes?: Record<string, any>
12
+ modes?: Modes
12
13
  }
13
14
 
14
15
  function ToastProvider({
@@ -1,4 +1,5 @@
1
1
  import { useCallback, useSyncExternalStore } from 'react'
2
+ import type { Modes } from '../../design-tokens'
2
3
 
3
4
  export type ToastPlacement = 'top' | 'bottom'
4
5
 
@@ -6,7 +7,7 @@ export interface ToastOptions {
6
7
  title: string
7
8
  timeout?: number
8
9
  onClose?: () => void
9
- modes?: Record<string, any>
10
+ modes?: Modes
10
11
  }
11
12
 
12
13
  export interface ToastEntry {
@@ -14,7 +15,7 @@ export interface ToastEntry {
14
15
  title: string
15
16
  timeout: number
16
17
  onClose?: (() => void) | undefined
17
- modes?: Record<string, any> | undefined
18
+ modes?: Modes | undefined
18
19
  }
19
20
 
20
21
  type Listener = () => void
@@ -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 interface ToggleProps {
13
14
  /** Whether the toggle is on (controlled) */
@@ -19,7 +20,7 @@ export interface ToggleProps {
19
20
  /** Whether the toggle is disabled */
20
21
  disabled?: boolean
21
22
  /** Design token modes for theming */
22
- modes?: Record<string, any>
23
+ modes?: Modes
23
24
  /** Override container styles */
24
25
  style?: StyleProp<ViewStyle>
25
26
  /** Accessibility label for screen readers */