jfs-components 0.1.2 → 0.1.12

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 (287) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/lib/commonjs/components/Accordion/Accordion.js +2 -1
  3. package/lib/commonjs/components/AccordionCheckbox/AccordionCheckbox.js +4 -3
  4. package/lib/commonjs/components/AccountCard/AccountCard.js +4 -3
  5. package/lib/commonjs/components/AllocationComparisonChart/AllocationComparisonChart.js +9 -6
  6. package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
  7. package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +11 -7
  8. package/lib/commonjs/components/Badge/Badge.js +47 -8
  9. package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
  10. package/lib/commonjs/components/BrandChip/BrandChip.js +3 -3
  11. package/lib/commonjs/components/Button/Button.js +2 -1
  12. package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +2 -1
  13. package/lib/commonjs/components/CardBankAccount/CardBankAccount.js +3 -2
  14. package/lib/commonjs/components/CardCTA/CardCTA.js +197 -27
  15. package/lib/commonjs/components/CardInsight/CardInsight.js +5 -1
  16. package/lib/commonjs/components/CcCard/CcCard.js +470 -0
  17. package/lib/commonjs/components/Checkbox/Checkbox.js +4 -3
  18. package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
  19. package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +7 -3
  20. package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +3 -2
  21. package/lib/commonjs/components/CircularRating/CircularRating.js +2 -1
  22. package/lib/commonjs/components/ClusterBubble/ClusterBubble.js +3 -2
  23. package/lib/commonjs/components/CompareTable/CompareTable.js +401 -0
  24. package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
  25. package/lib/commonjs/components/CoverageBarComparison/CoverageBarComparison.js +3 -2
  26. package/lib/commonjs/components/DonutChart/DonutChart.js +4 -3
  27. package/lib/commonjs/components/Dropdown/Dropdown.js +3 -2
  28. package/lib/commonjs/components/DropdownInput/DropdownInput.js +38 -5
  29. package/lib/commonjs/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
  30. package/lib/commonjs/components/FormField/FormField.js +45 -4
  31. package/lib/commonjs/components/Gauge/Gauge.js +1 -1
  32. package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +3 -2
  33. package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
  34. package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +2 -1
  35. package/lib/commonjs/components/ListGroup/ListGroup.js +2 -1
  36. package/lib/commonjs/components/ListItem/ListItem.js +3 -2
  37. package/lib/commonjs/components/MediaCard/MediaCard.js +4 -2
  38. package/lib/commonjs/components/MetricLegendItem/MetricLegendItem.js +3 -2
  39. package/lib/commonjs/components/MonthlyStatusGrid/MonthlyStatusGrid.js +6 -3
  40. package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
  41. package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
  42. package/lib/commonjs/components/PoweredByLabel/PoweredByLabel.js +3 -2
  43. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +427 -0
  44. package/lib/commonjs/components/ProductOverview/ProductOverview.js +4 -3
  45. package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +2 -2
  46. package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +162 -0
  47. package/lib/commonjs/components/Radio/Radio.js +5 -5
  48. package/lib/commonjs/components/Section/Section.js +3 -2
  49. package/lib/commonjs/components/Slider/Slider.js +474 -0
  50. package/lib/commonjs/components/Stack/Stack.js +86 -0
  51. package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
  52. package/lib/commonjs/components/SummaryTile/SummaryTile.js +3 -2
  53. package/lib/commonjs/components/Table/Table.js +324 -0
  54. package/lib/commonjs/components/Text/Text.js +2 -1
  55. package/lib/commonjs/components/TextInput/TextInput.js +22 -9
  56. package/lib/commonjs/components/TextSegment/TextSegment.js +119 -0
  57. package/lib/commonjs/components/ThreadHero/ThreadHero.js +4 -5
  58. package/lib/commonjs/components/Title/Title.js +2 -1
  59. package/lib/commonjs/components/Toast/Toast.js +3 -2
  60. package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +2 -1
  61. package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +3 -2
  62. package/lib/commonjs/components/UpiHandle/UpiHandle.js +2 -2
  63. package/lib/commonjs/components/index.js +107 -0
  64. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
  65. package/lib/commonjs/design-tokens/figma-modes.generated.js +39 -9
  66. package/lib/commonjs/icons/registry.js +1 -1
  67. package/lib/commonjs/utils/GlassFill/GlassFill.js +271 -0
  68. package/lib/commonjs/utils/GlassFill/GlassFill.web.js +120 -0
  69. package/lib/commonjs/utils/react-utils.js +78 -0
  70. package/lib/commonjs/utils/web-platform-utils.js +59 -0
  71. package/lib/module/components/Accordion/Accordion.js +3 -2
  72. package/lib/module/components/AccordionCheckbox/AccordionCheckbox.js +5 -4
  73. package/lib/module/components/AccountCard/AccountCard.js +5 -4
  74. package/lib/module/components/AllocationComparisonChart/AllocationComparisonChart.js +10 -7
  75. package/lib/module/components/AmountInput/AmountInput.js +6 -4
  76. package/lib/module/components/AreaLineChart/AreaLineChart.js +12 -8
  77. package/lib/module/components/Badge/Badge.js +49 -10
  78. package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
  79. package/lib/module/components/BrandChip/BrandChip.js +4 -4
  80. package/lib/module/components/Button/Button.js +3 -2
  81. package/lib/module/components/CardAdvisory/CardAdvisory.js +3 -2
  82. package/lib/module/components/CardBankAccount/CardBankAccount.js +4 -3
  83. package/lib/module/components/CardCTA/CardCTA.js +198 -28
  84. package/lib/module/components/CardInsight/CardInsight.js +5 -1
  85. package/lib/module/components/CcCard/CcCard.js +464 -0
  86. package/lib/module/components/Checkbox/Checkbox.js +5 -4
  87. package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
  88. package/lib/module/components/CircularProgressBar/CircularProgressBar.js +8 -4
  89. package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +4 -3
  90. package/lib/module/components/CircularRating/CircularRating.js +3 -2
  91. package/lib/module/components/ClusterBubble/ClusterBubble.js +4 -3
  92. package/lib/module/components/CompareTable/CompareTable.js +396 -0
  93. package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
  94. package/lib/module/components/CoverageBarComparison/CoverageBarComparison.js +4 -3
  95. package/lib/module/components/DonutChart/DonutChart.js +5 -4
  96. package/lib/module/components/Dropdown/Dropdown.js +4 -3
  97. package/lib/module/components/DropdownInput/DropdownInput.js +40 -7
  98. package/lib/module/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
  99. package/lib/module/components/FormField/FormField.js +48 -7
  100. package/lib/module/components/Gauge/Gauge.js +1 -1
  101. package/lib/module/components/HoldingsCard/HoldingsCard.js +4 -3
  102. package/lib/module/components/InputSearch/InputSearch.js +6 -4
  103. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -2
  104. package/lib/module/components/ListGroup/ListGroup.js +3 -2
  105. package/lib/module/components/ListItem/ListItem.js +4 -3
  106. package/lib/module/components/MediaCard/MediaCard.js +4 -2
  107. package/lib/module/components/MetricLegendItem/MetricLegendItem.js +4 -3
  108. package/lib/module/components/MonthlyStatusGrid/MonthlyStatusGrid.js +7 -4
  109. package/lib/module/components/NoteInput/NoteInput.js +7 -6
  110. package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
  111. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +4 -3
  112. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +421 -0
  113. package/lib/module/components/ProductOverview/ProductOverview.js +5 -4
  114. package/lib/module/components/ProgressBadge/ProgressBadge.js +3 -3
  115. package/lib/module/components/ProjectionMarker/ProjectionMarker.js +157 -0
  116. package/lib/module/components/Radio/Radio.js +5 -4
  117. package/lib/module/components/Section/Section.js +4 -3
  118. package/lib/module/components/Slider/Slider.js +469 -0
  119. package/lib/module/components/Stack/Stack.js +81 -0
  120. package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
  121. package/lib/module/components/SummaryTile/SummaryTile.js +4 -3
  122. package/lib/module/components/Table/Table.js +315 -0
  123. package/lib/module/components/Text/Text.js +3 -2
  124. package/lib/module/components/TextInput/TextInput.js +24 -11
  125. package/lib/module/components/TextSegment/TextSegment.js +114 -0
  126. package/lib/module/components/ThreadHero/ThreadHero.js +5 -6
  127. package/lib/module/components/Title/Title.js +3 -2
  128. package/lib/module/components/Toast/Toast.js +4 -3
  129. package/lib/module/components/TransactionBubble/TransactionBubble.js +3 -2
  130. package/lib/module/components/TransactionStatus/TransactionStatus.js +4 -3
  131. package/lib/module/components/UpiHandle/UpiHandle.js +3 -3
  132. package/lib/module/components/index.js +11 -0
  133. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
  134. package/lib/module/design-tokens/figma-modes.generated.js +39 -9
  135. package/lib/module/icons/registry.js +1 -1
  136. package/lib/module/utils/GlassFill/GlassFill.js +265 -0
  137. package/lib/module/utils/GlassFill/GlassFill.web.js +115 -0
  138. package/lib/module/utils/react-utils.js +75 -0
  139. package/lib/module/utils/web-platform-utils.js +58 -0
  140. package/lib/typescript/src/components/Accordion/Accordion.d.ts +7 -1
  141. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +7 -1
  142. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +7 -1
  143. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +7 -1
  144. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +3 -2
  145. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +8 -1
  146. package/lib/typescript/src/components/Badge/Badge.d.ts +32 -2
  147. package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
  148. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +7 -1
  149. package/lib/typescript/src/components/Button/Button.d.ts +7 -1
  150. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +7 -1
  151. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +7 -1
  152. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +27 -5
  153. package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
  154. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +3 -2
  155. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -2
  156. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +7 -1
  157. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +7 -1
  158. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +7 -1
  159. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +7 -1
  160. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +94 -0
  161. package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
  162. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +7 -1
  163. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +7 -1
  164. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +7 -1
  165. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +26 -1
  166. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +7 -1
  167. package/lib/typescript/src/components/FormField/FormField.d.ts +2 -2
  168. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +7 -1
  169. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +23 -2
  170. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +7 -1
  171. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +7 -1
  172. package/lib/typescript/src/components/ListItem/ListItem.d.ts +7 -1
  173. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +7 -1
  174. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +14 -2
  175. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +19 -2
  176. package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
  177. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +7 -1
  178. package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +87 -0
  179. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +7 -1
  180. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +7 -1
  181. package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +88 -0
  182. package/lib/typescript/src/components/Radio/Radio.d.ts +3 -2
  183. package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
  184. package/lib/typescript/src/components/Section/Section.d.ts +7 -1
  185. package/lib/typescript/src/components/Slider/Slider.d.ts +105 -0
  186. package/lib/typescript/src/components/Stack/Stack.d.ts +81 -0
  187. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +7 -1
  188. package/lib/typescript/src/components/Table/Table.d.ts +139 -0
  189. package/lib/typescript/src/components/Text/Text.d.ts +7 -1
  190. package/lib/typescript/src/components/TextInput/TextInput.d.ts +9 -29
  191. package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +106 -0
  192. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +7 -1
  193. package/lib/typescript/src/components/Title/Title.d.ts +7 -1
  194. package/lib/typescript/src/components/Toast/Toast.d.ts +7 -1
  195. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +7 -1
  196. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +7 -1
  197. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +7 -1
  198. package/lib/typescript/src/components/index.d.ts +14 -3
  199. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +22 -2
  200. package/lib/typescript/src/icons/registry.d.ts +1 -1
  201. package/lib/typescript/src/utils/GlassFill/GlassFill.d.ts +84 -0
  202. package/lib/typescript/src/utils/GlassFill/GlassFill.web.d.ts +43 -0
  203. package/lib/typescript/src/utils/react-utils.d.ts +47 -0
  204. package/lib/typescript/src/utils/web-platform-utils.d.ts +36 -0
  205. package/package.json +2 -1
  206. package/src/components/Accordion/Accordion.tsx +9 -2
  207. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +10 -3
  208. package/src/components/AccountCard/AccountCard.tsx +10 -3
  209. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +14 -4
  210. package/src/components/AmountInput/AmountInput.tsx +7 -5
  211. package/src/components/AreaLineChart/AreaLineChart.tsx +15 -5
  212. package/src/components/Badge/Badge.tsx +78 -8
  213. package/src/components/BenefitCard/BenefitCard.tsx +309 -0
  214. package/src/components/BrandChip/BrandChip.tsx +9 -3
  215. package/src/components/Button/Button.tsx +9 -2
  216. package/src/components/CardAdvisory/CardAdvisory.tsx +9 -2
  217. package/src/components/CardBankAccount/CardBankAccount.tsx +9 -2
  218. package/src/components/CardCTA/CardCTA.tsx +214 -41
  219. package/src/components/CardInsight/CardInsight.tsx +7 -1
  220. package/src/components/CcCard/CcCard.tsx +598 -0
  221. package/src/components/Checkbox/Checkbox.tsx +5 -4
  222. package/src/components/CheckboxItem/CheckboxItem.tsx +5 -4
  223. package/src/components/CircularProgressBar/CircularProgressBar.tsx +14 -4
  224. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +10 -3
  225. package/src/components/CircularRating/CircularRating.tsx +9 -2
  226. package/src/components/ClusterBubble/ClusterBubble.tsx +9 -2
  227. package/src/components/CompareTable/CompareTable.tsx +525 -0
  228. package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
  229. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +9 -2
  230. package/src/components/DonutChart/DonutChart.tsx +10 -3
  231. package/src/components/Dropdown/Dropdown.tsx +9 -2
  232. package/src/components/DropdownInput/DropdownInput.tsx +64 -5
  233. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +8 -1
  234. package/src/components/FormField/FormField.tsx +52 -6
  235. package/src/components/Gauge/Gauge.tsx +1 -1
  236. package/src/components/HoldingsCard/HoldingsCard.tsx +9 -2
  237. package/src/components/InputSearch/InputSearch.tsx +8 -5
  238. package/src/components/InstitutionBadge/InstitutionBadge.tsx +9 -2
  239. package/src/components/ListGroup/ListGroup.tsx +9 -2
  240. package/src/components/ListItem/ListItem.tsx +10 -3
  241. package/src/components/MediaCard/MediaCard.tsx +2 -2
  242. package/src/components/MetricLegendItem/MetricLegendItem.tsx +9 -2
  243. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +17 -2
  244. package/src/components/NoteInput/NoteInput.tsx +8 -6
  245. package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
  246. package/src/components/PoweredByLabel/PoweredByLabel.tsx +9 -2
  247. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +490 -0
  248. package/src/components/ProductOverview/ProductOverview.tsx +10 -3
  249. package/src/components/ProgressBadge/ProgressBadge.tsx +9 -3
  250. package/src/components/ProjectionMarker/ProjectionMarker.tsx +284 -0
  251. package/src/components/Radio/Radio.tsx +5 -4
  252. package/src/components/Section/Section.tsx +10 -3
  253. package/src/components/Slider/Slider.tsx +635 -0
  254. package/src/components/Stack/Stack.tsx +131 -0
  255. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -1
  256. package/src/components/SummaryTile/SummaryTile.tsx +9 -2
  257. package/src/components/Table/Table.tsx +449 -0
  258. package/src/components/Text/Text.tsx +9 -2
  259. package/src/components/TextInput/TextInput.tsx +22 -12
  260. package/src/components/TextSegment/TextSegment.tsx +173 -0
  261. package/src/components/ThreadHero/ThreadHero.tsx +10 -3
  262. package/src/components/Title/Title.tsx +9 -2
  263. package/src/components/Toast/Toast.tsx +9 -2
  264. package/src/components/TransactionBubble/TransactionBubble.tsx +9 -2
  265. package/src/components/TransactionStatus/TransactionStatus.tsx +9 -2
  266. package/src/components/UpiHandle/UpiHandle.tsx +9 -3
  267. package/src/components/index.ts +33 -3
  268. package/src/design-tokens/Coin Variables-variables-full.json +1 -1
  269. package/src/design-tokens/figma-modes.generated.ts +39 -9
  270. package/src/icons/registry.ts +1 -1
  271. package/src/utils/GlassFill/GlassFill.tsx +305 -0
  272. package/src/utils/GlassFill/GlassFill.web.tsx +148 -0
  273. package/src/utils/react-utils.ts +84 -0
  274. package/src/utils/web-platform-utils.ts +68 -0
  275. package/lib/commonjs/components/MediaCard/GlassFill.js +0 -62
  276. package/lib/commonjs/components/MediaCard/GlassFill.web.js +0 -48
  277. package/lib/module/components/MediaCard/GlassFill.js +0 -57
  278. package/lib/module/components/MediaCard/GlassFill.web.js +0 -43
  279. package/lib/typescript/scripts/extract-component-tokens.d.ts +0 -9
  280. package/lib/typescript/scripts/generate-component-docs.d.ts +0 -9
  281. package/lib/typescript/scripts/generate-icon-registry.d.ts +0 -3
  282. package/lib/typescript/scripts/generate-mode-types.d.ts +0 -2
  283. package/lib/typescript/scripts/retype-modes.d.cts +0 -2
  284. package/lib/typescript/src/components/MediaCard/GlassFill.d.ts +0 -47
  285. package/lib/typescript/src/components/MediaCard/GlassFill.web.d.ts +0 -20
  286. package/src/components/MediaCard/GlassFill.tsx +0 -89
  287. package/src/components/MediaCard/GlassFill.web.tsx +0 -53
