jfs-components 0.0.99 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +1 -1
  3. package/lib/commonjs/components/Balance/Balance.js +17 -12
  4. package/lib/commonjs/components/Card/Card.js +2 -1
  5. package/lib/commonjs/components/CardFeedback/CardFeedback.js +2 -1
  6. package/lib/commonjs/components/Checkbox/Checkbox.js +2 -1
  7. package/lib/commonjs/components/Drawer/Drawer.js +13 -4
  8. package/lib/commonjs/components/Dropdown/Dropdown.js +37 -18
  9. package/lib/commonjs/components/DropdownInput/DropdownInput.js +1 -1
  10. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +65 -4
  11. package/lib/commonjs/components/Image/Image.js +11 -5
  12. package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
  13. package/lib/commonjs/components/Overlay/Overlay.js +92 -0
  14. package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
  15. package/lib/commonjs/components/TestimonialsCard/TestimonialsCard.js +121 -0
  16. package/lib/commonjs/components/TextInput/TextInput.js +2 -1
  17. package/lib/commonjs/components/docs/modeControls.js +116 -0
  18. package/lib/commonjs/components/index.js +14 -0
  19. package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
  20. package/lib/commonjs/design-tokens/figma-modes.generated.js +391 -0
  21. package/lib/commonjs/design-tokens/index.js +11 -0
  22. package/lib/commonjs/icons/registry.js +1 -1
  23. package/lib/module/components/Accordion/Accordion.js +1 -2
  24. package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
  25. package/lib/module/components/Balance/Balance.js +18 -13
  26. package/lib/module/components/Card/Card.js +1 -2
  27. package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
  28. package/lib/module/components/Checkbox/Checkbox.js +1 -2
  29. package/lib/module/components/Drawer/Drawer.js +12 -4
  30. package/lib/module/components/Dropdown/Dropdown.js +37 -18
  31. package/lib/module/components/DropdownInput/DropdownInput.js +1 -1
  32. package/lib/module/components/FullscreenModal/FullscreenModal.js +67 -7
  33. package/lib/module/components/Image/Image.js +11 -5
  34. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +1 -2
  35. package/lib/module/components/LottiePlayer/loadNativeLottieView.js +8 -13
  36. package/lib/module/components/MoneyValue/MoneyValue.js +1 -2
  37. package/lib/module/components/OTP/OTP.js +1 -2
  38. package/lib/module/components/Overlay/Overlay.js +87 -0
  39. package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
  40. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
  41. package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
  42. package/lib/module/components/Section/Section.js +1 -2
  43. package/lib/module/components/TestimonialsCard/TestimonialsCard.js +116 -0
  44. package/lib/module/components/TextInput/TextInput.js +1 -2
  45. package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
  46. package/lib/module/components/docs/modeControls.js +111 -0
  47. package/lib/module/components/index.js +2 -0
  48. package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
  49. package/lib/module/design-tokens/figma-modes.generated.js +387 -0
  50. package/lib/module/design-tokens/index.js +2 -1
  51. package/lib/module/icons/registry.js +1 -1
  52. package/lib/module/utils/react-utils.js +0 -1
  53. package/lib/typescript/scripts/extract-component-tokens.d.ts +1 -1
  54. package/lib/typescript/scripts/generate-mode-types.d.ts +2 -0
  55. package/lib/typescript/scripts/retype-modes.d.cts +2 -0
  56. package/lib/typescript/src/components/Accordion/Accordion.d.ts +2 -1
  57. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +2 -1
  58. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +2 -1
  59. package/lib/typescript/src/components/ActionFooter/ActionFooter.d.ts +2 -1
  60. package/lib/typescript/src/components/ActionTile/ActionTile.d.ts +2 -1
  61. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +2 -1
  62. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +2 -1
  63. package/lib/typescript/src/components/AppBar/AppBar.d.ts +2 -1
  64. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +3 -2
  65. package/lib/typescript/src/components/Attached/Attached.d.ts +2 -1
  66. package/lib/typescript/src/components/Avatar/Avatar.d.ts +2 -1
  67. package/lib/typescript/src/components/AvatarGroup/AvatarGroup.d.ts +2 -1
  68. package/lib/typescript/src/components/Badge/Badge.d.ts +2 -1
  69. package/lib/typescript/src/components/Balance/Balance.d.ts +2 -1
  70. package/lib/typescript/src/components/BottomNav/BottomNav.d.ts +2 -1
  71. package/lib/typescript/src/components/BottomNavItem/BottomNavItem.d.ts +2 -1
  72. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +2 -1
  73. package/lib/typescript/src/components/BubbleChart/BubbleChart.d.ts +2 -1
  74. package/lib/typescript/src/components/Button/Button.d.ts +2 -1
  75. package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +2 -1
  76. package/lib/typescript/src/components/Card/Card.d.ts +3 -2
  77. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +2 -1
  78. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +2 -1
  79. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +2 -1
  80. package/lib/typescript/src/components/CardFeedback/CardFeedback.d.ts +7 -6
  81. package/lib/typescript/src/components/CardFinancialCondition/CardFinancialCondition.d.ts +2 -1
  82. package/lib/typescript/src/components/CardInsight/CardInsight.d.ts +2 -1
  83. package/lib/typescript/src/components/CardProviderInfo/CardProviderInfo.d.ts +2 -1
  84. package/lib/typescript/src/components/Carousel/Carousel.d.ts +4 -3
  85. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +2 -1
  86. package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
  87. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -1
  88. package/lib/typescript/src/components/ChipGroup/ChipGroup.d.ts +2 -1
  89. package/lib/typescript/src/components/ChipSelect/ChipSelect.d.ts +2 -1
  90. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +2 -1
  91. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +2 -1
  92. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +2 -1
  93. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +2 -1
  94. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +3 -2
  95. package/lib/typescript/src/components/CoverageRing/CoverageRing.d.ts +2 -1
  96. package/lib/typescript/src/components/DebitCard/DebitCard.d.ts +2 -1
  97. package/lib/typescript/src/components/Disclaimer/Disclaimer.d.ts +2 -1
  98. package/lib/typescript/src/components/Divider/Divider.d.ts +2 -1
  99. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +4 -3
  100. package/lib/typescript/src/components/DonutChartSummary/DonutChartSummary.d.ts +3 -2
  101. package/lib/typescript/src/components/Drawer/Drawer.d.ts +15 -1
  102. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +3 -2
  103. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +2 -1
  104. package/lib/typescript/src/components/EmptyState/EmptyState.d.ts +2 -1
  105. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +2 -1
  106. package/lib/typescript/src/components/FilterBar/FilterBar.d.ts +3 -2
  107. package/lib/typescript/src/components/Form/Form.d.ts +2 -1
  108. package/lib/typescript/src/components/FormField/FormField.d.ts +2 -1
  109. package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +9 -2
  110. package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
  111. package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
  112. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
  113. package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
  114. package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
  115. package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
  116. package/lib/typescript/src/components/Image/Image.d.ts +17 -1
  117. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +2 -1
  118. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +2 -1
  119. package/lib/typescript/src/components/LazyList/LazyList.d.ts +2 -1
  120. package/lib/typescript/src/components/LinearMeter/LinearMeter.d.ts +3 -2
  121. package/lib/typescript/src/components/LinearProgress/LinearProgress.d.ts +2 -1
  122. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +2 -1
  123. package/lib/typescript/src/components/ListItem/ListItem.d.ts +2 -1
  124. package/lib/typescript/src/components/LottieIntroBlock/LottieIntroBlock.d.ts +2 -1
  125. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.d.ts +2 -1
  126. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.web.d.ts +2 -1
  127. package/lib/typescript/src/components/MediaCard/MediaCard.d.ts +6 -5
  128. package/lib/typescript/src/components/MerchantProfile/MerchantProfile.d.ts +2 -1
  129. package/lib/typescript/src/components/MessageField/MessageField.d.ts +2 -1
  130. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +2 -1
  131. package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +2 -1
  132. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +4 -3
  133. package/lib/typescript/src/components/NavArrow/NavArrow.d.ts +2 -1
  134. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +2 -1
  135. package/lib/typescript/src/components/Nudge/Nudge.d.ts +2 -1
  136. package/lib/typescript/src/components/Numpad/Numpad.d.ts +2 -1
  137. package/lib/typescript/src/components/OTP/OTP.d.ts +3 -2
  138. package/lib/typescript/src/components/Overlay/Overlay.d.ts +52 -0
  139. package/lib/typescript/src/components/PageHero/PageHero.d.ts +2 -1
  140. package/lib/typescript/src/components/PaymentFeedback/PaymentFeedback.d.ts +2 -1
  141. package/lib/typescript/src/components/PlanComparisonCard/PlanComparisonCard.d.ts +2 -1
  142. package/lib/typescript/src/components/Popup/Popup.d.ts +2 -1
  143. package/lib/typescript/src/components/PortfolioHero/PortfolioHero.d.ts +2 -1
  144. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +2 -1
  145. package/lib/typescript/src/components/ProductLabel/ProductLabel.d.ts +2 -1
  146. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +2 -1
  147. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
  148. package/lib/typescript/src/components/Radio/Radio.d.ts +2 -1
  149. package/lib/typescript/src/components/RangeTrack/RangeTrack.d.ts +3 -2
  150. package/lib/typescript/src/components/RechargeCard/RechargeCard.d.ts +2 -1
  151. package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +2 -1
  152. package/lib/typescript/src/components/Screen/Screen.d.ts +2 -1
  153. package/lib/typescript/src/components/Section/Section.d.ts +3 -2
  154. package/lib/typescript/src/components/SegmentedControl/SegmentedControl.d.ts +2 -1
  155. package/lib/typescript/src/components/SegmentedTrack/SegmentedTrack.d.ts +4 -3
  156. package/lib/typescript/src/components/Slot/Slot.d.ts +2 -1
  157. package/lib/typescript/src/components/Spinner/Spinner.d.ts +2 -1
  158. package/lib/typescript/src/components/StatGroup/StatGroup.d.ts +2 -1
  159. package/lib/typescript/src/components/StatItem/StatItem.d.ts +2 -1
  160. package/lib/typescript/src/components/StatusHero/StatusHero.d.ts +2 -1
  161. package/lib/typescript/src/components/Stepper/Step.d.ts +2 -1
  162. package/lib/typescript/src/components/Stepper/StepLabel.d.ts +2 -1
  163. package/lib/typescript/src/components/Stepper/Stepper.d.ts +2 -1
  164. package/lib/typescript/src/components/StrengthIndicator/StrengthIndicator.d.ts +2 -1
  165. package/lib/typescript/src/components/SuggestiveSearch/SuggestiveSearch.d.ts +2 -1
  166. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +2 -1
  167. package/lib/typescript/src/components/SupportText/SupportText.d.ts +2 -1
  168. package/lib/typescript/src/components/SupportText/SupportTextIcon.d.ts +2 -1
  169. package/lib/typescript/src/components/SwappableAmount/SwappableAmount.d.ts +2 -1
  170. package/lib/typescript/src/components/Tabs/TabItem.d.ts +2 -1
  171. package/lib/typescript/src/components/Tabs/Tabs.d.ts +2 -1
  172. package/lib/typescript/src/components/TestimonialsCard/TestimonialsCard.d.ts +52 -0
  173. package/lib/typescript/src/components/Text/Text.d.ts +2 -1
  174. package/lib/typescript/src/components/TextInput/TextInput.d.ts +3 -2
  175. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +2 -1
  176. package/lib/typescript/src/components/Title/Title.d.ts +2 -1
  177. package/lib/typescript/src/components/Toast/Toast.d.ts +2 -1
  178. package/lib/typescript/src/components/Toast/ToastProvider.d.ts +2 -1
  179. package/lib/typescript/src/components/Toast/useToast.d.ts +3 -2
  180. package/lib/typescript/src/components/Toggle/Toggle.d.ts +2 -1
  181. package/lib/typescript/src/components/Tooltip/Tooltip.d.ts +2 -1
  182. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +2 -1
  183. package/lib/typescript/src/components/TransactionDetails/TransactionDetails.d.ts +3 -2
  184. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +2 -1
  185. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +2 -1
  186. package/lib/typescript/src/components/VStack/VStack.d.ts +2 -1
  187. package/lib/typescript/src/components/docs/modeControls.d.ts +28 -0
  188. package/lib/typescript/src/components/index.d.ts +2 -0
  189. package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
  190. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +264 -0
  191. package/lib/typescript/src/design-tokens/index.d.ts +1 -0
  192. package/lib/typescript/src/icons/registry.d.ts +1 -1
  193. package/lib/typescript/src/skeleton/Skeleton.d.ts +2 -1
  194. package/lib/typescript/src/utils/react-utils.d.ts +2 -1
  195. package/package.json +3 -2
  196. package/src/components/Accordion/Accordion.tsx +2 -1
  197. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +2 -1
  198. package/src/components/AccountCard/AccountCard.tsx +2 -1
  199. package/src/components/ActionFooter/ActionFooter.tsx +2 -1
  200. package/src/components/ActionTile/ActionTile.tsx +2 -1
  201. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +2 -1
  202. package/src/components/AmountInput/AmountInput.tsx +2 -1
  203. package/src/components/AppBar/AppBar.tsx +2 -1
  204. package/src/components/AreaLineChart/AreaLineChart.tsx +8 -7
  205. package/src/components/Attached/Attached.tsx +2 -1
  206. package/src/components/Avatar/Avatar.tsx +3 -2
  207. package/src/components/AvatarGroup/AvatarGroup.tsx +2 -1
  208. package/src/components/Badge/Badge.tsx +2 -1
  209. package/src/components/Balance/Balance.tsx +18 -12
  210. package/src/components/BottomNav/BottomNav.tsx +2 -1
  211. package/src/components/BottomNavItem/BottomNavItem.tsx +3 -2
  212. package/src/components/BrandChip/BrandChip.tsx +3 -2
  213. package/src/components/BubbleChart/BubbleChart.tsx +2 -1
  214. package/src/components/Button/Button.tsx +3 -2
  215. package/src/components/ButtonGroup/ButtonGroup.tsx +2 -1
  216. package/src/components/Card/Card.tsx +4 -3
  217. package/src/components/CardAdvisory/CardAdvisory.tsx +3 -2
  218. package/src/components/CardBankAccount/CardBankAccount.tsx +2 -1
  219. package/src/components/CardCTA/CardCTA.tsx +3 -2
  220. package/src/components/CardFeedback/CardFeedback.tsx +11 -10
  221. package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +3 -2
  222. package/src/components/CardInsight/CardInsight.tsx +2 -1
  223. package/src/components/CardProviderInfo/CardProviderInfo.tsx +2 -1
  224. package/src/components/Carousel/Carousel.tsx +5 -4
  225. package/src/components/Checkbox/Checkbox.tsx +2 -1
  226. package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
  227. package/src/components/CheckboxItem/CheckboxItem.tsx +2 -1
  228. package/src/components/ChipGroup/ChipGroup.tsx +2 -1
  229. package/src/components/ChipSelect/ChipSelect.tsx +2 -1
  230. package/src/components/CircularProgressBar/CircularProgressBar.tsx +2 -1
  231. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +2 -1
  232. package/src/components/CircularRating/CircularRating.tsx +3 -2
  233. package/src/components/ClusterBubble/ClusterBubble.tsx +2 -1
  234. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +3 -2
  235. package/src/components/CoverageRing/CoverageRing.tsx +2 -1
  236. package/src/components/DebitCard/DebitCard.tsx +2 -1
  237. package/src/components/Disclaimer/Disclaimer.tsx +2 -1
  238. package/src/components/Divider/Divider.tsx +2 -1
  239. package/src/components/DonutChart/DonutChart.tsx +6 -5
  240. package/src/components/DonutChartSummary/DonutChartSummary.tsx +3 -2
  241. package/src/components/Drawer/Drawer.tsx +21 -1
  242. package/src/components/Dropdown/Dropdown.tsx +42 -21
  243. package/src/components/DropdownInput/DropdownInput.tsx +5 -4
  244. package/src/components/EmptyState/EmptyState.tsx +2 -1
  245. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +2 -1
  246. package/src/components/FilterBar/FilterBar.tsx +3 -2
  247. package/src/components/Form/Form.tsx +2 -1
  248. package/src/components/FormField/FormField.tsx +3 -2
  249. package/src/components/FullscreenModal/FullscreenModal.tsx +77 -12
  250. package/src/components/Gauge/Gauge.tsx +2 -1
  251. package/src/components/HStack/HStack.tsx +2 -1
  252. package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
  253. package/src/components/Icon/Icon.tsx +3 -2
  254. package/src/components/IconButton/IconButton.tsx +3 -2
  255. package/src/components/IconCapsule/IconCapsule.tsx +3 -2
  256. package/src/components/Image/Image.tsx +29 -5
  257. package/src/components/InputSearch/InputSearch.tsx +3 -2
  258. package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -2
  259. package/src/components/LazyList/LazyList.tsx +2 -1
  260. package/src/components/LinearMeter/LinearMeter.tsx +3 -2
  261. package/src/components/LinearProgress/LinearProgress.tsx +2 -1
  262. package/src/components/ListGroup/ListGroup.tsx +2 -1
  263. package/src/components/ListItem/ListItem.tsx +3 -2
  264. package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +2 -1
  265. package/src/components/LottiePlayer/LottiePlayer.tsx +3 -2
  266. package/src/components/LottiePlayer/LottiePlayer.web.tsx +3 -2
  267. package/src/components/LottiePlayer/loadNativeLottieView.tsx +9 -13
  268. package/src/components/MediaCard/MediaCard.tsx +7 -6
  269. package/src/components/MerchantProfile/MerchantProfile.tsx +2 -1
  270. package/src/components/MessageField/MessageField.tsx +3 -2
  271. package/src/components/MetricLegendItem/MetricLegendItem.tsx +2 -1
  272. package/src/components/MoneyValue/MoneyValue.tsx +2 -1
  273. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +5 -4
  274. package/src/components/NavArrow/NavArrow.tsx +3 -2
  275. package/src/components/NoteInput/NoteInput.tsx +2 -1
  276. package/src/components/Nudge/Nudge.tsx +3 -2
  277. package/src/components/Numpad/Numpad.tsx +2 -1
  278. package/src/components/OTP/OTP.tsx +3 -2
  279. package/src/components/Overlay/Overlay.tsx +114 -0
  280. package/src/components/PageHero/PageHero.tsx +2 -1
  281. package/src/components/PaymentFeedback/PaymentFeedback.tsx +2 -1
  282. package/src/components/PlanComparisonCard/PlanComparisonCard.tsx +2 -1
  283. package/src/components/Popup/Popup.tsx +2 -1
  284. package/src/components/PortfolioHero/PortfolioHero.tsx +2 -1
  285. package/src/components/PoweredByLabel/PoweredByLabel.tsx +2 -1
  286. package/src/components/ProductLabel/ProductLabel.tsx +2 -1
  287. package/src/components/ProductOverview/ProductOverview.tsx +2 -1
  288. package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
  289. package/src/components/Radio/Radio.tsx +2 -1
  290. package/src/components/RangeTrack/RangeTrack.tsx +3 -2
  291. package/src/components/RechargeCard/RechargeCard.tsx +2 -1
  292. package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +2 -1
  293. package/src/components/Screen/Screen.tsx +2 -1
  294. package/src/components/Section/Section.tsx +6 -5
  295. package/src/components/SegmentedControl/SegmentedControl.tsx +3 -2
  296. package/src/components/SegmentedTrack/SegmentedTrack.tsx +5 -4
  297. package/src/components/Slot/Slot.tsx +2 -1
  298. package/src/components/Spinner/Spinner.tsx +2 -1
  299. package/src/components/StatGroup/StatGroup.tsx +3 -2
  300. package/src/components/StatItem/StatItem.tsx +2 -1
  301. package/src/components/StatusHero/StatusHero.tsx +2 -1
  302. package/src/components/Stepper/Step.tsx +2 -1
  303. package/src/components/Stepper/StepLabel.tsx +2 -1
  304. package/src/components/Stepper/Stepper.tsx +2 -1
  305. package/src/components/StrengthIndicator/StrengthIndicator.tsx +2 -1
  306. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +4 -3
  307. package/src/components/SummaryTile/SummaryTile.tsx +2 -1
  308. package/src/components/SupportText/SupportText.tsx +2 -1
  309. package/src/components/SupportText/SupportTextIcon.tsx +2 -1
  310. package/src/components/SwappableAmount/SwappableAmount.tsx +2 -1
  311. package/src/components/Tabs/TabItem.tsx +2 -1
  312. package/src/components/Tabs/Tabs.tsx +2 -1
  313. package/src/components/TestimonialsCard/TestimonialsCard.tsx +163 -0
  314. package/src/components/Text/Text.tsx +2 -1
  315. package/src/components/TextInput/TextInput.tsx +3 -2
  316. package/src/components/ThreadHero/ThreadHero.tsx +2 -1
  317. package/src/components/Title/Title.tsx +2 -1
  318. package/src/components/Toast/Toast.tsx +2 -1
  319. package/src/components/Toast/ToastProvider.tsx +2 -1
  320. package/src/components/Toast/useToast.ts +3 -2
  321. package/src/components/Toggle/Toggle.tsx +2 -1
  322. package/src/components/Tooltip/Tooltip.tsx +3 -2
  323. package/src/components/TransactionBubble/TransactionBubble.tsx +2 -1
  324. package/src/components/TransactionDetails/TransactionDetails.tsx +3 -2
  325. package/src/components/TransactionStatus/TransactionStatus.tsx +3 -2
  326. package/src/components/UpiHandle/UpiHandle.tsx +3 -2
  327. package/src/components/VStack/VStack.tsx +2 -1
  328. package/src/components/docs/modeControls.tsx +122 -0
  329. package/src/components/index.ts +2 -0
  330. package/src/design-tokens/JFSThemeProvider.tsx +4 -3
  331. package/src/design-tokens/figma-modes.generated.ts +396 -0
  332. package/src/design-tokens/index.ts +1 -0
  333. package/src/icons/registry.ts +1 -1
  334. package/src/skeleton/Skeleton.tsx +2 -1
  335. package/src/utils/react-utils.ts +3 -2
