jfs-components 0.1.8 → 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 (238) hide show
  1. package/CHANGELOG.md +16 -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/AreaLineChart/AreaLineChart.js +11 -7
  7. package/lib/commonjs/components/Badge/Badge.js +47 -8
  8. package/lib/commonjs/components/BrandChip/BrandChip.js +3 -3
  9. package/lib/commonjs/components/Button/Button.js +2 -1
  10. package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +2 -1
  11. package/lib/commonjs/components/CardBankAccount/CardBankAccount.js +3 -2
  12. package/lib/commonjs/components/CardCTA/CardCTA.js +197 -27
  13. package/lib/commonjs/components/CardInsight/CardInsight.js +5 -1
  14. package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +7 -3
  15. package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +3 -2
  16. package/lib/commonjs/components/CircularRating/CircularRating.js +2 -1
  17. package/lib/commonjs/components/ClusterBubble/ClusterBubble.js +3 -2
  18. package/lib/commonjs/components/CompareTable/CompareTable.js +72 -43
  19. package/lib/commonjs/components/CoverageBarComparison/CoverageBarComparison.js +3 -2
  20. package/lib/commonjs/components/DonutChart/DonutChart.js +4 -3
  21. package/lib/commonjs/components/Dropdown/Dropdown.js +3 -2
  22. package/lib/commonjs/components/DropdownInput/DropdownInput.js +3 -2
  23. package/lib/commonjs/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
  24. package/lib/commonjs/components/FormField/FormField.js +42 -2
  25. package/lib/commonjs/components/Gauge/Gauge.js +1 -1
  26. package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +3 -2
  27. package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +2 -1
  28. package/lib/commonjs/components/ListGroup/ListGroup.js +2 -1
  29. package/lib/commonjs/components/ListItem/ListItem.js +3 -2
  30. package/lib/commonjs/components/MediaCard/MediaCard.js +4 -2
  31. package/lib/commonjs/components/MetricLegendItem/MetricLegendItem.js +3 -2
  32. package/lib/commonjs/components/MonthlyStatusGrid/MonthlyStatusGrid.js +6 -3
  33. package/lib/commonjs/components/PoweredByLabel/PoweredByLabel.js +3 -2
  34. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +107 -33
  35. package/lib/commonjs/components/ProductOverview/ProductOverview.js +4 -3
  36. package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +2 -2
  37. package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +3 -2
  38. package/lib/commonjs/components/Section/Section.js +3 -2
  39. package/lib/commonjs/components/Slider/Slider.js +3 -2
  40. package/lib/commonjs/components/Stack/Stack.js +86 -0
  41. package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
  42. package/lib/commonjs/components/SummaryTile/SummaryTile.js +3 -2
  43. package/lib/commonjs/components/Table/Table.js +324 -0
  44. package/lib/commonjs/components/Text/Text.js +2 -1
  45. package/lib/commonjs/components/TextInput/TextInput.js +9 -1
  46. package/lib/commonjs/components/TextSegment/TextSegment.js +2 -1
  47. package/lib/commonjs/components/ThreadHero/ThreadHero.js +4 -5
  48. package/lib/commonjs/components/Title/Title.js +2 -1
  49. package/lib/commonjs/components/Toast/Toast.js +3 -2
  50. package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +2 -1
  51. package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +3 -2
  52. package/lib/commonjs/components/UpiHandle/UpiHandle.js +2 -2
  53. package/lib/commonjs/components/index.js +44 -0
  54. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
  55. package/lib/commonjs/design-tokens/figma-modes.generated.js +1 -0
  56. package/lib/commonjs/icons/registry.js +1 -1
  57. package/lib/commonjs/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.js +11 -3
  58. package/lib/commonjs/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.js +8 -4
  59. package/lib/commonjs/utils/react-utils.js +56 -0
  60. package/lib/commonjs/utils/web-platform-utils.js +59 -0
  61. package/lib/module/components/Accordion/Accordion.js +3 -2
  62. package/lib/module/components/AccordionCheckbox/AccordionCheckbox.js +5 -4
  63. package/lib/module/components/AccountCard/AccountCard.js +5 -4
  64. package/lib/module/components/AllocationComparisonChart/AllocationComparisonChart.js +10 -7
  65. package/lib/module/components/AreaLineChart/AreaLineChart.js +12 -8
  66. package/lib/module/components/Badge/Badge.js +49 -10
  67. package/lib/module/components/BrandChip/BrandChip.js +4 -4
  68. package/lib/module/components/Button/Button.js +3 -2
  69. package/lib/module/components/CardAdvisory/CardAdvisory.js +3 -2
  70. package/lib/module/components/CardBankAccount/CardBankAccount.js +4 -3
  71. package/lib/module/components/CardCTA/CardCTA.js +198 -28
  72. package/lib/module/components/CardInsight/CardInsight.js +5 -1
  73. package/lib/module/components/CircularProgressBar/CircularProgressBar.js +8 -4
  74. package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +4 -3
  75. package/lib/module/components/CircularRating/CircularRating.js +3 -2
  76. package/lib/module/components/ClusterBubble/ClusterBubble.js +4 -3
  77. package/lib/module/components/CompareTable/CompareTable.js +73 -44
  78. package/lib/module/components/CoverageBarComparison/CoverageBarComparison.js +4 -3
  79. package/lib/module/components/DonutChart/DonutChart.js +5 -4
  80. package/lib/module/components/Dropdown/Dropdown.js +4 -3
  81. package/lib/module/components/DropdownInput/DropdownInput.js +4 -3
  82. package/lib/module/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
  83. package/lib/module/components/FormField/FormField.js +45 -5
  84. package/lib/module/components/Gauge/Gauge.js +1 -1
  85. package/lib/module/components/HoldingsCard/HoldingsCard.js +4 -3
  86. package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -2
  87. package/lib/module/components/ListGroup/ListGroup.js +3 -2
  88. package/lib/module/components/ListItem/ListItem.js +4 -3
  89. package/lib/module/components/MediaCard/MediaCard.js +4 -2
  90. package/lib/module/components/MetricLegendItem/MetricLegendItem.js +4 -3
  91. package/lib/module/components/MonthlyStatusGrid/MonthlyStatusGrid.js +7 -4
  92. package/lib/module/components/PoweredByLabel/PoweredByLabel.js +4 -3
  93. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +109 -35
  94. package/lib/module/components/ProductOverview/ProductOverview.js +5 -4
  95. package/lib/module/components/ProgressBadge/ProgressBadge.js +3 -3
  96. package/lib/module/components/ProjectionMarker/ProjectionMarker.js +4 -3
  97. package/lib/module/components/Section/Section.js +4 -3
  98. package/lib/module/components/Slider/Slider.js +4 -3
  99. package/lib/module/components/Stack/Stack.js +81 -0
  100. package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
  101. package/lib/module/components/SummaryTile/SummaryTile.js +4 -3
  102. package/lib/module/components/Table/Table.js +315 -0
  103. package/lib/module/components/Text/Text.js +3 -2
  104. package/lib/module/components/TextInput/TextInput.js +9 -1
  105. package/lib/module/components/TextSegment/TextSegment.js +3 -2
  106. package/lib/module/components/ThreadHero/ThreadHero.js +5 -6
  107. package/lib/module/components/Title/Title.js +3 -2
  108. package/lib/module/components/Toast/Toast.js +4 -3
  109. package/lib/module/components/TransactionBubble/TransactionBubble.js +3 -2
  110. package/lib/module/components/TransactionStatus/TransactionStatus.js +4 -3
  111. package/lib/module/components/UpiHandle/UpiHandle.js +3 -3
  112. package/lib/module/components/index.js +2 -0
  113. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
  114. package/lib/module/design-tokens/figma-modes.generated.js +1 -0
  115. package/lib/module/icons/registry.js +1 -1
  116. package/lib/module/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.js +11 -3
  117. package/lib/module/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.js +8 -4
  118. package/lib/module/utils/react-utils.js +54 -0
  119. package/lib/module/utils/web-platform-utils.js +58 -0
  120. package/lib/typescript/src/components/Accordion/Accordion.d.ts +7 -1
  121. package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +7 -1
  122. package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +7 -1
  123. package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +7 -1
  124. package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +8 -1
  125. package/lib/typescript/src/components/Badge/Badge.d.ts +32 -2
  126. package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +7 -1
  127. package/lib/typescript/src/components/Button/Button.d.ts +7 -1
  128. package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +7 -1
  129. package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +7 -1
  130. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +27 -5
  131. package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +7 -1
  132. package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +7 -1
  133. package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +7 -1
  134. package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +7 -1
  135. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +7 -1
  136. package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +7 -1
  137. package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +7 -1
  138. package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +7 -1
  139. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +6 -0
  140. package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +7 -1
  141. package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +7 -1
  142. package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +7 -1
  143. package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +7 -1
  144. package/lib/typescript/src/components/ListItem/ListItem.d.ts +7 -1
  145. package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +7 -1
  146. package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +14 -2
  147. package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +7 -1
  148. package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +7 -1
  149. package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +7 -1
  150. package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +7 -1
  151. package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +7 -1
  152. package/lib/typescript/src/components/Section/Section.d.ts +7 -1
  153. package/lib/typescript/src/components/Slider/Slider.d.ts +6 -0
  154. package/lib/typescript/src/components/Stack/Stack.d.ts +81 -0
  155. package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +7 -1
  156. package/lib/typescript/src/components/Table/Table.d.ts +139 -0
  157. package/lib/typescript/src/components/Text/Text.d.ts +7 -1
  158. package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +7 -1
  159. package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +7 -1
  160. package/lib/typescript/src/components/Title/Title.d.ts +7 -1
  161. package/lib/typescript/src/components/Toast/Toast.d.ts +7 -1
  162. package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +7 -1
  163. package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +7 -1
  164. package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +7 -1
  165. package/lib/typescript/src/components/index.d.ts +4 -2
  166. package/lib/typescript/src/icons/registry.d.ts +1 -1
  167. package/lib/typescript/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.d.ts +31 -3
  168. package/lib/typescript/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.d.ts +18 -2
  169. package/lib/typescript/src/utils/react-utils.d.ts +37 -0
  170. package/lib/typescript/src/utils/web-platform-utils.d.ts +36 -0
  171. package/package.json +1 -1
  172. package/src/components/Accordion/Accordion.tsx +9 -2
  173. package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +10 -3
  174. package/src/components/AccountCard/AccountCard.tsx +10 -3
  175. package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +14 -4
  176. package/src/components/AreaLineChart/AreaLineChart.tsx +15 -5
  177. package/src/components/Badge/Badge.tsx +78 -8
  178. package/src/components/BrandChip/BrandChip.tsx +9 -3
  179. package/src/components/Button/Button.tsx +9 -2
  180. package/src/components/CardAdvisory/CardAdvisory.tsx +9 -2
  181. package/src/components/CardBankAccount/CardBankAccount.tsx +9 -2
  182. package/src/components/CardCTA/CardCTA.tsx +214 -41
  183. package/src/components/CardInsight/CardInsight.tsx +7 -1
  184. package/src/components/CircularProgressBar/CircularProgressBar.tsx +14 -4
  185. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +10 -3
  186. package/src/components/CircularRating/CircularRating.tsx +9 -2
  187. package/src/components/ClusterBubble/ClusterBubble.tsx +9 -2
  188. package/src/components/CompareTable/CompareTable.tsx +98 -50
  189. package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +9 -2
  190. package/src/components/DonutChart/DonutChart.tsx +10 -3
  191. package/src/components/Dropdown/Dropdown.tsx +9 -2
  192. package/src/components/DropdownInput/DropdownInput.tsx +9 -2
  193. package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +8 -1
  194. package/src/components/FormField/FormField.tsx +49 -4
  195. package/src/components/Gauge/Gauge.tsx +1 -1
  196. package/src/components/HoldingsCard/HoldingsCard.tsx +9 -2
  197. package/src/components/InstitutionBadge/InstitutionBadge.tsx +9 -2
  198. package/src/components/ListGroup/ListGroup.tsx +9 -2
  199. package/src/components/ListItem/ListItem.tsx +10 -3
  200. package/src/components/MediaCard/MediaCard.tsx +2 -2
  201. package/src/components/MetricLegendItem/MetricLegendItem.tsx +9 -2
  202. package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +17 -2
  203. package/src/components/PoweredByLabel/PoweredByLabel.tsx +9 -2
  204. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +104 -37
  205. package/src/components/ProductOverview/ProductOverview.tsx +10 -3
  206. package/src/components/ProgressBadge/ProgressBadge.tsx +9 -3
  207. package/src/components/ProjectionMarker/ProjectionMarker.tsx +9 -2
  208. package/src/components/Section/Section.tsx +10 -3
  209. package/src/components/Slider/Slider.tsx +9 -2
  210. package/src/components/Stack/Stack.tsx +131 -0
  211. package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -1
  212. package/src/components/SummaryTile/SummaryTile.tsx +9 -2
  213. package/src/components/Table/Table.tsx +449 -0
  214. package/src/components/Text/Text.tsx +9 -2
  215. package/src/components/TextInput/TextInput.tsx +7 -1
  216. package/src/components/TextSegment/TextSegment.tsx +9 -2
  217. package/src/components/ThreadHero/ThreadHero.tsx +10 -3
  218. package/src/components/Title/Title.tsx +9 -2
  219. package/src/components/Toast/Toast.tsx +9 -2
  220. package/src/components/TransactionBubble/TransactionBubble.tsx +9 -2
  221. package/src/components/TransactionStatus/TransactionStatus.tsx +9 -2
  222. package/src/components/UpiHandle/UpiHandle.tsx +9 -3
  223. package/src/components/index.ts +23 -2
  224. package/src/design-tokens/Coin Variables-variables-full.json +1 -1
  225. package/src/design-tokens/figma-modes.generated.ts +1 -0
  226. package/src/icons/registry.ts +1 -1
  227. package/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.tsx +32 -3
  228. package/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.tsx +25 -4
  229. package/src/utils/react-utils.ts +61 -0
  230. package/src/utils/web-platform-utils.ts +68 -0
  231. package/lib/commonjs/components/MediaCard/GlassFill.js +0 -62
  232. package/lib/commonjs/components/MediaCard/GlassFill.web.js +0 -48
  233. package/lib/module/components/MediaCard/GlassFill.js +0 -57
  234. package/lib/module/components/MediaCard/GlassFill.web.js +0 -43
  235. package/lib/typescript/src/components/MediaCard/GlassFill.d.ts +0 -47
  236. package/lib/typescript/src/components/MediaCard/GlassFill.web.d.ts +0 -20
  237. package/src/components/MediaCard/GlassFill.tsx +0 -89
  238. package/src/components/MediaCard/GlassFill.web.tsx +0 -53
