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
package/CHANGELOG.md CHANGED
@@ -4,6 +4,24 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [0.1.1] - 2026-06-10
8
+
9
+ - Design tokens — the `modes` prop is now strongly typed end to end. A generated `Modes` type gives autocomplete and validation for both collection-name keys and mode-name values across every component, while staying fully backward compatible (opt-in `StrictModes` turns typos into compile errors). `FIGMA_MODES`, `CollectionName`, and `ModeOf` are exported from the package.
10
+ - Storybook — components now expose per-collection mode `select` controls (auto-generated) in place of the freeform `modes` object control. Collection detection is composition-aware, so wrapper components (e.g. `Balance`, `BubbleChart`, `BrandChip`) surface the modes of the children they theme.
11
+ - `FullscreenModal` — hero media now fills the modal edge to edge: the surface width is measured and an explicit ratio-derived box is applied to the background, fixing the right-side gap / mis-sized image on native.
12
+
13
+ ---
14
+
15
+ ## [0.1.0] - 2026-06-08
16
+
17
+ - Added `TestimonialsCard` — compact avatar + title + body card for testimonial carousels.
18
+ - `Drawer` — programmatic ref API (`expand` / `collapse` / `toggle` / `getState`), controlled `state` + `onStateChange`, touch-overlay and gesture-loop fixes.
19
+ - `FullscreenModal` — safe-area-aware footer and close button; new `closeOffsetY` prop.
20
+ - `Dropdown` — `boxShadow`-based popup shadow with inner clip view (fixes clipped shadow on native).
21
+ - `Spinner` / `Skeleton` — shimmer overlay uses explicit absolute positioning instead of `absoluteFillObject`.
22
+
23
+ ---
24
+
7
25
  ## [0.0.95] - 2026-06-04
8
26
 
9
27
  - Added `Icon` — token-driven design-system icon primitive (`iconName`, `source`, `children` slot); exported from the package barrel.
@@ -99,7 +99,7 @@ const defaultFormatX = label => String(label);
99
99
  * @component
100
100
  */
101
101
  function AreaLineChart({
102
- series,
102
+ series = [],
103
103
  xLabels,
104
104
  yMin,
105
105
  yMax,
@@ -11,6 +11,13 @@ var _MoneyValue = _interopRequireDefault(require("../MoneyValue/MoneyValue"));
11
11
  var _reactUtils = require("../../utils/react-utils");
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ // The Balance design renders its money value at the 36 px / 900-weight scale.
15
+ // The `moneyValue/*` tokens alias into the `Context3` collection, where the
16
+ // `Balance & Cards` mode supplies those larger values. Applied *before* the
17
+ // caller's `modes` so any consumer can still override individual keys.
18
+ const DEFAULT_MONEY_VALUE_MODES = {
19
+ Context3: 'Balance & Cards'
20
+ };
14
21
  /**
15
22
  * Balance component that displays a title and a monetary value.
16
23
  *
@@ -34,7 +41,7 @@ function Balance({
34
41
  // Title styles
35
42
  const titleColor = (0, _figmaVariablesResolver.getVariableByName)('balance/title/foreground', modes) ?? '#0c0d10';
36
43
  const titleFontSize = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontSize', modes) ?? 14;
37
- const titleFontFamily = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontFamily', modes) ?? 'System';
44
+ const titleFontFamily = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontFamily', modes) ?? 'JioType Var';
38
45
  const titleLineHeight = (0, _figmaVariablesResolver.getVariableByName)('balance/title/lineHeight', modes) ?? 18;
39
46
  const titleFontWeightValue = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontWeight', modes) ?? 500;
40
47
  const titleFontWeight = typeof titleFontWeightValue === 'number' ? titleFontWeightValue.toString() : titleFontWeightValue;
@@ -51,15 +58,13 @@ function Balance({
51
58
  fontWeight: titleFontWeight
52
59
  };
53
60
 
54
- // Handle slot children or default content
55
- const content = _react.default.Children.map(children, child => {
56
- if (/*#__PURE__*/_react.default.isValidElement(child)) {
57
- return /*#__PURE__*/_react.default.cloneElement(child, {
58
- modes
59
- });
60
- }
61
- return child;
62
- });
61
+ // The money value renders at the Balance & Cards scale. Merge the default
62
+ // context mode first so the caller's `modes` can still override it, and
63
+ // force that context onto any slotted children so custom money values match.
64
+ const moneyValueModes = {
65
+ ...DEFAULT_MONEY_VALUE_MODES,
66
+ ...modes
67
+ };
63
68
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
64
69
  style: [containerStyle, style],