@@ -8,6 +8,7 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
8
8
  * This ensures that all child components in slots receive the modes prop from the parent.
9
9
  */
10
10
  import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils'
11
+ import type { Modes } from '../../design-tokens'
11
12
 
12
13
  export interface ScreenProps {
13
14
  /**
@@ -17,7 +18,7 @@ export interface ScreenProps {
17
18
  /**
18
19
  * Modes object to override default variable values.
19
20
  */
20
- modes?: Record<string, any>;
21
+ modes?: Modes;
21
22
  /**
22
23
  * Optional style overrides for the container.
23
24
  */
@@ -15,6 +15,7 @@ import IconCapsule from '../IconCapsule/IconCapsule'
15
15
  import ListItem from '../ListItem/ListItem'
16
16
  import { usePressableWebSupport, type WebAccessibilityProps } from '../../utils/web-platform-utils'
17
17
  import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils'
18
+ import type { Modes } from '../../design-tokens'
18
19
 
19
20
  // Match Button: delay the press visual on iOS so a scroll-cancelled touch
20
21
  // never applies the "pressed" style. See Button.tsx for the rationale.
@@ -356,7 +357,7 @@ type SectionProps = {
356
357
  slot?: React.ReactNode;
357
358
  /** Layout direction of the slot's children. Defaults to 'row' (horizontal). */
358
359
  slotDirection?: 'row' | 'column';
359
- modes?: Record<string, any>;
360
+ modes?: Modes;
360
361
  onPress?: () => void;
361
362
  style?: StyleProp<ViewStyle>;
362
363
  accessibilityLabel?: string;
@@ -400,7 +401,7 @@ interface SectionTokens {
400
401
  slotGap: number;
401
402
  }
402
403
 
403
- function resolveSectionTokens(modes: Record<string, any>): SectionTokens {
404
+ function resolveSectionTokens(modes: Modes): SectionTokens {
404
405
  const backgroundColor = getVariableByName('section/background/color', modes) || '#ffffff'
405
406
  const sectionGap = (getVariableByName('section/gap', modes) || 12) as number
406
407
  const slotGap = (getVariableByName('slot/gap', modes) || 12) as number
@@ -630,7 +631,7 @@ function Section({
630
631
 
631
632
  type SectionSlotProps = {
632
633
  slot: React.ReactNode;
633
- modes: Record<string, any>;
634
+ modes: Modes;
634
635
  direction: 'row' | 'column';
635
636
  rowGap: number;
636
637
  columnGap: number;
@@ -667,7 +668,7 @@ type BentoToggleRenderState = {
667
668
  type SectionBentoProps = {
668
669
  navSlot?: React.ReactNode;
669
670
  upiSlot?: React.ReactNode;
670
- modes?: Record<string, any>;
671
+ modes?: Modes;
671
672
  style?: StyleProp<ViewStyle>;
672
673
  accessibilityLabel?: string;
673
674
  accessibilityHint?: string;
@@ -891,7 +892,7 @@ function SectionBento({
891
892
  type DefaultBentoToggleProps = {
892
893
  expanded: boolean;
893
894
  onPress: () => void;
894
- modes: Record<string, any>;
895
+ modes: Modes;
895
896
  moreLabel: string;
896
897
  lessLabel: string;
897
898
  moreIcon: string;
@@ -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 type SegmentedControlItem = {
14
15
  key: React.Key
@@ -25,7 +26,7 @@ export type SegmentedControlProps = {
25
26
  /** Callback fired when the selected segment changes */
26
27
  onSelectionChange?: (key: React.Key) => void
27
28
  /** Design token modes for theming */
28
- modes?: Record<string, any>
29
+ modes?: Modes
29
30
  /** Override container styles */
30
31
  style?: StyleProp<ViewStyle>
31
32
  }
@@ -39,7 +40,7 @@ function SegmentedControlSegment({
39
40
  label: string
40
41
  active: boolean
41
42
  onPress: () => void
42
- modes: Record<string, any>
43
+ modes: Modes
43
44
  }) {
44
45
  const resolvedModes = {
45
46
  ...modes,
@@ -7,6 +7,7 @@ import {
7
7
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
8
8
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
9
9
  import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils'
10
+ import type { Modes } from '../../design-tokens'
10
11
 
11
12
  /**
12
13
  * Per-segment data definition for the data-driven `segments` prop.
@@ -39,7 +40,7 @@ export type SegmentedTrackSegmentData = {
39
40
  * Per-segment design token mode overrides. Merged on top of the parent
40
41
  * `modes` and the per-index Emphasis defaults.
41
42
  */
42
- modes?: Record<string, any>
43
+ modes?: Modes
43
44
  /** Override individual segment styles. */
44
45
  style?: StyleProp<ViewStyle>
45
46
  /** Per-segment accessibility label. */
@@ -60,7 +61,7 @@ export type SegmentedTrackProps = {
60
61
  */
61
62
  children?: React.ReactNode
62
63
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
63
- modes?: Record<string, any>
64
+ modes?: Modes
64
65
  /** Override the container styles. */
65
66
  style?: StyleProp<ViewStyle>
66
67
  /** Style applied to every segment (data-driven mode only). */
@@ -83,7 +84,7 @@ type SegmentedTrackSegmentProps = {
83
84
  * Design token modes for the segment. Merged with parent `modes` and the
84
85
  * per-index Emphasis defaults injected by the parent `SegmentedTrack`.
85
86
  */
86
- modes?: Record<string, any> | undefined
87
+ modes?: Modes | undefined
87
88
  /** Override the segment styles. */
88
89
  style?: StyleProp<ViewStyle> | undefined
89
90
  /** Per-segment accessibility label. */
@@ -216,7 +217,7 @@ function renderSegments({
216
217
  }: {
217
218
  segments: SegmentedTrackSegmentData[] | undefined
218
219
  children: React.ReactNode | undefined
219
- modes: Record<string, any>
220
+ modes: Modes
220
221
  segmentStyle: StyleProp<ViewStyle> | undefined
221
222
  }): React.ReactNode[] {
222
223
  if (children !== undefined && children !== null) {
@@ -3,6 +3,7 @@ import { View, type StyleProp, type ViewProps, type ViewStyle } from 'react-nati
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
5
5
  import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils'
6
+ import type { Modes } from '../../design-tokens'
6
7
 
7
8
  export type SlotLayoutDirection = 'vertical' | 'horizontal'
8
9
 
@@ -30,7 +31,7 @@ export type SlotProps = ViewProps & {
30
31
  /**
31
32
  * Mode configuration passed to the token resolver and cascaded to children.
32
33
  */
33
- modes?: Record<string, any>
34
+ modes?: Modes
34
35
  style?: StyleProp<ViewStyle>
35
36
  }
36
37
 
@@ -14,6 +14,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
14
14
  import { useTokens } from '../../design-tokens/JFSThemeProvider'
15
15
  import { EMPTY_MODES } from '../../utils/react-utils'
16
16
  import { useReducedMotion } from '../../skeleton/useReducedMotion'
17
+ import type { Modes } from '../../design-tokens'
17
18
 
18
19
  /**
19
20
  * Per-segment colours, resolved from the Figma `spiner/*` tokens. Consumers can
@@ -52,7 +53,7 @@ export type SpinnerProps = SpinnerBaseProps & {
52
53
  /** When false, renders a static resting spinner (also honoured for reduced motion). Defaults to true. */
53
54
  animating?: boolean
54
55
  /** Design token modes forwarded to token lookups. */
55
- modes?: Record<string, any>
56
+ modes?: Modes
56
57
  /** Container style override. */
57
58
  style?: StyleProp<ViewStyle>
58
59
  /** Accessibility label announced to assistive tech. Defaults to "Loading". */
@@ -8,6 +8,7 @@ import {
8
8
  } from '../../utils/react-utils'
9
9
  import StatItem from '../StatItem/StatItem'
10
10
  import Divider from '../Divider/Divider'
11
+ import type { Modes } from '../../design-tokens'
11
12
 
12
13
  export type StatGroupItem = {
13
14
  /** Stable key for the item. Falls back to the label / index. */
@@ -34,7 +35,7 @@ export type StatGroupProps = {
34
35
  */
35
36
  children?: React.ReactNode
36
37
  /** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
37
- modes?: Record<string, any>
38
+ modes?: Modes
38
39
  /** Override container styles. */
39
40
  style?: StyleProp<ViewStyle>
40
41
  }
@@ -123,7 +124,7 @@ function renderSlotChildren({
123
124
  }: {
124
125
  items?: StatGroupItem[]
125
126
  children?: React.ReactNode
126
- modes: Record<string, any>
127
+ modes: Modes
127
128
  }): React.ReactNode[] {
128
129
  let nodes: React.ReactNode[]
129
130
 
@@ -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
@@ -0,0 +1,163 @@
1
+ import React from 'react'
2
+ import {
3
+ View,
4
+ Text,
5
+ type ViewStyle,
6
+ type TextStyle,
7
+ type StyleProp,
8
+ } from 'react-native'
9
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
10
+ import { EMPTY_MODES } from '../../utils/react-utils'
11
+ import Avatar, { type AvatarProps } from '../Avatar/Avatar'
12
+ import type { Modes } from '../../design-tokens'
13
+
14
+ export type TestimonialsCardProps = {
15
+ /**
16
+ * The testimonial heading, typically the author's name.
17
+ */
18
+ title?: string
19
+ /**
20
+ * The testimonial body copy.
21
+ */
22
+ body?: string
23
+ /**
24
+ * Mode configuration passed to the token resolver. Also forwarded to the
25
+ * Avatar child for consistent theming.
26
+ */
27
+ modes?: Modes
28
+ /**
29
+ * Optional style overrides for the card container.
30
+ */
31
+ style?: StyleProp<ViewStyle>
32
+ /**
33
+ * Props forwarded to the Avatar component (e.g. a custom `imageSource`).
34
+ */
35
+ avatarProps?: Partial<AvatarProps>
36
+ /**
37
+ * Accessibility label for the card region. Falls back to a label generated
38
+ * from the title and body.
39
+ */
40
+ accessibilityLabel?: string
41
+ }
42
+
43
+ /**
44
+ * TestimonialsCard renders a compact, fixed-width card with a circular avatar,
45
+ * a bold title, and a body paragraph. It is typically used inside a horizontal
46
+ * carousel of customer testimonials.
47
+ *
48
+ * All styling values are resolved from Figma design tokens using the provided
49
+ * `modes`.
50
+ *
51
+ * @example
52
+ * ```tsx
53
+ * <TestimonialsCard
54
+ * title="Aarav S."
55
+ * body="I was dreading renewing my car insurance, but JioFinance made it a breeze."
56
+ * />
57
+ * ```
58
+ */
59
+ function TestimonialsCard({
60
+ title = 'Title',
61
+ body = 'I was dreading renewing my car insurance, but JioFinance made it a breeze.',
62
+ modes = EMPTY_MODES,
63
+ style,
64
+ avatarProps,
65
+ accessibilityLabel,
66
+ }: TestimonialsCardProps) {
67
+ // Container tokens
68
+ const background = getVariableByName('testimonialsCard/background', modes) ?? '#ffffff'
69
+ const borderColor = getVariableByName('testimonialsCard/border/color', modes) ?? '#e8e8e8'
70
+ const radius = getVariableByName('testimonialsCard/radius', modes) ?? 8
71
+ const gap = getVariableByName('testimonialsCard/gap', modes) ?? 8
72
+ const paddingHorizontal = getVariableByName('testimonialsCard/padding/horizontal', modes) ?? 12
73
+ const paddingVertical = getVariableByName('testimonialsCard/padding/vertical', modes) ?? 12
74
+
75
+ // Title typography tokens
76
+ const titleColor = getVariableByName('testimonialsCard/subtitle/color', modes) ?? '#1a1c1f'
77
+ const titleFontSize = getVariableByName('testimonialsCard/title/fontSize', modes) ?? 14
78
+ const titleFontFamily = getVariableByName('testimonialsCard/title/fontFamily', modes) ?? 'JioType Var'
79
+ const titleFontWeightRaw = getVariableByName('testimonialsCard/title/fontWeight', modes) ?? 700
80
+ const titleFontWeight =
81
+ typeof titleFontWeightRaw === 'number' ? titleFontWeightRaw.toString() : titleFontWeightRaw
82
+
83
+ // Body typography tokens
84
+ const bodyColor = getVariableByName('testimonialsCard/title/color', modes) ?? '#010101'
85
+ const bodyFontSize = getVariableByName('testimonialsCard/subtitle/fontSize', modes) ?? 12
86
+ const bodyLineHeight = getVariableByName('testimonialsCard/subtitle/lineHeight', modes) ?? 16
87
+ const bodyFontFamily = getVariableByName('testimonialsCard/subtitle/fontFamily', modes) ?? 'JioType Var'
88
+ const bodyFontWeightRaw = getVariableByName('testimonialsCard/subtitle/fontWeight', modes) ?? 400
89
+ const bodyFontWeight =
90
+ typeof bodyFontWeightRaw === 'number' ? bodyFontWeightRaw.toString() : bodyFontWeightRaw
91
+
92
+ const containerStyle: ViewStyle = {
93
+ width: 180,
94
+ backgroundColor: background as string,
95
+ borderColor: borderColor as string,
96
+ borderWidth: 1,
97
+ borderRadius: radius as number,
98
+ paddingHorizontal: paddingHorizontal as number,
99
+ paddingVertical: paddingVertical as number,
100
+ alignItems: 'flex-start',
101
+ gap: gap as number,
102
+ }
103
+
104
+ const titleTextStyle: TextStyle = {
105
+ color: titleColor as string,
106
+ fontSize: titleFontSize as number,
107
+ lineHeight: bodyLineHeight as number,
108
+ fontFamily: titleFontFamily as string,
109
+ fontWeight: titleFontWeight as TextStyle['fontWeight'],
110
+ width: '100%',
111
+ }
112
+
113
+ const bodyTextStyle: TextStyle = {
114
+ color: bodyColor as string,
115
+ fontSize: bodyFontSize as number,
116
+ lineHeight: bodyLineHeight as number,
117
+ fontFamily: bodyFontFamily as string,
118
+ fontWeight: bodyFontWeight as TextStyle['fontWeight'],
119
+ width: '100%',
120
+ }
121
+
122
+ const avatarModes = {
123
+ ...modes,
124
+ ...(avatarProps?.modes || {}),
125
+ }
126
+
127
+ const resolvedAccessibilityLabel =
128
+ accessibilityLabel ?? `Testimonial${title ? ` from ${title}` : ''}${body ? `: ${body}` : ''}`
129
+
130
+ return (
131
+ <View
132
+ style={[containerStyle, style]}
133
+ accessibilityRole="text"
134
+ accessibilityLabel={resolvedAccessibilityLabel}
135
+ >
136
+ <Avatar
137
+ style="Image"
138
+ modes={avatarModes}
139
+ {...avatarProps}
140
+ />
141
+ <View style={textContainerStyle}>
142
+ {!!title && (
143
+ <Text style={titleTextStyle} accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
144
+ {title}
145
+ </Text>
146
+ )}
147
+ {!!body && (
148
+ <Text style={bodyTextStyle} accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
149
+ {body}
150
+ </Text>
151
+ )}
152
+ </View>
153
+ </View>
154
+ )
155
+ }
156
+
157
+ const textContainerStyle: ViewStyle = {
158
+ width: '100%',
159
+ alignItems: 'flex-start',
160
+ gap: 4,
161
+ }
162
+
163
+ export default React.memo(TestimonialsCard)
@@ -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. */
@@ -3,6 +3,7 @@ import { Platform, Pressable, View, TextInput as RNTextInput, type StyleProp, ty
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import Icon from '../../icons/Icon'
5
5
  import { EMPTY_MODES, cloneChildrenWithModes } 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;
@@ -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;