@moderneinc/neo-styled-components 2.5.0-next.f8ed7e → 2.5.0-next.fbda18

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/dist/index.js CHANGED
@@ -62,21 +62,39 @@ var Switch = require('@mui/material/Switch');
62
62
  var ToggleButton = require('@mui/material/ToggleButton');
63
63
  var ToggleButtonGroup = require('@mui/material/ToggleButtonGroup');
64
64
 
65
+ const focusRingShadow$2 = `${neoDesign.shadows.focusWhite1.x}px ${neoDesign.shadows.focusWhite1.y}px ${neoDesign.shadows.focusWhite1.blur}px ${neoDesign.shadows.focusWhite1.spread}px ${neoDesign.shadows.focusWhite1.shadow}, ${neoDesign.shadows.focusBlue2.x}px ${neoDesign.shadows.focusBlue2.y}px ${neoDesign.shadows.focusBlue2.blur}px ${neoDesign.shadows.focusBlue2.spread}px ${neoDesign.shadows.focusBlue2.shadow}`;
65
66
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Avatar variant type without global augmentation
66
67
  const StyledAvatar = styles.styled(Avatar, {
67
68
  shouldForwardProp: prop => prop !== 'size' && prop !== 'variant',
68
69
  })(({ theme, size = 'medium', variant = 'circular' }) => ({
70
+ boxSizing: 'border-box',
69
71
  borderRadius: neoDesign.borderRadius.full,
70
72
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
71
73
  fontWeight: neoDesign.typography.fontWeight.regular,
72
74
  lineHeight: 1.5,
73
- // Size variants
74
- ...(size === 'small' && {
75
+ // Size variants — dimensions match Figma bounding boxes (border-box)
76
+ ...(size === 'small' &&
77
+ variant === 'circular' && {
78
+ width: neoDesign.spacing.spacing_4,
79
+ height: neoDesign.spacing.spacing_4,
80
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
81
+ }),
82
+ ...(size === 'small' &&
83
+ variant === 'initials' && {
75
84
  width: neoDesign.spacing.spacing_2_1_2,
76
85
  height: neoDesign.spacing.spacing_2_1_2,
77
86
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
78
87
  }),
79
- ...(size === 'medium' && {
88
+ // Medium circular fills its AvatarContainer (container owns the 44px dimension)
89
+ ...(size === 'medium' &&
90
+ variant === 'circular' && {
91
+ width: '100%',
92
+ height: '100%',
93
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
94
+ }),
95
+ // Medium initials has no container, so it owns its 44px dimension
96
+ ...(size === 'medium' &&
97
+ variant === 'initials' && {
80
98
  width: neoDesign.spacing.spacing_5_1_2,
81
99
  height: neoDesign.spacing.spacing_5_1_2,
82
100
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
@@ -92,20 +110,29 @@ const StyledAvatar = styles.styled(Avatar, {
92
110
  backgroundColor: 'transparent',
93
111
  border: `2px solid ${neoDesign.semanticColors.surfaces.white}`,
94
112
  }),
113
+ '&:focus-visible': {
114
+ outline: 'none',
115
+ boxShadow: focusRingShadow$2,
116
+ },
95
117
  }));
96
118
  const AvatarContainer = styles.styled(Box)(({ size = 'medium' }) => ({
119
+ boxSizing: 'border-box',
97
120
  ...(size === 'medium' && {
98
121
  width: neoDesign.spacing.spacing_5_1_2,
99
122
  height: neoDesign.spacing.spacing_5_1_2,
100
123
  backgroundColor: neoDesign.semanticColors.surfaces.white,
101
124
  borderRadius: neoDesign.borderRadius.full,
102
- padding: neoDesign.spacing.spacing_1_2,
125
+ padding: neoDesign.spacing.spacing_1_4,
103
126
  display: 'flex',
104
127
  alignItems: 'center',
105
128
  justifyContent: 'center',
106
129
  overflow: 'hidden',
107
130
  boxShadow: `${neoDesign.shadows.neutralSmall.x}px ${neoDesign.shadows.neutralSmall.y}px ${neoDesign.shadows.neutralSmall.blur}px ${neoDesign.shadows.neutralSmall.spread}px ${neoDesign.shadows.neutralSmall.shadow}`,
108
131
  }),
132
+ '&:focus-within': {
133
+ outline: 'none',
134
+ boxShadow: focusRingShadow$2,
135
+ },
109
136
  }));
110
137
  /**
111
138
  * NeoAvatar - User avatar component based on MUI Avatar
@@ -114,8 +141,9 @@ const AvatarContainer = styles.styled(Box)(({ size = 'medium' }) => ({
114
141
  *
115
142
  * Figma Props Mapping:
116
143
  * - Figma Type "Initials" → variant="initials", size="small" (20px)
117
- * - Figma Type "Small" → variant="circular", size="small" (20px with image)
144
+ * - Figma Type "Small" → variant="circular", size="small" (32px with image)
118
145
  * - Figma Type "Medium" → variant="circular", size="medium" (44px white container with image)
146
+ * - State: Focus → CSS :focus-visible ring (2px white inner + 4px blue outer)
119
147
  * - State: Hover (tooltip) → Wrap component with MUI Tooltip
120
148
  *
121
149
  * Usage:
@@ -149,7 +177,7 @@ const NeoAvatar = ({ size = 'medium', variant = 'circular', ...props }) => {
149
177
  };
150
178
  NeoAvatar.displayName = 'NeoAvatar';
151
179
 
152
- const StyledChip$1 = styles.styled(Chip)(({ theme }) => ({
180
+ const StyledChip$2 = styles.styled(Chip)(({ theme }) => ({
153
181
  height: 24,
154
182
  paddingTop: neoDesign.spacing.spacing_1_4,
155
183
  paddingBottom: neoDesign.spacing.spacing_1_4,
@@ -236,7 +264,7 @@ const StyledChip$1 = styles.styled(Chip)(({ theme }) => ({
236
264
  * - Label → label prop
237
265
  */
238
266
  const NeoBadge = (props) => {
239
- return jsxRuntime.jsx(StyledChip$1, { ...props });
267
+ return jsxRuntime.jsx(StyledChip$2, { ...props });
240
268
  };
241
269
  NeoBadge.displayName = 'NeoBadge';
242
270
 
@@ -502,7 +530,7 @@ const NeoActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
502
530
  NeoActivityIndicatorCell.displayName = 'NeoActivityIndicatorCell';
503
531
 
504
532
  /**
505
- * @license lucide-react v0.564.0 - ISC
533
+ * @license lucide-react v0.575.0 - ISC
506
534
  *
507
535
  * This source code is licensed under the ISC license.
508
536
  * See the LICENSE file in the root directory of this source tree.
@@ -513,7 +541,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
513
541
  }).join(" ").trim();
514
542
 
515
543
  /**
516
- * @license lucide-react v0.564.0 - ISC
544
+ * @license lucide-react v0.575.0 - ISC
517
545
  *
518
546
  * This source code is licensed under the ISC license.
519
547
  * See the LICENSE file in the root directory of this source tree.
@@ -522,7 +550,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
522
550
  const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
523
551
 
524
552
  /**
525
- * @license lucide-react v0.564.0 - ISC
553
+ * @license lucide-react v0.575.0 - ISC
526
554
  *
527
555
  * This source code is licensed under the ISC license.
528
556
  * See the LICENSE file in the root directory of this source tree.
@@ -534,7 +562,7 @@ const toCamelCase = (string) => string.replace(
534
562
  );
535
563
 
536
564
  /**
537
- * @license lucide-react v0.564.0 - ISC
565
+ * @license lucide-react v0.575.0 - ISC
538
566
  *
539
567
  * This source code is licensed under the ISC license.
540
568
  * See the LICENSE file in the root directory of this source tree.
@@ -547,7 +575,7 @@ const toPascalCase = (string) => {
547
575
  };
548
576
 
549
577
  /**
550
- * @license lucide-react v0.564.0 - ISC
578
+ * @license lucide-react v0.575.0 - ISC
551
579
  *
552
580
  * This source code is licensed under the ISC license.
553
581
  * See the LICENSE file in the root directory of this source tree.
@@ -566,7 +594,7 @@ var defaultAttributes = {
566
594
  };
567
595
 
568
596
  /**
569
- * @license lucide-react v0.564.0 - ISC
597
+ * @license lucide-react v0.575.0 - ISC
570
598
  *
571
599
  * This source code is licensed under the ISC license.
572
600
  * See the LICENSE file in the root directory of this source tree.
@@ -582,7 +610,7 @@ const hasA11yProp = (props) => {
582
610
  };
583
611
 
584
612
  /**
585
- * @license lucide-react v0.564.0 - ISC
613
+ * @license lucide-react v0.575.0 - ISC
586
614
  *
587
615
  * This source code is licensed under the ISC license.
588
616
  * See the LICENSE file in the root directory of this source tree.
@@ -620,7 +648,7 @@ const Icon = react.forwardRef(
620
648
  );
621
649
 
622
650
  /**
623
- * @license lucide-react v0.564.0 - ISC
651
+ * @license lucide-react v0.575.0 - ISC
624
652
  *
625
653
  * This source code is licensed under the ISC license.
626
654
  * See the LICENSE file in the root directory of this source tree.
@@ -645,7 +673,7 @@ const createLucideIcon = (iconName, iconNode) => {
645
673
  };
646
674
 
647
675
  /**
648
- * @license lucide-react v0.564.0 - ISC
676
+ * @license lucide-react v0.575.0 - ISC
649
677
  *
650
678
  * This source code is licensed under the ISC license.
651
679
  * See the LICENSE file in the root directory of this source tree.
@@ -659,7 +687,7 @@ const __iconNode$i = [
659
687
  const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
660
688
 
661
689
  /**
662
- * @license lucide-react v0.564.0 - ISC
690
+ * @license lucide-react v0.575.0 - ISC
663
691
  *
664
692
  * This source code is licensed under the ISC license.
665
693
  * See the LICENSE file in the root directory of this source tree.
@@ -673,7 +701,7 @@ const __iconNode$h = [
673
701
  const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
674
702
 
675
703
  /**
676
- * @license lucide-react v0.564.0 - ISC
704
+ * @license lucide-react v0.575.0 - ISC
677
705
  *
678
706
  * This source code is licensed under the ISC license.
679
707
  * See the LICENSE file in the root directory of this source tree.
@@ -695,7 +723,7 @@ const __iconNode$g = [
695
723
  const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
696
724
 
697
725
  /**
698
- * @license lucide-react v0.564.0 - ISC
726
+ * @license lucide-react v0.575.0 - ISC
699
727
  *
700
728
  * This source code is licensed under the ISC license.
701
729
  * See the LICENSE file in the root directory of this source tree.
@@ -706,7 +734,7 @@ const __iconNode$f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
706
734
  const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
707
735
 
708
736
  /**
709
- * @license lucide-react v0.564.0 - ISC
737
+ * @license lucide-react v0.575.0 - ISC
710
738
  *
711
739
  * This source code is licensed under the ISC license.
712
740
  * See the LICENSE file in the root directory of this source tree.
@@ -717,7 +745,7 @@ const __iconNode$e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
717
745
  const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
718
746
 
719
747
  /**
720
- * @license lucide-react v0.564.0 - ISC
748
+ * @license lucide-react v0.575.0 - ISC
721
749
  *
722
750
  * This source code is licensed under the ISC license.
723
751
  * See the LICENSE file in the root directory of this source tree.
@@ -728,7 +756,7 @@ const __iconNode$d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
728
756
  const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
729
757
 
730
758
  /**
731
- * @license lucide-react v0.564.0 - ISC
759
+ * @license lucide-react v0.575.0 - ISC
732
760
  *
733
761
  * This source code is licensed under the ISC license.
734
762
  * See the LICENSE file in the root directory of this source tree.
@@ -739,7 +767,7 @@ const __iconNode$c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
739
767
  const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
740
768
 
741
769
  /**
742
- * @license lucide-react v0.564.0 - ISC
770
+ * @license lucide-react v0.575.0 - ISC
743
771
  *
744
772
  * This source code is licensed under the ISC license.
745
773
  * See the LICENSE file in the root directory of this source tree.
@@ -753,7 +781,7 @@ const __iconNode$b = [
753
781
  const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
754
782
 
755
783
  /**
756
- * @license lucide-react v0.564.0 - ISC
784
+ * @license lucide-react v0.575.0 - ISC
757
785
  *
758
786
  * This source code is licensed under the ISC license.
759
787
  * See the LICENSE file in the root directory of this source tree.
@@ -768,7 +796,7 @@ const __iconNode$a = [
768
796
  const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
769
797
 
770
798
  /**
771
- * @license lucide-react v0.564.0 - ISC
799
+ * @license lucide-react v0.575.0 - ISC
772
800
  *
773
801
  * This source code is licensed under the ISC license.
774
802
  * See the LICENSE file in the root directory of this source tree.
@@ -782,7 +810,7 @@ const __iconNode$9 = [
782
810
  const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
783
811
 
784
812
  /**
785
- * @license lucide-react v0.564.0 - ISC
813
+ * @license lucide-react v0.575.0 - ISC
786
814
  *
787
815
  * This source code is licensed under the ISC license.
788
816
  * See the LICENSE file in the root directory of this source tree.
@@ -797,7 +825,7 @@ const __iconNode$8 = [
797
825
  const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8);
798
826
 
799
827
  /**
800
- * @license lucide-react v0.564.0 - ISC
828
+ * @license lucide-react v0.575.0 - ISC
801
829
  *
802
830
  * This source code is licensed under the ISC license.
803
831
  * See the LICENSE file in the root directory of this source tree.
@@ -812,7 +840,7 @@ const __iconNode$7 = [
812
840
  const Columns3 = createLucideIcon("columns-3", __iconNode$7);
813
841
 
814
842
  /**
815
- * @license lucide-react v0.564.0 - ISC
843
+ * @license lucide-react v0.575.0 - ISC
816
844
  *
817
845
  * This source code is licensed under the ISC license.
818
846
  * See the LICENSE file in the root directory of this source tree.
@@ -827,7 +855,7 @@ const __iconNode$6 = [
827
855
  const Info = createLucideIcon("info", __iconNode$6);
828
856
 
829
857
  /**
830
- * @license lucide-react v0.564.0 - ISC
858
+ * @license lucide-react v0.575.0 - ISC
831
859
  *
832
860
  * This source code is licensed under the ISC license.
833
861
  * See the LICENSE file in the root directory of this source tree.
@@ -842,7 +870,7 @@ const __iconNode$5 = [
842
870
  const ListFilter = createLucideIcon("list-filter", __iconNode$5);
843
871
 
844
872
  /**
845
- * @license lucide-react v0.564.0 - ISC
873
+ * @license lucide-react v0.575.0 - ISC
846
874
  *
847
875
  * This source code is licensed under the ISC license.
848
876
  * See the LICENSE file in the root directory of this source tree.
@@ -856,7 +884,7 @@ const __iconNode$4 = [
856
884
  const Plus = createLucideIcon("plus", __iconNode$4);
857
885
 
858
886
  /**
859
- * @license lucide-react v0.564.0 - ISC
887
+ * @license lucide-react v0.575.0 - ISC
860
888
  *
861
889
  * This source code is licensed under the ISC license.
862
890
  * See the LICENSE file in the root directory of this source tree.
@@ -870,7 +898,7 @@ const __iconNode$3 = [
870
898
  const Search = createLucideIcon("search", __iconNode$3);
871
899
 
872
900
  /**
873
- * @license lucide-react v0.564.0 - ISC
901
+ * @license lucide-react v0.575.0 - ISC
874
902
  *
875
903
  * This source code is licensed under the ISC license.
876
904
  * See the LICENSE file in the root directory of this source tree.
@@ -887,7 +915,7 @@ const __iconNode$2 = [
887
915
  const Trash2 = createLucideIcon("trash-2", __iconNode$2);
888
916
 
889
917
  /**
890
- * @license lucide-react v0.564.0 - ISC
918
+ * @license lucide-react v0.575.0 - ISC
891
919
  *
892
920
  * This source code is licensed under the ISC license.
893
921
  * See the LICENSE file in the root directory of this source tree.
@@ -906,7 +934,7 @@ const __iconNode$1 = [
906
934
  const WifiOff = createLucideIcon("wifi-off", __iconNode$1);
907
935
 
908
936
  /**
909
- * @license lucide-react v0.564.0 - ISC
937
+ * @license lucide-react v0.575.0 - ISC
910
938
  *
911
939
  * This source code is licensed under the ISC license.
912
940
  * See the LICENSE file in the root directory of this source tree.
@@ -1459,6 +1487,8 @@ const HelperText$2 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1459
1487
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1460
1488
  color: neoDesign.semanticColors.typography.bodySecondary,
1461
1489
  }));
1490
+ // Figma-exact border radius for xs checkbox — no matching design token
1491
+ const FIGMA_XS_BORDER_RADIUS = 1;
1462
1492
  const StyledCheckbox = styles.styled(Checkbox, {
1463
1493
  shouldForwardProp: prop => prop !== 'size',
1464
1494
  })(({ size = 'medium' }) => {
@@ -1466,8 +1496,7 @@ const StyledCheckbox = styles.styled(Checkbox, {
1466
1496
  const sizeConfig = {
1467
1497
  xs: {
1468
1498
  size: 12,
1469
- // biome-ignore plugin: Figma-exact 1px for xs — no matching token
1470
- borderRadius: 1, // From Figma: 1px for xs
1499
+ borderRadius: FIGMA_XS_BORDER_RADIUS,
1471
1500
  },
1472
1501
  small: {
1473
1502
  size: 16,
@@ -1634,7 +1663,9 @@ const StyledButtonBase = styles.styled(ButtonBase, {
1634
1663
  width: isMultiline ? '100%' : 'fit-content',
1635
1664
  maxWidth: isMultiline ? '100%' : 'none',
1636
1665
  overflowX: isMultiline ? 'auto' : 'visible',
1637
- padding: isMultiline && 'paddingMultiline' in sizeStyles ? sizeStyles.paddingMultiline : sizeStyles.paddingSingleLine,
1666
+ padding: isMultiline && 'paddingMultiline' in sizeStyles
1667
+ ? sizeStyles.paddingMultiline
1668
+ : sizeStyles.paddingSingleLine,
1638
1669
  paddingRight: isMultiline ? theme.spacing(7) : undefined, // Extra space for copy button in multiline only
1639
1670
  fontSize: sizeStyles.fontSize,
1640
1671
  fontFamily: neoDesign.typography.fontFamily.code,
@@ -1758,13 +1789,14 @@ const ColumnItemContainer = styles.styled(Box)(({ theme }) => ({
1758
1789
  paddingLeft: theme.spacing(0.75),
1759
1790
  paddingRight: theme.spacing(0.75),
1760
1791
  }));
1792
+ // Figma-exact border radius for menu items — no matching design token
1793
+ const MENU_ITEM_BORDER_RADIUS = 6;
1761
1794
  const MenuItemContent$1 = styles.styled('div')(({ theme }) => ({
1762
1795
  display: 'flex',
1763
1796
  alignItems: 'center',
1764
1797
  gap: theme.spacing(1),
1765
1798
  padding: theme.spacing(1),
1766
- // biome-ignore plugin: no exact token for 6px
1767
- borderRadius: 6,
1799
+ borderRadius: MENU_ITEM_BORDER_RADIUS,
1768
1800
  width: '100%',
1769
1801
  '&:hover': {
1770
1802
  backgroundColor: neoDesign.semanticColors.surfaces.listHover,
@@ -2476,111 +2508,85 @@ function NeoDataGridColumnsButton() {
2476
2508
  }
2477
2509
  NeoDataGridColumnsButton.displayName = 'NeoDataGridColumnsButton';
2478
2510
 
2479
- const StyledChip = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2480
- padding: 0,
2481
- borderRadius: neoDesign.borderRadius.full,
2482
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2483
- fontWeight: neoDesign.typography.fontWeight.medium,
2484
- // Size variants
2485
- ...(size === 'small' && {
2511
+ const sizeStyles = {
2512
+ small: {
2486
2513
  height: 16,
2487
2514
  paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
2488
2515
  paddingRight: neoDesign.spacing.spacing_1_2, // 4px
2489
- }),
2490
- ...(size === 'medium' && {
2516
+ },
2517
+ medium: {
2491
2518
  height: 18,
2492
2519
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2493
2520
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2494
- }),
2495
- ...(size === 'large' && {
2521
+ },
2522
+ large: {
2496
2523
  height: 20,
2497
2524
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2498
2525
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2499
- }),
2500
- [`& .${Chip.chipClasses.label}`]: {
2501
- padding: 0,
2502
2526
  },
2503
- // Outlined variant (light type in Figma) - Neutral/Default
2504
- ...(variant === 'outlined' &&
2505
- color === 'default' && {
2527
+ };
2528
+ const outlinedColorStyles = {
2529
+ default: {
2506
2530
  backgroundColor: neoDesign.semanticColors.status.neutral.light,
2507
2531
  color: neoDesign.semanticColors.status.neutral.dark,
2508
- borderColor: neoDesign.colors.grey[200], // base/grey/200
2509
- }),
2510
- // Outlined variant - Error
2511
- ...(variant === 'outlined' &&
2512
- color === 'error' && {
2532
+ borderColor: neoDesign.colors.grey[200],
2533
+ },
2534
+ error: {
2513
2535
  backgroundColor: neoDesign.semanticColors.status.error.light,
2514
2536
  color: neoDesign.semanticColors.status.error.dark,
2515
- borderColor: neoDesign.colors.red[100], // base/red/100
2516
- }),
2517
- // Outlined variant - Warning
2518
- ...(variant === 'outlined' &&
2519
- color === 'warning' && {
2537
+ borderColor: neoDesign.colors.red[100],
2538
+ },
2539
+ warning: {
2520
2540
  backgroundColor: neoDesign.semanticColors.status.warning.light,
2521
2541
  color: neoDesign.semanticColors.status.warning.dark,
2522
- borderColor: neoDesign.colors.orange[100], // base/orange/100
2523
- }),
2524
- // Outlined variant - Success
2525
- ...(variant === 'outlined' &&
2526
- color === 'success' && {
2542
+ borderColor: neoDesign.colors.orange[100],
2543
+ },
2544
+ success: {
2527
2545
  backgroundColor: neoDesign.semanticColors.status.success.light,
2528
2546
  color: neoDesign.semanticColors.status.success.dark,
2529
- borderColor: 'rgba(94, 196, 111, 0.24)', // rgba from Figma
2530
- }),
2531
- // Outlined variant - Info
2532
- ...(variant === 'outlined' &&
2533
- color === 'info' && {
2547
+ borderColor: 'rgba(94, 196, 111, 0.24)',
2548
+ },
2549
+ info: {
2534
2550
  backgroundColor: neoDesign.semanticColors.status.info.light,
2535
2551
  color: neoDesign.semanticColors.status.info.dark,
2536
- borderColor: neoDesign.colors.digitalBlue[100], // base/digital-blue/100
2537
- }),
2538
- // Outlined variant - Violet
2539
- ...(variant === 'outlined' &&
2540
- color === 'violet' && {
2552
+ borderColor: neoDesign.colors.digitalBlue[100],
2553
+ },
2554
+ violet: {
2541
2555
  backgroundColor: `${neoDesign.colors.violet[100]}66`, // rgba(235,213,241,0.4)
2542
2556
  color: neoDesign.colors.violet[600],
2543
- borderColor: neoDesign.colors.violet[100], // base/violet/100
2544
- }),
2545
- // Filled variant (dark type in Figma) - Neutral/Default
2546
- ...(variant === 'filled' &&
2547
- color === 'default' && {
2548
- backgroundColor: neoDesign.semanticColors.status.neutral.medium,
2549
- color: theme.palette.common.white,
2550
- border: 'none',
2551
- }),
2552
- // Filled variant - Error
2553
- ...(variant === 'filled' &&
2554
- color === 'error' && {
2555
- backgroundColor: neoDesign.semanticColors.status.error.medium,
2556
- color: theme.palette.common.white,
2557
- border: 'none',
2558
- }),
2559
- // Filled variant - Warning
2560
- ...(variant === 'filled' &&
2561
- color === 'warning' && {
2562
- backgroundColor: neoDesign.semanticColors.status.warning.medium,
2563
- color: theme.palette.common.white,
2564
- border: 'none',
2565
- }),
2566
- // Filled variant - Success
2567
- ...(variant === 'filled' &&
2568
- color === 'success' && {
2569
- backgroundColor: neoDesign.semanticColors.status.success.medium,
2570
- color: theme.palette.common.white,
2571
- border: 'none',
2572
- }),
2573
- // Filled variant - Info
2574
- ...(variant === 'filled' &&
2575
- color === 'info' && {
2576
- backgroundColor: neoDesign.semanticColors.status.info.medium,
2577
- color: theme.palette.common.white,
2578
- border: 'none',
2579
- }),
2580
- // Filled variant - Violet
2557
+ borderColor: neoDesign.colors.violet[100],
2558
+ },
2559
+ beta: {
2560
+ backgroundColor: neoDesign.colors.digitalBlue[100],
2561
+ color: neoDesign.colors.digitalBlue[400],
2562
+ borderColor: neoDesign.colors.digitalBlue[100],
2563
+ },
2564
+ };
2565
+ const filledColorStyles = {
2566
+ default: neoDesign.semanticColors.status.neutral.medium,
2567
+ error: neoDesign.semanticColors.status.error.medium,
2568
+ warning: neoDesign.semanticColors.status.warning.medium,
2569
+ success: neoDesign.semanticColors.status.success.medium,
2570
+ info: neoDesign.semanticColors.status.info.medium,
2571
+ violet: neoDesign.colors.violet[500],
2572
+ beta: neoDesign.colors.digitalBlue[300],
2573
+ };
2574
+ const StyledChip$1 = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2575
+ padding: 0,
2576
+ borderRadius: neoDesign.borderRadius.full,
2577
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2578
+ fontWeight: neoDesign.typography.fontWeight.medium,
2579
+ ...(size && sizeStyles[size]),
2580
+ [`& .${Chip.chipClasses.label}`]: {
2581
+ padding: 0,
2582
+ },
2583
+ ...(variant === 'outlined' &&
2584
+ color &&
2585
+ outlinedColorStyles[color]),
2581
2586
  ...(variant === 'filled' &&
2582
- color === 'violet' && {
2583
- backgroundColor: neoDesign.colors.violet[500],
2587
+ color &&
2588
+ color in filledColorStyles && {
2589
+ backgroundColor: filledColorStyles[color],
2584
2590
  color: theme.palette.common.white,
2585
2591
  border: 'none',
2586
2592
  }),
@@ -2593,11 +2599,11 @@ const StyledChip = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2593
2599
  * Figma Props Mapping:
2594
2600
  * - m (sm|md|lg) → size (small|medium|large)
2595
2601
  * - type (light|dark) → variant (outlined|filled)
2596
- * - state (Neutral|Error|Warning|Success|Info|Violet) → color (default|error|warning|success|info|violet)
2602
+ * - state (Neutral|Error|Warning|Success|Info|Violet|Beta) → color (default|error|warning|success|info|violet|beta)
2597
2603
  * - Label text → label prop
2598
2604
  */
2599
2605
  const NeoTag = ({ size = 'small', variant = 'outlined', ...props }) => {
2600
- return jsxRuntime.jsx(StyledChip, { size: size, variant: variant, ...props });
2606
+ return jsxRuntime.jsx(StyledChip$1, { size: size, variant: variant, ...props });
2601
2607
  };
2602
2608
  NeoTag.displayName = 'NeoTag';
2603
2609
 
@@ -3559,49 +3565,70 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3559
3565
  NeoDot.displayName = 'NeoDot';
3560
3566
 
3561
3567
  const focusRing = `${neoDesign.shadows.focusWhite1.x}px ${neoDesign.shadows.focusWhite1.y}px ${neoDesign.shadows.focusWhite1.blur}px ${neoDesign.shadows.focusWhite1.spread}px ${neoDesign.shadows.focusWhite1.shadow}, ${neoDesign.shadows.focusBlue2.x}px ${neoDesign.shadows.focusBlue2.y}px ${neoDesign.shadows.focusBlue2.blur}px ${neoDesign.shadows.focusBlue2.spread}px ${neoDesign.shadows.focusBlue2.shadow}`;
3562
- const StyledButton = styles.styled('button', {
3563
- shouldForwardProp: prop => prop !== 'active',
3564
- })(({ active }) => ({
3565
- display: 'inline-flex',
3566
- alignItems: active ? 'flex-end' : 'center',
3567
- gap: neoDesign.spacing.spacing_1_2,
3568
- padding: active ? `${neoDesign.spacing.spacing_3_4}px ${neoDesign.spacing.spacing_1_1_2}px` : `0 ${neoDesign.spacing.spacing_1_1_2}px`,
3569
- minHeight: 40,
3570
- border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
3568
+ const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3569
+ const StyledChip = styles.styled(Chip, {
3570
+ shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
3571
+ })(({ theme, selected }) => ({
3571
3572
  borderRadius: neoDesign.borderRadius.full,
3572
- backgroundColor: active
3573
- ? neoDesign.semanticColors.buttons.secondary.hoverBackground
3573
+ border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
3574
+ backgroundColor: selected
3575
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3574
3576
  : neoDesign.semanticColors.surfaces.white,
3575
- cursor: 'pointer',
3576
- fontFamily: 'inherit',
3577
- outline: 'none',
3578
- boxSizing: 'border-box',
3577
+ minHeight: 40,
3578
+ padding: `${neoDesign.spacing.spacing_3_4}px ${neoDesign.spacing.spacing_1_1_2}px`,
3579
+ gap: neoDesign.spacing.spacing_1,
3580
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3581
+ fontWeight: neoDesign.typography.fontWeight.medium,
3582
+ lineHeight: 1,
3583
+ color: neoDesign.semanticColors.typography.body,
3584
+ [`& .${Chip.chipClasses.label}`]: {
3585
+ padding: 0,
3586
+ overflow: 'visible',
3587
+ display: 'flex',
3588
+ alignItems: 'center',
3589
+ },
3590
+ [`& .${Chip.chipClasses.deleteIcon}`]: {
3591
+ color: neoDesign.semanticColors.icons.default,
3592
+ width: 24,
3593
+ height: 24,
3594
+ margin: 0,
3595
+ flexShrink: 0,
3596
+ '&:hover': {
3597
+ color: neoDesign.semanticColors.icons.default,
3598
+ },
3599
+ },
3579
3600
  '&:hover': {
3580
3601
  backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
3581
3602
  },
3582
- '&:focus-visible': {
3603
+ [`&.${Chip.chipClasses.focusVisible}`]: {
3583
3604
  boxShadow: focusRing,
3605
+ backgroundColor: selected
3606
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3607
+ : neoDesign.semanticColors.surfaces.white,
3584
3608
  },
3585
3609
  }));
3586
- const TextContent = styles.styled('span', {
3587
- shouldForwardProp: prop => prop !== 'active',
3588
- })(({ active }) => ({
3610
+ const LabelContent = styles.styled('span')({
3611
+ display: 'inline-flex',
3612
+ alignItems: 'center',
3613
+ gap: neoDesign.spacing.spacing_1,
3614
+ });
3615
+ const TextStack = styles.styled('span')({
3589
3616
  display: 'flex',
3590
3617
  flexDirection: 'column',
3591
3618
  alignItems: 'flex-start',
3592
3619
  justifyContent: 'center',
3593
- gap: active ? neoDesign.spacing.spacing_1_4 : undefined,
3594
- }));
3620
+ gap: neoDesign.spacing.spacing_1_4,
3621
+ });
3595
3622
  const HeaderLabel = styles.styled('span')(({ theme }) => ({
3596
3623
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xxs),
3597
3624
  fontWeight: neoDesign.typography.fontWeight.regular,
3598
3625
  lineHeight: '120%',
3599
3626
  color: neoDesign.semanticColors.typography.bodySecondary,
3600
3627
  }));
3601
- const Label$2 = styles.styled('span')(({ theme }) => ({
3628
+ const SelectedLabel = styles.styled('span')(({ theme }) => ({
3602
3629
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3603
3630
  fontWeight: neoDesign.typography.fontWeight.medium,
3604
- lineHeight: `${neoDesign.typography.lineHeight.xs}px`,
3631
+ lineHeight: 1,
3605
3632
  color: neoDesign.semanticColors.buttons.secondary.default,
3606
3633
  }));
3607
3634
  const CountBadge = styles.styled('span')(({ theme }) => ({
@@ -3612,7 +3639,6 @@ const CountBadge = styles.styled('span')(({ theme }) => ({
3612
3639
  height: 16,
3613
3640
  padding: `0 ${neoDesign.spacing.spacing_1_2}px`,
3614
3641
  borderRadius: neoDesign.borderRadius.full,
3615
- border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
3616
3642
  backgroundColor: neoDesign.semanticColors.brand,
3617
3643
  color: neoDesign.semanticColors.surfaces.white,
3618
3644
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
@@ -3620,24 +3646,19 @@ const CountBadge = styles.styled('span')(({ theme }) => ({
3620
3646
  lineHeight: 1,
3621
3647
  boxSizing: 'border-box',
3622
3648
  }));
3623
- const ChevronIcon = styles.styled(ChevronDown)({
3624
- width: 16,
3625
- height: 16,
3626
- color: neoDesign.semanticColors.brand,
3627
- flexShrink: 0,
3628
- });
3629
3649
  /**
3630
- * NeoFilterChips - Filter chip button used for filtering data
3650
+ * NeoFilterChip - Filter chip for filtering data, based on MUI Chip.
3631
3651
  *
3632
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=8257-239
3652
+ * @example
3653
+ * <NeoFilterChip label="Status" selected selectedLabel="Active, Pending" count={2} onClear={handleClear} />
3633
3654
  *
3634
- * Figma Props Mapping:
3635
- * - Property 1 (default|hover ope|focused|Active|active focused) → active boolean + CSS states
3655
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=8257-239
3636
3656
  */
3637
- const NeoFilterChips = ({ label, active = false, count = 0, onClick, ...props }) => {
3638
- return (jsxRuntime.jsxs(StyledButton, { type: "button", active: active, onClick: onClick, ...props, children: [jsxRuntime.jsxs(TextContent, { active: active, children: [active && jsxRuntime.jsx(HeaderLabel, { children: label }), jsxRuntime.jsx(Label$2, { children: label })] }), active && count > 0 && jsxRuntime.jsx(CountBadge, { children: count }), jsxRuntime.jsx(ChevronIcon, {})] }));
3657
+ const NeoFilterChip = ({ label, selected = false, expanded, selectedLabel, count = 0, onClear, onClick, ...props }) => {
3658
+ const chipLabel = selected ? (jsxRuntime.jsxs(LabelContent, { children: [jsxRuntime.jsxs(TextStack, { children: [jsxRuntime.jsx(HeaderLabel, { children: label }), jsxRuntime.jsx(SelectedLabel, { children: selectedLabel ?? label })] }), count > 0 && jsxRuntime.jsx(CountBadge, { children: count })] })) : (label);
3659
+ return (jsxRuntime.jsx(StyledChip, { label: chipLabel, selected: selected, clickable: true, onClick: onClick, onDelete: selected && onClear ? onClear : undefined, deleteIcon: jsxRuntime.jsx(X, { size: 24 }), "aria-expanded": expanded, ...props }));
3639
3660
  };
3640
- NeoFilterChips.displayName = 'NeoFilterChips';
3661
+ NeoFilterChip.displayName = 'NeoFilterChip';
3641
3662
 
3642
3663
  const SpinnerWrapper = styles.styled('div')({
3643
3664
  width: 24,
@@ -3879,6 +3900,31 @@ const NeoFooter = ({ variant = 'pagination', showShadow = false, loading = false
3879
3900
  };
3880
3901
  NeoFooter.displayName = 'NeoFooter';
3881
3902
 
3903
+ const customProps$1 = ['iconSize'];
3904
+ const StyledIconWrapper = styles.styled('div', {
3905
+ shouldForwardProp: prop => !customProps$1.includes(prop),
3906
+ })(({ iconSize }) => ({
3907
+ display: 'inline-flex',
3908
+ alignItems: 'center',
3909
+ justifyContent: 'center',
3910
+ width: iconSize,
3911
+ height: iconSize,
3912
+ flexShrink: 0,
3913
+ '& svg': {
3914
+ width: iconSize,
3915
+ height: iconSize,
3916
+ },
3917
+ }));
3918
+ /**
3919
+ * NeoIconWrapper - Flex-centered container that sizes icons
3920
+ *
3921
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4061-9955
3922
+ */
3923
+ const NeoIconWrapper = ({ size = 20, children, ...props }) => {
3924
+ return (jsxRuntime.jsx(StyledIconWrapper, { iconSize: size, ...props, children: children }));
3925
+ };
3926
+ NeoIconWrapper.displayName = 'NeoIconWrapper';
3927
+
3882
3928
  /**
3883
3929
  * NeoInfiniteScrollGrid - DataGrid with infinite scroll and load-more functionality
3884
3930
  *
@@ -4513,11 +4559,11 @@ NeoListItemButton.displayName = 'NeoListItemButton';
4513
4559
  * Focus ring box-shadow using Neo design tokens
4514
4560
  * Combines focusWhite1 (inner white ring) and focusBlue2 (outer blue ring)
4515
4561
  */
4516
- const focusRingShadow = `${neoDesign.shadows.focusWhite1.x}px ${neoDesign.shadows.focusWhite1.y}px ${neoDesign.shadows.focusWhite1.blur}px ${neoDesign.shadows.focusWhite1.spread}px ${neoDesign.shadows.focusWhite1.shadow}, ${neoDesign.shadows.focusBlue2.x}px ${neoDesign.shadows.focusBlue2.y}px ${neoDesign.shadows.focusBlue2.blur}px ${neoDesign.shadows.focusBlue2.spread}px ${neoDesign.shadows.focusBlue2.shadow}`;
4562
+ const focusRingShadow$1 = `${neoDesign.shadows.focusWhite1.x}px ${neoDesign.shadows.focusWhite1.y}px ${neoDesign.shadows.focusWhite1.blur}px ${neoDesign.shadows.focusWhite1.spread}px ${neoDesign.shadows.focusWhite1.shadow}, ${neoDesign.shadows.focusBlue2.x}px ${neoDesign.shadows.focusBlue2.y}px ${neoDesign.shadows.focusBlue2.blur}px ${neoDesign.shadows.focusBlue2.spread}px ${neoDesign.shadows.focusBlue2.shadow}`;
4517
4563
  /**
4518
4564
  * Card box-shadow using Neo design tokens for hover and selected states
4519
4565
  */
4520
- const activeShadow = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
4566
+ const activeShadow$1 = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
4521
4567
  /**
4522
4568
  * Styled Card component with Neo design tokens
4523
4569
  */
@@ -4533,16 +4579,16 @@ const StyledCard = styles.styled(MuiCard, {
4533
4579
  backgroundColor: neoDesign.semanticColors.surfaces.card,
4534
4580
  border: `1px solid ${selected ? neoDesign.semanticColors.border.tabActive : neoDesign.semanticColors.border.card}`,
4535
4581
  borderRadius: neoDesign.borderRadius.xS,
4536
- boxShadow: selected ? activeShadow : 'none',
4582
+ boxShadow: selected ? activeShadow$1 : 'none',
4537
4583
  transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
4538
4584
  cursor: 'pointer',
4539
4585
  '&:hover': {
4540
4586
  borderColor: neoDesign.semanticColors.border.tabActive,
4541
- boxShadow: activeShadow,
4587
+ boxShadow: activeShadow$1,
4542
4588
  },
4543
4589
  '&:focus-visible': {
4544
4590
  borderColor: neoDesign.semanticColors.border.tabActive,
4545
- boxShadow: focusRingShadow,
4591
+ boxShadow: focusRingShadow$1,
4546
4592
  outline: 'none',
4547
4593
  },
4548
4594
  ...(disabled && {
@@ -4602,7 +4648,7 @@ const Title = styles.styled('p')(({ theme }) => ({
4602
4648
  /**
4603
4649
  * Description text
4604
4650
  */
4605
- const Description = styles.styled('p')(({ theme }) => ({
4651
+ const Description$1 = styles.styled('p')(({ theme }) => ({
4606
4652
  margin: 0,
4607
4653
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
4608
4654
  fontWeight: neoDesign.typography.fontWeight.regular, // 400
@@ -4657,10 +4703,131 @@ const Description = styles.styled('p')(({ theme }) => ({
4657
4703
  * - typography.fontWeight.regular (400) - Description
4658
4704
  */
4659
4705
  const NeoMarketplaceCard = ({ logo, recipeCount, title, description, selected = false, disabled = false, onClick, ...props }) => {
4660
- return (jsxRuntime.jsxs(StyledCard, { selected: selected, disabled: disabled, onClick: disabled ? undefined : onClick, tabIndex: disabled ? -1 : 0, role: "button", "aria-disabled": disabled, "aria-pressed": selected, ...props, children: [jsxRuntime.jsxs(CardHeader, { children: [jsxRuntime.jsx(LogoContainer, { children: logo }), jsxRuntime.jsx(RecipeCount, { children: recipeCount })] }), jsxRuntime.jsxs(CardContent, { children: [jsxRuntime.jsx(Title, { children: title }), jsxRuntime.jsx(Description, { children: description })] })] }));
4706
+ return (jsxRuntime.jsxs(StyledCard, { selected: selected, disabled: disabled, onClick: disabled ? undefined : onClick, tabIndex: disabled ? -1 : 0, role: "button", "aria-disabled": disabled, "aria-pressed": selected, ...props, children: [jsxRuntime.jsxs(CardHeader, { children: [jsxRuntime.jsx(LogoContainer, { children: logo }), jsxRuntime.jsx(RecipeCount, { children: recipeCount })] }), jsxRuntime.jsxs(CardContent, { children: [jsxRuntime.jsx(Title, { children: title }), jsxRuntime.jsx(Description$1, { children: description })] })] }));
4661
4707
  };
4662
4708
  NeoMarketplaceCard.displayName = 'NeoMarketplaceCard';
4663
4709
 
4710
+ const focusRingShadow = `${neoDesign.shadows.focusWhite1.x}px ${neoDesign.shadows.focusWhite1.y}px ${neoDesign.shadows.focusWhite1.blur}px ${neoDesign.shadows.focusWhite1.spread}px ${neoDesign.shadows.focusWhite1.shadow}, ${neoDesign.shadows.focusBlue2.x}px ${neoDesign.shadows.focusBlue2.y}px ${neoDesign.shadows.focusBlue2.blur}px ${neoDesign.shadows.focusBlue2.spread}px ${neoDesign.shadows.focusBlue2.shadow}`;
4711
+ const activeShadow = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
4712
+ const StyledLargeCard = styles.styled(MuiCard, {
4713
+ shouldForwardProp: prop => prop !== 'cardState' && prop !== 'cardTheme',
4714
+ })(({ cardState = 'default', cardTheme = 'light' }) => {
4715
+ const isLight = cardTheme === 'light';
4716
+ const isActive = cardState === 'active';
4717
+ const isDisabled = cardState === 'disabled';
4718
+ const isFocused = cardState === 'focused';
4719
+ const activeBorderColor = isLight ? neoDesign.semanticColors.border.tabActive : neoDesign.colors.digitalGreen[300];
4720
+ const defaultBorderColor = isLight
4721
+ ? neoDesign.semanticColors.border.card
4722
+ : `${neoDesign.semanticColors.border.card}80`;
4723
+ return {
4724
+ width: 340,
4725
+ height: 162,
4726
+ display: 'flex',
4727
+ flexDirection: 'column',
4728
+ justifyContent: 'space-between',
4729
+ alignItems: 'flex-start',
4730
+ padding: neoDesign.spacing.spacing_2,
4731
+ borderRadius: neoDesign.borderRadius.xS,
4732
+ backgroundColor: isLight ? neoDesign.semanticColors.surfaces.card : neoDesign.colors.grey[800],
4733
+ border: `1px solid ${isActive || isFocused ? activeBorderColor : defaultBorderColor}`,
4734
+ boxShadow: isActive ? activeShadow : isFocused ? focusRingShadow : 'none',
4735
+ overflow: 'hidden',
4736
+ '&:focus-visible': {
4737
+ borderColor: isLight ? neoDesign.semanticColors.border.tabActive : neoDesign.colors.digitalGreen[300],
4738
+ boxShadow: focusRingShadow,
4739
+ outline: 'none',
4740
+ },
4741
+ ...(isDisabled && {
4742
+ opacity: 0.5,
4743
+ pointerEvents: 'none',
4744
+ cursor: 'not-allowed',
4745
+ }),
4746
+ };
4747
+ });
4748
+ const TopSection = styles.styled('div')({
4749
+ display: 'flex',
4750
+ flexDirection: 'column',
4751
+ gap: neoDesign.spacing.spacing_2,
4752
+ alignItems: 'flex-start',
4753
+ width: '100%',
4754
+ flexShrink: 0,
4755
+ });
4756
+ const HeaderRow = styles.styled('div')({
4757
+ display: 'flex',
4758
+ gap: neoDesign.spacing.spacing_1,
4759
+ alignItems: 'center',
4760
+ flexShrink: 0,
4761
+ });
4762
+ const HeaderSlot = styles.styled('div')({
4763
+ display: 'flex',
4764
+ flexDirection: 'column',
4765
+ alignItems: 'center',
4766
+ justifyContent: 'center',
4767
+ width: 20,
4768
+ height: 20,
4769
+ flexShrink: 0,
4770
+ });
4771
+ const HeaderTitle = styles.styled('span', {
4772
+ shouldForwardProp: prop => prop !== 'cardTheme',
4773
+ })(({ cardTheme = 'light' }) => ({
4774
+ fontFamily: `${neoDesign.typography.fontFamily.heading}, sans-serif`,
4775
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
4776
+ fontSize: neoDesign.typography.fontSize.h6,
4777
+ lineHeight: 1.4,
4778
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4779
+ flexShrink: 0,
4780
+ }));
4781
+ const Description = styles.styled('p', {
4782
+ shouldForwardProp: prop => prop !== 'cardTheme',
4783
+ })(({ cardTheme = 'light' }) => ({
4784
+ fontFamily: `${neoDesign.typography.fontFamily.body}, sans-serif`,
4785
+ fontWeight: neoDesign.typography.fontWeight.regular,
4786
+ fontSize: neoDesign.typography.fontSize.xs,
4787
+ lineHeight: 1.5,
4788
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4789
+ margin: 0,
4790
+ minWidth: '100%',
4791
+ wordWrap: 'break-word',
4792
+ }));
4793
+ const ButtonsRow = styles.styled('div')({
4794
+ display: 'flex',
4795
+ gap: neoDesign.spacing.spacing_3,
4796
+ alignItems: 'flex-start',
4797
+ flexShrink: 0,
4798
+ });
4799
+ /**
4800
+ * NeoMarketplaceLargeCard - A large marketplace card with state and theme variants
4801
+ *
4802
+ * A 340x162px card with optional icon, gel brand icon, title, description, and action buttons.
4803
+ * Icon, gel, and title display inline in a header row.
4804
+ * Supports 4 states (default, active, disabled, focused) and 2 themes (light, dark).
4805
+ *
4806
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=5925-11
4807
+ *
4808
+ * Figma Props Mapping:
4809
+ * - Property 1 → state (default/active/disabled/focused)
4810
+ * - Property 2 → cardTheme (light/dark)
4811
+ * - Show Icon → showIcon
4812
+ * - Show gel → showGel
4813
+ * - show buttons → showButtons
4814
+ *
4815
+ * Design Tokens Used:
4816
+ * - semanticColors.surfaces.card (#ffffff) - Light theme background
4817
+ * - colors.grey[800] (#1f2937) - Dark theme background
4818
+ * - semanticColors.border.card (#d1d5db) - Default border (50% opacity on dark)
4819
+ * - semanticColors.border.tabActive (#2f42ff) - Active/focused border (light theme)
4820
+ * - colors.digitalGreen[300] (#88fe9b) - Active/focused border (dark theme)
4821
+ * - borderRadius.xS (4px) - Corner radius
4822
+ * - shadows.focusWhite1 + shadows.focusBlue2 - Focus ring
4823
+ * - shadows.card - Active state shadow
4824
+ */
4825
+ const NeoMarketplaceLargeCard = ({ state = 'default', cardTheme = 'light', showIcon = true, showGel = true, showButtons = true, icon, gel, title, children, actions, onClick, ...props }) => {
4826
+ const isDisabled = state === 'disabled';
4827
+ return (jsxRuntime.jsxs(StyledLargeCard, { cardState: state, cardTheme: cardTheme, onClick: isDisabled ? undefined : onClick, tabIndex: isDisabled ? -1 : 0, "aria-disabled": isDisabled || undefined, ...props, children: [jsxRuntime.jsxs(TopSection, { children: [jsxRuntime.jsxs(HeaderRow, { children: [showIcon && icon && jsxRuntime.jsx(HeaderSlot, { children: icon }), showGel && gel && jsxRuntime.jsx(HeaderSlot, { children: gel }), title && jsxRuntime.jsx(HeaderTitle, { cardTheme: cardTheme, children: title })] }), children && jsxRuntime.jsx(Description, { cardTheme: cardTheme, children: children })] }), showButtons && actions && jsxRuntime.jsx(ButtonsRow, { children: actions })] }));
4828
+ };
4829
+ NeoMarketplaceLargeCard.displayName = 'NeoMarketplaceLargeCard';
4830
+
4664
4831
  const StyledMenu = styles.styled(Menu)(({ theme }) => ({
4665
4832
  [`& .${Paper.paperClasses.root}`]: {
4666
4833
  backgroundColor: neoDesign.semanticColors.surfaces.white,
@@ -4904,6 +5071,87 @@ const NeoModalFooter = ({ leadingContent, children }) => {
4904
5071
  };
4905
5072
  NeoModalFooter.displayName = 'NeoModalFooter';
4906
5073
 
5074
+ const customProps = ['selected'];
5075
+ const StyledRoot = styles.styled(ButtonBase, {
5076
+ shouldForwardProp: prop => !customProps.includes(prop),
5077
+ })(({ selected }) => ({
5078
+ display: 'flex',
5079
+ flexDirection: 'column',
5080
+ gap: neoDesign.spacing.spacing_1_4, // 2px
5081
+ alignItems: 'center',
5082
+ justifyContent: 'center',
5083
+ paddingTop: neoDesign.spacing.spacing_1, // 8px
5084
+ paddingBottom: neoDesign.spacing.spacing_1, // 8px
5085
+ paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
5086
+ paddingRight: neoDesign.spacing.spacing_1_2, // 4px
5087
+ borderRadius: neoDesign.borderRadius.xS, // 4px
5088
+ width: 95,
5089
+ cursor: 'pointer',
5090
+ textDecoration: 'none',
5091
+ '&:hover .neo-nav-icon-padding': {
5092
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground, // #F2F3FF
5093
+ },
5094
+ '&:hover .neo-nav-label': {
5095
+ color: neoDesign.semanticColors.buttons.primary.hover, // #1E2EC2
5096
+ },
5097
+ ...(selected && {
5098
+ '& .neo-nav-icon-padding': {
5099
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`, // rgba(220,224,255,0.75)
5100
+ },
5101
+ '& .neo-nav-label': {
5102
+ color: neoDesign.semanticColors.buttons.primary.pressed, // #131E7A
5103
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
5104
+ },
5105
+ '&:hover .neo-nav-icon-padding': {
5106
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`,
5107
+ },
5108
+ '&:hover .neo-nav-label': {
5109
+ color: neoDesign.semanticColors.buttons.primary.pressed,
5110
+ },
5111
+ }),
5112
+ }));
5113
+ const IconPadding = styles.styled('span')({
5114
+ display: 'flex',
5115
+ alignItems: 'center',
5116
+ padding: neoDesign.spacing.spacing_1, // 8px
5117
+ borderRadius: neoDesign.spacing.spacing_1, // 8px
5118
+ transition: 'background-color 150ms',
5119
+ });
5120
+ const Label$2 = styles.styled('span')(({ theme }) => ({
5121
+ fontFamily: neoDesign.typography.fontFamily.body,
5122
+ fontWeight: neoDesign.typography.fontWeight.regular,
5123
+ fontSize: theme.typography.pxToRem(10),
5124
+ lineHeight: 1.2,
5125
+ textAlign: 'center',
5126
+ color: neoDesign.semanticColors.typography.navigation.default, // #1F2937
5127
+ width: '100%',
5128
+ transition: 'color 150ms',
5129
+ }));
5130
+ const TagPill = styles.styled('span')(({ theme }) => ({
5131
+ display: 'inline-flex',
5132
+ alignItems: 'center',
5133
+ justifyContent: 'center',
5134
+ height: 18,
5135
+ paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
5136
+ paddingRight: neoDesign.spacing.spacing_3_4, // 6px
5137
+ borderRadius: neoDesign.borderRadius.full,
5138
+ backgroundColor: neoDesign.colors.digitalBlue[300], // #8D99FF
5139
+ color: neoDesign.semanticColors.typography.tooltip, // white
5140
+ fontFamily: neoDesign.typography.fontFamily.body,
5141
+ fontWeight: neoDesign.typography.fontWeight.medium,
5142
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
5143
+ lineHeight: 1,
5144
+ }));
5145
+ /**
5146
+ * NeoNavigationItem - Vertical navigation item with icon, label, and optional tag
5147
+ *
5148
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
5149
+ */
5150
+ const NeoNavigationItem = ({ icon, label, selected = false, tag, children, ...props }) => {
5151
+ return (jsxRuntime.jsxs(StyledRoot, { selected: selected, disableRipple: true, ...props, children: [jsxRuntime.jsx(IconPadding, { className: "neo-nav-icon-padding", children: icon }), label && jsxRuntime.jsx(Label$2, { className: "neo-nav-label", children: label }), tag && jsxRuntime.jsx(TagPill, { children: tag }), children] }));
5152
+ };
5153
+ NeoNavigationItem.displayName = 'NeoNavigationItem';
5154
+
4907
5155
  /**
4908
5156
  * Sticky header wrapper - sticks to top when scrolling
4909
5157
  */
@@ -6199,6 +6447,8 @@ const NeoTooltip = ({ variant = 'light', title, description, children, arrow = f
6199
6447
  };
6200
6448
  NeoTooltip.displayName = 'NeoTooltip';
6201
6449
 
6450
+ // Figma-exact border radius for toggle buttons — no matching design token
6451
+ const TOGGLE_BUTTON_BORDER_RADIUS = 14;
6202
6452
  const StyledToggleButtonGroup = styles.styled(ToggleButtonGroup)(({ theme }) => ({
6203
6453
  backgroundColor: neoDesign.colors.grey[50],
6204
6454
  padding: theme.spacing(0.625, 0.875),
@@ -6206,17 +6456,14 @@ const StyledToggleButtonGroup = styles.styled(ToggleButtonGroup)(({ theme }) =>
6206
6456
  gap: 0,
6207
6457
  [`& .${ToggleButtonGroup.toggleButtonGroupClasses.grouped}`]: {
6208
6458
  border: 'none',
6209
- // biome-ignore plugin: no exact token for 14px
6210
- borderRadius: 14,
6459
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6211
6460
  margin: 0,
6212
6461
  '&:not(:first-of-type)': {
6213
- // biome-ignore plugin: no exact token for 14px
6214
- borderRadius: 14,
6462
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6215
6463
  marginLeft: 0,
6216
6464
  },
6217
6465
  '&:not(:last-of-type)': {
6218
- // biome-ignore plugin: no exact token for 14px
6219
- borderRadius: 14,
6466
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6220
6467
  },
6221
6468
  },
6222
6469
  }));
@@ -6295,15 +6542,17 @@ exports.NeoDataGridSelect = NeoSelect;
6295
6542
  exports.NeoDatePicker = NeoDatePicker;
6296
6543
  exports.NeoDivider = NeoDivider;
6297
6544
  exports.NeoDot = NeoDot;
6298
- exports.NeoFilterChips = NeoFilterChips;
6545
+ exports.NeoFilterChip = NeoFilterChip;
6299
6546
  exports.NeoFooter = NeoFooter;
6300
6547
  exports.NeoIconButton = NeoIconButton;
6548
+ exports.NeoIconWrapper = NeoIconWrapper;
6301
6549
  exports.NeoInfiniteScrollGrid = NeoInfiniteScrollGrid;
6302
6550
  exports.NeoInputField = NeoInputField;
6303
6551
  exports.NeoListItem = NeoListItem;
6304
6552
  exports.NeoListItemButton = NeoListItemButton;
6305
6553
  exports.NeoLoadingSpinner = NeoLoadingSpinner;
6306
6554
  exports.NeoMarketplaceCard = NeoMarketplaceCard;
6555
+ exports.NeoMarketplaceLargeCard = NeoMarketplaceLargeCard;
6307
6556
  exports.NeoMenu = NeoMenu;
6308
6557
  exports.NeoMenuItem = NeoMenuItem;
6309
6558
  exports.NeoModal = NeoModal;
@@ -6311,6 +6560,7 @@ exports.NeoModalContent = NeoModalContent;
6311
6560
  exports.NeoModalFooter = NeoModalFooter;
6312
6561
  exports.NeoModalHeader = NeoModalHeader;
6313
6562
  exports.NeoMultiBadgesCell = NeoMultiBadgesCell;
6563
+ exports.NeoNavigationItem = NeoNavigationItem;
6314
6564
  exports.NeoPageContent = NeoPageContent;
6315
6565
  exports.NeoPaginatedGrid = NeoPaginatedGrid;
6316
6566
  exports.NeoProgressbar = NeoProgressbar;