package/CHANGELOG.md CHANGED
@@ -4,6 +4,51 @@ 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.12] - 2026-06-22
8
+
9
+ - Added `Stack` — token-driven vertical/horizontal layout container with `equalHeight` / `fullWidth` stretch enforcement, mode cascade to children, and `injectChildStyle` for cross-axis alignment that children cannot override.
10
+ - Added `Table` — compound data table (`TableHeader`, `TableHeaderCell`, `TableBody`, `TableRow`, `TableCell`) with token-driven header/body styling and horizontal scroll support.
11
+ - `CardCTA` — new `sip` variant (avatar-led card with headline / description / subtitle footer); accepts PascalCase Figma variant names (`CTA` / `Rating` / `Sip`) via `CardCTATypeInput`; body typography defaults aligned to Figma.
12
+ - `Badge` — new `glass` type (frosted pill via shared `GlassFill`); optional `leading` slot; `glassOverlayColor` / `glassIntensity` overrides; exported `BadgeProps` and `BadgeType`.
13
+ - `CompareTable` — feature rows now render through the shared `Table` primitive; selection cards pick up `selectionCard/radius`; `disableTruncation` support.
14
+ - `ProductMerchandisingCard` — footer special badge now uses `<Badge type="glass">`; progressive footer blur via `MaskedView` + gradient mask on native; `disableTruncation` support.
15
+ - `GlassFill` — consolidated into shared `src/utils/GlassFill/` (native blur + web `backdrop-filter`); removed per-component copies under `MediaCard` and `ProductMerchandisingCard`.
16
+ - `FormField` — iOS single-line input no longer applies row-height token as `lineHeight` (fixes vertically sunk text on iOS); web blur-on-outside-press via `useWebOutsidePress` so fields exit Active state when tapping buttons/links outside.
17
+ - Shared utilities — `injectChildStyle`, `resolveTruncation`, and `useWebOutsidePress` in `react-utils` / `web-platform-utils`.
18
+ - `disableTruncation` — opt-out of ellipsis / `numberOfLines` clamps rolled out across interactive and data-display components (e.g. `ListItem`, `Button`, `CompareTable`, charts, form controls).
19
+ - Figma/token sync pass; refreshed `.token-metadata.json`, `figma-modes.generated.ts`, icons registry, and Coin Variables tokens.
20
+
21
+ ---
22
+
23
+ ## [0.1.8] - 2026-06-12
24
+
25
+ - Added `BenefitCard` — header highlight + body benefit rows with icon/title/trailing value and optional CTA.
26
+ - Added `CcCard` — credit-card merchandising card with badge row, media, benefit list, footer CTA, and `compact` variant.
27
+ - Added `CompareTable` — accordion-style product comparison table with selection-card columns and feature rows.
28
+ - Added `ComparisonBar` — controlled add/remove image slots with a trailing Compare action.
29
+ - Added `PdpCcCard` — PDP credit-card hero with media, title, metrics row, and footer CTA.
30
+ - Added `ProductMerchandisingCard` — full-bleed media card with glass footer, avatar, badge, and CTA (`GlassFill` platform split for native blur / web `backdrop-filter`).
31
+ - Added `ProjectionMarker` — investment projection timeline with start/end values and a center duration/rate badge.
32
+ - Added `Slider` — token-driven range slider with SVG track, step snapping, and imperative ref API (`getValue` / `setValue` / `increment` / `decrement`).
33
+ - Added `TextSegment` — token-driven multi-colour inline text via `segments` or compositional `Text` children.
34
+ - `DropdownInput` — imperative ref API (`open` / `close` / `toggle` / `focus` / `blur` / `measureInWindow`).
35
+ - Form inputs — refs forwarded through `Checkbox`, `CheckboxItem`, `Radio`, `TextInput`, `InputSearch`, `NoteInput`, `AmountInput`, and `FormField`.
36
+ - Figma/token sync pass; refreshed `.token-metadata.json`, `figma-modes.generated.ts`, icons registry, and Coin Variables tokens.
37
+ - Added `npm run tokens` script (`scripts/figma-token-explorer.js`); `tsconfig.build.json` now excludes `scripts/`.
38
+
39
+ ---
40
+
41
+ ## [0.1.2] - 2026-06-10
42
+
43
+ - Added `Overlay` — full-screen scrim with optional dismiss-on-press and `contentPlacement` (`center` / `top` / `bottom` / `stretch`).
44
+ - `Drawer` — optional `showOverlay` + `onOverlayPress` scrim behind the sheet.
45
+ - `Image` — new `resizeMethod` prop for sharper high-res bitmap rendering.
46
+ - `FullscreenModal` — defers hero media render until modal width is measured.
47
+ - `DropdownInput` — popup animation set to `none`.
48
+ - `LottiePlayer` — fixed native module resolution (static `require` so Metro resolves when the peer is installed).
49
+
50
+ ---
51
+
7
52
  ## [0.1.1] - 2026-06-10
