jfs-components 0.1.28 → 0.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +28 -2
  2. package/lib/commonjs/components/CategoryCard/CategoryCard.js +264 -0
  3. package/lib/commonjs/components/CompareTable/CompareTable.js +247 -25
  4. package/lib/commonjs/components/ContentSheet/ContentSheet.js +91 -8
  5. package/lib/commonjs/components/CounterBadge/CounterBadge.js +78 -0
  6. package/lib/commonjs/components/FavoriteToggle/FavoriteToggle.js +180 -0
  7. package/lib/commonjs/components/HelloJioInput/HelloJioInput.js +287 -0
  8. package/lib/commonjs/components/MoneyValue/MoneyValue.js +179 -54
  9. package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +7 -1
  10. package/lib/commonjs/components/Table/Table.js +27 -7
  11. package/lib/commonjs/components/ValueBackMetric/ValueBackMetric.js +219 -0
  12. package/lib/commonjs/components/index.js +35 -0
  13. package/lib/commonjs/design-tokens/figma-modes.generated.js +3 -0
  14. package/lib/commonjs/icons/registry.js +1 -1
  15. package/lib/module/components/CategoryCard/CategoryCard.js +258 -0
  16. package/lib/module/components/CompareTable/CompareTable.js +247 -26
  17. package/lib/module/components/ContentSheet/ContentSheet.js +94 -11
  18. package/lib/module/components/CounterBadge/CounterBadge.js +73 -0
  19. package/lib/module/components/FavoriteToggle/FavoriteToggle.js +174 -0
  20. package/lib/module/components/HelloJioInput/HelloJioInput.js +281 -0
  21. package/lib/module/components/MoneyValue/MoneyValue.js +182 -57
  22. package/lib/module/components/PdpCcCard/PdpCcCard.js +7 -1
  23. package/lib/module/components/Table/Table.js +27 -7
  24. package/lib/module/components/ValueBackMetric/ValueBackMetric.js +214 -0
  25. package/lib/module/components/index.js +6 -1
  26. package/lib/module/design-tokens/figma-modes.generated.js +3 -0
  27. package/lib/module/icons/registry.js +1 -1
  28. package/lib/typescript/src/components/CategoryCard/CategoryCard.d.ts +72 -0
  29. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +36 -1
  30. package/lib/typescript/src/components/ContentSheet/ContentSheet.d.ts +20 -1
  31. package/lib/typescript/src/components/CounterBadge/CounterBadge.d.ts +19 -0
  32. package/lib/typescript/src/components/FavoriteToggle/FavoriteToggle.d.ts +66 -0
  33. package/lib/typescript/src/components/HelloJioInput/HelloJioInput.d.ts +111 -0
  34. package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +10 -1
  35. package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +25 -1
  36. package/lib/typescript/src/components/Table/Table.d.ts +9 -1
  37. package/lib/typescript/src/components/ValueBackMetric/ValueBackMetric.d.ts +86 -0
  38. package/lib/typescript/src/components/index.d.ts +5 -0
  39. package/lib/typescript/src/icons/registry.d.ts +1 -1
  40. package/package.json +1 -1
  41. package/src/components/CategoryCard/CategoryCard.tsx +404 -0
  42. package/src/components/CompareTable/CompareTable.tsx +324 -30
  43. package/src/components/ContentSheet/ContentSheet.tsx +120 -11
  44. package/src/components/CounterBadge/CounterBadge.tsx +95 -0
  45. package/src/components/FavoriteToggle/FavoriteToggle.tsx +243 -0
  46. package/src/components/HelloJioInput/HelloJioInput.tsx +513 -0
  47. package/src/components/MoneyValue/MoneyValue.tsx +216 -65
  48. package/src/components/PdpCcCard/PdpCcCard.tsx +36 -1
  49. package/src/components/Table/Table.tsx +29 -4
  50. package/src/components/ValueBackMetric/ValueBackMetric.tsx +298 -0
  51. package/src/components/index.ts +5 -0
  52. package/src/design-tokens/figma-modes.generated.ts +3 -0
  53. package/src/icons/registry.ts +1 -1
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
10
+ var _reactUtils = require("../../utils/react-utils");
11
+ var _Icon = _interopRequireDefault(require("../Icon/Icon"));
12
+ var _Link = _interopRequireDefault(require("../Link/Link"));
13
+ var _jsxRuntime = require("react/jsx-runtime");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const TITLE_LINE_HEIGHT_RATIO = 1.2;
16
+ const VALUE_LINE_HEIGHT_RATIO = 1.2;
17
+ const CAPTION_LINE_HEIGHT_RATIO = 1.5;
18
+
19
+ // The Figma node binds the header-icon size and the per-part font sizes/weights
20
+ // to `valueBackMetric/*` variables, but those tokens are NOT in the committed
21
+ // variables snapshot (`npm run tokens -- find valueBackMetric` → no matches).
22
+ // They also intentionally differ from the `metricdata/*` typography defaults
23
+ // (e.g. `metricdata/value` resolves to 20px/700, whereas this component's value
24
+ // is 16px/500). So the sizes/weights below are encoded as literal constants
25
+ // matching the Figma design exactly. Colours, gaps and padding DO exist as real
26
+ // `metricdata/*` tokens (and match the design), so those resolve through
27
+ // `getVariableByName` and stay themeable.
28
+ const TITLE_FONT_SIZE = 12;
29
+ const TITLE_FONT_WEIGHT = '500';
30
+ const VALUE_FONT_SIZE = 16;
31
+ const VALUE_FONT_WEIGHT = '500';
32
+ const CAPTION_FONT_SIZE = 12;
33
+ const CAPTION_FONT_WEIGHT = '400';
34
+ const FONT_FAMILY = 'JioType Var';
35
+ const CARD_BACKGROUND = '#ffffff';
36
+ const CARD_MIN_HEIGHT = 82;
37
+ const ICON_SIZE = 18;
38
+ // Figma renders the header glyph flush (all `icon/padding/*` tokens are 0); the
39
+ // shared Icon pulls padding from those tokens, so mirror MetricData and zero it
40
+ // explicitly to keep the icon flush against the title.
41
+ const ICON_PADDING_RESET = {
42
+ paddingLeft: 0,
43
+ paddingRight: 0,
44
+ paddingTop: 0,
45
+ paddingBottom: 0
46
+ };
47
+ /**
48
+ * ValueBackMetric — a compact, left-aligned "value back" card.
49
+ *
50
+ * Stacks a branded header row (icon + `title`, e.g. "JioPoints"), a prominent
51
+ * `value`, a muted `caption`, and an optional bottom `linkLabel` (e.g. "Earn").
52
+ * `value`, `caption` and `linkLabel` each render only when provided; the header
53
+ * (icon + title) always shows.
54
+ *
55
+ * Colours, gaps and padding resolve from the `metricdata/*` tokens; the header
56
+ * glyph from the `icon/*` tokens (default 18px gold); the link entirely from
57
+ * the `link/*` + `text/foreground` tokens via the shared {@link Link}, with
58
+ * `Text Appearance: Secondary` and `Text Sizes: Small` seeded so it renders
59
+ * purple at 12px like the design (caller `modes` win). The per-part font
60
+ * sizes/weights come from the Figma `valueBackMetric/*` variables, which are
61
+ * not yet in the committed token snapshot, so they are encoded as constants
62
+ * matching the design.
63
+ *
64
+ * @example
65
+ * ```tsx
66
+ * <ValueBackMetric
67
+ * title="JioPoints"
68
+ * value="Value"
69
+ * caption="Earn 10 point with UPI"
70
+ * linkLabel="Earn"
71
+ * onPress={() => navigation.navigate('ValueBack')}
72
+ * onLinkPress={() => navigation.navigate('EarnPoints')}
73
+ * />
74
+ * ```
75
+ */
76
+ function ValueBackMetric({
77
+ icon = 'ic_rupee_coin',
78
+ title = 'JioPoints',
79
+ value,
80
+ caption,
81
+ linkLabel,
82
+ onLinkPress,
83
+ onPress,
84
+ disabled,
85
+ modes = _reactUtils.EMPTY_MODES,
86
+ style,
87
+ titleStyle,
88
+ valueStyle,
89
+ captionStyle,
90
+ accessibilityLabel
91
+ }) {
92
+ const titleColor = (0, _figmaVariablesResolver.getVariableByName)('metricdata/title/color', modes) ?? '#000000';
93
+ const valueColor = (0, _figmaVariablesResolver.getVariableByName)('metricdata/value/color', modes) ?? '#000000';
94
+ const captionColor = (0, _figmaVariablesResolver.getVariableByName)('metricdata/caption/color', modes) ?? '#777777';
95
+ // The design's link is purple (`text/foreground` under `Text Appearance:
96
+ // Secondary`) at 12px (`link/fontSize` under `Text Sizes: Small`), while the
97
+ // header icon keeps the default gold `icon/color`. Seed only the link's
98
+ // modes; caller-supplied modes win.
99
+ const linkModes = _react.default.useMemo(() => ({
100
+ 'Text Appearance': 'Secondary',
101
+ 'Text Sizes': 'Small',
102
+ ...modes
103
+ }), [modes]);
104
+
105
+ // The header glyph is token-driven: `icon/color` (gold by default, retinted
106
+ // via `AppearanceBrand`) and `icon/size` (18px). Passing them explicitly — as
107
+ // MetricData does — makes the glyph deterministic instead of relying on the
108
+ // shared Icon's internal token lookups.
109
+ const iconColor = (0, _figmaVariablesResolver.getVariableByName)('icon/color', modes) ?? '#ad8444';
110
+ const iconSize = (0, _figmaVariablesResolver.getVariableByName)('icon/size', modes) ?? ICON_SIZE;
111
+ const gap = (0, _figmaVariablesResolver.getVariableByName)('metricdata/gap', modes) ?? 4;
112
+ const valueWrapGap = (0, _figmaVariablesResolver.getVariableByName)('metricdata/valueWrap/gap', modes) ?? 4;
113
+ const paddingHorizontal = (0, _figmaVariablesResolver.getVariableByName)('metricdata/padding/horizontal', modes) ?? 10;
114
+ const paddingVertical = (0, _figmaVariablesResolver.getVariableByName)('metricdata/padding/vertical', modes) ?? 10;
115
+ const containerStyle = {
116
+ flexDirection: 'column',
117
+ alignItems: 'flex-start',
118
+ justifyContent: 'center',
119
+ gap,
120
+ paddingHorizontal,
121
+ paddingVertical,
122
+ minHeight: CARD_MIN_HEIGHT,
123
+ backgroundColor: CARD_BACKGROUND
124
+ };
125
+ const titleTextStyle = {
126
+ color: titleColor,
127
+ fontFamily: FONT_FAMILY,
128
+ fontSize: TITLE_FONT_SIZE,
129
+ fontWeight: TITLE_FONT_WEIGHT,
130
+ lineHeight: TITLE_FONT_SIZE * TITLE_LINE_HEIGHT_RATIO
131
+ };
132
+ const valueTextStyle = {
133
+ color: valueColor,
134
+ fontFamily: FONT_FAMILY,
135
+ fontSize: VALUE_FONT_SIZE,
136
+ fontWeight: VALUE_FONT_WEIGHT,
137
+ lineHeight: VALUE_FONT_SIZE * VALUE_LINE_HEIGHT_RATIO
138
+ };
139
+ const captionTextStyle = {
140
+ color: captionColor,
141
+ fontFamily: FONT_FAMILY,
142
+ fontSize: CAPTION_FONT_SIZE,
143
+ fontWeight: CAPTION_FONT_WEIGHT,
144
+ lineHeight: CAPTION_FONT_SIZE * CAPTION_LINE_HEIGHT_RATIO
145
+ };
146
+
147
+ // Mirrors the Figma swap slot, whose preferred instances are `Icon` and
148
+ // `Image`. A registry name renders the token-driven `Icon` (18px, gold,
149
+ // flush — all from the `icon/*` tokens); a custom node (`<Icon/>`,
150
+ // `<Image/>`, anything) renders as-is with `modes` cascaded into it, so an
151
+ // Icon instance follows the icon tokens while an Image keeps its own sizing.
152
+ const iconNode = icon == null ? null : typeof icon === 'string' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
153
+ iconName: icon,
154
+ size: iconSize,
155
+ color: iconColor,
156
+ modes: modes,
157
+ style: ICON_PADDING_RESET
158
+ }) : (0, _reactUtils.cloneChildrenWithModes)(icon, modes);
159
+ const hasValue = value !== undefined && value !== null && value !== '';
160
+ const hasCaption = caption !== undefined && caption !== '';
161
+ const resolvedLabel = accessibilityLabel ?? ([title, typeof value === 'string' ? value : undefined, caption, linkLabel].filter(Boolean).join(', ') || undefined);
162
+ const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
163
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
164
+ style: {
165
+ flexDirection: 'row',
166
+ alignItems: 'center',
167
+ gap: valueWrapGap
168
+ },
169
+ children: [iconNode, title !== undefined && title !== '' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
170
+ style: [titleTextStyle, titleStyle],
171
+ children: title
172
+ }) : null]
173
+ }), hasValue || hasCaption ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
174
+ style: {
175
+ flexDirection: 'column',
176
+ alignItems: 'flex-start',
177
+ gap: 4
178
+ },
179
+ children: [hasValue ? typeof value === 'string' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
180
+ style: [valueTextStyle, valueStyle],
181
+ children: value
182
+ }) : value : null, hasCaption ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
183
+ style: [captionTextStyle, captionStyle],
184
+ children: caption
185
+ }) : null]
186
+ }) : null, linkLabel ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
187
+ text: linkLabel,
188
+ autolayout: "Hug",
189
+ modes: linkModes,
190
+ ...(onLinkPress ? {
191
+ onPress: onLinkPress
192
+ } : null)
193
+ }) : null]
194
+ });
195
+ if (onPress) {
196
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
197
+ style: [containerStyle, style],
198
+ onPress: onPress,
199
+ disabled: disabled,
200
+ accessibilityRole: "button",
201
+ ...(resolvedLabel !== undefined ? {
202
+ accessibilityLabel: resolvedLabel
203
+ } : null),
204
+ accessibilityState: {
205
+ disabled: !!disabled
206
+ },
207
+ children: content
208
+ });
209
+ }
210
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
211
+ style: [containerStyle, style],
212
+ accessible: true,
213
+ ...(resolvedLabel !== undefined ? {
214
+ accessibilityLabel: resolvedLabel
215
+ } : null),
216
+ children: content
217
+ });
218
+ }
219
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(ValueBackMetric);
@@ -207,6 +207,12 @@ Object.defineProperty(exports, "CarouselCardAccounts", {
207
207
  return _CarouselCardAccounts.default;
208
208
  }
209
209
  });
