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.
- package/CHANGELOG.md +16 -0
- package/lib/commonjs/components/Accordion/Accordion.js +2 -1
- package/lib/commonjs/components/AccordionCheckbox/AccordionCheckbox.js +4 -3
- package/lib/commonjs/components/AccountCard/AccountCard.js +4 -3
- package/lib/commonjs/components/AllocationComparisonChart/AllocationComparisonChart.js +9 -6
- package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +11 -7
- package/lib/commonjs/components/Badge/Badge.js +47 -8
- package/lib/commonjs/components/BrandChip/BrandChip.js +3 -3
- package/lib/commonjs/components/Button/Button.js +2 -1
- package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +2 -1
- package/lib/commonjs/components/CardBankAccount/CardBankAccount.js +3 -2
- package/lib/commonjs/components/CardCTA/CardCTA.js +197 -27
- package/lib/commonjs/components/CardInsight/CardInsight.js +5 -1
- package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +7 -3
- package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +3 -2
- package/lib/commonjs/components/CircularRating/CircularRating.js +2 -1
- package/lib/commonjs/components/ClusterBubble/ClusterBubble.js +3 -2
- package/lib/commonjs/components/CompareTable/CompareTable.js +72 -43
- package/lib/commonjs/components/CoverageBarComparison/CoverageBarComparison.js +3 -2
- package/lib/commonjs/components/DonutChart/DonutChart.js +4 -3
- package/lib/commonjs/components/Dropdown/Dropdown.js +3 -2
- package/lib/commonjs/components/DropdownInput/DropdownInput.js +3 -2
- package/lib/commonjs/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/commonjs/components/FormField/FormField.js +42 -2
- package/lib/commonjs/components/Gauge/Gauge.js +1 -1
- package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +3 -2
- package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +2 -1
- package/lib/commonjs/components/ListGroup/ListGroup.js +2 -1
- package/lib/commonjs/components/ListItem/ListItem.js +3 -2
- package/lib/commonjs/components/MediaCard/MediaCard.js +4 -2
- package/lib/commonjs/components/MetricLegendItem/MetricLegendItem.js +3 -2
- package/lib/commonjs/components/MonthlyStatusGrid/MonthlyStatusGrid.js +6 -3
- package/lib/commonjs/components/PoweredByLabel/PoweredByLabel.js +3 -2
- package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +107 -33
- package/lib/commonjs/components/ProductOverview/ProductOverview.js +4 -3
- package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +2 -2
- package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +3 -2
- package/lib/commonjs/components/Section/Section.js +3 -2
- package/lib/commonjs/components/Slider/Slider.js +3 -2
- package/lib/commonjs/components/Stack/Stack.js +86 -0
- package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/commonjs/components/SummaryTile/SummaryTile.js +3 -2
- package/lib/commonjs/components/Table/Table.js +324 -0
- package/lib/commonjs/components/Text/Text.js +2 -1
- package/lib/commonjs/components/TextInput/TextInput.js +9 -1
- package/lib/commonjs/components/TextSegment/TextSegment.js +2 -1
- package/lib/commonjs/components/ThreadHero/ThreadHero.js +4 -5
- package/lib/commonjs/components/Title/Title.js +2 -1
- package/lib/commonjs/components/Toast/Toast.js +3 -2
- package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +2 -1
- package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +3 -2
- package/lib/commonjs/components/UpiHandle/UpiHandle.js +2 -2
- package/lib/commonjs/components/index.js +44 -0
- package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/commonjs/design-tokens/figma-modes.generated.js +1 -0
- package/lib/commonjs/icons/registry.js +1 -1
- package/lib/commonjs/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.js +11 -3
- package/lib/commonjs/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.js +8 -4
- package/lib/commonjs/utils/react-utils.js +56 -0
- package/lib/commonjs/utils/web-platform-utils.js +59 -0
- package/lib/module/components/Accordion/Accordion.js +3 -2
- package/lib/module/components/AccordionCheckbox/AccordionCheckbox.js +5 -4
- package/lib/module/components/AccountCard/AccountCard.js +5 -4
- package/lib/module/components/AllocationComparisonChart/AllocationComparisonChart.js +10 -7
- package/lib/module/components/AreaLineChart/AreaLineChart.js +12 -8
- package/lib/module/components/Badge/Badge.js +49 -10
- package/lib/module/components/BrandChip/BrandChip.js +4 -4
- package/lib/module/components/Button/Button.js +3 -2
- package/lib/module/components/CardAdvisory/CardAdvisory.js +3 -2
- package/lib/module/components/CardBankAccount/CardBankAccount.js +4 -3
- package/lib/module/components/CardCTA/CardCTA.js +198 -28
- package/lib/module/components/CardInsight/CardInsight.js +5 -1
- package/lib/module/components/CircularProgressBar/CircularProgressBar.js +8 -4
- package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +4 -3
- package/lib/module/components/CircularRating/CircularRating.js +3 -2
- package/lib/module/components/ClusterBubble/ClusterBubble.js +4 -3
- package/lib/module/components/CompareTable/CompareTable.js +73 -44
- package/lib/module/components/CoverageBarComparison/CoverageBarComparison.js +4 -3
- package/lib/module/components/DonutChart/DonutChart.js +5 -4
- package/lib/module/components/Dropdown/Dropdown.js +4 -3
- package/lib/module/components/DropdownInput/DropdownInput.js +4 -3
- package/lib/module/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/module/components/FormField/FormField.js +45 -5
- package/lib/module/components/Gauge/Gauge.js +1 -1
- package/lib/module/components/HoldingsCard/HoldingsCard.js +4 -3
- package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -2
- package/lib/module/components/ListGroup/ListGroup.js +3 -2
- package/lib/module/components/ListItem/ListItem.js +4 -3
- package/lib/module/components/MediaCard/MediaCard.js +4 -2
- package/lib/module/components/MetricLegendItem/MetricLegendItem.js +4 -3
- package/lib/module/components/MonthlyStatusGrid/MonthlyStatusGrid.js +7 -4
- package/lib/module/components/PoweredByLabel/PoweredByLabel.js +4 -3
- package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +109 -35
- package/lib/module/components/ProductOverview/ProductOverview.js +5 -4
- package/lib/module/components/ProgressBadge/ProgressBadge.js +3 -3
- package/lib/module/components/ProjectionMarker/ProjectionMarker.js +4 -3
- package/lib/module/components/Section/Section.js +4 -3
- package/lib/module/components/Slider/Slider.js +4 -3
- package/lib/module/components/Stack/Stack.js +81 -0
- package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/module/components/SummaryTile/SummaryTile.js +4 -3
- package/lib/module/components/Table/Table.js +315 -0
- package/lib/module/components/Text/Text.js +3 -2
- package/lib/module/components/TextInput/TextInput.js +9 -1
- package/lib/module/components/TextSegment/TextSegment.js +3 -2
- package/lib/module/components/ThreadHero/ThreadHero.js +5 -6
- package/lib/module/components/Title/Title.js +3 -2
- package/lib/module/components/Toast/Toast.js +4 -3
- package/lib/module/components/TransactionBubble/TransactionBubble.js +3 -2
- package/lib/module/components/TransactionStatus/TransactionStatus.js +4 -3
- package/lib/module/components/UpiHandle/UpiHandle.js +3 -3
- package/lib/module/components/index.js +2 -0
- package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/module/design-tokens/figma-modes.generated.js +1 -0
- package/lib/module/icons/registry.js +1 -1
- package/lib/module/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.js +11 -3
- package/lib/module/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.js +8 -4
- package/lib/module/utils/react-utils.js +54 -0
- package/lib/module/utils/web-platform-utils.js +58 -0
- package/lib/typescript/src/components/Accordion/Accordion.d.ts +7 -1
- package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +7 -1
- package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +7 -1
- package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +8 -1
- package/lib/typescript/src/components/Badge/Badge.d.ts +32 -2
- package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +7 -1
- package/lib/typescript/src/components/Button/Button.d.ts +7 -1
- package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +7 -1
- package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +7 -1
- package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +27 -5
- package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +7 -1
- package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +7 -1
- package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +7 -1
- package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +7 -1
- package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +7 -1
- package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +7 -1
- package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +7 -1
- package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +7 -1
- package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +6 -0
- package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +7 -1
- package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +7 -1
- package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +7 -1
- package/lib/typescript/src/components/ListItem/ListItem.d.ts +7 -1
- package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +7 -1
- package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +14 -2
- package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +7 -1
- package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +7 -1
- package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +7 -1
- package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +7 -1
- package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +7 -1
- package/lib/typescript/src/components/Section/Section.d.ts +7 -1
- package/lib/typescript/src/components/Slider/Slider.d.ts +6 -0
- package/lib/typescript/src/components/Stack/Stack.d.ts +81 -0
- package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +7 -1
- package/lib/typescript/src/components/Table/Table.d.ts +139 -0
- package/lib/typescript/src/components/Text/Text.d.ts +7 -1
- package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +7 -1
- package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +7 -1
- package/lib/typescript/src/components/Title/Title.d.ts +7 -1
- package/lib/typescript/src/components/Toast/Toast.d.ts +7 -1
- package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +7 -1
- package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +7 -1
- package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +7 -1
- package/lib/typescript/src/components/index.d.ts +4 -2
- package/lib/typescript/src/icons/registry.d.ts +1 -1
- package/lib/typescript/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.d.ts +31 -3
- package/lib/typescript/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.d.ts +18 -2
- package/lib/typescript/src/utils/react-utils.d.ts +37 -0
- package/lib/typescript/src/utils/web-platform-utils.d.ts +36 -0
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.tsx +9 -2
- package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +10 -3
- package/src/components/AccountCard/AccountCard.tsx +10 -3
- package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +14 -4
- package/src/components/AreaLineChart/AreaLineChart.tsx +15 -5
- package/src/components/Badge/Badge.tsx +78 -8
- package/src/components/BrandChip/BrandChip.tsx +9 -3
- package/src/components/Button/Button.tsx +9 -2
- package/src/components/CardAdvisory/CardAdvisory.tsx +9 -2
- package/src/components/CardBankAccount/CardBankAccount.tsx +9 -2
- package/src/components/CardCTA/CardCTA.tsx +214 -41
- package/src/components/CardInsight/CardInsight.tsx +7 -1
- package/src/components/CircularProgressBar/CircularProgressBar.tsx +14 -4
- package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +10 -3
- package/src/components/CircularRating/CircularRating.tsx +9 -2
- package/src/components/ClusterBubble/ClusterBubble.tsx +9 -2
- package/src/components/CompareTable/CompareTable.tsx +98 -50
- package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +9 -2
- package/src/components/DonutChart/DonutChart.tsx +10 -3
- package/src/components/Dropdown/Dropdown.tsx +9 -2
- package/src/components/DropdownInput/DropdownInput.tsx +9 -2
- package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +8 -1
- package/src/components/FormField/FormField.tsx +49 -4
- package/src/components/Gauge/Gauge.tsx +1 -1
- package/src/components/HoldingsCard/HoldingsCard.tsx +9 -2
- package/src/components/InstitutionBadge/InstitutionBadge.tsx +9 -2
- package/src/components/ListGroup/ListGroup.tsx +9 -2
- package/src/components/ListItem/ListItem.tsx +10 -3
- package/src/components/MediaCard/MediaCard.tsx +2 -2
- package/src/components/MetricLegendItem/MetricLegendItem.tsx +9 -2
- package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +17 -2
- package/src/components/PoweredByLabel/PoweredByLabel.tsx +9 -2
- package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +104 -37
- package/src/components/ProductOverview/ProductOverview.tsx +10 -3
- package/src/components/ProgressBadge/ProgressBadge.tsx +9 -3
- package/src/components/ProjectionMarker/ProjectionMarker.tsx +9 -2
- package/src/components/Section/Section.tsx +10 -3
- package/src/components/Slider/Slider.tsx +9 -2
- package/src/components/Stack/Stack.tsx +131 -0
- package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -1
- package/src/components/SummaryTile/SummaryTile.tsx +9 -2
- package/src/components/Table/Table.tsx +449 -0
- package/src/components/Text/Text.tsx +9 -2
- package/src/components/TextInput/TextInput.tsx +7 -1
- package/src/components/TextSegment/TextSegment.tsx +9 -2
- package/src/components/ThreadHero/ThreadHero.tsx +10 -3
- package/src/components/Title/Title.tsx +9 -2
- package/src/components/Toast/Toast.tsx +9 -2
- package/src/components/TransactionBubble/TransactionBubble.tsx +9 -2
- package/src/components/TransactionStatus/TransactionStatus.tsx +9 -2
- package/src/components/UpiHandle/UpiHandle.tsx +9 -3
- package/src/components/index.ts +23 -2
- package/src/design-tokens/Coin Variables-variables-full.json +1 -1
- package/src/design-tokens/figma-modes.generated.ts +1 -0
- package/src/icons/registry.ts +1 -1
- package/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.tsx +32 -3
- package/src/{components/ProductMerchandisingCard → utils/GlassFill}/GlassFill.web.tsx +25 -4
- package/src/utils/react-utils.ts +61 -0
- package/src/utils/web-platform-utils.ts +68 -0
- package/lib/commonjs/components/MediaCard/GlassFill.js +0 -62
- package/lib/commonjs/components/MediaCard/GlassFill.web.js +0 -48
- package/lib/module/components/MediaCard/GlassFill.js +0 -57
- package/lib/module/components/MediaCard/GlassFill.web.js +0 -43
- package/lib/typescript/src/components/MediaCard/GlassFill.d.ts +0 -47
- package/lib/typescript/src/components/MediaCard/GlassFill.web.d.ts +0 -20
- package/src/components/MediaCard/GlassFill.tsx +0 -89
- 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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
312
|
-
|
|
347
|
+
backgroundColor: headerBg,
|
|
348
|
+
paddingHorizontal: headerPaddingH,
|
|
349
|
+
paddingVertical: headerPaddingV
|
|
313
350
|
},
|
|
314
|
-
children:
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
} : {}),
|