8
53
 
9
54
  - 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.
@@ -67,6 +67,7 @@ function Accordion({
67
67
  accessibilityHint,
68
68
  accessibilityState,
69
69
  webAccessibilityProps,
70
+ disableTruncation,
70
71
  ...rest
71
72
  }) {
72
73
  const [internalExpanded, setInternalExpanded] = (0, _react.useState)(defaultExpanded);
@@ -166,7 +167,7 @@ function Accordion({
166
167
  ...webProps,
167
168
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
168
169
  style: titleStyle,
169
- numberOfLines: 1,
170
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
170
171
  children: title
171
172
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
172
173
  name: isExpanded ? 'ic_minus' : 'ic_add',
@@ -64,7 +64,8 @@ function AccordionCheckbox({
64
64
  children,
65
65
  modes = _reactUtils.EMPTY_MODES,
66
66
  style,
67
- accessibilityLabel
67
+ accessibilityLabel,
68
+ disableTruncation
68
69
  }) {
69
70
  const isExpandedControlled = controlledExpanded !== undefined;
70
71
  const [internalExpanded, setInternalExpanded] = (0, _react.useState)(defaultExpanded);
@@ -209,12 +210,12 @@ function AccordionCheckbox({
209
210
  style: textWrapStyle,
210
211
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
211
212
  style: titleStyle,
212
- numberOfLines: 1,
213
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
213
214
  selectable: false,
214
215
  children: title
215
216
  }), subtitle ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
216
217
  style: subtitleStyle,
217
- numberOfLines: 1,
218
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
218
219
  selectable: false,
219
220
  children: subtitle
220
221
  }) : null]
@@ -78,7 +78,8 @@ function AccountCard({
78
78
  modes = _reactUtils.EMPTY_MODES,
79
79
  style,
80
80
  accessibilityLabel,
81
- accessibilityHint
81
+ accessibilityHint,
82
+ disableTruncation
82
83
  }) {
83
84
  const iconModes = (0, _react.useMemo)(() => modes === _reactUtils.EMPTY_MODES ? ADD_ICON_DEFAULT_MODES : {
84
85
  ...ADD_ICON_DEFAULT_MODES,
@@ -211,11 +212,11 @@ function AccountCard({
211
212
  },
212
213
  children: [title != null && title !== '' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
213
214
  style: titleStyle,
214
- numberOfLines: 1,
215
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
215
216
  children: title
216
217
  }) : null, showSubtitle ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
217
218
  style: subtitleStyle,
218
- numberOfLines: 1,
219
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
219
220
  children: subtitle
220
221
  }) : null]
221
222
  }) : null]