@@ -14,9 +14,18 @@ var _Button = _interopRequireDefault(require("../Button/Button"));
14
14
  var _Badge = _interopRequireDefault(require("../Badge/Badge"));
15
15
  var _ButtonGroup = _interopRequireDefault(require("../ButtonGroup/ButtonGroup"));
16
16
  var _IconButton = _interopRequireDefault(require("../IconButton/IconButton"));
17
+ var _Avatar = _interopRequireDefault(require("../Avatar/Avatar"));
17
18
  var _jsxRuntime = require("react/jsx-runtime");
18
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
+ /**
21
+ * Accepted `type` values. The canonical (and historical) values are lowercase
22
+ * (`'cta' | 'rating' | 'sip'`). The Figma variant names are PascalCase
23
+ * (`'CTA' | 'Rating' | 'Sip'`) — we accept those too and normalize internally
24
+ * so callers can pass either casing without a breaking change.
25
+ */
26
+
19
27
  const optionalTokenAvailability = new Map();
28
+ const toWeight = w => typeof w === 'number' ? `${w}` : w;
20
29
  function getOptionalVariableByName(name, modes, fallback) {
21
30
  let isAvailable = optionalTokenAvailability.get(name);
22
31
  if (isAvailable === undefined) {
@@ -39,11 +48,16 @@ function CardCTA({
39
48
  showRatingActions = true,
40
49
  onPressLike,
41
50
  onPressDislike,
51
+ headline = 'Headline',
52
+ description = 'Description',
53
+ subtitle = 'Subtitle',
54
+ avatarSource,
42
55
  modes: propModes = _reactUtils.EMPTY_MODES,
43
56
  iconSlot,
44
57
  buttonSlot,
45
58
  ratingBadgeSlot,
46
59
  ratingActionsSlot,
60
+ avatarSlot,
47
61
  style
48
62
  }) {
49
63
  const {
@@ -53,7 +67,10 @@ function CardCTA({
53
67
  ...globalModes,
54
68
  ...propModes
55
69
  };
56
- const isRating = type === 'rating';
70
+ // Accept both lowercase (canonical) and Figma PascalCase variant names.
71
+ const normalizedType = typeof type === 'string' ? type.toLowerCase() : 'cta';
72
+ const isRating = normalizedType === 'rating';
73
+ const isSip = normalizedType === 'sip';
57
74
  const background = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/background', modes) || '#ffffff';
58
75
  const radius = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/radius', modes) || 12;
59
76
  const borderSize = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/border/size', modes) || 1;
@@ -67,13 +84,13 @@ function CardCTA({
67
84
  const titleColor = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/color', modes) || '#0c0d10';
68
85
  const titleFontFamily = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/fontFamily', modes) || 'JioType Var';
69
86
  const titleFontSize = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/fontSize', modes) || 16;
70
- const titleLineHeight = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/lineHeight', modes) || 17.6;
87
+ const titleLineHeight = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/lineHeight', modes) || 18;
71
88
  const titleFontWeightRaw = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/title/fontWeight', modes) || 700;
72
89
  const titleFontWeight = typeof titleFontWeightRaw === 'number' ? titleFontWeightRaw.toString() : titleFontWeightRaw;
73
90
  const bodyColor = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/color', modes) || '#13002d';
74
91
  const bodyFontFamily = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/fontFamily', modes) || 'JioType Var';
75
- const bodyFontSize = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/fontSize', modes) || 10;
76
- const bodyLineHeight = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/lineHeight', modes) || 12;
92
+ const bodyFontSize = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/fontSize', modes) || 14;
93
+ const bodyLineHeight = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/lineHeight', modes) || 17;
77
94
  const bodyFontWeightRaw = (0, _figmaVariablesResolver.getVariableByName)('cardCTA/body/fontWeight', modes) || 400;
78
95
  const bodyFontWeight = typeof bodyFontWeightRaw === 'number' ? bodyFontWeightRaw.toString() : bodyFontWeightRaw;
79
96
  const ratingContentGap = getOptionalVariableByName('cardCTA/rating/content/gap', modes, 12);
@@ -82,6 +99,33 @@ function CardCTA({
82
99
  const ratingFooterPaddingH = getOptionalVariableByName('cardCTA/rating/footer/horizontal', modes, 16);
83
100
  const ratingFooterPaddingTop = getOptionalVariableByName('cardCTA/rating/footer/top', modes, 0);
84
101
  const ratingFooterPaddingBottom = getOptionalVariableByName('cardCTA/rating/footer/bottom', modes, 12);
102
+
103
+ // Sip variant footer text block (Headline / Description / Subtitle). These
104
+ // `ccCard/*` tokens were introduced for the Sip layout — resolve them
105
+ // optionally so older token snapshots that lack them fall back gracefully.
106
+ const sipFooterGap = getOptionalVariableByName('ccCard/footer/textWrap/gap', modes, 4);
107
+ const sipHeadlineColor = getOptionalVariableByName('ccCard/headline/color', modes, '#707275');
108
+ const sipHeadlineFontFamily = getOptionalVariableByName('ccCard/headline/fontFamily', modes, 'JioType Var');
109
+ const sipHeadlineFontSize = getOptionalVariableByName('ccCard/headline/fontSize', modes, 10);
110
+ const sipHeadlineLineHeight = getOptionalVariableByName('ccCard/headline/lineHeight', modes, 13);
111
+ const sipHeadlineFontWeightRaw = getOptionalVariableByName('ccCard/headline/fontWeight', modes, 500);
112
+ const sipHeadlineFontWeight = typeof sipHeadlineFontWeightRaw === 'number' ? sipHeadlineFontWeightRaw.toString() : sipHeadlineFontWeightRaw;
113
+ const sipDescriptionColor = getOptionalVariableByName('ccCard/title/color', modes, '#081007');
114
+ const sipDescriptionFontFamily = getOptionalVariableByName('ccCard/title/fontFamily', modes, 'JioType Var');
115
+ const sipDescriptionFontSize = getOptionalVariableByName('ccCard/title/fontSize', modes, 14);
116
+ const sipDescriptionLineHeight = getOptionalVariableByName('ccCard/title/lineHeight', modes, 15);
117
+ const sipDescriptionFontWeightRaw = getOptionalVariableByName('ccCard/title/fontWeight', modes, 700);
118
+ const sipDescriptionFontWeight = typeof sipDescriptionFontWeightRaw === 'number' ? sipDescriptionFontWeightRaw.toString() : sipDescriptionFontWeightRaw;
119
+ const sipSubtitleColor = getOptionalVariableByName('ccCard/subtitle/color', modes, '#707275');
120
+ const sipSubtitleFontFamily = getOptionalVariableByName('ccCard/subtitle/fontFamily', modes, 'JioType Var');
121
+ const sipSubtitleFontSize = getOptionalVariableByName('ccCard/subtitle/fontSize', modes, 10);
122
+ const sipSubtitleLineHeight = getOptionalVariableByName('ccCard/subtitle/lineHeight', modes, 13);
123
+ const sipSubtitleFontWeightRaw = getOptionalVariableByName('ccCard/subtitle/fontWeight', modes, 500);
124
+ const sipSubtitleFontWeight = typeof sipSubtitleFontWeightRaw === 'number' ? sipSubtitleFontWeightRaw.toString() : sipSubtitleFontWeightRaw;
125
+ const avatarModes = {
126
+ ...modes,
127
+ 'Avatar Size': 'L'
128
+ };
85
129
  const buttonModes = {
86
130
  ...modes,
87
131
  AppearanceBrand: 'Secondary',
@@ -98,25 +142,72 @@ function CardCTA({
98
142
  const [measuredButtonLabelWidth, setMeasuredButtonLabelWidth] = _react.default.useState(null);
99
143
  const buttonPaddingH = (0, _figmaVariablesResolver.getVariableByName)('button/padding/horizontal', buttonModes) || 20;
100
144
  const buttonBorderSize = (0, _figmaVariablesResolver.getVariableByName)('button/border/size', buttonModes) ?? 1;
101
- const measuredButtonWidth = measuredButtonLabelWidth === null ? undefined : Math.ceil(measuredButtonLabelWidth + buttonPaddingH * 2 + buttonBorderSize * 2);
102
- const handleButtonLabelTextLayout = _react.default.useCallback(event => {
103
- const lines = event?.nativeEvent?.lines;
104
- if (!Array.isArray(lines) || lines.length === 0) return;
105
- const nextWidth = Math.ceil(lines.reduce((sum, line) => sum + (typeof line?.width === 'number' ? line.width : 0), 0));
106
- if (nextWidth <= 0) return;
107
- setMeasuredButtonLabelWidth(currentWidth => {
108
- if (currentWidth !== null && Math.abs(currentWidth - nextWidth) < 1) {
109
- return currentWidth;
110
- }
111
- return nextWidth;
112
- });
145
+ // Small safety pad so sub-pixel rounding between the measure pass and the
146
+ // rendered glyph run can never clip the final character.
147
+ const measuredButtonWidth = measuredButtonLabelWidth === null ? undefined : Math.ceil(measuredButtonLabelWidth + buttonPaddingH * 2 + buttonBorderSize * 2 + 2);
148
+
149
+ // ROOT-CAUSE FIX for the Android "jumping button" feedback loop + clipping.
150
+ //
151
+ // Previously the *visible* label measured itself via `onTextLayout` and we
152
+ // fed that width straight back onto the same Button. Because the button is
153
+ // width-constrained by its parent, Android clamps the overflowing text and
154
+ // even character-breaks a single word ("Save" -> "Sav"/"e"); the re-applied
155
+ // width re-triggers layout, producing an endless ~60fps width oscillation.
156
+ //
157
+ // We now measure an *off-screen* copy of the label, laid out at an
158
+ // effectively unbounded width, so its reported single-line width is
159
+ // intrinsic and constant regardless of the button's applied width — the
160
+ // measurement can no longer depend on the value it produces, so the loop is
161
+ // impossible. Crucially the measurer reuses the Button's own resolved label
162
+ // styles (passed into `renderContent`), so the measured font matches the
163
+ // rendered font exactly and the width is never an under-estimate. The label
164
+ // is always a single line that overflows rather than wraps or truncates.
165
+ const handleMeasureTextLayout = _react.default.useCallback(event => {
166
+ const line = event?.nativeEvent?.lines?.[0];
167
+ const width = line && typeof line.width === 'number' ? line.width : 0;
168
+ if (width <= 0) return;
169
+ setMeasuredButtonLabelWidth(currentWidth => currentWidth !== null && Math.abs(currentWidth - width) < 0.5 ? currentWidth : Math.ceil(width));
113
170
  }, []);
171
+
172
+ // Off-screen measurer wrapper: absolute + opacity 0 + pointerEvents none =>
173
+ // out of flow, invisible, never intercepts touches, zero layout impact.
174
+ const measurerWrapStyle = {
175
+ position: 'absolute',
176
+ left: 0,
177
+ top: 0,
178
+ opacity: 0
179
+ };
180
+
181
+ // Renders the visible single-line label (never wraps, never ellipsizes) plus
182
+ // the co-located off-screen measurer that shares the Button's exact label
183
+ // styles. `width: 9999` forces the measurer onto one line so `onTextLayout`
184
+ // reports the true intrinsic width.
185
+ const renderButtonContent = labelExtraStyle => labelStyles => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
186
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
187
+ numberOfLines: 1,
188
+ ellipsizeMode: "clip",
189
+ style: [labelStyles, labelExtraStyle],
190
+ children: nonWrappingButtonLabel
191
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
192
+ pointerEvents: "none",
193
+ accessibilityElementsHidden: true,
194
+ importantForAccessibility: "no",
195
+ style: measurerWrapStyle,
196
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
197
+ style: [labelStyles, {
198
+ width: 9999
199
+ }],
200
+ onTextLayout: handleMeasureTextLayout,
201
+ children: nonWrappingButtonLabel
202
+ })
203
+ })]
204
+ });
114
205
  const containerStyle = {
115
206
  backgroundColor: background,
116
207
  borderRadius: radius,
117
208
  borderWidth: borderSize,
118
209
  borderColor,
119
- flexDirection: isRating ? 'column' : 'row',
210
+ flexDirection: isRating || isSip ? 'column' : 'row',
120
211
  overflow: 'visible'
121
212
  };
122
213
 
@@ -202,6 +293,47 @@ function CardCTA({
202
293
  lineHeight: bodyLineHeight,
203
294
  fontWeight: bodyFontWeight
204
295
  };
296
+ const sipWrapStyle = {
297
+ width: '100%',
298
+ paddingHorizontal: leftPaddingH,
299
+ paddingVertical: leftPaddingV,
300
+ gap: leftGap,
301
+ alignItems: 'flex-start',
302
+ justifyContent: 'flex-start',
303
+ overflow: 'visible'
304
+ };
305
+ const sipFooterTextWrapStyle = {
306
+ gap: sipFooterGap,
307
+ alignItems: 'flex-start',
308
+ alignSelf: 'stretch',
309
+ minWidth: 0
310
+ };
311
+ const sipDescriptionWrapStyle = {
312
+ flexDirection: 'row',
313
+ gap: sipFooterGap,
314
+ alignItems: 'flex-end'
315
+ };
316
+ const sipHeadlineStyle = {
317
+ color: sipHeadlineColor,
318
+ fontFamily: sipHeadlineFontFamily,
319
+ fontSize: sipHeadlineFontSize,
320
+ lineHeight: sipHeadlineLineHeight,
321
+ fontWeight: toWeight(sipHeadlineFontWeightRaw)
322
+ };
323
+ const sipDescriptionStyle = {
324
+ color: sipDescriptionColor,
325
+ fontFamily: sipDescriptionFontFamily,
326
+ fontSize: sipDescriptionFontSize,
327
+ lineHeight: sipDescriptionLineHeight,
328
+ fontWeight: toWeight(sipDescriptionFontWeightRaw)
329
+ };
330
+ const sipSubtitleStyle = {
331
+ color: sipSubtitleColor,
332
+ fontFamily: sipSubtitleFontFamily,
333
+ fontSize: sipSubtitleFontSize,
334
+ lineHeight: sipSubtitleLineHeight,
335
+ fontWeight: toWeight(sipSubtitleFontWeightRaw)
336
+ };
205
337
  const ratingContentStyle = {
206
338
  paddingHorizontal: ratingContentPaddingH,
207
339
  paddingVertical: ratingContentPaddingV,
@@ -248,6 +380,52 @@ function CardCTA({
248
380
  flexShrink: 0,
249
381
  flexWrap: 'nowrap'
250
382
  };
383
+ if (isSip) {
384
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
385
+ style: [containerStyle, style],
386
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
387
+ style: sipWrapStyle,
388
+ children: [avatarSlot ? (0, _reactUtils.cloneChildrenWithModes)(avatarSlot, avatarModes) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Avatar.default, {
389
+ style: "Image",
390
+ imageSource: avatarSource,
391
+ modes: avatarModes
392
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
393
+ style: textWrapStyle,
394
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
395
+ style: titleStyle,
396
+ children: title
397
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
398
+ style: bodyStyle,
399
+ children: body
400
+ })]
401
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
402
+ style: sipFooterTextWrapStyle,
403
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
404
+ style: sipHeadlineStyle,
405
+ children: headline
406
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
407
+ style: sipDescriptionWrapStyle,
408
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
409
+ style: sipDescriptionStyle,
410
+ children: description
411
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
412
+ style: sipSubtitleStyle,
413
+ children: subtitle
414
+ })]
415
+ })]
416
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
417
+ style: buttonWrapStyle,
418
+ children: buttonSlot ? (0, _reactUtils.cloneChildrenWithModes)(buttonSlot, buttonModes) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
419
+ label: effectiveButtonLabel,
420
+ onPress: onPressButton || (() => {}),
421
+ modes: buttonModes,
422
+ style: buttonStyle,
423
+ renderContent: renderButtonContent(buttonLabelStyle)
424
+ })
425
+ })]
426
+ })
427
+ });
428
+ }
251
429
  if (isRating) {
252
430
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
253
431
  style: [containerStyle, style],
@@ -275,11 +453,7 @@ function CardCTA({
275
453
  onPress: onPressButton || (() => {}),
276
454
  modes: buttonModes,
277
455
  style: ratingButtonStyle,
278
- renderContent: labelStyles => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
279
- onTextLayout: handleButtonLabelTextLayout,
280
- style: [labelStyles, ratingButtonLabelStyle],
281
- children: nonWrappingButtonLabel
282
- })
456
+ renderContent: renderButtonContent(ratingButtonLabelStyle)
283
457
  })
