jfs-components 0.1.0 → 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 (331) hide show
  1. package/CHANGELOG.md +8 -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/DropdownInput/DropdownInput.js +1 -1
  9. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +62 -2
  10. package/lib/commonjs/components/Image/Image.js +11 -5
  11. package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
  12. package/lib/commonjs/components/Overlay/Overlay.js +92 -0
  13. package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
  14. package/lib/commonjs/components/TextInput/TextInput.js +2 -1
  15. package/lib/commonjs/components/docs/modeControls.js +116 -0
  16. package/lib/commonjs/components/index.js +7 -0
  17. package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
  18. package/lib/commonjs/design-tokens/figma-modes.generated.js +391 -0
  19. package/lib/commonjs/design-tokens/index.js +11 -0
  20. package/lib/commonjs/icons/registry.js +1 -1
  21. package/lib/module/components/Accordion/Accordion.js +1 -2
  22. package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
  23. package/lib/module/components/Balance/Balance.js +18 -13
  24. package/lib/module/components/Card/Card.js +1 -2
  25. package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
  26. package/lib/module/components/Checkbox/Checkbox.js +1 -2
  27. package/lib/module/components/Drawer/Drawer.js +12 -4
  28. package/lib/module/components/DropdownInput/DropdownInput.js +1 -1
  29. package/lib/module/components/FullscreenModal/FullscreenModal.js +64 -5
  30. package/lib/module/components/Image/Image.js +11 -5
  31. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +1 -2
  32. package/lib/module/components/LottiePlayer/loadNativeLottieView.js +8 -13
  33. package/lib/module/components/MoneyValue/MoneyValue.js +1 -2
  34. package/lib/module/components/OTP/OTP.js +1 -2
  35. package/lib/module/components/Overlay/Overlay.js +87 -0
  36. package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
  37. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
  38. package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
  39. package/lib/module/components/Section/Section.js +1 -2
  40. package/lib/module/components/TextInput/TextInput.js +1 -2
  41. package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
  42. package/lib/module/components/docs/modeControls.js +111 -0
  43. package/lib/module/components/index.js +1 -0
  44. package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
  45. package/lib/module/design-tokens/figma-modes.generated.js +387 -0
  46. package/lib/module/design-tokens/index.js +2 -1
  47. package/lib/module/icons/registry.js +1 -1
  48. package/lib/module/utils/react-utils.js +0 -1
  49. package/lib/typescript/scripts/extract-component-tokens.d.ts +1 -1
  50. package/lib/typescript/scripts/generate-mode-types.d.ts +2 -0
  51. package/lib/typescript/scripts/retype-modes.d.cts +2 -0
  52. package/lib/typescript/src/components/Accordion/Accordion.d.ts +2 -1
  53. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +2 -1
  54. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +2 -1
  55. package/lib/typescript/src/components/ActionFooter/ActionFooter.d.ts +2 -1
  56. package/lib/typescript/src/components/ActionTile/ActionTile.d.ts +2 -1
  57. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +2 -1
  58. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +2 -1
  59. package/lib/typescript/src/components/AppBar/AppBar.d.ts +2 -1
  60. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +3 -2
  61. package/lib/typescript/src/components/Attached/Attached.d.ts +2 -1
  62. package/lib/typescript/src/components/Avatar/Avatar.d.ts +2 -1
  63. package/lib/typescript/src/components/AvatarGroup/AvatarGroup.d.ts +2 -1
  64. package/lib/typescript/src/components/Badge/Badge.d.ts +2 -1
  65. package/lib/typescript/src/components/Balance/Balance.d.ts +2 -1
  66. package/lib/typescript/src/components/BottomNav/BottomNav.d.ts +2 -1
  67. package/lib/typescript/src/components/BottomNavItem/BottomNavItem.d.ts +2 -1
  68. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +2 -1
  69. package/lib/typescript/src/components/BubbleChart/BubbleChart.d.ts +2 -1
  70. package/lib/typescript/src/components/Button/Button.d.ts +2 -1
  71. package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +2 -1
  72. package/lib/typescript/src/components/Card/Card.d.ts +3 -2
  73. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +2 -1
  74. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +2 -1
  75. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +2 -1
  76. package/lib/typescript/src/components/CardFeedback/CardFeedback.d.ts +7 -6
  77. package/lib/typescript/src/components/CardFinancialCondition/CardFinancialCondition.d.ts +2 -1
  78. package/lib/typescript/src/components/CardInsight/CardInsight.d.ts +2 -1
  79. package/lib/typescript/src/components/CardProviderInfo/CardProviderInfo.d.ts +2 -1
  80. package/lib/typescript/src/components/Carousel/Carousel.d.ts +4 -3
  81. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +2 -1
  82. package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
  83. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -1
  84. package/lib/typescript/src/components/ChipGroup/ChipGroup.d.ts +2 -1
  85. package/lib/typescript/src/components/ChipSelect/ChipSelect.d.ts +2 -1
  86. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +2 -1
  87. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +2 -1
  88. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +2 -1
  89. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +2 -1
  90. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +3 -2
  91. package/lib/typescript/src/components/CoverageRing/CoverageRing.d.ts +2 -1
  92. package/lib/typescript/src/components/DebitCard/DebitCard.d.ts +2 -1
  93. package/lib/typescript/src/components/Disclaimer/Disclaimer.d.ts +2 -1
  94. package/lib/typescript/src/components/Divider/Divider.d.ts +2 -1
  95. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +4 -3
  96. package/lib/typescript/src/components/DonutChartSummary/DonutChartSummary.d.ts +3 -2
  97. package/lib/typescript/src/components/Drawer/Drawer.d.ts +15 -1
  98. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +3 -2
  99. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +2 -1
  100. package/lib/typescript/src/components/EmptyState/EmptyState.d.ts +2 -1
  101. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +2 -1
  102. package/lib/typescript/src/components/FilterBar/FilterBar.d.ts +3 -2
  103. package/lib/typescript/src/components/Form/Form.d.ts +2 -1
  104. package/lib/typescript/src/components/FormField/FormField.d.ts +2 -1
  105. package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +2 -1
  106. package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
  107. package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
  108. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
  109. package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
  110. package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
  111. package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
  112. package/lib/typescript/src/components/Image/Image.d.ts +17 -1
  113. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +2 -1
  114. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +2 -1
  115. package/lib/typescript/src/components/LazyList/LazyList.d.ts +2 -1
  116. package/lib/typescript/src/components/LinearMeter/LinearMeter.d.ts +3 -2
  117. package/lib/typescript/src/components/LinearProgress/LinearProgress.d.ts +2 -1
  118. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +2 -1
  119. package/lib/typescript/src/components/ListItem/ListItem.d.ts +2 -1
  120. package/lib/typescript/src/components/LottieIntroBlock/LottieIntroBlock.d.ts +2 -1
  121. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.d.ts +2 -1
  122. package/lib/typescript/src/components/LottiePlayer/LottiePlayer.web.d.ts +2 -1
  123. package/lib/typescript/src/components/MediaCard/MediaCard.d.ts +6 -5
  124. package/lib/typescript/src/components/MerchantProfile/MerchantProfile.d.ts +2 -1
  125. package/lib/typescript/src/components/MessageField/MessageField.d.ts +2 -1
  126. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +2 -1
  127. package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +2 -1
  128. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +4 -3
  129. package/lib/typescript/src/components/NavArrow/NavArrow.d.ts +2 -1
  130. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +2 -1
  131. package/lib/typescript/src/components/Nudge/Nudge.d.ts +2 -1
  132. package/lib/typescript/src/components/Numpad/Numpad.d.ts +2 -1
  133. package/lib/typescript/src/components/OTP/OTP.d.ts +3 -2
  134. package/lib/typescript/src/components/Overlay/Overlay.d.ts +52 -0
  135. package/lib/typescript/src/components/PageHero/PageHero.d.ts +2 -1
  136. package/lib/typescript/src/components/PaymentFeedback/PaymentFeedback.d.ts +2 -1
  137. package/lib/typescript/src/components/PlanComparisonCard/PlanComparisonCard.d.ts +2 -1
  138. package/lib/typescript/src/components/Popup/Popup.d.ts +2 -1
  139. package/lib/typescript/src/components/PortfolioHero/PortfolioHero.d.ts +2 -1
  140. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +2 -1
  141. package/lib/typescript/src/components/ProductLabel/ProductLabel.d.ts +2 -1
  142. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +2 -1
  143. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
  144. package/lib/typescript/src/components/Radio/Radio.d.ts +2 -1
  145. package/lib/typescript/src/components/RangeTrack/RangeTrack.d.ts +3 -2
  146. package/lib/typescript/src/components/RechargeCard/RechargeCard.d.ts +2 -1
  147. package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +2 -1
  148. package/lib/typescript/src/components/Screen/Screen.d.ts +2 -1
  149. package/lib/typescript/src/components/Section/Section.d.ts +3 -2
  150. package/lib/typescript/src/components/SegmentedControl/SegmentedControl.d.ts +2 -1
  151. package/lib/typescript/src/components/SegmentedTrack/SegmentedTrack.d.ts +4 -3
  152. package/lib/typescript/src/components/Slot/Slot.d.ts +2 -1
  153. package/lib/typescript/src/components/Spinner/Spinner.d.ts +2 -1
  154. package/lib/typescript/src/components/StatGroup/StatGroup.d.ts +2 -1
  155. package/lib/typescript/src/components/StatItem/StatItem.d.ts +2 -1
  156. package/lib/typescript/src/components/StatusHero/StatusHero.d.ts +2 -1
  157. package/lib/typescript/src/components/Stepper/Step.d.ts +2 -1
  158. package/lib/typescript/src/components/Stepper/StepLabel.d.ts +2 -1
  159. package/lib/typescript/src/components/Stepper/Stepper.d.ts +2 -1
  160. package/lib/typescript/src/components/StrengthIndicator/StrengthIndicator.d.ts +2 -1
  161. package/lib/typescript/src/components/SuggestiveSearch/SuggestiveSearch.d.ts +2 -1
  162. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +2 -1
  163. package/lib/typescript/src/components/SupportText/SupportText.d.ts +2 -1
  164. package/lib/typescript/src/components/SupportText/SupportTextIcon.d.ts +2 -1
  165. package/lib/typescript/src/components/SwappableAmount/SwappableAmount.d.ts +2 -1
  166. package/lib/typescript/src/components/Tabs/TabItem.d.ts +2 -1
  167. package/lib/typescript/src/components/Tabs/Tabs.d.ts +2 -1
  168. package/lib/typescript/src/components/TestimonialsCard/TestimonialsCard.d.ts +2 -1
  169. package/lib/typescript/src/components/Text/Text.d.ts +2 -1
  170. package/lib/typescript/src/components/TextInput/TextInput.d.ts +3 -2
  171. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +2 -1
  172. package/lib/typescript/src/components/Title/Title.d.ts +2 -1
  173. package/lib/typescript/src/components/Toast/Toast.d.ts +2 -1
  174. package/lib/typescript/src/components/Toast/ToastProvider.d.ts +2 -1
  175. package/lib/typescript/src/components/Toast/useToast.d.ts +3 -2
  176. package/lib/typescript/src/components/Toggle/Toggle.d.ts +2 -1
  177. package/lib/typescript/src/components/Tooltip/Tooltip.d.ts +2 -1
  178. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +2 -1
  179. package/lib/typescript/src/components/TransactionDetails/TransactionDetails.d.ts +3 -2
  180. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +2 -1
  181. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +2 -1
  182. package/lib/typescript/src/components/VStack/VStack.d.ts +2 -1
  183. package/lib/typescript/src/components/docs/modeControls.d.ts +28 -0
  184. package/lib/typescript/src/components/index.d.ts +1 -0
  185. package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
  186. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +264 -0
  187. package/lib/typescript/src/design-tokens/index.d.ts +1 -0
  188. package/lib/typescript/src/icons/registry.d.ts +1 -1
  189. package/lib/typescript/src/skeleton/Skeleton.d.ts +2 -1
  190. package/lib/typescript/src/utils/react-utils.d.ts +2 -1
  191. package/package.json +3 -2
  192. package/src/components/Accordion/Accordion.tsx +2 -1
  193. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +2 -1
  194. package/src/components/AccountCard/AccountCard.tsx +2 -1
  195. package/src/components/ActionFooter/ActionFooter.tsx +2 -1
  196. package/src/components/ActionTile/ActionTile.tsx +2 -1
  197. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +2 -1
  198. package/src/components/AmountInput/AmountInput.tsx +2 -1
  199. package/src/components/AppBar/AppBar.tsx +2 -1
  200. package/src/components/AreaLineChart/AreaLineChart.tsx +8 -7
  201. package/src/components/Attached/Attached.tsx +2 -1
  202. package/src/components/Avatar/Avatar.tsx +3 -2
  203. package/src/components/AvatarGroup/AvatarGroup.tsx +2 -1
  204. package/src/components/Badge/Badge.tsx +2 -1
  205. package/src/components/Balance/Balance.tsx +18 -12
  206. package/src/components/BottomNav/BottomNav.tsx +2 -1
  207. package/src/components/BottomNavItem/BottomNavItem.tsx +3 -2
  208. package/src/components/BrandChip/BrandChip.tsx +3 -2
  209. package/src/components/BubbleChart/BubbleChart.tsx +2 -1
  210. package/src/components/Button/Button.tsx +3 -2
  211. package/src/components/ButtonGroup/ButtonGroup.tsx +2 -1
  212. package/src/components/Card/Card.tsx +4 -3
  213. package/src/components/CardAdvisory/CardAdvisory.tsx +3 -2
  214. package/src/components/CardBankAccount/CardBankAccount.tsx +2 -1
  215. package/src/components/CardCTA/CardCTA.tsx +3 -2
  216. package/src/components/CardFeedback/CardFeedback.tsx +11 -10
  217. package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +3 -2
  218. package/src/components/CardInsight/CardInsight.tsx +2 -1
  219. package/src/components/CardProviderInfo/CardProviderInfo.tsx +2 -1
  220. package/src/components/Carousel/Carousel.tsx +5 -4
  221. package/src/components/Checkbox/Checkbox.tsx +2 -1
  222. package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
  223. package/src/components/CheckboxItem/CheckboxItem.tsx +2 -1
  224. package/src/components/ChipGroup/ChipGroup.tsx +2 -1
  225. package/src/components/ChipSelect/ChipSelect.tsx +2 -1
  226. package/src/components/CircularProgressBar/CircularProgressBar.tsx +2 -1
  227. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +2 -1
  228. package/src/components/CircularRating/CircularRating.tsx +3 -2
  229. package/src/components/ClusterBubble/ClusterBubble.tsx +2 -1
  230. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +3 -2
  231. package/src/components/CoverageRing/CoverageRing.tsx +2 -1
  232. package/src/components/DebitCard/DebitCard.tsx +2 -1
  233. package/src/components/Disclaimer/Disclaimer.tsx +2 -1
  234. package/src/components/Divider/Divider.tsx +2 -1
  235. package/src/components/DonutChart/DonutChart.tsx +6 -5
  236. package/src/components/DonutChartSummary/DonutChartSummary.tsx +3 -2
  237. package/src/components/Drawer/Drawer.tsx +21 -1
  238. package/src/components/Dropdown/Dropdown.tsx +4 -3
  239. package/src/components/DropdownInput/DropdownInput.tsx +5 -4
  240. package/src/components/EmptyState/EmptyState.tsx +2 -1
  241. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +2 -1
  242. package/src/components/FilterBar/FilterBar.tsx +3 -2
  243. package/src/components/Form/Form.tsx +2 -1
  244. package/src/components/FormField/FormField.tsx +3 -2
  245. package/src/components/FullscreenModal/FullscreenModal.tsx +68 -10
  246. package/src/components/Gauge/Gauge.tsx +2 -1
  247. package/src/components/HStack/HStack.tsx +2 -1
  248. package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
  249. package/src/components/Icon/Icon.tsx +3 -2
  250. package/src/components/IconButton/IconButton.tsx +3 -2
  251. package/src/components/IconCapsule/IconCapsule.tsx +3 -2
  252. package/src/components/Image/Image.tsx +29 -5
  253. package/src/components/InputSearch/InputSearch.tsx +3 -2
  254. package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -2
  255. package/src/components/LazyList/LazyList.tsx +2 -1
  256. package/src/components/LinearMeter/LinearMeter.tsx +3 -2
  257. package/src/components/LinearProgress/LinearProgress.tsx +2 -1
  258. package/src/components/ListGroup/ListGroup.tsx +2 -1
  259. package/src/components/ListItem/ListItem.tsx +3 -2
  260. package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +2 -1
  261. package/src/components/LottiePlayer/LottiePlayer.tsx +3 -2
  262. package/src/components/LottiePlayer/LottiePlayer.web.tsx +3 -2
  263. package/src/components/LottiePlayer/loadNativeLottieView.tsx +9 -13
  264. package/src/components/MediaCard/MediaCard.tsx +7 -6
  265. package/src/components/MerchantProfile/MerchantProfile.tsx +2 -1
  266. package/src/components/MessageField/MessageField.tsx +3 -2
  267. package/src/components/MetricLegendItem/MetricLegendItem.tsx +2 -1
  268. package/src/components/MoneyValue/MoneyValue.tsx +2 -1
  269. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +5 -4
  270. package/src/components/NavArrow/NavArrow.tsx +3 -2
  271. package/src/components/NoteInput/NoteInput.tsx +2 -1
  272. package/src/components/Nudge/Nudge.tsx +3 -2
  273. package/src/components/Numpad/Numpad.tsx +2 -1
  274. package/src/components/OTP/OTP.tsx +3 -2
  275. package/src/components/Overlay/Overlay.tsx +114 -0
  276. package/src/components/PageHero/PageHero.tsx +2 -1
  277. package/src/components/PaymentFeedback/PaymentFeedback.tsx +2 -1
  278. package/src/components/PlanComparisonCard/PlanComparisonCard.tsx +2 -1
  279. package/src/components/Popup/Popup.tsx +2 -1
  280. package/src/components/PortfolioHero/PortfolioHero.tsx +2 -1
  281. package/src/components/PoweredByLabel/PoweredByLabel.tsx +2 -1
  282. package/src/components/ProductLabel/ProductLabel.tsx +2 -1
  283. package/src/components/ProductOverview/ProductOverview.tsx +2 -1
  284. package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
  285. package/src/components/Radio/Radio.tsx +2 -1
  286. package/src/components/RangeTrack/RangeTrack.tsx +3 -2
  287. package/src/components/RechargeCard/RechargeCard.tsx +2 -1
  288. package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +2 -1
  289. package/src/components/Screen/Screen.tsx +2 -1
  290. package/src/components/Section/Section.tsx +6 -5
  291. package/src/components/SegmentedControl/SegmentedControl.tsx +3 -2
  292. package/src/components/SegmentedTrack/SegmentedTrack.tsx +5 -4
  293. package/src/components/Slot/Slot.tsx +2 -1
  294. package/src/components/Spinner/Spinner.tsx +2 -1
  295. package/src/components/StatGroup/StatGroup.tsx +3 -2
  296. package/src/components/StatItem/StatItem.tsx +2 -1
  297. package/src/components/StatusHero/StatusHero.tsx +2 -1
  298. package/src/components/Stepper/Step.tsx +2 -1
  299. package/src/components/Stepper/StepLabel.tsx +2 -1
  300. package/src/components/Stepper/Stepper.tsx +2 -1
  301. package/src/components/StrengthIndicator/StrengthIndicator.tsx +2 -1
  302. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +4 -3
  303. package/src/components/SummaryTile/SummaryTile.tsx +2 -1
  304. package/src/components/SupportText/SupportText.tsx +2 -1
  305. package/src/components/SupportText/SupportTextIcon.tsx +2 -1
  306. package/src/components/SwappableAmount/SwappableAmount.tsx +2 -1
  307. package/src/components/Tabs/TabItem.tsx +2 -1
  308. package/src/components/Tabs/Tabs.tsx +2 -1
  309. package/src/components/TestimonialsCard/TestimonialsCard.tsx +2 -1
  310. package/src/components/Text/Text.tsx +2 -1
  311. package/src/components/TextInput/TextInput.tsx +3 -2
  312. package/src/components/ThreadHero/ThreadHero.tsx +2 -1
  313. package/src/components/Title/Title.tsx +2 -1
  314. package/src/components/Toast/Toast.tsx +2 -1
  315. package/src/components/Toast/ToastProvider.tsx +2 -1
  316. package/src/components/Toast/useToast.ts +3 -2
  317. package/src/components/Toggle/Toggle.tsx +2 -1
  318. package/src/components/Tooltip/Tooltip.tsx +3 -2
  319. package/src/components/TransactionBubble/TransactionBubble.tsx +2 -1
  320. package/src/components/TransactionDetails/TransactionDetails.tsx +3 -2
  321. package/src/components/TransactionStatus/TransactionStatus.tsx +3 -2
  322. package/src/components/UpiHandle/UpiHandle.tsx +3 -2
  323. package/src/components/VStack/VStack.tsx +2 -1
  324. package/src/components/docs/modeControls.tsx +122 -0
  325. package/src/components/index.ts +1 -0
  326. package/src/design-tokens/JFSThemeProvider.tsx +4 -3
  327. package/src/design-tokens/figma-modes.generated.ts +396 -0
  328. package/src/design-tokens/index.ts +1 -0
  329. package/src/icons/registry.ts +1 -1
  330. package/src/skeleton/Skeleton.tsx +2 -1
  331. package/src/utils/react-utils.ts +3 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ 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