@@ -67,7 +67,8 @@ function SegmentBar({
67
67
  baselineHeightPx,
68
68
  baselineLabel,
69
69
  showMarker,
70
- theme
70
+ theme,
71
+ disableTruncation
71
72
  }) {
72
73
  const {
73
74
  barWidth,
@@ -94,7 +95,7 @@ function SegmentBar({
94
95
  },
95
96
  accessibilityLabel: segment.accessibilityLabel,
96
97
  children: [showValueLabel ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
97
- numberOfLines: 1,
98
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
98
99
  style: labelStyle,
99
100
  children: segment.valueLabel
100
101
  }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -140,7 +141,7 @@ function SegmentBar({
140
141
  strokeDasharray: "2 2"
141
142
  })
142
143
  }), isShown(baselineLabel) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
143
- numberOfLines: 1,
144
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
144
145
  style: [labelStyle, {
145
146
  marginLeft: 6
146
147
  }],
@@ -149,7 +150,7 @@ function SegmentBar({
149
150
  }) : null]
150
151
  }) : null
151
152
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
152
- numberOfLines: 1,
153
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
153
154
  style: labelStyle,
154
155
  children: segment.label
155
156
  })]
@@ -186,7 +187,8 @@ function AllocationComparisonChart({
186
187
  style,
187
188
  chartStyle,
188
189
  legendStyle,
189
- accessibilityLabel
190
+ accessibilityLabel,
191
+ disableTruncation
190
192
  }) {
191
193
  const {
192
194
  modes: globalModes
@@ -290,7 +292,8 @@ function AllocationComparisonChart({
290
292
  baselineHeightPx: baselineHeightPx,
291
293
  baselineLabel: baselineLabel,
292
294
  showMarker: showMarker,
293
- theme: theme
295
+ theme: theme,
296
+ disableTruncation: disableTruncation
294
297
  }, segment.key ?? `segment-${index}`);
295
298
  })
