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