jfs-components 0.1.54 → 0.1.56

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 (30) hide show
  1. package/.cursor/D2C-SCREEN.md +2 -1
  2. package/.cursor/commands/D2C.md +2 -1
  3. package/CHANGELOG.md +11 -0
  4. package/lib/commonjs/components/ButtonGroup/ButtonGroup.js +16 -26
  5. package/lib/commonjs/components/CardCTA/CardCTA.js +36 -12
  6. package/lib/commonjs/components/Carousel/Carousel.js +33 -13
  7. package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +1 -1
  8. package/lib/commonjs/design-tokens/figma-modes.generated.js +10 -9
  9. package/lib/commonjs/icons/registry.js +1 -1
  10. package/lib/commonjs/utils/react-utils.js +4 -1
  11. package/lib/module/components/ButtonGroup/ButtonGroup.js +17 -27
  12. package/lib/module/components/CardCTA/CardCTA.js +36 -12
  13. package/lib/module/components/Carousel/Carousel.js +33 -13
  14. package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +1 -1
  15. package/lib/module/design-tokens/figma-modes.generated.js +10 -9
  16. package/lib/module/icons/registry.js +1 -1
  17. package/lib/module/utils/react-utils.js +4 -1
  18. package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +5 -5
  19. package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +14 -1
  20. package/lib/typescript/src/components/Carousel/Carousel.d.ts +30 -2
  21. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +1 -0
  22. package/lib/typescript/src/icons/registry.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/src/components/ButtonGroup/ButtonGroup.tsx +22 -24
  25. package/src/components/CardCTA/CardCTA.tsx +66 -20
  26. package/src/components/Carousel/Carousel.tsx +67 -12
  27. package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +1 -1
  28. package/src/design-tokens/figma-modes.generated.ts +10 -9
  29. package/src/icons/registry.ts +1 -1
  30. package/src/utils/react-utils.ts +8 -1
@@ -69,8 +69,11 @@ function cloneChildrenWithModes(children, modes, forcedModes) {
69
69
  } : modes;
70
70
  let processedChildren;
71
71
  if (hasChildren) {
72
+ // Descendants inherit this child's merged modes, not the ancestor's
73
+ // raw modes — so nested containers (e.g. ButtonGroup Neutral inside
74
+ // a CardCTA slot that injects Secondary) can cascade correctly.
72
75
  const childArray = _react.default.Children.toArray(childChildren);
73
- const processed = cloneChildrenWithModes(childArray, modes, forcedModes);
76
+ const processed = cloneChildrenWithModes(childArray, mergedModes, forcedModes);
74
77
  processedChildren = processed.length === 1 ? processed[0] : processed;
75
78
  }