296
299
  })]
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = AmountInput;
7
- var _react = _interopRequireDefault(require("react"));
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
9
  var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
10
10
  var _JFSThemeProvider = require("../../design-tokens/JFSThemeProvider");
@@ -13,17 +13,18 @@ var _NoteInput = _interopRequireDefault(require("../NoteInput/NoteInput"));
13
13
  var _reactUtils = require("../../utils/react-utils");
14
14
  var _jsxRuntime = require("react/jsx-runtime");
15
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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); }
16
17
  /**
17
18
  * AmountInput component that combines MoneyValue and NoteInput from Figma design.
18
19
  *
19
20
  * @component
20
21
  */
21
- function AmountInput({
22
+ const AmountInput = /*#__PURE__*/(0, _react.forwardRef)(function AmountInput({
22
23
  moneyValueSlot,
23
24
  noteInputSlot,
24
25
  modes: propModes = _reactUtils.EMPTY_MODES,
25
26
  style
26
- }) {
27
+ }, ref) {
27
28
  const {
28
29
  modes: globalModes
29
30
  } = (0, _JFSThemeProvider.useTokens)();
@@ -77,7 +78,9 @@ function AmountInput({
77
78
  return noteInputSlot;
78
79
  };
79
80
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
81
+ ref: ref,
80
82
  style: containerStyle,
81
83
  children: [renderMoneyValueSlot(), renderNoteInputSlot()]
82
84
  });
83
- }
85
+ });
86
+ var _default = exports.default = AmountInput;
@@ -123,7 +123,8 @@ function AreaLineChart({
123
123
  modes: propModes = _reactUtils.EMPTY_MODES,
124
124
  style,
125
125
  children,
126
- accessibilityLabel
126
+ accessibilityLabel,
127
+ disableTruncation
127
128
  }) {
128
129
  const {
129
130
  modes: globalModes
@@ -243,8 +244,9 @@ function AreaLineChart({
243
244
  formatX,
244
245
  formatY,
245
246
  showDots,
246
- modes
247
- }), [plotWidth, height, inset, xScale, yScale, yTicks, indexXs, count, resolvedSeries, curve, activeIndex, setActiveIndex, xLabels, formatX, formatY, showDots, modes]);
247
+ modes,
248
+ disableTruncation
249
+ }), [plotWidth, height, inset, xScale, yScale, yTicks, indexXs, count, resolvedSeries, curve, activeIndex, setActiveIndex, xLabels, formatX, formatY, showDots, modes, disableTruncation]);
248
250
  const isMultiSeries = resolvedSeries.length > 1;
