@moderneinc/neo-styled-components 2.5.0-next.ab39d3 → 2.5.0-next.ef98e2

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
@@ -149,7 +149,7 @@ const NeoAvatar = ({ size = 'medium', variant = 'circular', ...props }) => {
149
149
  };
150
150
  NeoAvatar.displayName = 'NeoAvatar';
151
151
 
152
- const StyledChip$1 = styles.styled(Chip)(({ theme }) => ({
152
+ const StyledChip$2 = styles.styled(Chip)(({ theme }) => ({
153
153
  height: 24,
154
154
  paddingTop: neoDesign.spacing.spacing_1_4,
155
155
  paddingBottom: neoDesign.spacing.spacing_1_4,
@@ -236,7 +236,7 @@ const StyledChip$1 = styles.styled(Chip)(({ theme }) => ({
236
236
  * - Label → label prop
237
237
  */
238
238
  const NeoBadge = (props) => {
239
- return jsxRuntime.jsx(StyledChip$1, { ...props });
239
+ return jsxRuntime.jsx(StyledChip$2, { ...props });
240
240
  };
241
241
  NeoBadge.displayName = 'NeoBadge';
242
242
 
@@ -502,7 +502,7 @@ const NeoActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
502
502
  NeoActivityIndicatorCell.displayName = 'NeoActivityIndicatorCell';
503
503
 
504
504
  /**
505
- * @license lucide-react v0.564.0 - ISC
505
+ * @license lucide-react v0.575.0 - ISC
506
506
  *
507
507
  * This source code is licensed under the ISC license.
508
508
  * See the LICENSE file in the root directory of this source tree.
@@ -513,7 +513,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
513
513
  }).join(" ").trim();
514
514
 
515
515
  /**
516
- * @license lucide-react v0.564.0 - ISC
516
+ * @license lucide-react v0.575.0 - ISC
517
517
  *
518
518
  * This source code is licensed under the ISC license.
519
519
  * See the LICENSE file in the root directory of this source tree.
@@ -522,7 +522,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
522
522
  const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
523
523
 
524
524
  /**
525
- * @license lucide-react v0.564.0 - ISC
525
+ * @license lucide-react v0.575.0 - ISC
526
526
  *
527
527
  * This source code is licensed under the ISC license.
528
528
  * See the LICENSE file in the root directory of this source tree.
@@ -534,7 +534,7 @@ const toCamelCase = (string) => string.replace(
534
534
  );
535
535
 
536
536
  /**
537
- * @license lucide-react v0.564.0 - ISC
537
+ * @license lucide-react v0.575.0 - ISC
538
538
  *
539
539
  * This source code is licensed under the ISC license.
540
540
  * See the LICENSE file in the root directory of this source tree.
@@ -547,7 +547,7 @@ const toPascalCase = (string) => {
547
547
  };
548
548
 
549
549
  /**
550
- * @license lucide-react v0.564.0 - ISC
550
+ * @license lucide-react v0.575.0 - ISC
551
551
  *
552
552
  * This source code is licensed under the ISC license.
553
553
  * See the LICENSE file in the root directory of this source tree.
@@ -566,7 +566,7 @@ var defaultAttributes = {
566
566
  };
567
567
 
568
568
  /**
569
- * @license lucide-react v0.564.0 - ISC
569
+ * @license lucide-react v0.575.0 - ISC
570
570
  *
571
571
  * This source code is licensed under the ISC license.
572
572
  * See the LICENSE file in the root directory of this source tree.
@@ -582,7 +582,7 @@ const hasA11yProp = (props) => {
582
582
  };
583
583
 
584
584
  /**
585
- * @license lucide-react v0.564.0 - ISC
585
+ * @license lucide-react v0.575.0 - ISC
586
586
  *
587
587
  * This source code is licensed under the ISC license.
588
588
  * See the LICENSE file in the root directory of this source tree.
@@ -620,7 +620,7 @@ const Icon = react.forwardRef(
620
620
  );
621
621
 
622
622
  /**
623
- * @license lucide-react v0.564.0 - ISC
623
+ * @license lucide-react v0.575.0 - ISC
624
624
  *
625
625
  * This source code is licensed under the ISC license.
626
626
  * See the LICENSE file in the root directory of this source tree.
@@ -645,7 +645,7 @@ const createLucideIcon = (iconName, iconNode) => {
645
645
  };
646
646
 
647
647
  /**
648
- * @license lucide-react v0.564.0 - ISC
648
+ * @license lucide-react v0.575.0 - ISC
649
649
  *
650
650
  * This source code is licensed under the ISC license.
651
651
  * See the LICENSE file in the root directory of this source tree.
@@ -659,7 +659,7 @@ const __iconNode$i = [
659
659
  const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
660
660
 
661
661
  /**
662
- * @license lucide-react v0.564.0 - ISC
662
+ * @license lucide-react v0.575.0 - ISC
663
663
  *
664
664
  * This source code is licensed under the ISC license.
665
665
  * See the LICENSE file in the root directory of this source tree.
@@ -673,7 +673,7 @@ const __iconNode$h = [
673
673
  const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
674
674
 
675
675
  /**
676
- * @license lucide-react v0.564.0 - ISC
676
+ * @license lucide-react v0.575.0 - ISC
677
677
  *
678
678
  * This source code is licensed under the ISC license.
679
679
  * See the LICENSE file in the root directory of this source tree.
@@ -695,7 +695,7 @@ const __iconNode$g = [
695
695
  const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
696
696
 
697
697
  /**
698
- * @license lucide-react v0.564.0 - ISC
698
+ * @license lucide-react v0.575.0 - ISC
699
699
  *
700
700
  * This source code is licensed under the ISC license.
701
701
  * See the LICENSE file in the root directory of this source tree.
@@ -706,7 +706,7 @@ const __iconNode$f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
706
706
  const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
707
707
 
708
708
  /**
709
- * @license lucide-react v0.564.0 - ISC
709
+ * @license lucide-react v0.575.0 - ISC
710
710
  *
711
711
  * This source code is licensed under the ISC license.
712
712
  * See the LICENSE file in the root directory of this source tree.
@@ -717,7 +717,7 @@ const __iconNode$e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
717
717
  const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
718
718
 
719
719
  /**
720
- * @license lucide-react v0.564.0 - ISC
720
+ * @license lucide-react v0.575.0 - ISC
721
721
  *
722
722
  * This source code is licensed under the ISC license.
723
723
  * See the LICENSE file in the root directory of this source tree.
@@ -728,7 +728,7 @@ const __iconNode$d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
728
728
  const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
729
729
 
730
730
  /**
731
- * @license lucide-react v0.564.0 - ISC
731
+ * @license lucide-react v0.575.0 - ISC
732
732
  *
733
733
  * This source code is licensed under the ISC license.
734
734
  * See the LICENSE file in the root directory of this source tree.
@@ -739,7 +739,7 @@ const __iconNode$c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
739
739
  const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
740
740
 
741
741
  /**
742
- * @license lucide-react v0.564.0 - ISC
742
+ * @license lucide-react v0.575.0 - ISC
743
743
  *
744
744
  * This source code is licensed under the ISC license.
745
745
  * See the LICENSE file in the root directory of this source tree.
@@ -753,7 +753,7 @@ const __iconNode$b = [
753
753
  const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
754
754
 
755
755
  /**
756
- * @license lucide-react v0.564.0 - ISC
756
+ * @license lucide-react v0.575.0 - ISC
757
757
  *
758
758
  * This source code is licensed under the ISC license.
759
759
  * See the LICENSE file in the root directory of this source tree.
@@ -768,7 +768,7 @@ const __iconNode$a = [
768
768
  const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
769
769
 
770
770
  /**
771
- * @license lucide-react v0.564.0 - ISC
771
+ * @license lucide-react v0.575.0 - ISC
772
772
  *
773
773
  * This source code is licensed under the ISC license.
774
774
  * See the LICENSE file in the root directory of this source tree.
@@ -782,7 +782,7 @@ const __iconNode$9 = [
782
782
  const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
783
783
 
784
784
  /**
785
- * @license lucide-react v0.564.0 - ISC
785
+ * @license lucide-react v0.575.0 - ISC
786
786
  *
787
787
  * This source code is licensed under the ISC license.
788
788
  * See the LICENSE file in the root directory of this source tree.
@@ -797,7 +797,7 @@ const __iconNode$8 = [
797
797
  const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8);
798
798
 
799
799
  /**
800
- * @license lucide-react v0.564.0 - ISC
800
+ * @license lucide-react v0.575.0 - ISC
801
801
  *
802
802
  * This source code is licensed under the ISC license.
803
803
  * See the LICENSE file in the root directory of this source tree.
@@ -812,7 +812,7 @@ const __iconNode$7 = [
812
812
  const Columns3 = createLucideIcon("columns-3", __iconNode$7);
813
813
 
814
814
  /**
815
- * @license lucide-react v0.564.0 - ISC
815
+ * @license lucide-react v0.575.0 - ISC
816
816
  *
817
817
  * This source code is licensed under the ISC license.
818
818
  * See the LICENSE file in the root directory of this source tree.
@@ -827,7 +827,7 @@ const __iconNode$6 = [
827
827
  const Info = createLucideIcon("info", __iconNode$6);
828
828
 
829
829
  /**
830
- * @license lucide-react v0.564.0 - ISC
830
+ * @license lucide-react v0.575.0 - ISC
831
831
  *
832
832
  * This source code is licensed under the ISC license.
833
833
  * See the LICENSE file in the root directory of this source tree.
@@ -842,7 +842,7 @@ const __iconNode$5 = [
842
842
  const ListFilter = createLucideIcon("list-filter", __iconNode$5);
843
843
 
844
844
  /**
845
- * @license lucide-react v0.564.0 - ISC
845
+ * @license lucide-react v0.575.0 - ISC
846
846
  *
847
847
  * This source code is licensed under the ISC license.
848
848
  * See the LICENSE file in the root directory of this source tree.
@@ -856,7 +856,7 @@ const __iconNode$4 = [
856
856
  const Plus = createLucideIcon("plus", __iconNode$4);
857
857
 
858
858
  /**
859
- * @license lucide-react v0.564.0 - ISC
859
+ * @license lucide-react v0.575.0 - ISC
860
860
  *
861
861
  * This source code is licensed under the ISC license.
862
862
  * See the LICENSE file in the root directory of this source tree.
@@ -870,7 +870,7 @@ const __iconNode$3 = [
870
870
  const Search = createLucideIcon("search", __iconNode$3);
871
871
 
872
872
  /**
873
- * @license lucide-react v0.564.0 - ISC
873
+ * @license lucide-react v0.575.0 - ISC
874
874
  *
875
875
  * This source code is licensed under the ISC license.
876
876
  * See the LICENSE file in the root directory of this source tree.
@@ -887,7 +887,7 @@ const __iconNode$2 = [
887
887
  const Trash2 = createLucideIcon("trash-2", __iconNode$2);
888
888
 
889
889
  /**
890
- * @license lucide-react v0.564.0 - ISC
890
+ * @license lucide-react v0.575.0 - ISC
891
891
  *
892
892
  * This source code is licensed under the ISC license.
893
893
  * See the LICENSE file in the root directory of this source tree.
@@ -906,7 +906,7 @@ const __iconNode$1 = [
906
906
  const WifiOff = createLucideIcon("wifi-off", __iconNode$1);
907
907
 
908
908
  /**
909
- * @license lucide-react v0.564.0 - ISC
909
+ * @license lucide-react v0.575.0 - ISC
910
910
  *
911
911
  * This source code is licensed under the ISC license.
912
912
  * See the LICENSE file in the root directory of this source tree.
@@ -1439,7 +1439,7 @@ const LabelContainer$4 = styles.styled('div')(({ size = 'medium' }) => ({
1439
1439
  flexDirection: 'column',
1440
1440
  gap: size === 'medium' ? 2 : 0,
1441
1441
  }));
1442
- const Label$3 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1442
+ const Label$4 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1443
1443
  fontSize: theme.typography.pxToRem(size === 'xs'
1444
1444
  ? neoDesign.typography.fontSize.xs
1445
1445
  : size === 'small'
@@ -1459,6 +1459,8 @@ const HelperText$2 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1459
1459
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1460
1460
  color: neoDesign.semanticColors.typography.bodySecondary,
1461
1461
  }));
1462
+ // Figma-exact border radius for xs checkbox — no matching design token
1463
+ const FIGMA_XS_BORDER_RADIUS = 1;
1462
1464
  const StyledCheckbox = styles.styled(Checkbox, {
1463
1465
  shouldForwardProp: prop => prop !== 'size',
1464
1466
  })(({ size = 'medium' }) => {
@@ -1466,8 +1468,7 @@ const StyledCheckbox = styles.styled(Checkbox, {
1466
1468
  const sizeConfig = {
1467
1469
  xs: {
1468
1470
  size: 12,
1469
- // biome-ignore plugin: Figma-exact 1px for xs — no matching token
1470
- borderRadius: 1, // From Figma: 1px for xs
1471
+ borderRadius: FIGMA_XS_BORDER_RADIUS,
1471
1472
  },
1472
1473
  small: {
1473
1474
  size: 16,
@@ -1588,7 +1589,7 @@ const NeoCheckbox = ({ size = 'medium', label, helperText, disabled, icon, check
1588
1589
  return (jsxRuntime.jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }));
1589
1590
  }
1590
1591
  // With label, wrap in container for proper layout
1591
- return (jsxRuntime.jsxs(CheckboxContainer, { disabled: disabled, children: [jsxRuntime.jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }), jsxRuntime.jsxs(LabelContainer$4, { size: size, children: [label && jsxRuntime.jsx(Label$3, { size: size, children: label }), helperText && jsxRuntime.jsx(HelperText$2, { size: size, children: helperText })] })] }));
1592
+ return (jsxRuntime.jsxs(CheckboxContainer, { disabled: disabled, children: [jsxRuntime.jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }), jsxRuntime.jsxs(LabelContainer$4, { size: size, children: [label && jsxRuntime.jsx(Label$4, { size: size, children: label }), helperText && jsxRuntime.jsx(HelperText$2, { size: size, children: helperText })] })] }));
1592
1593
  };
1593
1594
  NeoCheckbox.displayName = 'NeoCheckbox';
1594
1595
 
@@ -1634,7 +1635,9 @@ const StyledButtonBase = styles.styled(ButtonBase, {
1634
1635
  width: isMultiline ? '100%' : 'fit-content',
1635
1636
  maxWidth: isMultiline ? '100%' : 'none',
1636
1637
  overflowX: isMultiline ? 'auto' : 'visible',
1637
- padding: isMultiline && 'paddingMultiline' in sizeStyles ? sizeStyles.paddingMultiline : sizeStyles.paddingSingleLine,
1638
+ padding: isMultiline && 'paddingMultiline' in sizeStyles
1639
+ ? sizeStyles.paddingMultiline
1640
+ : sizeStyles.paddingSingleLine,
1638
1641
  paddingRight: isMultiline ? theme.spacing(7) : undefined, // Extra space for copy button in multiline only
1639
1642
  fontSize: sizeStyles.fontSize,
1640
1643
  fontFamily: neoDesign.typography.fontFamily.code,
@@ -1758,13 +1761,14 @@ const ColumnItemContainer = styles.styled(Box)(({ theme }) => ({
1758
1761
  paddingLeft: theme.spacing(0.75),
1759
1762
  paddingRight: theme.spacing(0.75),
1760
1763
  }));
1764
+ // Figma-exact border radius for menu items — no matching design token
1765
+ const MENU_ITEM_BORDER_RADIUS = 6;
1761
1766
  const MenuItemContent$1 = styles.styled('div')(({ theme }) => ({
1762
1767
  display: 'flex',
1763
1768
  alignItems: 'center',
1764
1769
  gap: theme.spacing(1),
1765
1770
  padding: theme.spacing(1),
1766
- // biome-ignore plugin: no exact token for 6px
1767
- borderRadius: 6,
1771
+ borderRadius: MENU_ITEM_BORDER_RADIUS,
1768
1772
  width: '100%',
1769
1773
  '&:hover': {
1770
1774
  backgroundColor: neoDesign.semanticColors.surfaces.listHover,
@@ -1908,7 +1912,7 @@ const LabelContainer$3 = styles.styled('div')({
1908
1912
  gap: neoDesign.spacing.spacing_1,
1909
1913
  minWidth: 0,
1910
1914
  });
1911
- const Label$2 = styles.styled('span')({
1915
+ const Label$3 = styles.styled('span')({
1912
1916
  color: neoDesign.semanticColors.icons.default,
1913
1917
  flexShrink: 0,
1914
1918
  });
@@ -1960,7 +1964,7 @@ const Shortcut = styles.styled('span')(({ theme }) => ({
1960
1964
  * ```
1961
1965
  */
1962
1966
  const NeoMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
1963
- return (jsxRuntime.jsx(StyledMenuItem, { ...props, children: jsxRuntime.jsxs(MenuItemContent, { children: [icon && jsxRuntime.jsx(IconWrapper$1, { children: icon }), jsxRuntime.jsxs(LabelContainer$3, { children: [jsxRuntime.jsx(Label$2, { children: children }), secondaryText && jsxRuntime.jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsxRuntime.jsx(Shortcut, { children: shortcut })] }) }));
1967
+ return (jsxRuntime.jsx(StyledMenuItem, { ...props, children: jsxRuntime.jsxs(MenuItemContent, { children: [icon && jsxRuntime.jsx(IconWrapper$1, { children: icon }), jsxRuntime.jsxs(LabelContainer$3, { children: [jsxRuntime.jsx(Label$3, { children: children }), secondaryText && jsxRuntime.jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsxRuntime.jsx(Shortcut, { children: shortcut })] }) }));
1964
1968
  };
1965
1969
  NeoMenuItem.displayName = 'NeoMenuItem';
1966
1970
 
@@ -2476,111 +2480,85 @@ function NeoDataGridColumnsButton() {
2476
2480
  }
2477
2481
  NeoDataGridColumnsButton.displayName = 'NeoDataGridColumnsButton';
2478
2482
 
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' && {
2483
+ const sizeStyles = {
2484
+ small: {
2486
2485
  height: 16,
2487
2486
  paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
2488
2487
  paddingRight: neoDesign.spacing.spacing_1_2, // 4px
2489
- }),
2490
- ...(size === 'medium' && {
2488
+ },
2489
+ medium: {
2491
2490
  height: 18,
2492
2491
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2493
2492
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2494
- }),
2495
- ...(size === 'large' && {
2493
+ },
2494
+ large: {
2496
2495
  height: 20,
2497
2496
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2498
2497
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2499
- }),
2500
- [`& .${Chip.chipClasses.label}`]: {
2501
- padding: 0,
2502
2498
  },
2503
- // Outlined variant (light type in Figma) - Neutral/Default
2504
- ...(variant === 'outlined' &&
2505
- color === 'default' && {
2499
+ };
2500
+ const outlinedColorStyles = {
2501
+ default: {
2506
2502
  backgroundColor: neoDesign.semanticColors.status.neutral.light,
2507
2503
  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' && {
2504
+ borderColor: neoDesign.colors.grey[200],
2505
+ },
2506
+ error: {
2513
2507
  backgroundColor: neoDesign.semanticColors.status.error.light,
2514
2508
  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' && {
2509
+ borderColor: neoDesign.colors.red[100],
2510
+ },
2511
+ warning: {
2520
2512
  backgroundColor: neoDesign.semanticColors.status.warning.light,
2521
2513
  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' && {
2514
+ borderColor: neoDesign.colors.orange[100],
2515
+ },
2516
+ success: {
2527
2517
  backgroundColor: neoDesign.semanticColors.status.success.light,
2528
2518
  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' && {
2519
+ borderColor: 'rgba(94, 196, 111, 0.24)',
2520
+ },
2521
+ info: {
2534
2522
  backgroundColor: neoDesign.semanticColors.status.info.light,
2535
2523
  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' && {
2524
+ borderColor: neoDesign.colors.digitalBlue[100],
2525
+ },
2526
+ violet: {
2541
2527
  backgroundColor: `${neoDesign.colors.violet[100]}66`, // rgba(235,213,241,0.4)
2542
2528
  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
2529
+ borderColor: neoDesign.colors.violet[100],
2530
+ },
2531
+ beta: {
2532
+ backgroundColor: neoDesign.colors.digitalBlue[100],
2533
+ color: neoDesign.colors.digitalBlue[400],
2534
+ borderColor: neoDesign.colors.digitalBlue[100],
2535
+ },
2536
+ };
2537
+ const filledColorStyles = {
2538
+ default: neoDesign.semanticColors.status.neutral.medium,
2539
+ error: neoDesign.semanticColors.status.error.medium,
2540
+ warning: neoDesign.semanticColors.status.warning.medium,
2541
+ success: neoDesign.semanticColors.status.success.medium,
2542
+ info: neoDesign.semanticColors.status.info.medium,
2543
+ violet: neoDesign.colors.violet[500],
2544
+ beta: neoDesign.colors.digitalBlue[300],
2545
+ };
2546
+ const StyledChip$1 = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2547
+ padding: 0,
2548
+ borderRadius: neoDesign.borderRadius.full,
2549
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2550
+ fontWeight: neoDesign.typography.fontWeight.medium,
2551
+ ...(size && sizeStyles[size]),
2552
+ [`& .${Chip.chipClasses.label}`]: {
2553
+ padding: 0,
2554
+ },
2555
+ ...(variant === 'outlined' &&
2556
+ color &&
2557
+ outlinedColorStyles[color]),
2581
2558
  ...(variant === 'filled' &&
2582
- color === 'violet' && {
2583
- backgroundColor: neoDesign.colors.violet[500],
2559
+ color &&
2560
+ color in filledColorStyles && {
2561
+ backgroundColor: filledColorStyles[color],
2584
2562
  color: theme.palette.common.white,
2585
2563
  border: 'none',
2586
2564
  }),
@@ -2593,11 +2571,11 @@ const StyledChip = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2593
2571
  * Figma Props Mapping:
2594
2572
  * - m (sm|md|lg) → size (small|medium|large)
2595
2573
  * - type (light|dark) → variant (outlined|filled)
2596
- * - state (Neutral|Error|Warning|Success|Info|Violet) → color (default|error|warning|success|info|violet)
2574
+ * - state (Neutral|Error|Warning|Success|Info|Violet|Beta) → color (default|error|warning|success|info|violet|beta)
2597
2575
  * - Label text → label prop
2598
2576
  */
2599
2577
  const NeoTag = ({ size = 'small', variant = 'outlined', ...props }) => {
2600
- return jsxRuntime.jsx(StyledChip, { size: size, variant: variant, ...props });
2578
+ return jsxRuntime.jsx(StyledChip$1, { size: size, variant: variant, ...props });
2601
2579
  };
2602
2580
  NeoTag.displayName = 'NeoTag';
2603
2581
 
@@ -3558,6 +3536,102 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3558
3536
  };
3559
3537
  NeoDot.displayName = 'NeoDot';
3560
3538
 
3539
+ 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}`;
3540
+ const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3541
+ const StyledChip = styles.styled(Chip, {
3542
+ shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
3543
+ })(({ theme, selected }) => ({
3544
+ borderRadius: neoDesign.borderRadius.full,
3545
+ border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
3546
+ backgroundColor: selected
3547
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3548
+ : neoDesign.semanticColors.surfaces.white,
3549
+ minHeight: 40,
3550
+ padding: `${neoDesign.spacing.spacing_3_4}px ${neoDesign.spacing.spacing_1_1_2}px`,
3551
+ gap: neoDesign.spacing.spacing_1,
3552
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3553
+ fontWeight: neoDesign.typography.fontWeight.medium,
3554
+ lineHeight: 1,
3555
+ color: neoDesign.semanticColors.typography.body,
3556
+ [`& .${Chip.chipClasses.label}`]: {
3557
+ padding: 0,
3558
+ overflow: 'visible',
3559
+ display: 'flex',
3560
+ alignItems: 'center',
3561
+ },
3562
+ [`& .${Chip.chipClasses.deleteIcon}`]: {
3563
+ color: neoDesign.semanticColors.icons.default,
3564
+ width: 24,
3565
+ height: 24,
3566
+ margin: 0,
3567
+ flexShrink: 0,
3568
+ '&:hover': {
3569
+ color: neoDesign.semanticColors.icons.default,
3570
+ },
3571
+ },
3572
+ '&:hover': {
3573
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
3574
+ },
3575
+ [`&.${Chip.chipClasses.focusVisible}`]: {
3576
+ boxShadow: focusRing,
3577
+ backgroundColor: selected
3578
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3579
+ : neoDesign.semanticColors.surfaces.white,
3580
+ },
3581
+ }));
3582
+ const LabelContent = styles.styled('span')({
3583
+ display: 'inline-flex',
3584
+ alignItems: 'center',
3585
+ gap: neoDesign.spacing.spacing_1,
3586
+ });
3587
+ const TextStack = styles.styled('span')({
3588
+ display: 'flex',
3589
+ flexDirection: 'column',
3590
+ alignItems: 'flex-start',
3591
+ justifyContent: 'center',
3592
+ gap: neoDesign.spacing.spacing_1_4,
3593
+ });
3594
+ const HeaderLabel = styles.styled('span')(({ theme }) => ({
3595
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xxs),
3596
+ fontWeight: neoDesign.typography.fontWeight.regular,
3597
+ lineHeight: '120%',
3598
+ color: neoDesign.semanticColors.typography.bodySecondary,
3599
+ }));
3600
+ const SelectedLabel = styles.styled('span')(({ theme }) => ({
3601
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3602
+ fontWeight: neoDesign.typography.fontWeight.medium,
3603
+ lineHeight: 1,
3604
+ color: neoDesign.semanticColors.buttons.secondary.default,
3605
+ }));
3606
+ const CountBadge = styles.styled('span')(({ theme }) => ({
3607
+ display: 'inline-flex',
3608
+ alignItems: 'center',
3609
+ justifyContent: 'center',
3610
+ minWidth: 16,
3611
+ height: 16,
3612
+ padding: `0 ${neoDesign.spacing.spacing_1_2}px`,
3613
+ borderRadius: neoDesign.borderRadius.full,
3614
+ backgroundColor: neoDesign.semanticColors.brand,
3615
+ color: neoDesign.semanticColors.surfaces.white,
3616
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
3617
+ fontWeight: neoDesign.typography.fontWeight.medium,
3618
+ lineHeight: 1,
3619
+ boxSizing: 'border-box',
3620
+ }));
3621
+ /**
3622
+ * NeoFilterChip - Filter chip for filtering data, based on MUI Chip.
3623
+ *
3624
+ * @example
3625
+ * <NeoFilterChip label="Status" selected selectedLabel="Active, Pending" count={2} onClear={handleClear} />
3626
+ *
3627
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=8257-239
3628
+ */
3629
+ const NeoFilterChip = ({ label, selected = false, expanded, selectedLabel, count = 0, onClear, onClick, ...props }) => {
3630
+ 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);
3631
+ 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 }));
3632
+ };
3633
+ NeoFilterChip.displayName = 'NeoFilterChip';
3634
+
3561
3635
  const SpinnerWrapper = styles.styled('div')({
3562
3636
  width: 24,
3563
3637
  height: 24,
@@ -3798,6 +3872,31 @@ const NeoFooter = ({ variant = 'pagination', showShadow = false, loading = false
3798
3872
  };
3799
3873
  NeoFooter.displayName = 'NeoFooter';
3800
3874
 
3875
+ const customProps$1 = ['iconSize'];
3876
+ const StyledIconWrapper = styles.styled('div', {
3877
+ shouldForwardProp: prop => !customProps$1.includes(prop),
3878
+ })(({ iconSize }) => ({
3879
+ display: 'inline-flex',
3880
+ alignItems: 'center',
3881
+ justifyContent: 'center',
3882
+ width: iconSize,
3883
+ height: iconSize,
3884
+ flexShrink: 0,
3885
+ '& svg': {
3886
+ width: iconSize,
3887
+ height: iconSize,
3888
+ },
3889
+ }));
3890
+ /**
3891
+ * NeoIconWrapper - Flex-centered container that sizes icons
3892
+ *
3893
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4061-9955
3894
+ */
3895
+ const NeoIconWrapper = ({ size = 20, children, ...props }) => {
3896
+ return (jsxRuntime.jsx(StyledIconWrapper, { iconSize: size, ...props, children: children }));
3897
+ };
3898
+ NeoIconWrapper.displayName = 'NeoIconWrapper';
3899
+
3801
3900
  /**
3802
3901
  * NeoInfiniteScrollGrid - DataGrid with infinite scroll and load-more functionality
3803
3902
  *
@@ -4432,11 +4531,11 @@ NeoListItemButton.displayName = 'NeoListItemButton';
4432
4531
  * Focus ring box-shadow using Neo design tokens
4433
4532
  * Combines focusWhite1 (inner white ring) and focusBlue2 (outer blue ring)
4434
4533
  */
4435
- 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}`;
4534
+ 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}`;
4436
4535
  /**
4437
4536
  * Card box-shadow using Neo design tokens for hover and selected states
4438
4537
  */
4439
- 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}`;
4538
+ 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}`;
4440
4539
  /**
4441
4540
  * Styled Card component with Neo design tokens
4442
4541
  */
@@ -4452,16 +4551,16 @@ const StyledCard = styles.styled(MuiCard, {
4452
4551
  backgroundColor: neoDesign.semanticColors.surfaces.card,
4453
4552
  border: `1px solid ${selected ? neoDesign.semanticColors.border.tabActive : neoDesign.semanticColors.border.card}`,
4454
4553
  borderRadius: neoDesign.borderRadius.xS,
4455
- boxShadow: selected ? activeShadow : 'none',
4554
+ boxShadow: selected ? activeShadow$1 : 'none',
4456
4555
  transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
4457
4556
  cursor: 'pointer',
4458
4557
  '&:hover': {
4459
4558
  borderColor: neoDesign.semanticColors.border.tabActive,
4460
- boxShadow: activeShadow,
4559
+ boxShadow: activeShadow$1,
4461
4560
  },
4462
4561
  '&:focus-visible': {
4463
4562
  borderColor: neoDesign.semanticColors.border.tabActive,
4464
- boxShadow: focusRingShadow,
4563
+ boxShadow: focusRingShadow$1,
4465
4564
  outline: 'none',
4466
4565
  },
4467
4566
  ...(disabled && {
@@ -4521,7 +4620,7 @@ const Title = styles.styled('p')(({ theme }) => ({
4521
4620
  /**
4522
4621
  * Description text
4523
4622
  */
4524
- const Description = styles.styled('p')(({ theme }) => ({
4623
+ const Description$1 = styles.styled('p')(({ theme }) => ({
4525
4624
  margin: 0,
4526
4625
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
4527
4626
  fontWeight: neoDesign.typography.fontWeight.regular, // 400
@@ -4576,10 +4675,131 @@ const Description = styles.styled('p')(({ theme }) => ({
4576
4675
  * - typography.fontWeight.regular (400) - Description
4577
4676
  */
4578
4677
  const NeoMarketplaceCard = ({ logo, recipeCount, title, description, selected = false, disabled = false, onClick, ...props }) => {
4579
- 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 })] })] }));
4678
+ 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 })] })] }));
4580
4679
  };
4581
4680
  NeoMarketplaceCard.displayName = 'NeoMarketplaceCard';
4582
4681
 
4682
+ 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}`;
4683
+ 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}`;
4684
+ const StyledLargeCard = styles.styled(MuiCard, {
4685
+ shouldForwardProp: prop => prop !== 'cardState' && prop !== 'cardTheme',
4686
+ })(({ cardState = 'default', cardTheme = 'light' }) => {
4687
+ const isLight = cardTheme === 'light';
4688
+ const isActive = cardState === 'active';
4689
+ const isDisabled = cardState === 'disabled';
4690
+ const isFocused = cardState === 'focused';
4691
+ const activeBorderColor = isLight ? neoDesign.semanticColors.border.tabActive : neoDesign.colors.digitalGreen[300];
4692
+ const defaultBorderColor = isLight
4693
+ ? neoDesign.semanticColors.border.card
4694
+ : `${neoDesign.semanticColors.border.card}80`;
4695
+ return {
4696
+ width: 340,
4697
+ height: 162,
4698
+ display: 'flex',
4699
+ flexDirection: 'column',
4700
+ justifyContent: 'space-between',
4701
+ alignItems: 'flex-start',
4702
+ padding: neoDesign.spacing.spacing_2,
4703
+ borderRadius: neoDesign.borderRadius.xS,
4704
+ backgroundColor: isLight ? neoDesign.semanticColors.surfaces.card : neoDesign.colors.grey[800],
4705
+ border: `1px solid ${isActive || isFocused ? activeBorderColor : defaultBorderColor}`,
4706
+ boxShadow: isActive ? activeShadow : isFocused ? focusRingShadow : 'none',
4707
+ overflow: 'hidden',
4708
+ '&:focus-visible': {
4709
+ borderColor: isLight ? neoDesign.semanticColors.border.tabActive : neoDesign.colors.digitalGreen[300],
4710
+ boxShadow: focusRingShadow,
4711
+ outline: 'none',
4712
+ },
4713
+ ...(isDisabled && {
4714
+ opacity: 0.5,
4715
+ pointerEvents: 'none',
4716
+ cursor: 'not-allowed',
4717
+ }),
4718
+ };
4719
+ });
4720
+ const TopSection = styles.styled('div')({
4721
+ display: 'flex',
4722
+ flexDirection: 'column',
4723
+ gap: neoDesign.spacing.spacing_2,
4724
+ alignItems: 'flex-start',
4725
+ width: '100%',
4726
+ flexShrink: 0,
4727
+ });
4728
+ const HeaderRow = styles.styled('div')({
4729
+ display: 'flex',
4730
+ gap: neoDesign.spacing.spacing_1,
4731
+ alignItems: 'center',
4732
+ flexShrink: 0,
4733
+ });
4734
+ const HeaderSlot = styles.styled('div')({
4735
+ display: 'flex',
4736
+ flexDirection: 'column',
4737
+ alignItems: 'center',
4738
+ justifyContent: 'center',
4739
+ width: 20,
4740
+ height: 20,
4741
+ flexShrink: 0,
4742
+ });
4743
+ const HeaderTitle = styles.styled('span', {
4744
+ shouldForwardProp: prop => prop !== 'cardTheme',
4745
+ })(({ cardTheme = 'light' }) => ({
4746
+ fontFamily: `${neoDesign.typography.fontFamily.heading}, sans-serif`,
4747
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
4748
+ fontSize: neoDesign.typography.fontSize.h6,
4749
+ lineHeight: 1.4,
4750
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4751
+ flexShrink: 0,
4752
+ }));
4753
+ const Description = styles.styled('p', {
4754
+ shouldForwardProp: prop => prop !== 'cardTheme',
4755
+ })(({ cardTheme = 'light' }) => ({
4756
+ fontFamily: `${neoDesign.typography.fontFamily.body}, sans-serif`,
4757
+ fontWeight: neoDesign.typography.fontWeight.regular,
4758
+ fontSize: neoDesign.typography.fontSize.xs,
4759
+ lineHeight: 1.5,
4760
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4761
+ margin: 0,
4762
+ minWidth: '100%',
4763
+ wordWrap: 'break-word',
4764
+ }));
4765
+ const ButtonsRow = styles.styled('div')({
4766
+ display: 'flex',
4767
+ gap: neoDesign.spacing.spacing_3,
4768
+ alignItems: 'flex-start',
4769
+ flexShrink: 0,
4770
+ });
4771
+ /**
4772
+ * NeoMarketplaceLargeCard - A large marketplace card with state and theme variants
4773
+ *
4774
+ * A 340x162px card with optional icon, gel brand icon, title, description, and action buttons.
4775
+ * Icon, gel, and title display inline in a header row.
4776
+ * Supports 4 states (default, active, disabled, focused) and 2 themes (light, dark).
4777
+ *
4778
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=5925-11
4779
+ *
4780
+ * Figma Props Mapping:
4781
+ * - Property 1 → state (default/active/disabled/focused)
4782
+ * - Property 2 → cardTheme (light/dark)
4783
+ * - Show Icon → showIcon
4784
+ * - Show gel → showGel
4785
+ * - show buttons → showButtons
4786
+ *
4787
+ * Design Tokens Used:
4788
+ * - semanticColors.surfaces.card (#ffffff) - Light theme background
4789
+ * - colors.grey[800] (#1f2937) - Dark theme background
4790
+ * - semanticColors.border.card (#d1d5db) - Default border (50% opacity on dark)
4791
+ * - semanticColors.border.tabActive (#2f42ff) - Active/focused border (light theme)
4792
+ * - colors.digitalGreen[300] (#88fe9b) - Active/focused border (dark theme)
4793
+ * - borderRadius.xS (4px) - Corner radius
4794
+ * - shadows.focusWhite1 + shadows.focusBlue2 - Focus ring
4795
+ * - shadows.card - Active state shadow
4796
+ */
4797
+ const NeoMarketplaceLargeCard = ({ state = 'default', cardTheme = 'light', showIcon = true, showGel = true, showButtons = true, icon, gel, title, children, actions, onClick, ...props }) => {
4798
+ const isDisabled = state === 'disabled';
4799
+ 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 })] }));
4800
+ };
4801
+ NeoMarketplaceLargeCard.displayName = 'NeoMarketplaceLargeCard';
4802
+
4583
4803
  const StyledMenu = styles.styled(Menu)(({ theme }) => ({
4584
4804
  [`& .${Paper.paperClasses.root}`]: {
4585
4805
  backgroundColor: neoDesign.semanticColors.surfaces.white,
@@ -4823,6 +5043,87 @@ const NeoModalFooter = ({ leadingContent, children }) => {
4823
5043
  };
4824
5044
  NeoModalFooter.displayName = 'NeoModalFooter';
4825
5045
 
5046
+ const customProps = ['selected'];
5047
+ const StyledRoot = styles.styled(ButtonBase, {
5048
+ shouldForwardProp: prop => !customProps.includes(prop),
5049
+ })(({ selected }) => ({
5050
+ display: 'flex',
5051
+ flexDirection: 'column',
5052
+ gap: neoDesign.spacing.spacing_1_4, // 2px
5053
+ alignItems: 'center',
5054
+ justifyContent: 'center',
5055
+ paddingTop: neoDesign.spacing.spacing_1, // 8px
5056
+ paddingBottom: neoDesign.spacing.spacing_1, // 8px
5057
+ paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
5058
+ paddingRight: neoDesign.spacing.spacing_1_2, // 4px
5059
+ borderRadius: neoDesign.borderRadius.xS, // 4px
5060
+ width: 95,
5061
+ cursor: 'pointer',
5062
+ textDecoration: 'none',
5063
+ '&:hover .neo-nav-icon-padding': {
5064
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground, // #F2F3FF
5065
+ },
5066
+ '&:hover .neo-nav-label': {
5067
+ color: neoDesign.semanticColors.buttons.primary.hover, // #1E2EC2
5068
+ },
5069
+ ...(selected && {
5070
+ '& .neo-nav-icon-padding': {
5071
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`, // rgba(220,224,255,0.75)
5072
+ },
5073
+ '& .neo-nav-label': {
5074
+ color: neoDesign.semanticColors.buttons.primary.pressed, // #131E7A
5075
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
5076
+ },
5077
+ '&:hover .neo-nav-icon-padding': {
5078
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`,
5079
+ },
5080
+ '&:hover .neo-nav-label': {
5081
+ color: neoDesign.semanticColors.buttons.primary.pressed,
5082
+ },
5083
+ }),
5084
+ }));
5085
+ const IconPadding = styles.styled('span')({
5086
+ display: 'flex',
5087
+ alignItems: 'center',
5088
+ padding: neoDesign.spacing.spacing_1, // 8px
5089
+ borderRadius: neoDesign.spacing.spacing_1, // 8px
5090
+ transition: 'background-color 150ms',
5091
+ });
5092
+ const Label$2 = styles.styled('span')(({ theme }) => ({
5093
+ fontFamily: neoDesign.typography.fontFamily.body,
5094
+ fontWeight: neoDesign.typography.fontWeight.regular,
5095
+ fontSize: theme.typography.pxToRem(10),
5096
+ lineHeight: 1.2,
5097
+ textAlign: 'center',
5098
+ color: neoDesign.semanticColors.typography.navigation.default, // #1F2937
5099
+ width: '100%',
5100
+ transition: 'color 150ms',
5101
+ }));
5102
+ const TagPill = styles.styled('span')(({ theme }) => ({
5103
+ display: 'inline-flex',
5104
+ alignItems: 'center',
5105
+ justifyContent: 'center',
5106
+ height: 18,
5107
+ paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
5108
+ paddingRight: neoDesign.spacing.spacing_3_4, // 6px
5109
+ borderRadius: neoDesign.borderRadius.full,
5110
+ backgroundColor: neoDesign.colors.digitalBlue[300], // #8D99FF
5111
+ color: neoDesign.semanticColors.typography.tooltip, // white
5112
+ fontFamily: neoDesign.typography.fontFamily.body,
5113
+ fontWeight: neoDesign.typography.fontWeight.medium,
5114
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
5115
+ lineHeight: 1,
5116
+ }));
5117
+ /**
5118
+ * NeoNavigationItem - Vertical navigation item with icon, label, and optional tag
5119
+ *
5120
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
5121
+ */
5122
+ const NeoNavigationItem = ({ icon, label, selected = false, tag, children, ...props }) => {
5123
+ 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] }));
5124
+ };
5125
+ NeoNavigationItem.displayName = 'NeoNavigationItem';
5126
+
4826
5127
  /**
4827
5128
  * Sticky header wrapper - sticks to top when scrolling
4828
5129
  */
@@ -6118,6 +6419,8 @@ const NeoTooltip = ({ variant = 'light', title, description, children, arrow = f
6118
6419
  };
6119
6420
  NeoTooltip.displayName = 'NeoTooltip';
6120
6421
 
6422
+ // Figma-exact border radius for toggle buttons — no matching design token
6423
+ const TOGGLE_BUTTON_BORDER_RADIUS = 14;
6121
6424
  const StyledToggleButtonGroup = styles.styled(ToggleButtonGroup)(({ theme }) => ({
6122
6425
  backgroundColor: neoDesign.colors.grey[50],
6123
6426
  padding: theme.spacing(0.625, 0.875),
@@ -6125,17 +6428,14 @@ const StyledToggleButtonGroup = styles.styled(ToggleButtonGroup)(({ theme }) =>
6125
6428
  gap: 0,
6126
6429
  [`& .${ToggleButtonGroup.toggleButtonGroupClasses.grouped}`]: {
6127
6430
  border: 'none',
6128
- // biome-ignore plugin: no exact token for 14px
6129
- borderRadius: 14,
6431
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6130
6432
  margin: 0,
6131
6433
  '&:not(:first-of-type)': {
6132
- // biome-ignore plugin: no exact token for 14px
6133
- borderRadius: 14,
6434
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6134
6435
  marginLeft: 0,
6135
6436
  },
6136
6437
  '&:not(:last-of-type)': {
6137
- // biome-ignore plugin: no exact token for 14px
6138
- borderRadius: 14,
6438
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6139
6439
  },
6140
6440
  },
6141
6441
  }));
@@ -6214,14 +6514,17 @@ exports.NeoDataGridSelect = NeoSelect;
6214
6514
  exports.NeoDatePicker = NeoDatePicker;
6215
6515
  exports.NeoDivider = NeoDivider;
6216
6516
  exports.NeoDot = NeoDot;
6517
+ exports.NeoFilterChip = NeoFilterChip;
6217
6518
  exports.NeoFooter = NeoFooter;
6218
6519
  exports.NeoIconButton = NeoIconButton;
6520
+ exports.NeoIconWrapper = NeoIconWrapper;
6219
6521
  exports.NeoInfiniteScrollGrid = NeoInfiniteScrollGrid;
6220
6522
  exports.NeoInputField = NeoInputField;
6221
6523
  exports.NeoListItem = NeoListItem;
6222
6524
  exports.NeoListItemButton = NeoListItemButton;
6223
6525
  exports.NeoLoadingSpinner = NeoLoadingSpinner;
6224
6526
  exports.NeoMarketplaceCard = NeoMarketplaceCard;
6527
+ exports.NeoMarketplaceLargeCard = NeoMarketplaceLargeCard;
6225
6528
  exports.NeoMenu = NeoMenu;
6226
6529
  exports.NeoMenuItem = NeoMenuItem;
6227
6530
  exports.NeoModal = NeoModal;
@@ -6229,6 +6532,7 @@ exports.NeoModalContent = NeoModalContent;
6229
6532
  exports.NeoModalFooter = NeoModalFooter;
6230
6533
  exports.NeoModalHeader = NeoModalHeader;
6231
6534
  exports.NeoMultiBadgesCell = NeoMultiBadgesCell;
6535
+ exports.NeoNavigationItem = NeoNavigationItem;
6232
6536
  exports.NeoPageContent = NeoPageContent;
6233
6537
  exports.NeoPaginatedGrid = NeoPaginatedGrid;
6234
6538
  exports.NeoProgressbar = NeoProgressbar;