210
+ Object.defineProperty(exports, "CategoryCard", {
211
+ enumerable: true,
212
+ get: function () {
213
+ return _CategoryCard.default;
214
+ }
215
+ });
210
216
  Object.defineProperty(exports, "CcCard", {
211
217
  enumerable: true,
212
218
  get: function () {
@@ -285,6 +291,12 @@ Object.defineProperty(exports, "ContentSheet", {
285
291
  return _ContentSheet.default;
286
292
  }
287
293
  });
294
+ Object.defineProperty(exports, "CounterBadge", {
295
+ enumerable: true,
296
+ get: function () {
297
+ return _CounterBadge.default;
298
+ }
299
+ });
288
300
  Object.defineProperty(exports, "CoverageBarComparison", {
289
301
  enumerable: true,
290
302
  get: function () {
@@ -369,6 +381,12 @@ Object.defineProperty(exports, "ExpandableCheckbox", {
369
381
  return _ExpandableCheckbox.default;
370
382
  }
371
383
  });
384
+ Object.defineProperty(exports, "FavoriteToggle", {
385
+ enumerable: true,
386
+ get: function () {
387
+ return _FavoriteToggle.default;
388
+ }
389
+ });
372
390
  Object.defineProperty(exports, "FilterBar", {
373
391
  enumerable: true,
374
392
  get: function () {
@@ -417,6 +435,12 @@ Object.defineProperty(exports, "HStack", {
417
435
  return _HStack.default;
418
436
  }
419
437
  });
438
+ Object.defineProperty(exports, "HelloJioInput", {
439
+ enumerable: true,
440
+ get: function () {
441
+ return _HelloJioInput.default;
442
+ }
443
+ });
420
444
  Object.defineProperty(exports, "HeroSection", {
421
445
  enumerable: true,
422
446
  get: function () {
@@ -987,6 +1011,12 @@ Object.defineProperty(exports, "VStack", {
987
1011
  return _VStack.default;
988
1012
  }
989
1013
  });
1014
+ Object.defineProperty(exports, "ValueBackMetric", {
1015
+ enumerable: true,
1016
+ get: function () {
1017
+ return _ValueBackMetric.default;
1018
+ }
1019
+ });
990
1020
  Object.defineProperty(exports, "addToast", {
991
1021
  enumerable: true,
992
1022
  get: function () {
@@ -1053,6 +1083,7 @@ var _CardFeedback = _interopRequireDefault(require("./CardFeedback/CardFeedback"
1053
1083
  var _CardFinancialCondition = _interopRequireDefault(require("./CardFinancialCondition/CardFinancialCondition"));
1054
1084
  var _CardInsight = _interopRequireDefault(require("./CardInsight/CardInsight"));
1055
1085
  var _CcCard = _interopRequireDefault(require("./CcCard/CcCard"));
1086
+ var _CategoryCard = _interopRequireDefault(require("./CategoryCard/CategoryCard"));
1056
1087
  var _Disclaimer = _interopRequireDefault(require("./Disclaimer/Disclaimer"));
1057
1088
  var _Divider = _interopRequireDefault(require("./Divider/Divider"));
1058
1089
  var _Drawer = _interopRequireDefault(require("./Drawer/Drawer"));
@@ -1079,6 +1110,7 @@ var _AllocationComparisonChart = _interopRequireDefault(require("./AllocationCom
1079
1110
  var _MonthlyStatusGrid = _interopRequireWildcard(require("./MonthlyStatusGrid/MonthlyStatusGrid"));
1080
1111
  var _Gauge = _interopRequireDefault(require("./Gauge/Gauge"));
1081
1112
  var _HeroSection = _interopRequireDefault(require("./HeroSection/HeroSection"));
1113
+ var _HelloJioInput = _interopRequireDefault(require("./HelloJioInput/HelloJioInput"));
1082
1114
  var _HoldingsCard = _interopRequireDefault(require("./HoldingsCard/HoldingsCard"));
1083
1115
  var _HStack = _interopRequireDefault(require("./HStack/HStack"));
1084
1116
  var _Icon = _interopRequireDefault(require("./Icon/Icon"));
@@ -1182,5 +1214,8 @@ var _SegmentedControl = _interopRequireDefault(require("./SegmentedControl/Segme
1182
1214
  var _Toggle = _interopRequireDefault(require("./Toggle/Toggle"));
1183
1215
  var _AutoplayControl = _interopRequireDefault(require("./AutoplayControl/AutoplayControl"));
1184
1216
  var _NumberPagination = _interopRequireDefault(require("./NumberPagination/NumberPagination"));
1217
+ var _CounterBadge = _interopRequireDefault(require("./CounterBadge/CounterBadge"));
1218
+ var _FavoriteToggle = _interopRequireDefault(require("./FavoriteToggle/FavoriteToggle"));
1219
+ var _ValueBackMetric = _interopRequireDefault(require("./ValueBackMetric/ValueBackMetric"));
1185
1220
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
1186
1221
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -325,6 +325,7 @@ const FIGMA_COMPONENT_MODES = exports.FIGMA_COMPONENT_MODES = {
325
325
  "CardProviderInfo": ["AppearanceBrand", "Avatar Size", "Badge Size", "Color Mode", "context 10", "Context4", "Profile Card Appearance"],
326
326
  "Carousel": ["peekOffset"],
327
327
  "CarouselCardAccounts": ["peekOffset"],
328
+ "CategoryCard": ["AppearanceBrand", "Badge Size", "Color Mode", "Emphasis", "Radius"],
328
329
  "CcCard": ["AppearanceBrand", "AppearanceSystem", "Avatar Size", "Badge Size", "Button / Size", "Button / State", "Color Mode", "Context", "context 10", "context 8", "Context2", "Context4", "context5", "context7", "Emphasis", "List Item Style", "ListItem State", "NavArrow Direction", "Page type", "Profile Card Appearance", "Radius", "Selectable", "Semantic Intent", "Text Appearance", "Text Sizes", "Weight"],
329
330
  "Checkbox": ["Color Mode"],
330
331
  "CheckboxGroup": ["Color Mode"],
@@ -354,6 +355,7 @@ const FIGMA_COMPONENT_MODES = exports.FIGMA_COMPONENT_MODES = {
354
355
  "FullscreenModal": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Color Mode", "Context", "context 10", "context5", "Emphasis", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
355
356
  "Gauge": ["AppearanceBrand", "AppearanceSystem", "Color Mode", "FormField States", "Semantic Intent", "Status"],
356
357
  "Grid": ["Background", "Color Mode", "Context", "Padding", "Page type", "Slot gap"],
358
+ "HelloJioInput": ["AppearanceBrand", "Button / Size", "Button / State", "Color Mode", "Emphasis"],
357
359
  "HeroSection": ["AppearanceBrand", "Button / Size", "Button / State", "Color Mode", "context 9", "context7", "Emphasis", "FormField States", "InputState", "Page type", "Status"],
358
360
  "HoldingsCard": ["AppearanceBrand", "Color Mode"],
359
361
  "HStack": ["Context", "Padding", "Page type", "Slot gap"],
@@ -422,6 +424,7 @@ const FIGMA_COMPONENT_MODES = exports.FIGMA_COMPONENT_MODES = {
422
424
  "TransactionBubble": ["Color Mode", "context 10", "Context2", "Context3", "context5", "List Item Style", "NavArrow Direction", "Page type", "Profile Card Appearance", "Transaction Status"],
423
425
  "TransactionStatus": ["Transaction Status"],
424
426
  "UpiHandle": ["Color Mode", "context 10", "Profile Card Appearance", "UPI Handle Image"],
427
+ "ValueBackMetric": ["AppearanceBrand", "Badge Size", "Color Mode", "Context", "context 10", "Context4", "Emphasis", "Profile Card Appearance", "Text Appearance", "Text Sizes", "Weight"],
425
428
  "VStack": ["Context", "Padding", "Page type", "Slot gap"]
426
429
  };
427
430