65
70
  "data-node-id": "1986:6203",
@@ -67,10 +72,10 @@ function Balance({
67
72
  style: titleStyle,
68
73
  "data-node-id": "1986:2613",
69
74
  children: title
70
- }), children ? content : /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoneyValue.default, {
75
+ }), children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, DEFAULT_MONEY_VALUE_MODES) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoneyValue.default, {
71
76
  value: amount,
72
77
  currency: currency,
73
- modes: modes
78
+ modes: moneyValueModes
74
79
  })]
75
80
  });
76
81
  }
@@ -15,7 +15,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
15
15
  * Context to share 'modes' with child components like Card.Title and Card.SupportText.
16
16
  * This ensures that nested components can resolve their tokens correctly without
17
17
  * needing explicit mode prop passing for every child.
18
- */const CardContext = /*#__PURE__*/(0, _react.createContext)({});
18
+ */
19
+ const CardContext = /*#__PURE__*/(0, _react.createContext)({});
19
20
  /**
20
21
  * Card component implementation from Figma node 765:6186.
21
22
  *
@@ -19,7 +19,8 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
19
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
20
20
  /**
21
21
  * Context to share 'modes' with child components.
22
- */const CardFeedbackContext = /*#__PURE__*/(0, _react.createContext)({});
22
+ */
23
+ const CardFeedbackContext = /*#__PURE__*/(0, _react.createContext)({});
23
24
  /**
24
25
  * CardFeedback component from Figma node 1280:4481.
25
26
  *
@@ -15,7 +15,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
15
15
  * Tracks whether the last user interaction was a keyboard event (Tab).
16
16
  * Capture-phase document listeners fire before any element-level handlers,
17
17
  * so the flag is always up-to-date when onFocus runs.
18
- */function useFocusVisible() {
18
+ */
19
+ function useFocusVisible() {
19
20
  const [isFocusVisible, setIsFocusVisible] = (0, _react.useState)(false);
20
21
  const hadKeyboardEventRef = (0, _react.useRef)(false);
21
22
  (0, _react.useEffect)(() => {
@@ -10,7 +10,9 @@ var _reactNativeGestureHandler = require("react-native-gesture-handler");
10
10
  var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
11
11
  var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
12
12
  var _reactUtils = require("../../utils/react-utils");
13
+ var _Overlay = _interopRequireDefault(require("../Overlay/Overlay"));
13
14
  var _jsxRuntime = require("react/jsx-runtime");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
16
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
17
  const AnimatedScrollView = _reactNativeReanimated.default.createAnimatedComponent(_reactNativeGestureHandler.ScrollView);
16
18
 
@@ -72,7 +74,9 @@ function DrawerInner({
72
74
  contentContainerStyle,
73
75
  showsVerticalScrollIndicator = false,
74
76
  bottomInset = 80,
75
- onStateChange
77
+ onStateChange,
78
+ showOverlay = false,
79
+ onOverlayPress
76
80
  }, ref) {
77
81
  const {
78
82
  height: screenHeight
@@ -370,10 +374,15 @@ function DrawerInner({
370
374
  // Per the standard react-native-gesture-handler architecture, a single
371
375
  // GestureHandlerRootView must wrap the app root; this overlay only needs to
372
376
  // let touches fall through where the sheet isn't.
373
- (0, _jsxRuntime.jsx)(_reactNative.View, {
377
+ (0, _jsxRuntime.jsxs)(_reactNative.View, {
374
378
  style: [styles.host, style],
375
379
  pointerEvents: "box-none",
376
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
380
+ children: [showOverlay ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Overlay.default, {
381
+ modes: modes,
382
+ ...(onOverlayPress ? {
383
+ onPress: onOverlayPress
384
+ } : {})
385
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
377
386
  gesture: gesture,
378
387
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
379
388
  style: [styles.sheet, {
@@ -446,7 +455,7 @@ function DrawerInner({
446
455
  })]
447
456
  })
448
457
  })
449
- })
458
+ })]
450
459
  })
451
460
  );
452
461
  }
@@ -178,18 +178,34 @@ function Dropdown({
178
178
  const shadowOffsetX = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/offsetX', modes), 10) || 0;
179
179
  const shadowOffsetY = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/offsetY', modes), 10) || 4;
180
180
  const shadowBlur = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/blur', modes), 10) || 16;
181
- const containerStyle = {
181
+
182
+ // Shadow lives on the OUTER view, which must NOT set `overflow: 'hidden'`.
183
+ // On native, clipping a view also clips its shadow (iOS clips the layer
184
+ // shadow; Android clips the elevation shadow), so the soft popup shadow
185
+ // that renders fine on web (CSS box-shadow paints outside the box) would
186
+ // get cut off. The rounded-corner clipping is moved to a separate inner
187
+ // view below.
188
+ //
189
+ // The `boxShadow` style prop (RN 0.76+ / react-native-web) is used as the
190
+ // single source of truth so the designed color/offset/blur are honored on
191
+ // iOS, Android AND web. We intentionally do NOT also set the legacy
192
+ // `shadow*` / `elevation` props: on the new architecture (and web) those
193
+ // are translated into a box-shadow internally, so combining them with an
194
+ // explicit `boxShadow` would stack two shadows. Android's legacy
195
+ // `elevation` is also undesirable here because it ignores the shadow color
196
+ // and only paints a generic gray shadow.
197
+ const shadowStyle = {
182
198
  backgroundColor: background,
199
+ borderRadius: radius,
200
+ boxShadow: `${shadowOffsetX}px ${shadowOffsetY}px ${shadowBlur}px 0px ${shadowColor}`
201
+ };
202
+
203
+ // Inner view carries the rounded corners + clipping so list/scroll content
204
+ // stays inside the radius without affecting the outer view's shadow.
205
+ const clipStyle = {
183
206
  borderRadius: radius,
184
207
  overflow: 'hidden',
185
- shadowColor,
186
- shadowOffset: {
187
- width: shadowOffsetX,
188
- height: shadowOffsetY
189
- },
190
- shadowOpacity: 1,
191
- shadowRadius: shadowBlur / 2,
192
- elevation: 4
208
+ backgroundColor: background
193
209
  };
194
210
  const content = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
195
211
  style: {
@@ -198,17 +214,20 @@ function Dropdown({
198
214
  children: (0, _reactUtils.cloneChildrenWithModes)(children, modes)
199
215
  });
200
216
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
201
- style: [containerStyle, style],
217
+ style: [shadowStyle, style],
202
218
  accessibilityRole: "menu",
203
219
  accessibilityLabel: accessibilityLabel || 'Dropdown menu',
204
- children: maxHeight != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
205
- style: {
206
- maxHeight
207
- },
208
- showsVerticalScrollIndicator: true,
209
- keyboardShouldPersistTaps: "handled",
210
- children: content
211
- }) : content
220
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
221
+ style: clipStyle,
222
+ children: maxHeight != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
223
+ style: {
224
+ maxHeight
225
+ },
226
+ showsVerticalScrollIndicator: true,
227
+ keyboardShouldPersistTaps: "handled",
228
+ children: content
229
+ }) : content
230
+ })
212
231
  });