284
458
  }), showRatingActions ? ratingActionsSlot ? (0, _reactUtils.cloneChildrenWithModes)(ratingActionsSlot, iconButtonModes) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ButtonGroup.default, {
285
459
  modes: iconButtonModes,
@@ -320,11 +494,7 @@ function CardCTA({
320
494
  onPress: onPressButton || (() => {}),
321
495
  modes: buttonModes,
322
496
  style: buttonStyle,
323
- renderContent: labelStyles => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
324
- onTextLayout: handleButtonLabelTextLayout,
325
- style: [labelStyles, buttonLabelStyle],
326
- children: nonWrappingButtonLabel
327
- })
497
+ renderContent: renderButtonContent(buttonLabelStyle)
328
498
  })
329
499
  })]
330
500
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -36,7 +36,9 @@ function CardInsight({
36
36
  style
37
37
  }) {
38
38
  const background = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/background', modes) ?? '#ffffff';
39
- const radius = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/radius', modes) ?? 16;
39
+ const radius = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/radius', modes) ?? 12;
40
+ const borderWidth = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/borderWidth', modes) ?? 1;
41
+ const borderColor = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/border/color', modes) ?? '#ffffff';
40
42
  const paddingHorizontal = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/padding/horizontal', modes) ?? 12;
41
43
  const paddingVertical = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/padding/vertical', modes) ?? 16;
42
44
  const gap = (0, _figmaVariablesResolver.getVariableByName)('cardInsight/gap', modes) ?? 12;
@@ -109,6 +111,8 @@ function CardInsight({
109
111
  width,
110
112
  backgroundColor: background,
111
113
  borderRadius: radius,
114
+ borderWidth,
115
+ borderColor,
112
116
  paddingHorizontal,
113
117
  paddingVertical,
114
118
  gap,
@@ -36,8 +36,11 @@ const toFontWeight = (value, fallback) => {
36
36
  return fallback;
37
37
  };
38
38
  const getStrokeColor = (style, fallback) => {
39
+ // `StyleSheet.flatten(undefined)` returns `undefined`, so guard before
40
+ // reading `backgroundColor` — otherwise omitting the optional style prop
41
+ // crashes with "Cannot read property 'backgroundColor' of undefined".
39
42
  const flattened = _reactNative.StyleSheet.flatten(style);
40
- return typeof flattened.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
43
+ return typeof flattened?.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
41
44
  };
42
45
  function CircularProgressBar({
43
46
  value = 70,
@@ -51,6 +54,7 @@ function CircularProgressBar({
51
54
  valueStyle,
52
55
  supportTextStyle,
53
56
  accessibilityLabel,
57
+ disableTruncation,
54
58
  ...rest
55
59
  }) {
56
60
  const {
@@ -175,11 +179,11 @@ function CircularProgressBar({
175
179
  pointerEvents: "none",
176
180
  children: [hasSupportText ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
177
181
  style: [computedSupportTextStyle, supportTextStyle],
178
- numberOfLines: 1,
182
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
179
183
  children: supportText
180
184
  }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
181
185
  style: [computedValueStyle, valueStyle],
182
- numberOfLines: 1,
186
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
183
187
  children: displayValue
184
188
  })]
185
189
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconMinus.IconMinus, {
@@ -36,7 +36,7 @@ const toFontWeight = (value, fallback) => {
36
36
  };
37
37
  const getBackgroundColor = (style, fallback) => {
38
38
  const flattened = _reactNative.StyleSheet.flatten(style);
39
- return typeof flattened.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
39
+ return flattened && typeof flattened.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
40
40
  };
41
41
  function CircularProgressBarDoted({
42
42
  value = 72,
@@ -59,6 +59,7 @@ function CircularProgressBarDoted({
59
59
  scoreLabelStyle,
60
60
  tierLabelStyle,
61
61
  accessibilityLabel,
62
+ disableTruncation,
62
63
  onLayout,
63
64
  ...rest
64
65
  }) {
@@ -193,7 +194,7 @@ function CircularProgressBarDoted({
193
194
  };
194
195
  const trendContent = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
195
196
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
196
- numberOfLines: 1,
197
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
197
198
  style: [computedTierLabelStyle, tierLabelStyle],
198
199
  children: tierLabel
199
200
  }), showChevron ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconChevronright.IconChevronright, {
@@ -96,6 +96,7 @@ function CircularRating({
96
96
  footerTextStyle,
97
97
  nudgeStyle,
98
98
  accessibilityLabel,
99
+ disableTruncation,
99
100
  ...rest
100
101
  }) {
101
102
  const {
@@ -135,7 +136,7 @@ function CircularRating({
135
136
  style: [tokens.footerStyle, footerStyle],
136
137
  children: processedFooterSlot || /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
137
138
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
138
- numberOfLines: 1,
139
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
139
140
  style: [tokens.footerTextStyle, footerTextStyle],
140
141
  children: footerText
141
142
  }), showFooterIcon ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
@@ -88,7 +88,8 @@ function ClusterBubble({
88
88
  circleStyle,
89
89
  style,
90
90
  modes: propModes = _reactUtils.EMPTY_MODES,
91
- accessibilityLabel
91
+ accessibilityLabel,
92
+ disableTruncation
92
93
  }) {
93
94
  const {
94
95
  modes: globalModes
@@ -135,7 +136,7 @@ function ClusterBubble({
135
136
  if (typeof node === 'string' || typeof node === 'number') {
136
137
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
137
138
  style: [baseStyle, override],
138
- numberOfLines: 2,
139
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 2),
139
140
  children: node
140
141
  });
141
142
  }
@@ -9,6 +9,7 @@ var _reactNative = require("react-native");
9
9
  var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
10
10
  var _reactUtils = require("../../utils/react-utils");
11
11
  var _Accordion = _interopRequireDefault(require("../Accordion/Accordion"));
12
+ var _Table = _interopRequireDefault(require("../Table/Table"));
12
13
  var _Image = _interopRequireDefault(require("../Image/Image"));
13
14
  var _IconButton = _interopRequireDefault(require("../IconButton/IconButton"));
14
15
  var _Icon = _interopRequireDefault(require("../../icons/Icon"));
@@ -109,7 +110,8 @@ function CompareTable({
109
110
  addColumnLabel = 'Add a card',
110
111
  maxColumns = 4,
111
112
  modes = _reactUtils.EMPTY_MODES,
112
- style
113
+ style,
114
+ disableTruncation
113
115
  }) {
114
116
  // --- selection card tokens ------------------------------------------------
115
117
  const cardBg = (0, _figmaVariablesResolver.getVariableByName)('selectionCard/background/color', modes) ?? '#ffffff';
@@ -123,6 +125,11 @@ function CompareTable({
123
125
  const cardLabelFontFamily = (0, _figmaVariablesResolver.getVariableByName)('selectionCard/label/fontfamily', modes) ?? 'JioType Var';
124
126
  const cardLabelFontWeight = (0, _figmaVariablesResolver.getVariableByName)('selectionCard/label/fontweight', modes) ?? 700;
125
127
  const imageRadius = (0, _figmaVariablesResolver.getVariableByName)('image/radius', modes) ?? 8;
128
+ // `selectionCard/radius` (Figma node 5568:3487) rounds the card corners.
129
+ // The published token store is still out of sync (the variable resolves to
130
+ // `0` in the design), so the read falls back to `0` and will pick up a
131
+ // rounded value automatically once the store syncs.
132
+ const cardRadius = (0, _figmaVariablesResolver.getVariableByName)('selectionCard/radius', modes) ?? 0;
126
133
 
127
134
  // --- add-a-card icon button tokens ---------------------------------------
128
135
  // padding/size/border come from the shared iconButton tokens; the filled
@@ -132,6 +139,9 @@ function CompareTable({
132
139
  const addBorderSize = (0, _figmaVariablesResolver.getVariableByName)('iconButton/border/size', modes) ?? 1;
133
140
  const addPadding = (0, _figmaVariablesResolver.getVariableByName)('iconButton/padding', modes) ?? 11;
134
141
  const addIconSize = (0, _figmaVariablesResolver.getVariableByName)('iconButton/icon/size', modes) ?? 18;
142
+ // `iconButton/radius` is the design-token sentinel `9999` ("perfect
143
+ // circle"), mirroring IconButton's own resolution.
144
+ const addRadius = (0, _figmaVariablesResolver.getVariableByName)('iconButton/radius', modes) ?? 9999;
135
145
  const addBg = ADD_BUTTON_BG;
136
146
  const addIconColor = ADD_BUTTON_ICON_COLOR;
137
147
 
@@ -156,6 +166,8 @@ function CompareTable({
156
166
  const cellPaddingV = (0, _figmaVariablesResolver.getVariableByName)('compareTableCell/padding/vertical', modes) ?? 12;
157
167
  const columnCount = columns.length;
158
168
  const showAddCard = onAddColumn != null && columnCount < maxColumns;
169
+ /** Grid columns shared by the selection-card row and every table row. */
170
+ const gridColumnCount = columnCount + (showAddCard ? 1 : 0);
159
171
  const cardLabelStyle = {
160
172
  ...NO_WRAP_TEXT,
161
173
  color: cardLabelColor,
@@ -190,6 +202,7 @@ function CompareTable({
190
202
  minWidth: 0,
191
203
  minHeight: 147,
192
204
  backgroundColor: cardBg,
205
+ borderRadius: cardRadius,
193
206
  alignItems: 'center',
194
207
  justifyContent: 'center',
195
208
  gap: cardGap,
@@ -214,7 +227,7 @@ function CompareTable({
214
227
  accessibilityLabel: column.label
215
228
  }), column.label != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
216
229
  style: cardLabelStyle,
217
- numberOfLines: 2,
230
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 2),
218
231
  children: column.label
219
232
  }), column.actionLabel != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
220
233
  onPress: column.onActionPress,
@@ -251,7 +264,7 @@ function CompareTable({
251
264
  style: {
252
265
  width: addPadding * 2 + addIconSize,
253
266
  height: addPadding * 2 + addIconSize,
254
- borderRadius: 9999,
267
+ borderRadius: addRadius,
255
268
  borderWidth: addBorderSize,
256
269
  borderColor: addBorderColor,
257
270
  backgroundColor: addBg,
@@ -267,7 +280,7 @@ function CompareTable({
267
280
  })
268
281
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
269
282
  style: cardLabelStyle,
270
- numberOfLines: 1,
283
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
271
284
  children: addColumnLabel
272
285
  })]
273
286
  }, "__add_card__");
@@ -290,53 +303,72 @@ function CompareTable({
290
303
  }
291
304
  return (0, _reactUtils.cloneChildrenWithModes)(value, modes);
292
305
  };
293
- const renderTable = section => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
306
+
307
+ // Renders a section's comparison grid using the shared `Table` component.
308
+ // CompareTable keeps ownership of token resolution and passes the resolved
309
+ // values as style overrides so the appearance is byte-identical to the
310
+ // previous hand-rolled grid (full outer border + suppressed last-edge
311
+ // dividers), while reusing Table's structure and `modes` cascade.
312
+ //
313
+ // When the "Add a card" tile is visible, each table row appends an empty
314
+ // trailing cell with the same flex weight so data columns stay 1:1 beneath
315
+ // their selection card.
316
+ const renderTableCell = (content, colIndex, isLastRow, key) => {
317
+ const isLastCol = colIndex === gridColumnCount - 1;
318
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default.Cell, {
319
+ modes: modes,
320
+ flex: 1,
321
+ align: "left",
322
+ isLastColumn: isLastCol,
323
+ isLastRow: isLastRow,
324
+ style: {
325
+ backgroundColor: cellBg,
326
+ borderColor: cellBorderColor,
327
+ borderRightWidth: isLastCol ? 0 : cellBorderSize,
328
+ borderBottomWidth: isLastRow ? 0 : cellBorderSize,
329
+ paddingHorizontal: cellPaddingH,
330
+ paddingVertical: cellPaddingV
331
+ },
332
+ children: content
333
+ }, key);
334
+ };
335
+ const renderTable = section => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Table.default, {
336
+ modes: modes,
294
337
  style: {
295
338
  width: '100%',
296
339
  borderWidth: cellBorderSize,
297
- borderColor: cellBorderColor,
298
- overflow: 'hidden'
340
+ borderColor: cellBorderColor
299
341
  },
300
- children: [section.header != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
342
+ children: [section.header != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default.Header, {
343
+ modes: modes,
301
344
  style: {
302
- backgroundColor: headerBg,
303
- paddingHorizontal: headerPaddingH,
304
- paddingVertical: headerPaddingV,
305
345
  borderBottomWidth: cellBorderSize,
306
346
  borderBottomColor: cellBorderColor
307
347
  },
308
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
309
- style: headerTextStyle,
310
- children: section.header
311
- })
312
- }), section.rows.map((row, rowIndex) => {
313
- const isLastRow = rowIndex === section.rows.length - 1;
314
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
348
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default.HeaderCell, {
349
+ modes: modes,
350
+ flex: 1,
315
351
  style: {
316
- flexDirection: 'row',
317
- width: '100%'
352
+ backgroundColor: headerBg,
353
+ paddingHorizontal: headerPaddingH,
354
+ paddingVertical: headerPaddingV
318
355
  },
319
- children: Array.from({
320
- length: columnCount
321
- }).map((_, colIndex) => {
322
- const isLastCol = colIndex === columnCount - 1;
323
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
324
- style: {
325
- flex: 1,
326
- minWidth: 0,
327
- backgroundColor: cellBg,
328
- justifyContent: 'center',
329
- paddingHorizontal: cellPaddingH,
330
- paddingVertical: cellPaddingV,
331
- borderRightWidth: isLastCol ? 0 : cellBorderSize,
332
- borderRightColor: cellBorderColor,
333
- borderBottomWidth: isLastRow ? 0 : cellBorderSize,
334
- borderBottomColor: cellBorderColor
335
- },
336
- children: renderCellContent(row.values?.[colIndex], `${rowIndex}-${colIndex}`)
337
- }, colIndex);
356
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
357
+ style: headerTextStyle,
358
+ children: section.header
338
359
  })
339
- }, row.key ?? rowIndex);
360
+ })
361
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.default.Body, {
362
+ modes: modes,
363
+ children: section.rows.map((row, rowIndex) => {
364
+ const isLastRow = rowIndex === section.rows.length - 1;
365
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Table.default.Row, {
366
+ modes: modes,
367
+ children: [Array.from({
368
+ length: columnCount
369
+ }).map((_, colIndex) => renderTableCell(renderCellContent(row.values?.[colIndex], `${rowIndex}-${colIndex}`), colIndex, isLastRow, colIndex)), showAddCard && renderTableCell(null, gridColumnCount - 1, isLastRow, '__add_spacer__')]
370
+ }, row.key ?? rowIndex);
371
+ })
340
372
  })]
341
373
  });
342
374
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
@@ -361,9 +393,6 @@ function CompareTable({
361
393
  title: section.title,
362
394
  defaultExpanded: section.defaultExpanded ?? index === 0,
363
395
  modes: modes,
364
- style: {
365
- paddingHorizontal: headerPaddingH
366
- },
367
396
  children: renderTable(section)
368
397
  }, section.key ?? section.title ?? index))
369
398
  })]
@@ -142,7 +142,8 @@ function CoverageBarComparison({
142
142
  chartStyle,
143
143
  legendStyle,
144
144
  labelStyle,
145
- accessibilityLabel
145
+ accessibilityLabel,
146
+ disableTruncation
146
147
  }) {
147
148
  const {
148
149
  modes: globalModes
@@ -228,7 +229,7 @@ function CoverageBarComparison({
228
229
  minWidth: 1
229
230
  },
230
231
  children: [hasLabel ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
231
- numberOfLines: 1,
232
+ ...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
232
233
  style: [computedLabelStyle, labelStyle],
233
234
  children: original.label
234
235
  }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(BarShape, {