+
7
15
  ## [0.1.0] - 2026-06-08
8
16
 
9
17
  - Added `TestimonialsCard` — compact avatar + title + body card for testimonial carousels.
@@ -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
  }
@@ -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,
@@ -253,7 +253,57 @@ function FullscreenModal({
253
253
  useNativeDriver: true
254
254
  }), [scrollY]);
255
255
  const heroTranslateY = (0, _react.useMemo)(() => _reactNative.Animated.multiply(scrollY, -1), [scrollY]);
256
- 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]);
257
307
  const processedChildren = (0, _react.useMemo)(() => children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
258
308
 
259
309
  // The hero text region always reserves `heroHeight` and anchors its content
@@ -306,8 +356,18 @@ function FullscreenModal({
306
356
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
307
357
  style: [rootStyle, style],
308
358
  testID: testID,
359
+ onLayout: onContainerLayout,
309
360
  children: [processedHeroMedia ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
310
- 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, {
311
371
  transform: [{
312
372
  translateY: heroTranslateY
313
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
  /**
@@ -43,7 +43,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
43
43
  /**
44
44
  * Helper function to convert a color to a more transparent version for placeholder text.
45
45
  * Takes a color string (hex, rgb, rgba) and returns it with reduced opacity.
46
- */const IS_WEB = _reactNative.Platform.OS === 'web';
46
+ */
47
+ const IS_WEB = _reactNative.Platform.OS === 'web';
47
48
  function makePlaceholderColor(color, opacity = 0.5) {
48
49
  if (!color || typeof color !== 'string') {
49
50
  return color || '';
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.modeArgTypes = modeArgTypes;
7
+ exports.modeDecorator = modeDecorator;
8
+ exports.withModeControls = withModeControls;
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _figmaModes = require("../../design-tokens/figma-modes.generated");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ /**
14
+ * Storybook helpers that turn a component's design-token collections into real,
15
+ * per-collection `select` controls and merge the picked values into the `modes`
16
+ * prop — so authors get the same enum-driven DX in the Storybook Controls panel
17
+ * that the typed `modes` prop gives them in code.
18
+ *
19
+ * Fully backward compatible:
20
+ * - If nothing is picked, `modes` is left exactly as the story provided it.
21
+ * - Any `modes` value the story already sets WINS over a control selection,
22
+ * so existing stories render identically until someone touches a control.
23
+ * - The synthetic control args are stripped before they reach the component,
24
+ * so they never leak in as unknown props.
25
+ */const UNSET = '(default)';
26
+ /**
27
+ * Resolve the list of collections to expose. Accepts a component name (looked up
28
+ * in the generated map), an explicit list, or both (merged + de-duplicated).
29
+ */
30
+ function resolveCollections(componentOrCollections, extra = []) {
31
+ const fromName = typeof componentOrCollections === 'string' ? _figmaModes.FIGMA_COMPONENT_MODES[componentOrCollections] || [] : componentOrCollections;
32
+ const merged = new Set([...fromName, ...extra]);
33
+ // Only keep collections that actually have more than one mode to choose from.
34
+ return [...merged].filter(name => {
35
+ const modes = _figmaModes.FIGMA_MODES[name];
36
+ return Array.isArray(modes) && modes.length > 1;
37
+ });
38
+ }
39
+
40
+ /**
41
+ * Build `argTypes` entries — one `select` per multi-mode collection, grouped
42
+ * under a "Modes" category. Spread the result into your story `meta.argTypes`.
43
+ */
44
+ function modeArgTypes(componentOrCollections, extra = []) {
45
+ const collections = resolveCollections(componentOrCollections, extra);
46
+ const argTypes = {};
47
+ for (const name of collections) {
48
+ const modes = _figmaModes.FIGMA_MODES[name];
49
+ argTypes[name] = {
50
+ name,
51
+ description: `\`${name}\` collection mode`,
52
+ control: {
53
+ type: 'select'
54
+ },
55
+ options: [UNSET, ...modes],
56
+ table: {
57
+ category: 'Modes'
58
+ }
59
+ };
60
+ }
61
+ return argTypes;
62
+ }
63
+
64
+ /**
65
+ * A decorator that merges the picked collection modes into `args.modes` and
66
+ * strips the synthetic control args before they reach the component.
67
+ */
68
+ function modeDecorator(componentOrCollections, extra = []) {
69
+ const collections = resolveCollections(componentOrCollections, extra);
70
+ return function ModeControlsDecorator(Story, context) {
71
+ const args = context?.args || {};
72
+ const picked = {};
73
+ // Start from the real story args so nothing is dropped. Passing only the
74
+ // synthetic keys here would REPLACE the story args in this Storybook
75
+ // renderer, wiping out real props (e.g. `series`, slot nodes) and leaving
76
+ // the component to render empty/crash.
77
+ const override = {
78
+ ...args
79
+ };
80
+ for (const name of collections) {
81
+ const value = args[name];
82
+ if (value && value !== UNSET) {
83
+ picked[name] = value;
84
+ }
85
+ // Neutralise the synthetic arg so it is never spread onto the component.
86
+ override[name] = undefined;
87
+ }
88
+
89
+ // Explicit story-provided modes win over control selections.
90
+ override.modes = {
91
+ ...picked,
92
+ ...(args.modes || {})
93
+ };
94
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Story, {
95
+ args: override
96
+ });
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Convenience: returns `{ argTypes, decorators }` to spread directly into a
102
+ * story `meta`.
103
+ *
104
+ * @example
105
+ * const meta = {
106
+ * title: 'Components/Button',
107
+ * component: Button,
108
+ * ...withModeControls('Button'),
109
+ * }
110
+ */
111
+ function withModeControls(componentOrCollections, extra = []) {
112
+ return {
113
+ argTypes: modeArgTypes(componentOrCollections, extra),
114
+ decorators: [modeDecorator(componentOrCollections, extra)]
115
+ };
116
+ }
@@ -513,6 +513,12 @@ Object.defineProperty(exports, "OTPResend", {
513
513
  return _OTP.OTPResend;
514
514
  }
515
515
  });
516
+ Object.defineProperty(exports, "Overlay", {
517
+ enumerable: true,
518
+ get: function () {
519
+ return _Overlay.default;
520
+ }
521
+ });
516
522
  Object.defineProperty(exports, "PageHero", {
517
523
  enumerable: true,
518
524
  get: function () {
@@ -924,6 +930,7 @@ var _NoteInput = _interopRequireDefault(require("./NoteInput/NoteInput"));
924
930
  var _Nudge = _interopRequireDefault(require("./Nudge/Nudge"));
925
931
  var _NavArrow = _interopRequireDefault(require("./NavArrow/NavArrow"));
926
932
  var _Numpad = _interopRequireDefault(require("./Numpad/Numpad"));
933
+ var _Overlay = _interopRequireDefault(require("./Overlay/Overlay"));
927
934
  var _Title = _interopRequireDefault(require("./Title/Title"));
928
935
  var _Screen = _interopRequireDefault(require("./Screen/Screen"));
929
936
  var _Section = _interopRequireDefault(require("./Section/Section"));
@@ -43,7 +43,7 @@ const JFSThemeProvider = ({
43
43
  * Hook to access the current design token context.
44
44
  *
45
45
  * returns {
46
- * modes: Record<string, any> - The current active modes
46
+ * modes: Modes - The current active modes
47
47
  * getVariable: (name: string) => any - Function to resolve a token value
48
48
  * }
49
49
  */