249
251
  const resolvedFormatValue = formatValue ?? (v => formatY(v));
250
252
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(ChartContext.Provider, {
@@ -385,7 +387,8 @@ function ChartYAxis({
385
387
  yScale,
386
388
  yTicks,
387
389
  formatY,
388
- modes
390
+ modes,
391
+ disableTruncation
389
392
  } = useChart();
390
393
  const typo = useAxisTypography(modes);
391
394
  const format = formatLabel ?? formatY;
@@ -413,7 +416,7 @@ function ChartYAxis({
413
416
  },
414
417
  children: showLabels ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
415
418
  style: typo.style,
416
- numberOfLines: 1,
419
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
417
420
  children: format(t)
418
421
  }) : null
419
422
  }, `yl-${t}`);
@@ -464,7 +467,8 @@ function ChartXAxis({
464
467
  formatX,
465
468
  modes,
466
469
  activeIndex,
467
- setActiveIndex
470
+ setActiveIndex,
471
+ disableTruncation
468
472
  } = useChart();
469
473
  const typo = useAxisTypography(modes);
470
474
  const format = formatLabel ?? formatX;
@@ -510,7 +514,7 @@ function ChartXAxis({
510
514
  color: activeColor,
511
515
  fontWeight: '700'
512
516
  } : null],
513
- numberOfLines: 1,
517
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
514
518
  children: format(label, i)
515
519
  });
516
520
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -10,21 +10,34 @@ var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resol
10
10
  var _reactUtils = require("../../utils/react-utils");
11
11
  var _Skeleton = _interopRequireDefault(require("../../skeleton/Skeleton"));
12
12
  var _SkeletonGroup = require("../../skeleton/SkeletonGroup");
13
+ var _GlassFill = _interopRequireDefault(require("../../utils/GlassFill/GlassFill"));
13
14
  var _jsxRuntime = require("react/jsx-runtime");
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
16
  function Badge({
16
17
  label = 'Label',
18
+ type = 'default',
17
19
  modes = _reactUtils.EMPTY_MODES,
18
20
  onPress,
19
21
  accessibilityLabel,
20
22
  style,
21
23
  labelStyle,
22
24
  loading,
25
+ disableTruncation,
26
+ leading,
27
+ glassOverlayColor,
28
+ glassIntensity,
23
29
  ...rest
24
30
  }) {
25
- // Resolve token values (fall back to sensible defaults)
31
+ const isGlass = type === 'glass';
32
+ const hasLeading = leading != null;
33
+
34
+ // Resolve token values (fall back to sensible defaults). The glass type
35
+ // swaps the solid fill for a translucent overlay + white label, matching the
36
+ // Figma `badge/glass/*` tokens.
26
37
  const backgroundColor = (0, _figmaVariablesResolver.getVariableByName)('badge/color/background', modes) || '#d8effe';
27
- const labelColor = (0, _figmaVariablesResolver.getVariableByName)('badge/color/label', modes) || '#000000';
38
+ const glassBackground = (0, _figmaVariablesResolver.getVariableByName)('badge/glass/color/background', modes) || '#ffffff26';
39
+ const glassLabelColor = (0, _figmaVariablesResolver.getVariableByName)('badge/glass/color/label', modes) || '#ffffff';
40
+ const labelColor = isGlass ? glassLabelColor : (0, _figmaVariablesResolver.getVariableByName)('badge/color/label', modes) || '#000000';
28
41
  const fontSize = Number((0, _figmaVariablesResolver.getVariableByName)('badge/label/fontSize', modes)) || 12;
29
42
  const fontFamily = (0, _figmaVariablesResolver.getVariableByName)('badge/fontFamily', modes) || undefined;
30
43
  const fontWeight = (0, _figmaVariablesResolver.getVariableByName)('badge/label/fontWeight', modes) || '600';
@@ -32,6 +45,9 @@ function Badge({
32
45
  const paddingVertical = Number((0, _figmaVariablesResolver.getVariableByName)('badge/padding/vertical', modes)) || 4;
33
46
  const borderRadius = Number((0, _figmaVariablesResolver.getVariableByName)('badge/radius', modes)) || 4;
34
47
  const lineHeight = Number((0, _figmaVariablesResolver.getVariableByName)('badge/label/lineHeight', modes)) || Math.round(fontSize * 1.2);
48
+ // Figma `blur/minimal` (px radius) -> GlassFill's 0–100 intensity scale, the
49
+ // same 1:1 mapping the merchandising card footer uses.
50
+ const blurIntensity = Math.max(0, Math.min(100, Math.round(Number((0, _figmaVariablesResolver.getVariableByName)('blur/minimal', modes)) || 29)));
35
51
 
36
52
  // Skeleton short-circuit. Size derived from the same tokens the loaded
37
53
  // badge would use so the placeholder occupies the same box.
@@ -54,13 +70,25 @@ function Badge({
54
70
  }
55
71
  const Container = onPress ? _reactNative.Pressable : _reactNative.View;
56
72
  const containerStyle = {
57
- backgroundColor,
73
+ // Glass keeps the container transparent so the GlassFill blur shows through;
74
+ // `overflow: 'hidden'` clips the native blur view to the rounded pill (the
75
+ // blur view does not honor borderRadius itself).
76
+ backgroundColor: isGlass ? 'transparent' : backgroundColor,
58
77
  paddingHorizontal,
59
78
  paddingVertical,
60
79
  borderRadius,
61
80
  alignSelf: 'flex-start',
62
81
  alignItems: 'center',
63
82
  justifyContent: 'center',
83
+ // A leading node sits in-line before the label, so switch to a row with a
84
+ // small gap. Consumer `style` (spread last) can still override either.
85
+ ...(hasLeading ? {
86
+ flexDirection: 'row',
87
+ gap: 4
88
+ } : null),
89
+ ...(isGlass ? {
90
+ overflow: 'hidden'
91
+ } : null),
64
92
  ...(style || {})
65
93
  };
66
94
  const textStyle = {
@@ -73,19 +101,30 @@ function Badge({
73
101
  ...(labelStyle || {})
74
102
  };
75
103
  const defaultAccessibilityLabel = accessibilityLabel || label;
76
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(Container, {
104
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Container, {
77
105
  style: containerStyle,
78
106
  accessibilityRole: onPress ? 'button' : 'text',
79
107
  accessibilityLabel: undefined,
80
108
  onPress: onPress,
81
109
  ...rest,
82
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
110
+ children: [isGlass ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_GlassFill.default, {
111
+ tint: "light",
112
+ intensity: glassIntensity ?? blurIntensity,
113
+ overlayColor: glassOverlayColor ?? glassBackground,
114
+ androidTintWash: false
115
+ }) : null, hasLeading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
116
+ style: LEADING_WRAP,
117
+ children: leading
118
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
83
119
  style: textStyle,
84
- numberOfLines: 1,
85
- ellipsizeMode: "tail",
120
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1, 'tail'),
86
121
  accessibilityElementsHidden: false,
87
122
  children: label
88
- })
123
+ })]
89
124
  });
90
125
  }