213
232
  }
214
233
  var _default = exports.default = Dropdown;
@@ -537,7 +537,7 @@ function DropdownInput({
537
537
  transparent: true,
538
538
  statusBarTranslucent: true,
539
539
  navigationBarTranslucent: true,
540
- animationType: "fade",
540
+ animationType: "none",
541
541
  onRequestClose: closeMenu,
542
542
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
543
543
  style: _reactNative.StyleSheet.absoluteFill,
@@ -189,6 +189,7 @@ function FullscreenModal({
189
189
  heroMedia,
190
190
  heroHeight = 420,
191
191
  showClose = true,
192
+ closeOffsetY = 0,
192
193
  onClose,
193
194
  closeAccessibilityLabel = 'Close',
194
195
  footer,
@@ -225,8 +226,8 @@ function FullscreenModal({
225
226
  // SafeAreaProvider — every inset is 0, so the layout is unchanged.
226
227
  const insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
227
228
  const closeButtonInsetStyle = (0, _react.useMemo)(() => ({
228
- top: 12 + insets.top
229
- }), [insets.top]);
229
+ top: 12 + insets.top + closeOffsetY
230
+ }), [insets.top, closeOffsetY]);
230
231
  // Extend (not replace) the footer's token bottom padding by the bottom inset
231
232
  // so the action button never sits under the system navigation area.
232
233
  const footerInsetStyle = (0, _react.useMemo)(() => {
@@ -252,7 +253,57 @@ function FullscreenModal({
252
253
  useNativeDriver: true
253
254
  }), [scrollY]);
254
255
  const heroTranslateY = (0, _react.useMemo)(() => _reactNative.Animated.multiply(scrollY, -1), [scrollY]);
255
- const processedHeroMedia = (0, _react.useMemo)(() => heroMedia ? (0, _reactUtils.cloneChildrenWithModes)(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [heroMedia, modes]);
256
+
257
+ // The hero media is a full-bleed background pinned to the top of the modal.
258
+ // Its wrapper is absolutely positioned (`top/left/right: 0`) so it never
259
+ // contributes to scroll height. We measure the modal's own width so we can
260
+ // give the hero media a DEFINITE { width, height } box (see
261
+ // `processedHeroMedia` below) — relying on the media's own `width: '100%'` +
262
+ // `aspectRatio` is unreliable inside an indefinite-height absolute box (RN's
263
+ // `<Image>` falls back to its intrinsic width and leaves a gap), so we size
264
+ // it explicitly here instead.
265
+ const [containerWidth, setContainerWidth] = (0, _react.useState)(0);
266
+ const onContainerLayout = (0, _react.useCallback)(e => {
267
+ const w = e.nativeEvent.layout.width;
268
+ setContainerWidth(prev => prev !== w ? w : prev);
269
+ }, []);
270
+ const processedHeroMedia = (0, _react.useMemo)(() => {
271
+ if (!heroMedia) return null;
272
+ // Defer rendering the hero until we have measured the modal width. This
273
+ // matters for image sharpness: React Native decodes a bitmap once, on the
274
+ // first render, and caches it. If we rendered the media before knowing the
275
+ // final box, that first decode would be sized/sampled for the wrong box and
276
+ // the cached (downsampled) bitmap would then just be scaled up — blurry.
277
+ // Rendering only once the explicit { width, height } box is known means the
278
+ // very first decode is already full-resolution for the correct box.
279
+ if (containerWidth <= 0) return null;
280
+ const withModes = (0, _reactUtils.cloneChildrenWithModes)(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES);
281
+
282
+ // Force the hero to fill the modal width edge to edge, top-aligned, with the
283
+ // height derived from the media's native aspect ratio.
284
+ //
285
+ // Why we inject explicit width/height instead of relying on the media's own
286
+ // `width: '100%'` + `aspectRatio`: the hero wrapper is absolutely positioned
287
+ // with an INDEFINITE height, and in that layout context React Native's
288
+ // `<Image>` falls back to its INTRINSIC width (so a 361px-wide asset renders
289
+ // 361px wide and leaves a gap on the right) rather than stretching to the
290
+ // parent. By computing `height = containerWidth / ratio` here and passing a
291
+ // DEFINITE { width, height } box (which makes `<Image>` skip aspectRatio and
292
+ // cover-fit into that exact box), the hero always fills the width with the
293
+ // correct ratio-derived height.
294
+ return _react.default.Children.map(withModes, child => {
295
+ if (! /*#__PURE__*/_react.default.isValidElement(child)) return child;
296
+ const props = child.props;
297
+ const ratio = typeof props.ratio === 'number' && props.ratio > 0 ? props.ratio : undefined;
298
+ // Only size media that exposes a numeric `ratio` and hasn't already been
299
+ // given an explicit box by the caller.
300
+ if (ratio == null || props.width != null || props.height != null) return child;
301
+ return /*#__PURE__*/_react.default.cloneElement(child, {
302
+ width: containerWidth,
303
+ height: containerWidth / ratio
304
+ });
305
+ });
306
+ }, [heroMedia, modes, containerWidth]);
256
307
  const processedChildren = (0, _react.useMemo)(() => children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
257
308
 
258
309
  // The hero text region always reserves `heroHeight` and anchors its content
@@ -305,8 +356,18 @@ function FullscreenModal({
305
356
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
306
357
  style: [rootStyle, style],
307
358
  testID: testID,
359
+ onLayout: onContainerLayout,
308
360
  children: [processedHeroMedia ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
309
- style: [heroBackgroundStyle, {
361
+ style: [heroBackgroundStyle,
362
+ // Give the absolute wrapper a DEFINITE width (the measured modal
363
+ // width) so the media's `width: '100%'` + `aspectRatio` resolves to
364
+ // a true edge-to-edge fill with a ratio-derived height, top-aligned.
365
+ // Before the first layout pass `containerWidth` is 0 — fall back to
366
+ // stretching via `left/right: 0` so there is no flash of a mis-sized
367
+ // image.
368
+ containerWidth > 0 ? {
369
+ width: containerWidth
370
+ } : null, {
310
371
  transform: [{
311
372
  translateY: heroTranslateY
312
373
  }]
@@ -43,6 +43,7 @@ function Image({
43
43
  imageSource,
44
44
  ratio = DEFAULT_RATIO,
45
45
  resizeMode = 'cover',
46
+ resizeMethod,
46
47
  width,
47
48
  height,
48
49
  borderRadius,
@@ -53,11 +54,15 @@ function Image({
53
54
  loading
54
55
  }) {
55
56
  const source = (0, _react.useMemo)(() => normalizeSource(imageSource), [imageSource]);
57
+
58
+ // Explicit { width, height } means a "fill an exact box" layout — typically a
59
+ // full-bleed hero/background where the asset is high-res and sharpness
60
+ // matters most. There, default to `'none'` (full-resolution, no pre-decode
61
+ // downsample) so detail is never thrown away. Aspect-ratio images keep the
62
+ // memory-safe `'scale'` default. A caller-supplied `resizeMethod` always wins.
63
+ const isExplicitBox = width != null && height != null;
64
+ const effectiveResizeMethod = resizeMethod ?? (isExplicitBox ? 'none' : 'scale');
56
65
  const layoutStyle = (0, _react.useMemo)(() => {
57
- // If the caller has fully specified width AND height, they're doing a
58
- // non-aspect layout (e.g. "fill the parent") — respect that and skip
59
- // `aspectRatio` so it doesn't conflict.
60
- const isExplicitBox = width != null && height != null;
61
66
  const s = {
62
67
  width: width ?? '100%',
63
68
  ...(isExplicitBox ? {
@@ -71,7 +76,7 @@ function Image({
71
76
  };
72
77
  if (borderRadius != null) s.borderRadius = borderRadius;
73
78
  return s;
74
- }, [ratio, width, height, borderRadius]);
79
+ }, [ratio, width, height, borderRadius, isExplicitBox]);
75
80
  const {
76
81
  active: groupActive
77
82
  } = (0, _SkeletonGroup.useSkeleton)();
@@ -102,6 +107,7 @@ function Image({
102
107
  source: source,
103
108
  style: [layoutStyle, style],
104
109
  resizeMode: resizeMode,
110
+ resizeMethod: effectiveResizeMethod,
105
111
  accessibilityLabel: accessibilityLabel,
106
112
  accessibilityElementsHidden: accessibilityElementsHidden,
107
113
  importantForAccessibility: importantForAccessibility
@@ -11,17 +11,6 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
11
11
  /** Props we forward to the underlying native Lottie view. */
12
12
 
13
13
  const INSTALL_HINT = 'LottiePlayer requires lottie-react-native in your app.\n' + ' npm install lottie-react-native\n' + ' cd ios && pod install';
14
-
15
- /**
16
- * Metro resolves `require('lottie-react-native')` at bundle time even inside
17
- * try/catch, which breaks apps that import `jfs-components` without having
18
- * the optional peer installed. Splitting the module id into a runtime string
19
- * keeps Metro from statically linking it — the native module is loaded only
20
- * when present in the consumer's node_modules.
21
- */
22
- function resolveNativeLottieModuleName() {
23
- return ['lottie', '-react', '-native'].join('');
24
- }
25
14
  function LottieUnavailableView({
26
15
  style
27
16
  }) {
@@ -65,8 +54,14 @@ let cachedView;
65
54
  function getNativeLottieView() {
66
55
  if (cachedView !== undefined) return cachedView;
67
56
  try {
68
- const mod = require(resolveNativeLottieModuleName());
69
- cachedView = mod.default ?? LottieUnavailable;
57
+ // Static require so Metro resolves the module by its build-time numeric id.
58
+ // A runtime-constructed string path is NOT resolvable by Metro's `require`
59
+ // (it indexes modules by number, not path), so it would always throw and
60
+ // fall back to the install hint even when the package is installed. The
61
+ // dependency stays an *optional* peer: apps that use LottiePlayer install
62
+ // it; apps that don't simply never import this module.
63
+ const mod = require('lottie-react-native');
64
+ cachedView = mod.default ?? mod.LottieView ?? LottieUnavailable;
70
65
  } catch {
71
66
  cachedView = LottieUnavailable;
72
67
  }
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
10
+ var _JFSThemeProvider = require("../../design-tokens/JFSThemeProvider");
11
+ var _reactUtils = require("../../utils/react-utils");
12
+ var _jsxRuntime = require("react/jsx-runtime");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ const PLACEMENT_STYLE = {
15
+ center: {
16
+ justifyContent: 'center',
17
+ alignItems: 'center'
18
+ },
19
+ top: {
20
+ justifyContent: 'flex-start',
21
+ alignItems: 'stretch'
22
+ },
23
+ bottom: {
24
+ justifyContent: 'flex-end',
25
+ alignItems: 'stretch'
26
+ },
27
+ stretch: {
28
+ justifyContent: 'center',
29
+ alignItems: 'stretch'
30
+ }
31
+ };
32
+
33
+ /**
34
+ * Overlay — a token-driven scrim that dims content behind an overlaid surface.
35
+ *
36
+ * Renders a semi-transparent backdrop using the `overlay/background` design
37
+ * token and optionally hosts content (e.g. a modal, sheet or dialog) on top.
38
+ * Pair it with a `Modal` for true full-screen overlays, or drop it inside any
39
+ * relatively-positioned container to dim just that region.
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * <Overlay modes={modes} onPress={close}>
44
+ * <Card>Dialog content</Card>
45
+ * </Overlay>
46
+ * ```
47
+ */
48
+ function Overlay({
49
+ children,
50
+ contentPlacement = 'center',
51
+ onPress,
52
+ fill = true,
53
+ modes: propModes = _reactUtils.EMPTY_MODES,
54
+ style,
55
+ ...rest
56
+ }) {
57
+ const {
58
+ modes: globalModes
59
+ } = (0, _JFSThemeProvider.useTokens)();
60
+ const modes = (0, _react.useMemo)(() => ({
61
+ ...globalModes,
62
+ ...propModes
63
+ }), [globalModes, propModes]);
64
+ const {
65
+ containerStyle,
66
+ processedChildren
67
+ } = (0, _react.useMemo)(() => {
68
+ const backgroundColor = (0, _figmaVariablesResolver.getVariableByName)('overlay/background', modes) ?? 'rgba(0, 0, 0, 0.7)';
69
+ const container = {
70
+ backgroundColor,
71
+ overflow: 'hidden',
72
+ ...PLACEMENT_STYLE[contentPlacement]
73
+ };
74
+ const processed = children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes) : null;
75
+ return {
76
+ containerStyle: container,
77
+ processedChildren: processed
78
+ };
79
+ }, [children, modes, contentPlacement]);
80
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
81
+ style: [fill && _reactNative.StyleSheet.absoluteFill, containerStyle, style],
82
+ accessibilityViewIsModal: true,
83
+ ...rest,
84
+ children: [onPress ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
85
+ style: _reactNative.StyleSheet.absoluteFill,
86
+ onPress: onPress,
87
+ accessibilityRole: "button",
88
+ accessibilityLabel: "Dismiss overlay"
89
+ }) : null, processedChildren]
90
+ });
91
+ }
92
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(Overlay);
@@ -11,7 +11,8 @@ var _reactUtils = require("../../utils/react-utils");
11
11
  var _Icon = _interopRequireDefault(require("../../icons/Icon"));
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- /** Figma grid: label column 1.8fr, each plan column 1fr. */const LABEL_COLUMN_FR = 1.8;
14
+ /** Figma grid: label column 1.8fr, each plan column 1fr. */
15
+ const LABEL_COLUMN_FR = 1.8;
15
16
  const PLAN_COLUMN_FR = 1;
16
17
 
17
18
  /**