76
79
  result.push(/*#__PURE__*/_react.default.cloneElement(child, {
@@ -3,21 +3,21 @@
3
3
  import React from 'react';
4
4
  import { View } from 'react-native';
5
5
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
6
- import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils';
6
+ import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils';
7
7
  import IconButton from '../IconButton/IconButton';
8
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
9
  /**
10
10
  * ButtonGroup component that aggregates multiple buttons (e.g., IconButton)
11
11
  * and handles their layout and styling/theming via design tokens.
12
12
  *
13
- * It passes the provided `modes` to all its immediate React Element children.
14
- * Non-IconButton children (e.g., Button) are automatically stretched to fill
15
- * available space. IconButton children keep their natural width.
13
+ * Group `modes` cascade to every child (and nested slot children). A child's
14
+ * own `modes` still win on conflict. Non-IconButton children (e.g. Button) are
15
+ * stretched to fill available space; IconButton children keep intrinsic width.
16
16
  *
17
17
  * @component
18
18
  * @example
19
19
  * ```jsx
20
- * <ButtonGroup modes={{"Color Mode": "Light"}}>
20
+ * <ButtonGroup modes={{"Color Mode": "Light", AppearanceBrand: "Neutral"}}>
21
21
  * <IconButton iconName="ic_qr_code" />
22
22
  * <Button label="Pay" />
23
23
  * </ButtonGroup>
@@ -28,12 +28,9 @@ function ButtonGroup({
28
28
  modes = EMPTY_MODES,
29
29
  style
30
30
  }) {
31
- // Resolve design tokens
32
31
  const gap = getVariableByName('buttonGroup/gap', modes) ?? 12;
33
32
  const paddingHorizontal = getVariableByName('buttonGroup/padding/horizontal', modes) ?? 0;
34
33
  const paddingVertical = getVariableByName('buttonGroup/padding/vertical', modes) ?? 0;
35
-
36
- // Container style
37
34
  const containerStyle = {
38
35
  flexDirection: 'row',
39
36
  alignItems: 'center',
@@ -41,27 +38,20 @@ function ButtonGroup({
41
38
  paddingHorizontal: paddingHorizontal,
42
39
  paddingVertical: paddingVertical
43
40
  };
44
-
45
- // Flatten children to handle Fragments properly
46
41
  const flatChildren = flattenChildren(children);
47
- const childrenWithModes = React.Children.map(flatChildren, child => {
48
- if (/*#__PURE__*/React.isValidElement(child)) {
49
- const element = child;
50
- const childModes = element.props.modes || {};
51
- const mergedModes = {
52
- ...modes,
53
- ...childModes
54
- };
55
- const isIconButton = element.type === IconButton;
56
- const stretchStyle = isIconButton ? undefined : {
57
- flex: 1
58
- };
59
- return /*#__PURE__*/React.cloneElement(element, {
60
- modes: mergedModes,
61
- style: [stretchStyle, element.props.style]
62
- });
42
+ const cascadedChildren = cloneChildrenWithModes(flatChildren, modes);
43
+ const childrenWithModes = React.Children.map(cascadedChildren, child => {
44
+ if (! /*#__PURE__*/React.isValidElement(child)) {
45
+ return child;
63
46
  }
64
- return child;
47
+ const element = child;
48
+ const isIconButton = element.type === IconButton;
49
+ const stretchStyle = isIconButton ? undefined : {
50
+ flex: 1
51
+ };
52
+ return /*#__PURE__*/React.cloneElement(element, {
53
+ style: [stretchStyle, element.props.style]
54
+ });
65
55
  });
66
56
  return /*#__PURE__*/_jsx(View, {
67
57
  style: [containerStyle, style],
@@ -41,6 +41,8 @@ function CardCTA({
41
41
  onPressButton,
42
42
  ratingLabel = '+28 Rating',
43
43
  showRatingActions = true,
44
+ showButton = true,
45
+ ratingMediaAlign = 'center',
44
46
  onPressLike,
45
47
  onPressDislike,
46
48
  headline = 'Headline',
@@ -127,11 +129,14 @@ function CardCTA({
127
129
  AppearanceBrand: 'Secondary',
128
130
  'Button / Size': 'S'
129
131
  };
132
+ // Rating footer IconButtons are Neutral / S / Low per Figma. Apply those
133
+ // AFTER cascaded modes so card-level AppearanceBrand (often Secondary)
134
+ // cannot override the footer chrome.
130
135
  const iconButtonModes = {
136
+ ...modes,
131
137
  'Button / Size': 'S',
132
- 'Emphasis': 'Low',
133
- 'AppearanceBrand': 'Neutral',
134
- ...modes
138
+ Emphasis: 'Low',
139
+ AppearanceBrand: 'Neutral'
135
140
  };
136
141
  const effectiveButtonLabel = buttonLabel ?? (isRating ? 'Save' : 'Button');
137
142
  const nonWrappingButtonLabel = effectiveButtonLabel.replace(/\s/g, '\u00A0');
@@ -204,7 +209,14 @@ function CardCTA({
204
209
  borderWidth: borderSize,
205
210
  borderColor,
206
211
  flexDirection: isRating || isSip ? 'column' : 'row',
207
- overflow: 'visible'
212
+ overflow: 'visible',
213
+ // Rating cards fill equal-height carousel slots and pin the footer down
214
+ // when free space exists; intrinsic height is unchanged when not stretched.
215
+ ...(isRating ? {
216
+ alignSelf: 'stretch',
217
+ justifyContent: 'space-between',
218
+ flexGrow: 1
219
+ } : {})
208
220
  };
209
221
 
210
222
  // NOTE: `minWidth: 0` + explicit `flexShrink: 1` are required on native.
@@ -353,16 +365,23 @@ function CardCTA({
353
365
  paddingHorizontal: ratingContentPaddingH,
354
366
  paddingVertical: ratingContentPaddingV,
355
367
  gap: ratingContentGap,
356
- alignItems: 'flex-start'
368
+ alignItems: 'flex-start',
369
+ alignSelf: 'stretch'
370
+ };
371
+ const ratingMediaStyle = {
372
+ alignSelf: 'stretch',
373
+ width: '100%',
374
+ alignItems: ratingMediaAlign === 'center' ? 'center' : 'flex-start'
357
375
  };
358
376
  const ratingFooterStyle = {
359
377
  flexDirection: 'row',
360
378
  alignItems: 'flex-start',
361
- justifyContent: 'space-between',
379
+ justifyContent: showButton ? 'space-between' : 'flex-start',
362
380
  paddingHorizontal: ratingFooterPaddingH,
363
381
  paddingTop: ratingFooterPaddingTop,
364
382
  paddingBottom: ratingFooterPaddingBottom,
365
- overflow: 'visible'
383
+ overflow: 'visible',
384
+ alignSelf: 'stretch'
366
385
  };
367
386
  const buttonLabelStyle = {
368
387
  flexGrow: 0,
@@ -446,9 +465,12 @@ function CardCTA({
446
465
  style: [containerStyle, style],
447
466
  children: [/*#__PURE__*/_jsxs(View, {
448
467
  style: ratingContentStyle,
449
- children: [ratingBadgeSlot ? cloneChildrenWithModes(ratingBadgeSlot, modes) : /*#__PURE__*/_jsx(Badge, {
450
- label: ratingLabel,
451
- modes: modes
468
+ children: [/*#__PURE__*/_jsx(View, {
469
+ style: ratingMediaStyle,
470
+ children: ratingBadgeSlot ? cloneChildrenWithModes(ratingBadgeSlot, modes) : /*#__PURE__*/_jsx(Badge, {
471
+ label: ratingLabel,
472
+ modes: modes
473
+ })
452
474
  }), /*#__PURE__*/_jsxs(View, {
453
475
  style: textWrapStyle,
454
476
  children: [/*#__PURE__*/_jsx(Text, {
@@ -461,7 +483,7 @@ function CardCTA({
461
483
  })]
462
484
  }), /*#__PURE__*/_jsxs(View, {
463
485
  style: ratingFooterStyle,
464
- children: [/*#__PURE__*/_jsx(View, {
486
+ children: [showButton ? /*#__PURE__*/_jsx(View, {
465
487
  style: ratingButtonWrapStyle,
466
488
  children: buttonSlot ? cloneChildrenWithModes(buttonSlot, buttonModes) : /*#__PURE__*/_jsx(Button, {
467
489
  label: effectiveButtonLabel,
@@ -470,17 +492,19 @@ function CardCTA({
470
492
  style: ratingButtonStyle,
471
493
  renderContent: renderButtonContent(ratingButtonLabelStyle)
472
494
  })
473
- }), showRatingActions ? ratingActionsSlot ? cloneChildrenWithModes(ratingActionsSlot, iconButtonModes) : /*#__PURE__*/_jsxs(ButtonGroup, {
495
+ }) : null, showRatingActions ? ratingActionsSlot ? cloneChildrenWithModes(ratingActionsSlot, iconButtonModes) : /*#__PURE__*/_jsxs(ButtonGroup, {
474
496
  modes: iconButtonModes,
475
497
  children: [/*#__PURE__*/_jsx(IconButton, {
476
498
  iconName: "ic_like",
477
499
  accessibilityLabel: "Like",
500
+ modes: iconButtonModes,
478
501
  ...(onPressLike ? {
479
502
  onPress: onPressLike
480
503
  } : {})
481
504
  }), /*#__PURE__*/_jsx(IconButton, {
482
505
  iconName: "ic_dislike",
483
506
  accessibilityLabel: "Dislike",
507
+ modes: iconButtonModes,
484
508
  ...(onPressDislike ? {
485
509
  onPress: onPressDislike
486
510
  } : {})
@@ -37,8 +37,12 @@ export function Carousel({
37
37
  loop = true,
38
38
  gap: gapProp,
39
39
  itemWidth: itemWidthProp,
40
+ itemInset,
41
+ bleedHorizontal,
40
42
  paddingHorizontal: paddingHorizontalProp,
41
43
  paddingVertical: paddingVerticalProp,
44
+ equalHeight = true,
45
+ maxHeight: maxHeightProp,
42
46
  type = 'Default',
43
47
  onIndexChange,
44
48
  style
@@ -50,7 +54,7 @@ export function Carousel({
50
54
  const containerPaddingH = parseFloat(getVariableByName('carousel/padding/horizontal', modes));
51
55
  const containerPaddingV = parseFloat(getVariableByName('carousel/padding/vertical', modes));
52
56
  // Outer container max height per Figma (`carousel/maxHeight`).
53
- const maxHeight = parseFloat(getVariableByName('carousel/maxHeight', modes));
57
+ const tokenMaxHeight = parseFloat(getVariableByName('carousel/maxHeight', modes));
54
58
  // Gap between AutoplayControl and NumberPagination in the Numbered overlay.
55
59
  const controlGap = parseFloat(getVariableByName('carouselControl/gap', modes));
56
60
 
@@ -79,15 +83,18 @@ export function Carousel({
79
83
  const items = useMemo(() => React.Children.toArray(children).filter(React.isValidElement), [children]);
80
84
  const totalItems = items.length;
81
85
 
82
- // Effective item width: provided prop, or full container width minus peek offsets.
86
+ // Effective item width: explicit prop, itemInset derivation, or token peek.
83
87
  // For the Numbered variant the items are full-bleed (no peek padding).
84
88
  const effectiveItemWidth = useMemo(() => {
85
89
  if (itemWidthProp != null) return itemWidthProp;
86
90
  if (containerWidth === 0) return 0;
87
91
  if (isNumbered) return containerWidth;
92
+ if (itemInset != null) {
93
+ return Math.max(0, containerWidth - itemInset * 2);
94
+ }
88
95
  // Full-width minus peekOffset on each side
89
96
  return containerWidth - containerPaddingH * 4;
90
- }, [itemWidthProp, containerWidth, containerPaddingH, isNumbered]);
97
+ }, [itemWidthProp, itemInset, containerWidth, containerPaddingH, isNumbered]);
91
98
 
92
99
  // Snap interval = item width + gap
93
100
  const snapInterval = effectiveItemWidth + gap;
@@ -221,14 +228,20 @@ export function Carousel({
221
228
  }, [isPlaying, startAutoPlay, clearAutoPlay]);
222
229
 
223
230
  // ---- Render ----
224
- // Explicit padding props win verbatim; otherwise fall back to the
225
- // token-derived values (horizontal keeps its legacy ×2 "peek" multiplier).
226
- // Numbered variant is full-bleed: zero padding.
227
- const effectivePaddingH = isNumbered ? 0 : paddingHorizontalProp ?? containerPaddingH;
231
+ // Padding priority: Numbered 0; itemInset inset; explicit padding →
232
+ // verbatim; else token (legacy ×2 peek is applied via item width, not here).
233
+ const effectivePaddingH = isNumbered ? 0 : itemInset ?? paddingHorizontalProp ?? containerPaddingH;
228
234
  const effectivePaddingV = isNumbered ? 0 : paddingVerticalProp ?? containerPaddingV;
235
+
236
+ // Equal-height rows hug content — don't clip with the token maxHeight unless
237
+ // the caller opts into a numeric max (or disables equalHeight for legacy strips).
238
+ const resolvedMaxHeight = isNumbered ? undefined : maxHeightProp === false ? undefined : typeof maxHeightProp === 'number' ? maxHeightProp : equalHeight ? undefined : tokenMaxHeight;
229
239
  const outerStyle = {
230
240
  paddingVertical: effectivePaddingV,
231
- maxHeight: isNumbered ? undefined : maxHeight,
241
+ maxHeight: resolvedMaxHeight,
242
+ ...(bleedHorizontal != null ? {
243
+ marginHorizontal: -Math.abs(bleedHorizontal)
244
+ } : {}),
232
245
  // Numbered needs relative positioning for the floating controls overlay.
233
246
  ...(isNumbered ? {
234
247
  overflow: 'hidden'
@@ -237,8 +250,8 @@ export function Carousel({
237
250
  const contentContainerStyle = {
238
251
  paddingHorizontal: effectivePaddingH,
239
252
  gap,
240
- // Align items to the start so snap works correctly
241
- alignItems: 'flex-start'
253
+ // Stretch so every slide matches the tallest (default). Opt out with equalHeight={false}.
254
+ alignItems: equalHeight ? 'stretch' : 'flex-start'
242
255
  };
243
256
  return /*#__PURE__*/_jsx(CarouselContext.Provider, {
244
257
  value: contextValue,
@@ -269,7 +282,10 @@ export function Carousel({
269
282
  flexGrow: 0,
270
283
  flexShrink: 0,
271
284
  flexBasis: effectiveItemWidth > 0 ? effectiveItemWidth : 'auto',
272
- overflow: 'hidden'
285
+ overflow: 'hidden',
286
+ ...(equalHeight ? {
287
+ alignSelf: 'stretch'
288
+ } : {})
273
289
  };
274
290
 
275
291
  // The cloned style forces the child's outer node to also honor the
@@ -278,8 +294,12 @@ export function Carousel({
278
294
  const childOverrideStyle = {
279
295
  width: effectiveItemWidth > 0 ? effectiveItemWidth : undefined,
280
296
  maxWidth: effectiveItemWidth > 0 ? effectiveItemWidth : undefined,
281
- flexGrow: 0,
282
- flexShrink: 0
297
+ flexGrow: equalHeight ? 1 : 0,
298
+ flexShrink: 0,
299
+ ...(equalHeight ? {
300
+ alignSelf: 'stretch',
301
+ height: '100%'
302
+ } : {})
283
303
  };
284
304
 
285
305
  // Pass modes down to children
@@ -71,7 +71,7 @@ function CircularProgressBarDoted({
71
71
  const activeDots = normalizedValue <= 0 ? 0 : Math.ceil(normalizedValue / 100 * resolvedDotCount);
72
72
  const dotShadowSize = toNumber(getVariableByName('circularProgressBarDoted/dot/shadow/size', modes), 6);
73
73
  const baseDotSize = toNumber(getVariableByName('circularProgressBarDoted/dot/size', modes), 6);
74
- const dotSize = baseDotSize + dotShadowSize;
74
+ const dotSize = baseDotSize + dotShadowSize * 2;
75
75
  const outerDotSize = dotSize;
76
76
  const ringSize = layoutSize;
77
77
  const ringRadius = Math.max(0, (ringSize - outerDotSize) / 2);
@@ -198,6 +198,7 @@ export const FIGMA_MODES = {
198
198
  "NavArrow Direction": ["Left&Right", "Top&Bottom"],
199
199
  "NoteInput / Output": ["Default"],
200
200
  "Nudge / Output": ["Default"],
201
+ "Nudge Border Radius ": ["Default", "Pill"],
201
202
  "Nudge padding": ["Default", "None"],
202
203
  "number pagination": ["Default"],
203
204
  "Numpad / Output": ["Default"],
@@ -322,19 +323,19 @@ export const FIGMA_COMPONENT_MODES = {
322
323
  "AvatarGroup": ["Avatar Size", "Badge Size", "Context4"],
323
324
  "Badge": ["AppearanceBrand", "AppearanceSystem", "Badge Size", "Color Mode", "Emphasis", "Semantic Intent"],
324
325
  "Balance": ["Color Mode", "Context3"],
325
- "BenefitCard": ["AppearanceBrand", "AppearanceSystem", "Avatar Size", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Context4", "Emphasis", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap", "Text Appearance", "Text Sizes", "Weight"],
326
+ "BenefitCard": ["AppearanceBrand", "AppearanceSystem", "Avatar Size", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Context4", "Emphasis", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap", "Text Appearance", "Text Sizes", "Weight"],
326
327
  "BottomNav": ["Color Mode"],
327
328
  "BottomNavItem": ["BottomNavItem / State", "Color Mode"],
328
329
  "BrandChip": ["Avatar Size", "Badge Size", "Color Mode", "context 10", "Context4", "Profile Card Appearance"],
329
330
  "BubbleChart": ["Appearance / DataViz", "Color Mode", "Context", "context 10", "Emphasis / DataViz", "Profile Card Appearance", "Text Appearance"],
330
331
  "Button": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent"],
331
332
  "Card": ["AppearanceBrand", "AppearanceSystem", "Card Container", "Color Mode", "context 8", "Gap", "Page type", "Semantic Intent"],
332
- "CardAdvisory": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "circularProgressBar Size", "Color Mode", "Context", "context 10", "Emphasis", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
333
+ "CardAdvisory": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "circularProgressBar Size", "Color Mode", "Context", "context 10", "Emphasis", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
333
334
  "CardBankAccount": ["AppearanceBrand", "AppearanceSystem", "Avatar Size", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Context4", "context5", "Emphasis", "List Item Style", "Page type", "Profile Card Appearance", "Semantic Intent", "Text Appearance", "Text Sizes", "Weight"],
334
335
  "CardCTA": ["AppearanceBrand", "AppearanceSystem", "Avatar Size", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "context 8", "context 9", "Context4", "Emphasis", "Icon Capsule Size", "MediaBlock", "Page type", "Profile Card Appearance", "Semantic Intent"],
335
336
  "CardFeedback": ["AppearanceBrand", "AppearanceSystem", "Color Mode"],
336
- "CardFinancialCondition": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "circularProgressBar Size", "Color Mode", "Context", "context 10", "Emphasis", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
337
- "CardInsight": ["Appearance / DataViz", "AppearanceBrand", "AppearanceSystem", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "context 8", "Emphasis", "Emphasis / DataViz", "LinearProgress Size", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap", "Text Appearance"],
337
+ "CardFinancialCondition": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "circularProgressBar Size", "Color Mode", "Context", "context 10", "Emphasis", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
338
+ "CardInsight": ["Appearance / DataViz", "AppearanceBrand", "AppearanceSystem", "Badge Size", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "context 8", "Emphasis", "Emphasis / DataViz", "LinearProgress Size", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap", "Text Appearance"],
338
339
  "CardProviderInfo": ["AppearanceBrand", "Avatar Size", "Badge Size", "Color Mode", "context 10", "Context4", "Profile Card Appearance"],
339
340
  "Carousel": ["peekOffset"],
340
341
  "CarouselCardAccounts": ["peekOffset"],
@@ -345,7 +346,7 @@ export const FIGMA_COMPONENT_MODES = {
345
346
  "CheckboxItem": ["Color Mode", "Context", "Slot gap"],
346
347
  "ChipSelect": ["ChipSelect State", "Color Mode"],
347
348
  "CircularProgressBar": ["AppearanceBrand", "AppearanceSystem", "circularProgressBar Size", "Color Mode", "Emphasis", "Semantic Intent"],
348
- "CircularRating": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
349
+ "CircularRating": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
349
350
  "ClusterBubble": ["Appearance / DataViz", "Color Mode", "Context", "context 10", "Emphasis / DataViz", "Profile Card Appearance", "Text Appearance"],
350
351
  "CompareTable": ["Accordion States", "AppearanceBrand", "Button / Size", "Button / State", "Color Mode", "Emphasis", "Page type", "Radius"],
351
352
  "ComparisonBar": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Icon Capsule Size", "Page type", "Profile Card Appearance", "Radius", "Semantic Intent"],
@@ -373,7 +374,7 @@ export const FIGMA_COMPONENT_MODES = {
373
374
  "HeroSection": ["AppearanceBrand", "Button / Size", "Button / State", "Color Mode", "context 9", "context7", "Emphasis", "FormField States", "InputState", "Page type", "Status"],
374
375
  "HoldingsCard": ["AppearanceBrand", "Color Mode"],
375
376
  "HStack": ["Context", "Padding", "Page type", "Slot gap", "Stack Context"],
376
- "Icon": ["AppearanceBrand", "AppearanceSystem", "Badge Size", "Color Mode", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent"],
377
+ "Icon": ["AppearanceBrand", "Badge Size", "Color Mode", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent"],
377
378
  "IconButton": ["AppearanceBrand", "Button / Size", "Button / State", "Color Mode", "Emphasis", "Page type"],
378
379
  "IconCapsule": ["AppearanceBrand", "AppearanceSystem", "Color Mode", "Context", "Emphasis", "Icon Capsule Size", "Page type", "Semantic Intent"],
379
380
  "InputSearch": ["Color Mode", "FormField States", "InputState", "Status"],
@@ -388,12 +389,12 @@ export const FIGMA_COMPONENT_MODES = {
388
389
  "MediaCard": ["Contrast Context"],
389
390
  "MerchantProfile": ["Avatar Size", "Badge Size", "Color Mode", "context 10", "Context4", "Profile Card Appearance"],
390
391
  "MessageField": ["Color Mode", "FormField States"],
391
- "MetricData": ["AppearanceBrand", "AppearanceSystem", "Badge Size", "Color Mode", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent"],
392
+ "MetricData": ["AppearanceBrand", "Badge Size", "Color Mode", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent"],
392
393
  "MetricLegendItem": ["Appearance / DataViz", "Color Mode", "Emphasis / DataViz"],
393
394
  "MoneyValue": ["Color Mode", "Context3"],
394
395
  "MonthlyStatusGrid": ["Appearance / DataViz", "Calendar Glyph State", "Color Mode", "Emphasis / DataViz"],
395
396
  "NavArrow": ["Color Mode", "context 10", "Context2", "context5", "List Item Style", "NavArrow Direction", "Page type", "Profile Card Appearance"],
396
- "Nudge": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
397
+ "Nudge": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Nudge Border Radius ", "Nudge padding", "Page type", "Profile Card Appearance", "Semantic Intent", "Slot gap"],
397
398
  "OTP": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "FormField States", "Input/PINSlot States", "Page type", "Profile Card Appearance", "Semantic Intent", "Status"],
398
399
  "PageHero": ["AppearanceBrand", "AppearanceSystem", "Button / Size", "Button / State", "Button Glass State", "Button type", "Color Mode", "Context", "context 10", "Emphasis", "Page type", "PageHero Size", "Profile Card Appearance", "Semantic Intent", "Video / Output"],
399
400
  "PaymentFeedback": ["AppearanceBrand", "AppearanceSystem", "Color Mode", "Context", "Emphasis", "Icon Capsule Size", "Page type", "Semantic Intent"],
@@ -439,7 +440,7 @@ export const FIGMA_COMPONENT_MODES = {
439
440
  "TransactionBubble": ["Color Mode", "context 10", "Context2", "Context3", "context5", "List Item Style", "NavArrow Direction", "Page type", "Profile Card Appearance", "Transaction Status"],
440
441
  "TransactionStatus": ["Transaction Status"],
441
442
  "UpiHandle": ["Color Mode", "context 10", "Profile Card Appearance", "UPI Handle Image"],
442
- "ValueBackMetric": ["AppearanceBrand", "AppearanceSystem", "Badge Size", "Color Mode", "Context", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent", "Text Appearance", "Text Sizes", "Weight"],
443
+ "ValueBackMetric": ["AppearanceBrand", "Badge Size", "Color Mode", "Context", "context 10", "Context4", "Emphasis", "Page type", "Profile Card Appearance", "Semantic Intent", "Text Appearance", "Text Sizes", "Weight"],
443
444
  "VStack": ["Context", "Padding", "Page type", "Slot gap", "Stack Context"]
444
445
  };
445
446