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
@@ -3,8 +3,9 @@
3
3
  import React from 'react';
4
4
  import { View, Text, Pressable, Platform } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
6
+ import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils';
7
7
  import Accordion from '../Accordion/Accordion';
8
+ import Table from '../Table/Table';
8
9
  import Image from '../Image/Image';
9
10
  import IconButton from '../IconButton/IconButton';
10
11
  import Icon from '../../icons/Icon';
@@ -104,7 +105,8 @@ function CompareTable({
104
105
  addColumnLabel = 'Add a card',
105
106
  maxColumns = 4,
106
107
  modes = EMPTY_MODES,
107
- style
108
+ style,
109
+ disableTruncation
108
110
  }) {
109
111
  // --- selection card tokens ------------------------------------------------
110
112
  const cardBg = getVariableByName('selectionCard/background/color', modes) ?? '#ffffff';
@@ -118,6 +120,11 @@ function CompareTable({
118
120
  const cardLabelFontFamily = getVariableByName('selectionCard/label/fontfamily', modes) ?? 'JioType Var';
119
121
  const cardLabelFontWeight = getVariableByName('selectionCard/label/fontweight', modes) ?? 700;
120
122
  const imageRadius = getVariableByName('image/radius', modes) ?? 8;
123
+ // `selectionCard/radius` (Figma node 5568:3487) rounds the card corners.
124
+ // The published token store is still out of sync (the variable resolves to
125
+ // `0` in the design), so the read falls back to `0` and will pick up a
126
+ // rounded value automatically once the store syncs.
127
+ const cardRadius = getVariableByName('selectionCard/radius', modes) ?? 0;
121
128
 
122
129
  // --- add-a-card icon button tokens ---------------------------------------
123
130
  // padding/size/border come from the shared iconButton tokens; the filled
@@ -127,6 +134,9 @@ function CompareTable({
127
134
  const addBorderSize = getVariableByName('iconButton/border/size', modes) ?? 1;
128
135
  const addPadding = getVariableByName('iconButton/padding', modes) ?? 11;
129
136
  const addIconSize = getVariableByName('iconButton/icon/size', modes) ?? 18;
137
+ // `iconButton/radius` is the design-token sentinel `9999` ("perfect
138
+ // circle"), mirroring IconButton's own resolution.
139
+ const addRadius = getVariableByName('iconButton/radius', modes) ?? 9999;
130
140
  const addBg = ADD_BUTTON_BG;
131
141
  const addIconColor = ADD_BUTTON_ICON_COLOR;
132
142
 
@@ -151,6 +161,8 @@ function CompareTable({
151
161
  const cellPaddingV = getVariableByName('compareTableCell/padding/vertical', modes) ?? 12;
152
162
  const columnCount = columns.length;
153
163
  const showAddCard = onAddColumn != null && columnCount < maxColumns;
164
+ /** Grid columns shared by the selection-card row and every table row. */
165
+ const gridColumnCount = columnCount + (showAddCard ? 1 : 0);
154
166
  const cardLabelStyle = {
155
167
  ...NO_WRAP_TEXT,
156
168
  color: cardLabelColor,
@@ -185,6 +197,7 @@ function CompareTable({
185
197
  minWidth: 0,
186
198
  minHeight: 147,
187
199
  backgroundColor: cardBg,
200
+ borderRadius: cardRadius,
188
201
  alignItems: 'center',
189
202
  justifyContent: 'center',
190
203
  gap: cardGap,
@@ -209,7 +222,7 @@ function CompareTable({
209
222
  accessibilityLabel: column.label
210
223
  }), column.label != null && /*#__PURE__*/_jsx(Text, {
211
224
  style: cardLabelStyle,
212
- numberOfLines: 2,
225
+ ...resolveTruncation(disableTruncation, 2),
213
226
  children: column.label
214
227
  }), column.actionLabel != null && /*#__PURE__*/_jsx(Pressable, {
215
228
  onPress: column.onActionPress,
@@ -246,7 +259,7 @@ function CompareTable({
246
259
  style: {
247
260
  width: addPadding * 2 + addIconSize,
248
261
  height: addPadding * 2 + addIconSize,
249
- borderRadius: 9999,
262
+ borderRadius: addRadius,
250
263
  borderWidth: addBorderSize,
251
264
  borderColor: addBorderColor,
252
265
  backgroundColor: addBg,
@@ -262,7 +275,7 @@ function CompareTable({
262
275
  })
263
276
  }), /*#__PURE__*/_jsx(Text, {
264
277
  style: cardLabelStyle,
265
- numberOfLines: 1,
278
+ ...resolveTruncation(disableTruncation, 1),
266
279
  children: addColumnLabel
267
280
  })]
268
281
  }, "__add_card__");
@@ -285,53 +298,72 @@ function CompareTable({
285
298
  }
286
299
  return cloneChildrenWithModes(value, modes);
287
300
  };
288
- const renderTable = section => /*#__PURE__*/_jsxs(View, {
301
+
302
+ // Renders a section's comparison grid using the shared `Table` component.
303
+ // CompareTable keeps ownership of token resolution and passes the resolved
304
+ // values as style overrides so the appearance is byte-identical to the
305
+ // previous hand-rolled grid (full outer border + suppressed last-edge
306
+ // dividers), while reusing Table's structure and `modes` cascade.
307
+ //
308
+ // When the "Add a card" tile is visible, each table row appends an empty
309
+ // trailing cell with the same flex weight so data columns stay 1:1 beneath
310
+ // their selection card.
311
+ const renderTableCell = (content, colIndex, isLastRow, key) => {
312
+ const isLastCol = colIndex === gridColumnCount - 1;
313
+ return /*#__PURE__*/_jsx(Table.Cell, {
314
+ modes: modes,
315
+ flex: 1,
316
+ align: "left",
317
+ isLastColumn: isLastCol,
318
+ isLastRow: isLastRow,
319
+ style: {
320
+ backgroundColor: cellBg,
321
+ borderColor: cellBorderColor,
322
+ borderRightWidth: isLastCol ? 0 : cellBorderSize,
323
+ borderBottomWidth: isLastRow ? 0 : cellBorderSize,
324
+ paddingHorizontal: cellPaddingH,
325
+ paddingVertical: cellPaddingV
326
+ },
327
+ children: content
328
+ }, key);
329
+ };
330
+ const renderTable = section => /*#__PURE__*/_jsxs(Table, {
331
+ modes: modes,
289
332
  style: {
290
333
  width: '100%',
291
334
  borderWidth: cellBorderSize,
292
- borderColor: cellBorderColor,
293
- overflow: 'hidden'
335
+ borderColor: cellBorderColor
294
336
  },
295
- children: [section.header != null && /*#__PURE__*/_jsx(View, {
337
+ children: [section.header != null && /*#__PURE__*/_jsx(Table.Header, {
338
+ modes: modes,
296
339
  style: {
297
- backgroundColor: headerBg,
298
- paddingHorizontal: headerPaddingH,
299
- paddingVertical: headerPaddingV,
300
340
  borderBottomWidth: cellBorderSize,
301
341
  borderBottomColor: cellBorderColor
302
342
  },
303
- children: /*#__PURE__*/_jsx(Text, {
304
- style: headerTextStyle,
305
- children: section.header
306
- })
307
- }), section.rows.map((row, rowIndex) => {
308
- const isLastRow = rowIndex === section.rows.length - 1;
309
- return /*#__PURE__*/_jsx(View, {
343
+ children: /*#__PURE__*/_jsx(Table.HeaderCell, {
344
+ modes: modes,
345
+ flex: 1,
310
346
  style: {
311
- flexDirection: 'row',
312
- width: '100%'
347
+ backgroundColor: headerBg,
348
+ paddingHorizontal: headerPaddingH,
349
+ paddingVertical: headerPaddingV
313
350
  },
314
- children: Array.from({
315
- length: columnCount
316
- }).map((_, colIndex) => {
317
- const isLastCol = colIndex === columnCount - 1;
318
- return /*#__PURE__*/_jsx(View, {
319
- style: {
320
- flex: 1,
321
- minWidth: 0,
322
- backgroundColor: cellBg,
323
- justifyContent: 'center',
324
- paddingHorizontal: cellPaddingH,
325
- paddingVertical: cellPaddingV,
326
- borderRightWidth: isLastCol ? 0 : cellBorderSize,
327
- borderRightColor: cellBorderColor,
328
- borderBottomWidth: isLastRow ? 0 : cellBorderSize,
329
- borderBottomColor: cellBorderColor
330
- },
331
- children: renderCellContent(row.values?.[colIndex], `${rowIndex}-${colIndex}`)
332
- }, colIndex);
351
+ children: /*#__PURE__*/_jsx(Text, {
352
+ style: headerTextStyle,
353
+ children: section.header
333
354
  })
334
- }, row.key ?? rowIndex);
355
+ })
356
+ }), /*#__PURE__*/_jsx(Table.Body, {
357
+ modes: modes,
358
+ children: section.rows.map((row, rowIndex) => {
359
+ const isLastRow = rowIndex === section.rows.length - 1;
360
+ return /*#__PURE__*/_jsxs(Table.Row, {
361
+ modes: modes,
362
+ children: [Array.from({
363
+ length: columnCount
364
+ }).map((_, colIndex) => renderTableCell(renderCellContent(row.values?.[colIndex], `${rowIndex}-${colIndex}`), colIndex, isLastRow, colIndex)), showAddCard && renderTableCell(null, gridColumnCount - 1, isLastRow, '__add_spacer__')]
365
+ }, row.key ?? rowIndex);
366
+ })
335
367
  })]
336
368
  });
337
369
  return /*#__PURE__*/_jsxs(View, {
@@ -356,9 +388,6 @@ function CompareTable({
356
388
  title: section.title,
357
389
  defaultExpanded: section.defaultExpanded ?? index === 0,
358
390
  modes: modes,
359
- style: {
360
- paddingHorizontal: headerPaddingH
361
- },
362
391
  children: renderTable(section)
363
392
  }, section.key ?? section.title ?? index))
364
393
  })]
@@ -5,7 +5,7 @@ import { View, Text } from 'react-native';
5
5
  import Svg, { Rect } from 'react-native-svg';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
7
7
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
8
- import { EMPTY_MODES } from '../../utils/react-utils';
8
+ import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils';
9
9
  import MetricLegendItem from '../MetricLegendItem/MetricLegendItem';
10
10
 
11
11
  /**
@@ -136,7 +136,8 @@ function CoverageBarComparison({
136
136
  chartStyle,
137
137
  legendStyle,
138
138
  labelStyle,
139
- accessibilityLabel
139
+ accessibilityLabel,
140
+ disableTruncation
140
141
  }) {
141
142
  const {
142
143
  modes: globalModes
@@ -222,7 +223,7 @@ function CoverageBarComparison({
222
223
  minWidth: 1
223
224
  },
224
225
  children: [hasLabel ? /*#__PURE__*/_jsx(Text, {
225
- numberOfLines: 1,
226
+ ...resolveTruncation(disableTruncation, 1),
226
227
  style: [computedLabelStyle, labelStyle],
227
228
  children: original.label
228
229
  }) : null, /*#__PURE__*/_jsx(BarShape, {
@@ -5,7 +5,7 @@ import { StyleSheet, Text, View } from 'react-native';
5
5
  import Svg, { Circle } from 'react-native-svg';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
7
7
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
8
- import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils';
8
+ import { EMPTY_MODES, flattenChildren, resolveTruncation } from '../../utils/react-utils';
9
9
 
10
10
  /**
11
11
  * Per-segment data definition for the data-driven `segments` prop.
@@ -126,7 +126,8 @@ function DonutChart({
126
126
  style,
127
127
  valueStyle,
128
128
  labelStyle,
129
- accessibilityLabel
129
+ accessibilityLabel,
130
+ disableTruncation
130
131
  }) {
131
132
  const {
132
133
  modes: globalModes
@@ -224,7 +225,7 @@ function DonutChart({
224
225
  fontWeight: valueFontWeight,
225
226
  textAlign: 'center'
226
227
  }, valueStyle],
227
- numberOfLines: 1,
228
+ ...resolveTruncation(disableTruncation, 1),
228
229
  children: value
229
230
  }) : null, showLabel ? /*#__PURE__*/_jsx(Text, {
230
231
  style: [{
@@ -235,7 +236,7 @@ function DonutChart({
235
236
  fontWeight: labelFontWeight,
236
237
  textAlign: 'center'
237
238
  }, labelStyle],
238
- numberOfLines: 1,
239
+ ...resolveTruncation(disableTruncation, 1),
239
240
  children: label
240
241
  }) : null]
241
242
  }) : null]
@@ -4,7 +4,7 @@ import React, { useCallback, useMemo, useState } from 'react';
4
4
  import { Platform, Pressable, ScrollView, Text, View } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils';
8
8
  import Icon from '../../icons/Icon';
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  const IS_WEB = Platform.OS === 'web';
@@ -61,7 +61,8 @@ export function DropdownItem({
61
61
  style,
62
62
  labelStyle,
63
63
  accessibilityLabel,
64
- accessibilityHint
64
+ accessibilityHint,
65
+ disableTruncation
65
66
  }) {
66
67
  const {
67
68
  modes: globalModes
@@ -130,7 +131,7 @@ export function DropdownItem({
130
131
  ...a11yProps,
131
132
  children: [processedLeading, children != null ? children : /*#__PURE__*/_jsx(Text, {
132
133
  style: [textStyle, labelStyle],
133
- numberOfLines: 1,
134
+ ...resolveTruncation(disableTruncation, 1),
134
135
  children: label
135
136
  }), customTrailing, showDefaultCheck && /*#__PURE__*/_jsx(Icon, {
136
137
  name: "ic_confirm",
@@ -5,7 +5,7 @@ import { Dimensions, Modal, Platform, Pressable, StyleSheet, Text, View } from '
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
7
7
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
8
- import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils';
8
+ import { EMPTY_MODES, flattenChildren, resolveTruncation } from '../../utils/react-utils';
9
9
  import Icon from '../../icons/Icon';
10
10
  import SupportText from '../SupportText/SupportText';
11
11
  import Dropdown, { DropdownItem } from '../Dropdown/Dropdown';
@@ -155,7 +155,8 @@ const DropdownInput = /*#__PURE__*/forwardRef(function DropdownInput({
155
155
  accessibilityLabel,
156
156
  accessibilityHint,
157
157
  onFocus,
158
- onBlur
158
+ onBlur,
159
+ disableTruncation
159
160
  }, ref) {
160
161
  // ---------------- Modes ----------------
161
162
  const {
@@ -542,7 +543,7 @@ const DropdownInput = /*#__PURE__*/forwardRef(function DropdownInput({
542
543
  style: [valueTextStyle, !hasValue && {
543
544
  color: placeholderColor
544
545
  }],
545
- numberOfLines: 1,
546
+ ...resolveTruncation(disableTruncation, 1),
546
547
  children: displayLabel
547
548
  }), /*#__PURE__*/_jsx(View, {
548
549
  accessibilityElementsHidden: true,
@@ -58,6 +58,7 @@ function ExpandableCheckbox({
58
58
  readMoreLabel = 'Read more',
59
59
  readLessLabel = 'Read less',
60
60
  collapsedLines = 1,
61
+ disableTruncation = false,
61
62
  modes = EMPTY_MODES,
62
63
  style,
63
64
  labelStyle,
@@ -130,7 +131,7 @@ function ExpandableCheckbox({
130
131
  }), [modes]);
131
132
  const a11yLabel = accessibilityLabel ?? (typeof label === 'string' ? label : undefined);
132
133
  const buttonLabel = isExpanded ? readLessLabel : readMoreLabel;
133
- const labelNumberOfLinesProps = !isExpanded && collapsedLines > 0 ? {
134
+ const labelNumberOfLinesProps = !disableTruncation && !isExpanded && collapsedLines > 0 ? {
134
135
  numberOfLines: collapsedLines,
135
136
  ellipsizeMode: 'tail'
136
137
  } : null;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
 
3
- import React, { forwardRef, useCallback, useMemo, useState } from 'react';
4
- import { View, Text, TextInput as RNTextInput } from 'react-native';
3
+ import React, { forwardRef, useCallback, useMemo, useRef, useState } from 'react';
4
+ import { Platform, View, Text, TextInput as RNTextInput } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, cloneChildrenWithModes, mergeRefs } from '../../utils/react-utils';
8
+ import { useWebOutsidePress } from '../../utils/web-platform-utils';
8
9
  import SupportText from '../SupportText/SupportText';
9
10
  import Icon from '../../icons/Icon';
10
11
  import { useFormContext } from '../Form/Form';
@@ -202,6 +203,21 @@ const FormField = /*#__PURE__*/forwardRef(function FormField({
202
203
  const [isFocused, setIsFocused] = useState(false);
203
204
  const interactive = !isDisabled && !isReadOnly;
204
205
 
206
+ // Internal handles so we can (a) imperatively blur the input and (b) detect
207
+ // outside presses. The forwarded `ref` is merged in below, so the public
208
+ // ref API (focus/blur/clear/isFocused) is unchanged for consumers.
209
+ const inputRef = useRef(null);
210
+ const rootRef = useRef(null);
211
+ // Stable merged ref so React doesn't detach/reattach (and momentarily null
212
+ // `inputRef.current`) on every render.
213
+ const mergedInputRef = useMemo(() => mergeRefs(inputRef, ref), [ref]);
214
+
215
+ // Web: pressing an INTERACTIVE element outside the field (Button, link,
216
+ // another pressable) often does not move DOM focus, so the native `blur`
217
+ // never fires and the field stays visually "Active". Force a blur on any
218
+ // outside pointer press while focused. No-op on native.
219
+ useWebOutsidePress(rootRef, useCallback(() => inputRef.current?.blur(), []), isFocused);
220
+
205
221
  // FormField States cascade — error > read only/disabled > active (focused) > idle.
206
222
  // Disabled maps to "Read Only" since there is no dedicated disabled mode and
207
223
  // the visual treatment is closest. This is only the DEFAULT — an explicit
@@ -284,7 +300,30 @@ const FormField = /*#__PURE__*/forwardRef(function FormField({
284
300
  color: tokens.inputTextColor,
285
301
  fontFamily: tokens.inputFontFamily,
286
302
  fontSize: tokens.inputFontSize,
287
- lineHeight: tokens.inputLineHeight,
303
+ // ⚠️ DO NOT change to an unconditional `lineHeight: tokens.inputLineHeight`.
304
+ // This has regressed twice — read this before "simplifying" it.
305
+ //
306
+ // `inputLineHeight` comes from the Figma token `formField/input/label`
307
+ // ("16/45"), which is a 16px font inside a 45px ROW, i.e. it is the row
308
+ // HEIGHT, not the text leading. The row height is already applied via
309
+ // `inputRowStyle.minHeight` + `alignItems: 'center'`, so the text never
310
+ // needs this value as its own `lineHeight`.
311
+ //
312
+ // Passing a `lineHeight` (45) that is much larger than `fontSize` (16)
313
+ // onto a single-line RNTextInput breaks ONLY iOS: iOS puts ALL the extra
314
+ // vertical space ABOVE the glyphs, so the text/placeholder sinks to the
315
+ // bottom of the box instead of centering. Android and Web distribute the
316
+ // space evenly and look correct. This is a long-standing iOS native
317
+ // font-metrics bug in UITextField — see facebook/react-native#39145 and
318
+ // #28012; the documented workaround is exactly "drop lineHeight on the
319
+ // single-line input and let a wrapper center it". A single-line UITextField
320
+ // with no lineHeight centers its text natively (see react-native#56774).
321
+ //
322
+ // So: omit lineHeight on iOS (native centering via the row), and keep the
323
+ // token value on Android/Web where it already renders correctly.
324
+ ...(Platform.OS === 'ios' ? null : {
325
+ lineHeight: tokens.inputLineHeight
326
+ }),
288
327
  fontWeight: tokens.inputFontWeight,
289
328
  padding: 0,
290
329
  margin: 0,
@@ -321,6 +360,7 @@ const FormField = /*#__PURE__*/forwardRef(function FormField({
321
360
  // -- Accessibility ------------------------------------------------------
322
361
  const resolvedA11yLabel = accessibilityLabel || label || placeholder || 'Form field';
323
362
  return /*#__PURE__*/_jsxs(View, {
363
+ ref: rootRef,
324
364
  style: [wrapperStyle, style],
325
365
  pointerEvents: isDisabled ? 'none' : 'auto',
326
366
  testID: testID,
@@ -341,7 +381,7 @@ const FormField = /*#__PURE__*/forwardRef(function FormField({
341
381
  importantForAccessibility: "no",
342
382
  children: processedLeading
343
383
  }), /*#__PURE__*/_jsx(RNTextInput, {
344
- ref: ref,
384
+ ref: mergedInputRef,
345
385
  style: [inputTextStyles, inputTextStyle],
346
386
  value: value ?? '',
347
387
  onChangeText: handleChangeText,
@@ -35,7 +35,7 @@ const toFontWeight = (value, fallback) => {
35
35
  };
36
36
  const getStrokeColor = (style, fallback) => {
37
37
  const flattened = StyleSheet.flatten(style);
38
- return typeof flattened.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
38
+ return flattened && typeof flattened.backgroundColor === 'string' ? flattened.backgroundColor : fallback;
39
39
  };
40
40
  function Gauge({
41
41
  value = 84,
@@ -4,7 +4,7 @@ import React from 'react';
4
4
  import { View, Text, Pressable, Image } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import Radio from '../Radio/Radio';
7
- import { EMPTY_MODES } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils';
8
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  const GRID_COLUMNS = 3;
10
10
  const GRID_COLUMN_GAP = 12;
@@ -34,7 +34,8 @@ export default function HoldingsCard({
34
34
  onPress,
35
35
  modes = EMPTY_MODES,
36
36
  style,
37
- testID
37
+ testID,
38
+ disableTruncation
38
39
  }) {
39
40
  // ---- Container tokens ----
40
41
  const containerFill = getVariableByName('holdingsCard/container/fill', modes) || '#fef4e5';
@@ -186,7 +187,7 @@ export default function HoldingsCard({
186
187
  lineHeight: detailValueLineHeight,
187
188
  fontWeight: detailValueFontWeight
188
189
  },
189
- numberOfLines: 1,
190
+ ...resolveTruncation(disableTruncation, 1),
190
191
  children: item.value
191
192
  })]
192
193
  }, `${rowIndex}-${colIndex}`)), row.length < GRID_COLUMNS && Array.from({
@@ -4,7 +4,7 @@ import React, { useMemo } from 'react';
4
4
  import { Text, View } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils';
8
8
  import MediaSource from '../../utils/MediaSource';
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  // Default avatar asset (shared with the Avatar component) so that
@@ -82,6 +82,7 @@ function InstitutionBadge({
82
82
  style,
83
83
  labelStyle,
84
84
  accessibilityLabel,
85
+ disableTruncation,
85
86
  ...rest
86
87
  }) {
87
88
  const {
@@ -118,7 +119,7 @@ function InstitutionBadge({
118
119
  })
119
120
  }), /*#__PURE__*/_jsx(Text, {
120
121
  style: [tokens.labelStyle, labelStyle],
121
- numberOfLines: 1,
122
+ ...resolveTruncation(disableTruncation, 1),
122
123
  children: label
123
124
  })]
124
125
  });
@@ -8,7 +8,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
8
8
  * Helper function to recursively clone children and pass modes prop to components that accept it.
9
9
  * This ensures that all child components in slots receive the modes prop from the parent.
10
10
  */
11
- import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils';
11
+ import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren, resolveTruncation } from '../../utils/react-utils';
12
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
13
  /**
14
14
  * ListGroup component that mirrors the Figma "List Group" component.
@@ -43,6 +43,7 @@ function ListGroup({
43
43
  style,
44
44
  accessibilityLabel,
45
45
  accessibilityHint,
46
+ disableTruncation,
46
47
  ...rest
47
48
  }) {
48
49
  // Resolve container tokens
@@ -95,7 +96,7 @@ function ListGroup({
95
96
  style: [labelStyle, processedSlot && {
96
97
  marginBottom: gap
97
98
  }],
98
- numberOfLines: 1,
99
+ ...resolveTruncation(disableTruncation, 1),
99
100
  accessibilityElementsHidden: true,
100
101
  importantForAccessibility: "no",
101
102
  children: label
@@ -5,7 +5,7 @@ import { View, Text, Pressable, Platform } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import NavArrow from '../NavArrow/NavArrow';
7
7
  import { usePressableWebSupport } from '../../utils/web-platform-utils';
8
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
8
+ import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils';
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  // ---------------------------------------------------------------------------
11
11
  // Module-scope constants — never re-allocated per render.
@@ -185,6 +185,7 @@ function ListItemImpl({
185
185
  accessibilityHint,
186
186
  accessibilityState,
187
187
  webAccessibilityProps,
188
+ disableTruncation,
188
189
  ...rest
189
190
  }) {
190
191
  const tokens = useMemo(() => resolveListItemTokens(modes), [modes]);
@@ -239,7 +240,7 @@ function ListItemImpl({
239
240
  const displayText = layout === 'Vertical' ? supportText.replace(/ /g, '\n') : supportText;
240
241
  return /*#__PURE__*/_jsx(Text, {
241
242
  style: layout === 'Vertical' ? [tokens.supportTextStyle, verticalSupportTextOverride] : tokens.supportTextStyle,
242
- numberOfLines: layout === 'Horizontal' ? 2 : undefined,
243
+ ...resolveTruncation(disableTruncation, layout === 'Horizontal' ? 2 : undefined),
243
244
  children: displayText
244
245
  });
245
246
  };
@@ -272,7 +273,7 @@ function ListItemImpl({
272
273
  },
273
274
  children: [/*#__PURE__*/_jsx(Text, {
274
275
  style: tokens.titleTextStyle,
275
- numberOfLines: 1,
276
+ ...resolveTruncation(disableTruncation, 1),
276
277
  children: title
277
278
  }), showSupportText && renderSupportContent()]
278
279
  }), processedTrailing ? /*#__PURE__*/_jsx(View, {
@@ -4,7 +4,7 @@ import React, { createContext, useContext } from 'react';
4
4
  import { View, Text, StyleSheet } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import Image from '../Image/Image';
7
- import GlassFill from './GlassFill';
7
+ import GlassFill from '../../utils/GlassFill/GlassFill';
8
8
  import { EMPTY_MODES } from '../../utils/react-utils';
9
9
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  const MediaCardContext = /*#__PURE__*/createContext({});
@@ -186,7 +186,9 @@ export function Footer({
186
186
  children: [/*#__PURE__*/_jsx(GlassFill, {
187
187
  tint: tint,
188
188
  intensity: intensity,
189
- overlayColor: glassBgColor
189
+ overlayColor: glassBgColor,
190
+ webBlurScale: 0.3,
191
+ webBlurMaxPx: 30
190
192
  }), /*#__PURE__*/_jsx(View, {
191
193
  style: {
192
194
  flexDirection: 'row',
@@ -3,7 +3,7 @@
3
3
  import React from 'react';
4
4
  import { View, Text } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
- import { EMPTY_MODES } from '../../utils/react-utils';
6
+ import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils';
7
7
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
8
  /**
9
9
  * MetricLegendItem renders a horizontal row consisting of a small colored
@@ -22,7 +22,8 @@ function MetricLegendItem({
22
22
  style,
23
23
  indicatorStyle,
24
24
  labelStyle,
25
- valueStyle
25
+ valueStyle,
26
+ disableTruncation
26
27
  }) {
27
28
  const gap = getVariableByName('metricLegendItem/gap', modes) ?? 4;
28
29
  const textWrapGap = getVariableByName('metricLegendItem/textWrap/gap', modes) ?? 4;
@@ -87,7 +88,7 @@ function MetricLegendItem({
87
88
  lineHeight: valueLineHeight,
88
89
  fontWeight: valueFontWeight
89
90
  }, valueStyle],
90
- numberOfLines: 1,
91
+ ...resolveTruncation(disableTruncation, 1),
91
92
  children: value
92
93
  })]
93
94
  })]
@@ -4,7 +4,7 @@ import React from 'react';
4
4
  import { View, Text } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
6
  import { useTokens } from '../../design-tokens/JFSThemeProvider';
7
- import { EMPTY_MODES } from '../../utils/react-utils';
7
+ import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils';
8
8
  import MetricLegendItem from '../MetricLegendItem/MetricLegendItem';
9
9
 
10
10
  /**
@@ -75,7 +75,8 @@ function CalendarGlyph({
75
75
  modes: propModes = EMPTY_MODES,
76
76
  style,
77
77
  labelStyle,
78
- accessibilityLabel
78
+ accessibilityLabel,
79
+ disableTruncation
79
80
  }) {
80
81
  const {
81
82
  modes: globalModes
@@ -120,7 +121,7 @@ function CalendarGlyph({
120
121
  gap
121
122
  }, style],
122
123
  children: /*#__PURE__*/_jsx(Text, {
123
- numberOfLines: 1,
124
+ ...resolveTruncation(disableTruncation, 1),
124
125
  style: [{
125
126
  color: foreground,
126
127
  fontFamily,
@@ -182,7 +183,8 @@ function MonthlyStatusGrid({
182
183
  glyphStyle,
183
184
  labelStyle,
184
185
  legendStyle,
185
- accessibilityLabel
186
+ accessibilityLabel,
187
+ disableTruncation
186
188
  }) {
187
189
  const {
188
190
  modes: globalModes
@@ -239,6 +241,7 @@ function MonthlyStatusGrid({
239
241
  label: label,
240
242
  status: month.status,
241
243
  modes: glyphModes,
244
+ disableTruncation: disableTruncation,
242
245
  ...(glyphStyle !== undefined ? {
243
246
  style: glyphStyle
244
247
  } : {}),