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