126
+ const LEADING_WRAP = {
127
+ justifyContent: 'center',
128
+ alignItems: 'center'
129
+ };
91
130
  var _default = exports.default = Badge;
@@ -0,0 +1,231 @@
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 _reactUtils = require("../../utils/react-utils");
11
+ var _Icon = _interopRequireDefault(require("../Icon/Icon"));
12
+ var _Text = _interopRequireDefault(require("../Text/Text"));
13
+ var _ListItem = _interopRequireDefault(require("../ListItem/ListItem"));
14
+ var _Divider = _interopRequireDefault(require("../Divider/Divider"));
15
+ var _Button = _interopRequireDefault(require("../Button/Button"));
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ 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); }
19
+ /**
20
+ * A single benefit row rendered with the shared `ListItem` primitive: a
21
+ * leading icon, a title and an optional right-aligned trailing value.
22
+ */
23
+
24
+ /**
25
+ * BenefitCard — Figma node 5352:1077 ("Benefit Card").
26
+ *
27
+ * A white, rounded card that summarises the rewards a user will earn. It is
28
+ * composed entirely from the shared design-system primitives so it stays in
29
+ * sync with the rest of the library:
30
+ *
31
+ * - **Header** — a section title + a single highlighted {@link ListItem}
32
+ * (leading `Icon`, title, right-aligned trailing value) followed by a
33
+ * `Divider`.
34
+ * - **Body** — a section title + a column of benefit {@link ListItem}s. The
35
+ * list is a real slot: pass `children` to fully control it, or `items` for
36
+ * the declarative path.
37
+ * - **CTA** — a small {@link Button} (Figma `Button / Size = S`).
38
+ *
39
+ * The list rows resolve through the `List Item Style: Minimal` mode (12px /
40
+ * regular title, 4px gap, no padding) and the leading icons use the
41
+ * `AppearanceBrand: Secondary` brand color, exactly matching the design. All
42
+ * three defaults can be overridden via `modes`.
43
+ */
44
+ function BenefitCard({
45
+ headerTitle = 'You will earn',
46
+ headerItem,
47
+ showHeader = true,
48
+ bodyTitle = 'Upgrade to JioFinance+ and earn more',
49
+ items,
50
+ children,
51
+ buttonLabel = 'Upgrade',
52
+ onButtonPress,
53
+ button,
54
+ showButton = true,
55
+ onPress,
56
+ width = 344,
57
+ modes = _reactUtils.EMPTY_MODES,
58
+ style,
59
+ accessibilityLabel
60
+ }) {
61
+ const tokens = (0, _react.useMemo)(() => resolveTokens(modes), [modes]);
62
+
63
+ // Sub-component modes. Consumer-supplied `modes` always win via spread order.
64
+ const listItemModes = (0, _react.useMemo)(() => ({
65
+ 'List Item Style': 'Minimal',
66
+ ...modes
67
+ }), [modes]);
68
+ const iconModes = (0, _react.useMemo)(() => ({
69
+ AppearanceBrand: 'Secondary',
70
+ ...modes
71
+ }), [modes]);
72
+ const trailingTextModes = (0, _react.useMemo)(() => ({
73
+ 'Text Sizes': 'Small',
74
+ Weight: 'Regular',
75
+ ...modes
76
+ }), [modes]);
77
+ const ctaModes = (0, _react.useMemo)(() => ({
78
+ 'Button / Size': 'S',
79
+ ...modes
80
+ }), [modes]);
81
+ const renderItem = (item, key) => {
82
+ const leading = item.leading ?? (item.icon != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
83
+ iconName: item.icon,
84
+ color: item.iconColor,
85
+ modes: iconModes
86
+ }) : null);
87
+ const trailing = item.trailing ?? (item.trailingText != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
88
+ modes: trailingTextModes,
89
+ children: item.trailingText
90
+ }) : undefined);
91
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItem.default, {
92
+ layout: "Horizontal",
93
+ navArrow: false,
94
+ showSupportText: false,
95
+ title: item.title,
96
+ leading: leading,
97
+ trailing: trailing,
98
+ onPress: item.onPress,
99
+ modes: listItemModes
100
+ }, key);
101
+ };
102
+ const headerNode = showHeader && (headerTitle != null || headerItem != null) ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
103
+ style: styles.section,
104
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
105
+ style: styles.cardHeader,
106
+ children: [headerTitle != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
107
+ style: tokens.title,
108
+ children: headerTitle
109
+ }) : null, headerItem != null ? renderItem(headerItem, 'header-item') : null]
110
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Divider.default, {
111
+ modes: modes
112
+ })]
113
+ }) : null;
114
+ const bodyList = children ? (0, _reactUtils.cloneChildrenWithModes)(children, listItemModes) : (items ?? DEFAULT_ITEMS).map((item, index) => renderItem(item, index));
115
+ const ctaNode = button ?? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
116
+ label: buttonLabel,
117
+ modes: ctaModes,
118
+ onPress: onButtonPress
119
+ });
120
+ const containerStyle = (0, _react.useMemo)(() => ({
121
+ ...tokens.container,
122
+ width
123
+ }), [tokens.container, width]);
124
+ const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
125
+ children: [headerNode, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
126
+ style: tokens.body,
127
+ children: [bodyTitle != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
128
+ style: tokens.title,
129
+ children: bodyTitle
130
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
131
+ style: tokens.listWrap,
132
+ children: bodyList
133
+ })]
134
+ }), showButton ? ctaNode : null]
135
+ });
136
+ if (onPress) {
137
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
138
+ style: ({
139
+ pressed
140
+ }) => [containerStyle, pressed ? styles.pressed : null, style],
141
+ accessibilityRole: "button",
142
+ accessibilityLabel: accessibilityLabel ?? headerTitle ?? bodyTitle,
143
+ onPress: onPress,
144
+ children: content
145
+ });
146
+ }
147
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
148
+ style: [containerStyle, style],
149
+ accessibilityLabel: accessibilityLabel,
150
+ children: content
151
+ });
152
+ }
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // Tokens / static styles
156
+ // ---------------------------------------------------------------------------
157
+
158
+ // The "card header" inner gap (title -> highlighted item) is a fixed 4px in
159
+ // the Figma node and has no dedicated token.
160
+ const CARD_HEADER_GAP = 4;
161
+ function asNum(raw, fallback) {
162
+ const n = typeof raw === 'number' ? raw : parseFloat(raw);
163
+ return Number.isFinite(n) ? n : fallback;
164
+ }
165
+ function asStr(raw, fallback) {
166
+ return raw != null ? String(raw) : fallback;
167
+ }
168
+ function resolveTokens(modes) {
169
+ // NOTE: token names are passed as string literals DIRECTLY to
170
+ // getVariableByName so the `extract-component-tokens` script can statically
171
+ // collect them for the generated docs. Do not refactor these into a helper
172
+ // that receives the name as a variable.
173
+ const background = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/background', modes), '#ffffff');
174
+ const paddingHorizontal = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/padding/horizontal', modes), 12);
175
+ const paddingVertical = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/padding/vertical', modes), 12);
176
+ const radius = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/radius', modes), 12);
177
+ const gap = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/gap', modes), 8);
178
+ const titleColor = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/foreground', modes), '#000000');
179
+ const titleSize = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontsize', modes), 14);
180
+ const titleFamily = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontFamily', modes), 'JioType Var');
181
+ const titleWeight = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontWeight', modes), '500');
182
+ return {
183
+ container: {
184
+ backgroundColor: background,
185
+ paddingHorizontal,
186
+ paddingVertical,
187
+ borderRadius: radius,
188
+ gap,
189
+ flexDirection: 'column',
190
+ alignItems: 'flex-start'
191
+ },
192
+ body: {
193
+ alignSelf: 'stretch',
194
+ gap
195
+ },
196
+ listWrap: {
197
+ alignSelf: 'stretch',
198
+ gap
199
+ },
200
+ title: {
201
+ color: titleColor,
202
+ fontSize: titleSize,
203
+ fontFamily: titleFamily,
204
+ fontWeight: titleWeight,
205
+ lineHeight: 20,
206
+ letterSpacing: -0.5,
207
+ includeFontPadding: false
208
+ }
209
+ };
210
+ }
211
+ const DEFAULT_ITEMS = [{
212
+ icon: 'ic_card',
213
+ title: 'Up to ₹5000 cashback'
214
+ }, {
215
+ icon: 'ic_card',
216
+ title: '25% extra JioPoints'
217
+ }];
218
+ const styles = _reactNative.StyleSheet.create({
219
+ section: {
220
+ alignSelf: 'stretch',
221
+ gap: 8
222
+ },
223
+ cardHeader: {
224
+ alignSelf: 'stretch',
225
+ gap: CARD_HEADER_GAP
226
+ },
227
+ pressed: {
228
+ opacity: 0.92
229
+ }
230
+ });
231
+ var _default = exports.default = BenefitCard;
@@ -95,7 +95,8 @@ function BrandChip({
95
95
  modes: propModes = _reactUtils.EMPTY_MODES,
96
96
  style,
97
97
  labelStyle,
98
- accessibilityLabel
98
+ accessibilityLabel,
99
+ disableTruncation
99
100
  }) {
100
101
  const {
101
102
  modes: globalModes
@@ -126,8 +127,7 @@ function BrandChip({
126
127
  const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
127
128
  children: [avatarNode, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
128
129
  style: [tokens.labelStyle, labelStyle],
129
- numberOfLines: 1,
130
- ellipsizeMode: "tail",
130
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1, 'tail'),
131
131
  children: label
132
132
  })]
133
133
  });
@@ -176,6 +176,7 @@ function ButtonImpl({
176
176
  accessibilityState,
177
177
  webAccessibilityProps,
178
178
  loading,
179
+ disableTruncation,
179
180
  ...rest
180
181
  }) {
181
182
  // Hover state is web-only in practice; the setter is gated so native taps
@@ -220,7 +221,7 @@ function ButtonImpl({
220
221
  } else {
221
222
  content = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
222
223
  style: activeLabelStyle,
223
- numberOfLines: 1,
224
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
224
225
  children: label
225
226
  });
226
227
  }