@moderneinc/neo-styled-components 2.5.0-next.45d7db → 2.5.0-next.80ce67

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
 
@@ -386,6 +386,7 @@ const ActivityDot = styles.styled('div')(({ color }) => ({
386
386
  *
387
387
  * **Figma Props Mapping:**
388
388
  * - `Size` (Figma) → `size` (React): Height variant matching DataGrid sizes
389
+ * - `Type` (Figma) → `color` (React): Activity type (Commit Job → commitJob, Recipe Run → recipeRun, Visualization → visualization)
389
390
  *
390
391
  * **Design Tokens:**
391
392
  * - `semanticColors.activity.commitJob` - Blue dot for commit job events (#2F42FF)
@@ -501,7 +502,7 @@ const NeoActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
501
502
  NeoActivityIndicatorCell.displayName = 'NeoActivityIndicatorCell';
502
503
 
503
504
  /**
504
- * @license lucide-react v0.564.0 - ISC
505
+ * @license lucide-react v0.575.0 - ISC
505
506
  *
506
507
  * This source code is licensed under the ISC license.
507
508
  * See the LICENSE file in the root directory of this source tree.
@@ -512,7 +513,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
512
513
  }).join(" ").trim();
513
514
 
514
515
  /**
515
- * @license lucide-react v0.564.0 - ISC
516
+ * @license lucide-react v0.575.0 - ISC
516
517
  *
517
518
  * This source code is licensed under the ISC license.
518
519
  * See the LICENSE file in the root directory of this source tree.
@@ -521,7 +522,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
521
522
  const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
522
523
 
523
524
  /**
524
- * @license lucide-react v0.564.0 - ISC
525
+ * @license lucide-react v0.575.0 - ISC
525
526
  *
526
527
  * This source code is licensed under the ISC license.
527
528
  * See the LICENSE file in the root directory of this source tree.
@@ -533,7 +534,7 @@ const toCamelCase = (string) => string.replace(
533
534
  );
534
535
 
535
536
  /**
536
- * @license lucide-react v0.564.0 - ISC
537
+ * @license lucide-react v0.575.0 - ISC
537
538
  *
538
539
  * This source code is licensed under the ISC license.
539
540
  * See the LICENSE file in the root directory of this source tree.
@@ -546,7 +547,7 @@ const toPascalCase = (string) => {
546
547
  };
547
548
 
548
549
  /**
549
- * @license lucide-react v0.564.0 - ISC
550
+ * @license lucide-react v0.575.0 - ISC
550
551
  *
551
552
  * This source code is licensed under the ISC license.
552
553
  * See the LICENSE file in the root directory of this source tree.
@@ -565,7 +566,7 @@ var defaultAttributes = {
565
566
  };
566
567
 
567
568
  /**
568
- * @license lucide-react v0.564.0 - ISC
569
+ * @license lucide-react v0.575.0 - ISC
569
570
  *
570
571
  * This source code is licensed under the ISC license.
571
572
  * See the LICENSE file in the root directory of this source tree.
@@ -581,7 +582,7 @@ const hasA11yProp = (props) => {
581
582
  };
582
583
 
583
584
  /**
584
- * @license lucide-react v0.564.0 - ISC
585
+ * @license lucide-react v0.575.0 - ISC
585
586
  *
586
587
  * This source code is licensed under the ISC license.
587
588
  * See the LICENSE file in the root directory of this source tree.
@@ -619,7 +620,7 @@ const Icon = react.forwardRef(
619
620
  );
620
621
 
621
622
  /**
622
- * @license lucide-react v0.564.0 - ISC
623
+ * @license lucide-react v0.575.0 - ISC
623
624
  *
624
625
  * This source code is licensed under the ISC license.
625
626
  * See the LICENSE file in the root directory of this source tree.
@@ -644,42 +645,42 @@ const createLucideIcon = (iconName, iconNode) => {
644
645
  };
645
646
 
646
647
  /**
647
- * @license lucide-react v0.564.0 - ISC
648
+ * @license lucide-react v0.575.0 - ISC
648
649
  *
649
650
  * This source code is licensed under the ISC license.
650
651
  * See the LICENSE file in the root directory of this source tree.
651
652
  */
652
653
 
653
654
 
654
- const __iconNode$h = [
655
+ const __iconNode$i = [
655
656
  ["path", { d: "M12 5v14", key: "s699le" }],
656
657
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
657
658
  ];
658
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$h);
659
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
659
660
 
660
661
  /**
661
- * @license lucide-react v0.564.0 - ISC
662
+ * @license lucide-react v0.575.0 - ISC
662
663
  *
663
664
  * This source code is licensed under the ISC license.
664
665
  * See the LICENSE file in the root directory of this source tree.
665
666
  */
666
667
 
667
668
 
668
- const __iconNode$g = [
669
+ const __iconNode$h = [
669
670
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
670
671
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
671
672
  ];
672
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$g);
673
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
673
674
 
674
675
  /**
675
- * @license lucide-react v0.564.0 - ISC
676
+ * @license lucide-react v0.575.0 - ISC
676
677
  *
677
678
  * This source code is licensed under the ISC license.
678
679
  * See the LICENSE file in the root directory of this source tree.
679
680
  */
680
681
 
681
682
 
682
- const __iconNode$f = [
683
+ const __iconNode$g = [
683
684
  ["path", { d: "M8 2v4", key: "1cmpym" }],
684
685
  ["path", { d: "M16 2v4", key: "4m81vk" }],
685
686
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
@@ -691,127 +692,142 @@ const __iconNode$f = [
691
692
  ["path", { d: "M12 18h.01", key: "mhygvu" }],
692
693
  ["path", { d: "M16 18h.01", key: "kzsmim" }]
693
694
  ];
694
- const CalendarDays = createLucideIcon("calendar-days", __iconNode$f);
695
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
695
696
 
696
697
  /**
697
- * @license lucide-react v0.564.0 - ISC
698
+ * @license lucide-react v0.575.0 - ISC
698
699
  *
699
700
  * This source code is licensed under the ISC license.
700
701
  * See the LICENSE file in the root directory of this source tree.
701
702
  */
702
703
 
703
704
 
704
- const __iconNode$e = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
705
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$e);
705
+ const __iconNode$f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
706
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
706
707
 
707
708
  /**
708
- * @license lucide-react v0.564.0 - ISC
709
+ * @license lucide-react v0.575.0 - ISC
709
710
  *
710
711
  * This source code is licensed under the ISC license.
711
712
  * See the LICENSE file in the root directory of this source tree.
712
713
  */
713
714
 
714
715
 
715
- const __iconNode$d = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
716
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$d);
716
+ const __iconNode$e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
717
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
717
718
 
718
719
  /**
719
- * @license lucide-react v0.564.0 - ISC
720
+ * @license lucide-react v0.575.0 - ISC
720
721
  *
721
722
  * This source code is licensed under the ISC license.
722
723
  * See the LICENSE file in the root directory of this source tree.
723
724
  */
724
725
 
725
726
 
726
- const __iconNode$c = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
727
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$c);
727
+ const __iconNode$d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
728
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
728
729
 
729
730
  /**
730
- * @license lucide-react v0.564.0 - ISC
731
+ * @license lucide-react v0.575.0 - ISC
731
732
  *
732
733
  * This source code is licensed under the ISC license.
733
734
  * See the LICENSE file in the root directory of this source tree.
734
735
  */
735
736
 
736
737
 
737
- const __iconNode$b = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
738
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$b);
738
+ const __iconNode$c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
739
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
739
740
 
740
741
  /**
741
- * @license lucide-react v0.564.0 - ISC
742
+ * @license lucide-react v0.575.0 - ISC
742
743
  *
743
744
  * This source code is licensed under the ISC license.
744
745
  * See the LICENSE file in the root directory of this source tree.
745
746
  */
746
747
 
747
748
 
748
- const __iconNode$a = [
749
+ const __iconNode$b = [
749
750
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
750
751
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
751
752
  ];
752
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$a);
753
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
753
754
 
754
755
  /**
755
- * @license lucide-react v0.564.0 - ISC
756
+ * @license lucide-react v0.575.0 - ISC
756
757
  *
757
758
  * This source code is licensed under the ISC license.
758
759
  * See the LICENSE file in the root directory of this source tree.
759
760
  */
760
761
 
761
762
 
762
- const __iconNode$9 = [
763
+ const __iconNode$a = [
763
764
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
764
765
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
765
766
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
766
767
  ];
767
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$9);
768
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
768
769
 
769
770
  /**
770
- * @license lucide-react v0.564.0 - ISC
771
+ * @license lucide-react v0.575.0 - ISC
771
772
  *
772
773
  * This source code is licensed under the ISC license.
773
774
  * See the LICENSE file in the root directory of this source tree.
774
775
  */
775
776
 
776
777
 
777
- const __iconNode$8 = [
778
+ const __iconNode$9 = [
778
779
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
779
780
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
780
781
  ];
781
- const CircleCheck = createLucideIcon("circle-check", __iconNode$8);
782
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
782
783
 
783
784
  /**
784
- * @license lucide-react v0.564.0 - ISC
785
+ * @license lucide-react v0.575.0 - ISC
785
786
  *
786
787
  * This source code is licensed under the ISC license.
787
788
  * See the LICENSE file in the root directory of this source tree.
788
789
  */
789
790
 
790
791
 
791
- const __iconNode$7 = [
792
+ const __iconNode$8 = [
792
793
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
793
794
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
794
795
  ["path", { d: "M12 17h.01", key: "p32p05" }]
795
796
  ];
796
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$7);
797
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8);
797
798
 
798
799
  /**
799
- * @license lucide-react v0.564.0 - ISC
800
+ * @license lucide-react v0.575.0 - ISC
800
801
  *
801
802
  * This source code is licensed under the ISC license.
802
803
  * See the LICENSE file in the root directory of this source tree.
803
804
  */
804
805
 
805
806
 
806
- const __iconNode$6 = [
807
+ const __iconNode$7 = [
807
808
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
808
809
  ["path", { d: "M9 3v18", key: "fh3hqa" }],
809
810
  ["path", { d: "M15 3v18", key: "14nvp0" }]
810
811
  ];
811
- const Columns3 = createLucideIcon("columns-3", __iconNode$6);
812
+ const Columns3 = createLucideIcon("columns-3", __iconNode$7);
812
813
 
813
814
  /**
814
- * @license lucide-react v0.564.0 - ISC
815
+ * @license lucide-react v0.575.0 - ISC
816
+ *
817
+ * This source code is licensed under the ISC license.
818
+ * See the LICENSE file in the root directory of this source tree.
819
+ */
820
+
821
+
822
+ const __iconNode$6 = [
823
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
824
+ ["path", { d: "M12 16v-4", key: "1dtifu" }],
825
+ ["path", { d: "M12 8h.01", key: "e9boi3" }]
826
+ ];
827
+ const Info = createLucideIcon("info", __iconNode$6);
828
+
829
+ /**
830
+ * @license lucide-react v0.575.0 - ISC
815
831
  *
816
832
  * This source code is licensed under the ISC license.
817
833
  * See the LICENSE file in the root directory of this source tree.
@@ -826,7 +842,7 @@ const __iconNode$5 = [
826
842
  const ListFilter = createLucideIcon("list-filter", __iconNode$5);
827
843
 
828
844
  /**
829
- * @license lucide-react v0.564.0 - ISC
845
+ * @license lucide-react v0.575.0 - ISC
830
846
  *
831
847
  * This source code is licensed under the ISC license.
832
848
  * See the LICENSE file in the root directory of this source tree.
@@ -840,7 +856,7 @@ const __iconNode$4 = [
840
856
  const Plus = createLucideIcon("plus", __iconNode$4);
841
857
 
842
858
  /**
843
- * @license lucide-react v0.564.0 - ISC
859
+ * @license lucide-react v0.575.0 - ISC
844
860
  *
845
861
  * This source code is licensed under the ISC license.
846
862
  * See the LICENSE file in the root directory of this source tree.
@@ -854,7 +870,7 @@ const __iconNode$3 = [
854
870
  const Search = createLucideIcon("search", __iconNode$3);
855
871
 
856
872
  /**
857
- * @license lucide-react v0.564.0 - ISC
873
+ * @license lucide-react v0.575.0 - ISC
858
874
  *
859
875
  * This source code is licensed under the ISC license.
860
876
  * See the LICENSE file in the root directory of this source tree.
@@ -871,7 +887,7 @@ const __iconNode$2 = [
871
887
  const Trash2 = createLucideIcon("trash-2", __iconNode$2);
872
888
 
873
889
  /**
874
- * @license lucide-react v0.564.0 - ISC
890
+ * @license lucide-react v0.575.0 - ISC
875
891
  *
876
892
  * This source code is licensed under the ISC license.
877
893
  * See the LICENSE file in the root directory of this source tree.
@@ -890,7 +906,7 @@ const __iconNode$1 = [
890
906
  const WifiOff = createLucideIcon("wifi-off", __iconNode$1);
891
907
 
892
908
  /**
893
- * @license lucide-react v0.564.0 - ISC
909
+ * @license lucide-react v0.575.0 - ISC
894
910
  *
895
911
  * This source code is licensed under the ISC license.
896
912
  * See the LICENSE file in the root directory of this source tree.
@@ -1379,7 +1395,6 @@ const StyledButtonGroup = styles.styled(MuiButtonGroup)(({ theme, size = 'medium
1379
1395
  *
1380
1396
  * Figma Props Mapping:
1381
1397
  * - Size (Sm|Md) → size prop (small|medium)
1382
- * - Icon=False → Icon support not included in this implementation
1383
1398
  * - Active button state → Controlled externally via button props or classes
1384
1399
  *
1385
1400
  * Usage:
@@ -1424,7 +1439,7 @@ const LabelContainer$4 = styles.styled('div')(({ size = 'medium' }) => ({
1424
1439
  flexDirection: 'column',
1425
1440
  gap: size === 'medium' ? 2 : 0,
1426
1441
  }));
1427
- const Label$3 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1442
+ const Label$4 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1428
1443
  fontSize: theme.typography.pxToRem(size === 'xs'
1429
1444
  ? neoDesign.typography.fontSize.xs
1430
1445
  : size === 'small'
@@ -1573,7 +1588,7 @@ const NeoCheckbox = ({ size = 'medium', label, helperText, disabled, icon, check
1573
1588
  return (jsxRuntime.jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }));
1574
1589
  }
1575
1590
  // With label, wrap in container for proper layout
1576
- 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 })] })] }));
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$4, { size: size, children: label }), helperText && jsxRuntime.jsx(HelperText$2, { size: size, children: helperText })] })] }));
1577
1592
  };
1578
1593
  NeoCheckbox.displayName = 'NeoCheckbox';
1579
1594
 
@@ -1600,6 +1615,11 @@ const StyledButtonBase = styles.styled(ButtonBase, {
1600
1615
  paddingMultiline: theme.spacing(3), // 24px all sides
1601
1616
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm), // 14px
1602
1617
  },
1618
+ inline: {
1619
+ height: 'auto',
1620
+ paddingSingleLine: `0 ${theme.spacing(0.5)}`, // 4px horizontal
1621
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
1622
+ },
1603
1623
  };
1604
1624
  const sizeStyles = sizeConfig[size];
1605
1625
  // Base styles shared by all variants
@@ -1614,12 +1634,12 @@ const StyledButtonBase = styles.styled(ButtonBase, {
1614
1634
  width: isMultiline ? '100%' : 'fit-content',
1615
1635
  maxWidth: isMultiline ? '100%' : 'none',
1616
1636
  overflowX: isMultiline ? 'auto' : 'visible',
1617
- padding: isMultiline ? sizeStyles.paddingMultiline : sizeStyles.paddingSingleLine,
1637
+ padding: isMultiline && 'paddingMultiline' in sizeStyles ? sizeStyles.paddingMultiline : sizeStyles.paddingSingleLine,
1618
1638
  paddingRight: isMultiline ? theme.spacing(7) : undefined, // Extra space for copy button in multiline only
1619
1639
  fontSize: sizeStyles.fontSize,
1620
1640
  fontFamily: neoDesign.typography.fontFamily.code,
1621
1641
  fontWeight: neoDesign.typography.fontWeight.regular,
1622
- lineHeight: isMultiline ? 1.5 : size === 'xs' ? 1.2 : 'normal',
1642
+ lineHeight: isMultiline ? 1.5 : size === 'xs' || size === 'inline' ? 1.2 : 'normal',
1623
1643
  borderRadius: neoDesign.borderRadius.xS,
1624
1644
  textAlign: 'left',
1625
1645
  textTransform: 'none',
@@ -1670,12 +1690,13 @@ const IconWrapper$2 = styles.styled('span')(({ theme, isMultiline }) => ({
1670
1690
  *
1671
1691
  * Figma Props Mapping:
1672
1692
  * - Color (Light|Dark) → variant (outlined|filled)
1673
- * - size (Single line|multiline) → auto-detected from children
1693
+ * - size (Single line|multiline|inline) → size prop + auto-detected multiline
1674
1694
  * - Copy button → endIcon (ReactNode)
1675
1695
  * - Text content → children prop
1676
1696
  */
1677
1697
  const NeoCodeSnippet = ({ variant = 'outlined', size = 'small', endIcon, children, ...props }) => {
1678
- const isMultiline = String(children).includes('\n');
1698
+ // Inline snippets are never multiline — they sit within a line of text
1699
+ const isMultiline = size !== 'inline' && String(children).includes('\n');
1679
1700
  return (jsxRuntime.jsxs(StyledButtonBase, { variant: variant, size: size, isMultiline: isMultiline, ...props, children: [isMultiline ? children : jsxRuntime.jsx("span", { children: children }), endIcon && jsxRuntime.jsx(IconWrapper$2, { isMultiline: isMultiline, children: endIcon })] }));
1680
1701
  };
1681
1702
  NeoCodeSnippet.displayName = 'NeoCodeSnippet';
@@ -1887,7 +1908,7 @@ const LabelContainer$3 = styles.styled('div')({
1887
1908
  gap: neoDesign.spacing.spacing_1,
1888
1909
  minWidth: 0,
1889
1910
  });
1890
- const Label$2 = styles.styled('span')({
1911
+ const Label$3 = styles.styled('span')({
1891
1912
  color: neoDesign.semanticColors.icons.default,
1892
1913
  flexShrink: 0,
1893
1914
  });
@@ -1913,9 +1934,11 @@ const Shortcut = styles.styled('span')(({ theme }) => ({
1913
1934
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4159-8649
1914
1935
  *
1915
1936
  * Figma Props Mapping:
1937
+ * - Figma "Dropdown - Menu" component uses Type (Avatar|Button|Icon) and Open (True|False)
1938
+ * to control the menu trigger. NeoMenuItem is the individual item inside the menu.
1916
1939
  * - Text label → children prop (mapped via figma.children)
1917
- * - State=Selected → selected prop (mapped via figma.enum)
1918
- * - State=Disabled → disabled prop (mapped via figma.enum)
1940
+ * - selected → selected prop (React-controlled)
1941
+ * - disabled → disabled prop (React-controlled)
1919
1942
  * - Hover state → CSS :hover (not mapped)
1920
1943
  * - Icon slot → icon prop (not mappable - ReactNode)
1921
1944
  * - Secondary text → secondaryText prop (not mappable - ReactNode/string)
@@ -1937,7 +1960,7 @@ const Shortcut = styles.styled('span')(({ theme }) => ({
1937
1960
  * ```
1938
1961
  */
1939
1962
  const NeoMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
1940
- 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 })] }) }));
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$3, { children: children }), secondaryText && jsxRuntime.jsx(SecondaryLabel, { children: secondaryText })] }), shortcut && jsxRuntime.jsx(Shortcut, { children: shortcut })] }) }));
1941
1964
  };
1942
1965
  NeoMenuItem.displayName = 'NeoMenuItem';
1943
1966
 
@@ -2453,111 +2476,85 @@ function NeoDataGridColumnsButton() {
2453
2476
  }
2454
2477
  NeoDataGridColumnsButton.displayName = 'NeoDataGridColumnsButton';
2455
2478
 
2456
- const StyledChip = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2457
- padding: 0,
2458
- borderRadius: neoDesign.borderRadius.full,
2459
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2460
- fontWeight: neoDesign.typography.fontWeight.medium,
2461
- // Size variants
2462
- ...(size === 'small' && {
2479
+ const sizeStyles = {
2480
+ small: {
2463
2481
  height: 16,
2464
2482
  paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
2465
2483
  paddingRight: neoDesign.spacing.spacing_1_2, // 4px
2466
- }),
2467
- ...(size === 'medium' && {
2484
+ },
2485
+ medium: {
2468
2486
  height: 18,
2469
2487
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2470
2488
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2471
- }),
2472
- ...(size === 'large' && {
2489
+ },
2490
+ large: {
2473
2491
  height: 20,
2474
2492
  paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
2475
2493
  paddingRight: neoDesign.spacing.spacing_3_4, // 6px
2476
- }),
2477
- [`& .${Chip.chipClasses.label}`]: {
2478
- padding: 0,
2479
2494
  },
2480
- // Outlined variant (light type in Figma) - Neutral/Default
2481
- ...(variant === 'outlined' &&
2482
- color === 'default' && {
2495
+ };
2496
+ const outlinedColorStyles = {
2497
+ default: {
2483
2498
  backgroundColor: neoDesign.semanticColors.status.neutral.light,
2484
2499
  color: neoDesign.semanticColors.status.neutral.dark,
2485
- borderColor: neoDesign.colors.grey[200], // base/grey/200
2486
- }),
2487
- // Outlined variant - Error
2488
- ...(variant === 'outlined' &&
2489
- color === 'error' && {
2500
+ borderColor: neoDesign.colors.grey[200],
2501
+ },
2502
+ error: {
2490
2503
  backgroundColor: neoDesign.semanticColors.status.error.light,
2491
2504
  color: neoDesign.semanticColors.status.error.dark,
2492
- borderColor: neoDesign.colors.red[100], // base/red/100
2493
- }),
2494
- // Outlined variant - Warning
2495
- ...(variant === 'outlined' &&
2496
- color === 'warning' && {
2505
+ borderColor: neoDesign.colors.red[100],
2506
+ },
2507
+ warning: {
2497
2508
  backgroundColor: neoDesign.semanticColors.status.warning.light,
2498
2509
  color: neoDesign.semanticColors.status.warning.dark,
2499
- borderColor: neoDesign.colors.orange[100], // base/orange/100
2500
- }),
2501
- // Outlined variant - Success
2502
- ...(variant === 'outlined' &&
2503
- color === 'success' && {
2510
+ borderColor: neoDesign.colors.orange[100],
2511
+ },
2512
+ success: {
2504
2513
  backgroundColor: neoDesign.semanticColors.status.success.light,
2505
2514
  color: neoDesign.semanticColors.status.success.dark,
2506
- borderColor: 'rgba(94, 196, 111, 0.24)', // rgba from Figma
2507
- }),
2508
- // Outlined variant - Info
2509
- ...(variant === 'outlined' &&
2510
- color === 'info' && {
2515
+ borderColor: 'rgba(94, 196, 111, 0.24)',
2516
+ },
2517
+ info: {
2511
2518
  backgroundColor: neoDesign.semanticColors.status.info.light,
2512
2519
  color: neoDesign.semanticColors.status.info.dark,
2513
- borderColor: neoDesign.colors.digitalBlue[100], // base/digital-blue/100
2514
- }),
2515
- // Outlined variant - Violet
2516
- ...(variant === 'outlined' &&
2517
- color === 'violet' && {
2520
+ borderColor: neoDesign.colors.digitalBlue[100],
2521
+ },
2522
+ violet: {
2518
2523
  backgroundColor: `${neoDesign.colors.violet[100]}66`, // rgba(235,213,241,0.4)
2519
2524
  color: neoDesign.colors.violet[600],
2520
- borderColor: neoDesign.colors.violet[100], // base/violet/100
2521
- }),
2522
- // Filled variant (dark type in Figma) - Neutral/Default
2523
- ...(variant === 'filled' &&
2524
- color === 'default' && {
2525
- backgroundColor: neoDesign.semanticColors.status.neutral.medium,
2526
- color: theme.palette.common.white,
2527
- border: 'none',
2528
- }),
2529
- // Filled variant - Error
2530
- ...(variant === 'filled' &&
2531
- color === 'error' && {
2532
- backgroundColor: neoDesign.semanticColors.status.error.medium,
2533
- color: theme.palette.common.white,
2534
- border: 'none',
2535
- }),
2536
- // Filled variant - Warning
2537
- ...(variant === 'filled' &&
2538
- color === 'warning' && {
2539
- backgroundColor: neoDesign.semanticColors.status.warning.medium,
2540
- color: theme.palette.common.white,
2541
- border: 'none',
2542
- }),
2543
- // Filled variant - Success
2544
- ...(variant === 'filled' &&
2545
- color === 'success' && {
2546
- backgroundColor: neoDesign.semanticColors.status.success.medium,
2547
- color: theme.palette.common.white,
2548
- border: 'none',
2549
- }),
2550
- // Filled variant - Info
2551
- ...(variant === 'filled' &&
2552
- color === 'info' && {
2553
- backgroundColor: neoDesign.semanticColors.status.info.medium,
2554
- color: theme.palette.common.white,
2555
- border: 'none',
2556
- }),
2557
- // Filled variant - Violet
2525
+ borderColor: neoDesign.colors.violet[100],
2526
+ },
2527
+ beta: {
2528
+ backgroundColor: neoDesign.colors.digitalBlue[100],
2529
+ color: neoDesign.colors.digitalBlue[400],
2530
+ borderColor: neoDesign.colors.digitalBlue[100],
2531
+ },
2532
+ };
2533
+ const filledColorStyles = {
2534
+ default: neoDesign.semanticColors.status.neutral.medium,
2535
+ error: neoDesign.semanticColors.status.error.medium,
2536
+ warning: neoDesign.semanticColors.status.warning.medium,
2537
+ success: neoDesign.semanticColors.status.success.medium,
2538
+ info: neoDesign.semanticColors.status.info.medium,
2539
+ violet: neoDesign.colors.violet[500],
2540
+ beta: neoDesign.colors.digitalBlue[300],
2541
+ };
2542
+ const StyledChip$1 = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2543
+ padding: 0,
2544
+ borderRadius: neoDesign.borderRadius.full,
2545
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
2546
+ fontWeight: neoDesign.typography.fontWeight.medium,
2547
+ ...(size && sizeStyles[size]),
2548
+ [`& .${Chip.chipClasses.label}`]: {
2549
+ padding: 0,
2550
+ },
2551
+ ...(variant === 'outlined' &&
2552
+ color &&
2553
+ outlinedColorStyles[color]),
2558
2554
  ...(variant === 'filled' &&
2559
- color === 'violet' && {
2560
- backgroundColor: neoDesign.colors.violet[500],
2555
+ color &&
2556
+ color in filledColorStyles && {
2557
+ backgroundColor: filledColorStyles[color],
2561
2558
  color: theme.palette.common.white,
2562
2559
  border: 'none',
2563
2560
  }),
@@ -2570,11 +2567,11 @@ const StyledChip = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2570
2567
  * Figma Props Mapping:
2571
2568
  * - m (sm|md|lg) → size (small|medium|large)
2572
2569
  * - type (light|dark) → variant (outlined|filled)
2573
- * - state (Neutral|Error|Warning|Success|Info|Violet) → color (default|error|warning|success|info|violet)
2570
+ * - state (Neutral|Error|Warning|Success|Info|Violet|Beta) → color (default|error|warning|success|info|violet|beta)
2574
2571
  * - Label text → label prop
2575
2572
  */
2576
2573
  const NeoTag = ({ size = 'small', variant = 'outlined', ...props }) => {
2577
- return jsxRuntime.jsx(StyledChip, { size: size, variant: variant, ...props });
2574
+ return jsxRuntime.jsx(StyledChip$1, { size: size, variant: variant, ...props });
2578
2575
  };
2579
2576
  NeoTag.displayName = 'NeoTag';
2580
2577
 
@@ -3535,6 +3532,102 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3535
3532
  };
3536
3533
  NeoDot.displayName = 'NeoDot';
3537
3534
 
3535
+ 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}`;
3536
+ const filterChipOnlyProps = ['selected', 'expanded', 'selectedLabel', 'count', 'onClear'];
3537
+ const StyledChip = styles.styled(Chip, {
3538
+ shouldForwardProp: prop => !filterChipOnlyProps.includes(prop),
3539
+ })(({ theme, selected }) => ({
3540
+ borderRadius: neoDesign.borderRadius.full,
3541
+ border: `1px solid ${neoDesign.semanticColors.buttons.secondary.defaultBorder}`,
3542
+ backgroundColor: selected
3543
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3544
+ : neoDesign.semanticColors.surfaces.white,
3545
+ minHeight: 40,
3546
+ padding: `${neoDesign.spacing.spacing_3_4}px ${neoDesign.spacing.spacing_1_1_2}px`,
3547
+ gap: neoDesign.spacing.spacing_1,
3548
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3549
+ fontWeight: neoDesign.typography.fontWeight.medium,
3550
+ lineHeight: 1,
3551
+ color: neoDesign.semanticColors.typography.body,
3552
+ [`& .${Chip.chipClasses.label}`]: {
3553
+ padding: 0,
3554
+ overflow: 'visible',
3555
+ display: 'flex',
3556
+ alignItems: 'center',
3557
+ },
3558
+ [`& .${Chip.chipClasses.deleteIcon}`]: {
3559
+ color: neoDesign.semanticColors.icons.default,
3560
+ width: 24,
3561
+ height: 24,
3562
+ margin: 0,
3563
+ flexShrink: 0,
3564
+ '&:hover': {
3565
+ color: neoDesign.semanticColors.icons.default,
3566
+ },
3567
+ },
3568
+ '&:hover': {
3569
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
3570
+ },
3571
+ [`&.${Chip.chipClasses.focusVisible}`]: {
3572
+ boxShadow: focusRing,
3573
+ backgroundColor: selected
3574
+ ? neoDesign.semanticColors.buttons.secondary.pressedBackground
3575
+ : neoDesign.semanticColors.surfaces.white,
3576
+ },
3577
+ }));
3578
+ const LabelContent = styles.styled('span')({
3579
+ display: 'inline-flex',
3580
+ alignItems: 'center',
3581
+ gap: neoDesign.spacing.spacing_1,
3582
+ });
3583
+ const TextStack = styles.styled('span')({
3584
+ display: 'flex',
3585
+ flexDirection: 'column',
3586
+ alignItems: 'flex-start',
3587
+ justifyContent: 'center',
3588
+ gap: neoDesign.spacing.spacing_1_4,
3589
+ });
3590
+ const HeaderLabel = styles.styled('span')(({ theme }) => ({
3591
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xxs),
3592
+ fontWeight: neoDesign.typography.fontWeight.regular,
3593
+ lineHeight: '120%',
3594
+ color: neoDesign.semanticColors.typography.bodySecondary,
3595
+ }));
3596
+ const SelectedLabel = styles.styled('span')(({ theme }) => ({
3597
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3598
+ fontWeight: neoDesign.typography.fontWeight.medium,
3599
+ lineHeight: 1,
3600
+ color: neoDesign.semanticColors.buttons.secondary.default,
3601
+ }));
3602
+ const CountBadge = styles.styled('span')(({ theme }) => ({
3603
+ display: 'inline-flex',
3604
+ alignItems: 'center',
3605
+ justifyContent: 'center',
3606
+ minWidth: 16,
3607
+ height: 16,
3608
+ padding: `0 ${neoDesign.spacing.spacing_1_2}px`,
3609
+ borderRadius: neoDesign.borderRadius.full,
3610
+ backgroundColor: neoDesign.semanticColors.brand,
3611
+ color: neoDesign.semanticColors.surfaces.white,
3612
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
3613
+ fontWeight: neoDesign.typography.fontWeight.medium,
3614
+ lineHeight: 1,
3615
+ boxSizing: 'border-box',
3616
+ }));
3617
+ /**
3618
+ * NeoFilterChip - Filter chip for filtering data, based on MUI Chip.
3619
+ *
3620
+ * @example
3621
+ * <NeoFilterChip label="Status" selected selectedLabel="Active, Pending" count={2} onClear={handleClear} />
3622
+ *
3623
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=8257-239
3624
+ */
3625
+ const NeoFilterChip = ({ label, selected = false, expanded, selectedLabel, count = 0, onClear, onClick, ...props }) => {
3626
+ 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);
3627
+ 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 }));
3628
+ };
3629
+ NeoFilterChip.displayName = 'NeoFilterChip';
3630
+
3538
3631
  const SpinnerWrapper = styles.styled('div')({
3539
3632
  width: 24,
3540
3633
  height: 24,
@@ -3775,6 +3868,31 @@ const NeoFooter = ({ variant = 'pagination', showShadow = false, loading = false
3775
3868
  };
3776
3869
  NeoFooter.displayName = 'NeoFooter';
3777
3870
 
3871
+ const customProps$1 = ['iconSize'];
3872
+ const StyledIconWrapper = styles.styled('div', {
3873
+ shouldForwardProp: prop => !customProps$1.includes(prop),
3874
+ })(({ iconSize }) => ({
3875
+ display: 'inline-flex',
3876
+ alignItems: 'center',
3877
+ justifyContent: 'center',
3878
+ width: iconSize,
3879
+ height: iconSize,
3880
+ flexShrink: 0,
3881
+ '& svg': {
3882
+ width: iconSize,
3883
+ height: iconSize,
3884
+ },
3885
+ }));
3886
+ /**
3887
+ * NeoIconWrapper - Flex-centered container that sizes icons
3888
+ *
3889
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4061-9955
3890
+ */
3891
+ const NeoIconWrapper = ({ size = 20, children, ...props }) => {
3892
+ return (jsxRuntime.jsx(StyledIconWrapper, { iconSize: size, ...props, children: children }));
3893
+ };
3894
+ NeoIconWrapper.displayName = 'NeoIconWrapper';
3895
+
3778
3896
  /**
3779
3897
  * NeoInfiniteScrollGrid - DataGrid with infinite scroll and load-more functionality
3780
3898
  *
@@ -4326,6 +4444,22 @@ const StyledListItemButton = styles.styled(ListItemButton)(({ theme }) => ({
4326
4444
  color: neoDesign.semanticColors.typography.button.disabled,
4327
4445
  },
4328
4446
  },
4447
+ // Focus state
4448
+ [`&.${ListItemButton.listItemButtonClasses.focusVisible}`]: {
4449
+ outline: `2px solid ${neoDesign.semanticColors.border.tabActive}`,
4450
+ outlineOffset: 2,
4451
+ border: `2px solid ${neoDesign.semanticColors.border.tabActive}`,
4452
+ backgroundColor: theme.palette.common.white,
4453
+ [`& .${ListItemIcon.listItemIconClasses.root}`]: {
4454
+ color: neoDesign.semanticColors.icons.default,
4455
+ },
4456
+ [`& .${ListItemText.listItemTextClasses.primary}`]: {
4457
+ color: neoDesign.colors.grey[800],
4458
+ },
4459
+ [`& .${ListItemText.listItemTextClasses.secondary}`]: {
4460
+ color: neoDesign.semanticColors.typography.bodySecondary,
4461
+ },
4462
+ },
4329
4463
  // Disabled state
4330
4464
  [`&.${ListItemButton.listItemButtonClasses.disabled}`]: {
4331
4465
  backgroundColor: neoDesign.colors.grey[50],
@@ -4345,7 +4479,7 @@ const StyledListItemButton = styles.styled(ListItemButton)(({ theme }) => ({
4345
4479
  * NeoListItemButton - Selectable list item with icon and text
4346
4480
  *
4347
4481
  * A selectable list item component that displays an optional icon with primary
4348
- * and secondary text. Supports active (selected), deselected, and disabled states.
4482
+ * and secondary text. Supports active (selected), deselected, focus, and disabled states.
4349
4483
  *
4350
4484
  * Uses MUI's ListItemButton as base for proper accessibility and interaction.
4351
4485
  * Compose with ListItemIcon and ListItemText for proper structure.
@@ -4366,9 +4500,10 @@ const StyledListItemButton = styles.styled(ListItemButton)(({ theme }) => ({
4366
4500
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4925-3764
4367
4501
  *
4368
4502
  * Figma Props Mapping:
4369
- * - property1="Active" → selected={true}
4370
- * - property1="Deselected" → selected={false}
4371
- * - property1="Disabled" → disabled={true}
4503
+ * - state="active" → selected={true}
4504
+ * - state="deselected" → selected={false}
4505
+ * - state="focus" → focus-visible CSS state
4506
+ * - state="disabled" → disabled={true}
4372
4507
  * - showIcon → Conditional rendering of ListItemIcon child
4373
4508
  *
4374
4509
  * Design Tokens Used:
@@ -4783,6 +4918,87 @@ const NeoModalFooter = ({ leadingContent, children }) => {
4783
4918
  };
4784
4919
  NeoModalFooter.displayName = 'NeoModalFooter';
4785
4920
 
4921
+ const customProps = ['selected'];
4922
+ const StyledRoot = styles.styled(ButtonBase, {
4923
+ shouldForwardProp: prop => !customProps.includes(prop),
4924
+ })(({ selected }) => ({
4925
+ display: 'flex',
4926
+ flexDirection: 'column',
4927
+ gap: neoDesign.spacing.spacing_1_4, // 2px
4928
+ alignItems: 'center',
4929
+ justifyContent: 'center',
4930
+ paddingTop: neoDesign.spacing.spacing_1, // 8px
4931
+ paddingBottom: neoDesign.spacing.spacing_1, // 8px
4932
+ paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
4933
+ paddingRight: neoDesign.spacing.spacing_1_2, // 4px
4934
+ borderRadius: neoDesign.borderRadius.xS, // 4px
4935
+ width: 95,
4936
+ cursor: 'pointer',
4937
+ textDecoration: 'none',
4938
+ '&:hover .neo-nav-icon-padding': {
4939
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground, // #F2F3FF
4940
+ },
4941
+ '&:hover .neo-nav-label': {
4942
+ color: neoDesign.semanticColors.buttons.primary.hover, // #1E2EC2
4943
+ },
4944
+ ...(selected && {
4945
+ '& .neo-nav-icon-padding': {
4946
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`, // rgba(220,224,255,0.75)
4947
+ },
4948
+ '& .neo-nav-label': {
4949
+ color: neoDesign.semanticColors.buttons.primary.pressed, // #131E7A
4950
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
4951
+ },
4952
+ '&:hover .neo-nav-icon-padding': {
4953
+ backgroundColor: `${neoDesign.colors.digitalBlue[100]}BF`,
4954
+ },
4955
+ '&:hover .neo-nav-label': {
4956
+ color: neoDesign.semanticColors.buttons.primary.pressed,
4957
+ },
4958
+ }),
4959
+ }));
4960
+ const IconPadding = styles.styled('span')({
4961
+ display: 'flex',
4962
+ alignItems: 'center',
4963
+ padding: neoDesign.spacing.spacing_1, // 8px
4964
+ borderRadius: neoDesign.spacing.spacing_1, // 8px
4965
+ transition: 'background-color 150ms',
4966
+ });
4967
+ const Label$2 = styles.styled('span')(({ theme }) => ({
4968
+ fontFamily: neoDesign.typography.fontFamily.body,
4969
+ fontWeight: neoDesign.typography.fontWeight.regular,
4970
+ fontSize: theme.typography.pxToRem(10),
4971
+ lineHeight: 1.2,
4972
+ textAlign: 'center',
4973
+ color: neoDesign.semanticColors.typography.navigation.default, // #1F2937
4974
+ width: '100%',
4975
+ transition: 'color 150ms',
4976
+ }));
4977
+ const TagPill = styles.styled('span')(({ theme }) => ({
4978
+ display: 'inline-flex',
4979
+ alignItems: 'center',
4980
+ justifyContent: 'center',
4981
+ height: 18,
4982
+ paddingLeft: neoDesign.spacing.spacing_3_4, // 6px
4983
+ paddingRight: neoDesign.spacing.spacing_3_4, // 6px
4984
+ borderRadius: neoDesign.borderRadius.full,
4985
+ backgroundColor: neoDesign.colors.digitalBlue[300], // #8D99FF
4986
+ color: neoDesign.semanticColors.typography.tooltip, // white
4987
+ fontFamily: neoDesign.typography.fontFamily.body,
4988
+ fontWeight: neoDesign.typography.fontWeight.medium,
4989
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
4990
+ lineHeight: 1,
4991
+ }));
4992
+ /**
4993
+ * NeoNavigationItem - Vertical navigation item with icon, label, and optional tag
4994
+ *
4995
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
4996
+ */
4997
+ const NeoNavigationItem = ({ icon, label, selected = false, tag, children, ...props }) => {
4998
+ 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] }));
4999
+ };
5000
+ NeoNavigationItem.displayName = 'NeoNavigationItem';
5001
+
4786
5002
  /**
4787
5003
  * Sticky header wrapper - sticks to top when scrolling
4788
5004
  */
@@ -5365,7 +5581,7 @@ NeoSkeleton.displayName = 'NeoSkeleton';
5365
5581
 
5366
5582
  /**
5367
5583
  * Styled Alert component with custom severity and variant styling
5368
- * Uses Custom Variants Pattern to add 'neutral' severity
5584
+ * Uses Custom Variants Pattern to add 'neutral' and 'info' severities
5369
5585
  */
5370
5586
  const StyledAlert$1 = styles.styled(Alert, {
5371
5587
  shouldForwardProp: prop => prop !== 'severity' && prop !== 'variant',
@@ -5384,6 +5600,10 @@ const StyledAlert$1 = styles.styled(Alert, {
5384
5600
  light: neoDesign.semanticColors.status.neutral.light,
5385
5601
  medium: neoDesign.semanticColors.status.neutral.medium,
5386
5602
  },
5603
+ info: {
5604
+ light: neoDesign.semanticColors.status.info.light,
5605
+ medium: neoDesign.semanticColors.status.info.medium,
5606
+ },
5387
5607
  };
5388
5608
  const severityColors = colorMap[severity];
5389
5609
  // Variant-specific styles based on Phase 1.1 analysis
@@ -5443,19 +5663,20 @@ const StyledAlert$1 = styles.styled(Alert, {
5443
5663
  /**
5444
5664
  * NeoStatusBanner - Status banner component for displaying system status messages
5445
5665
  *
5446
- * Displays status information with different severity levels (success, error, neutral) and
5666
+ * Displays status information with different severity levels (success, error, info, neutral) and
5447
5667
  * visual modes (outlined for light backgrounds, filled for emphasis).
5448
5668
  *
5449
5669
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4921-3427
5450
5670
  *
5451
5671
  * Figma Props Mapping:
5452
- * - Status (Success|Error|Offline) → severity ('success'|'error'|'neutral')
5672
+ * - Status (Success|Error|Info|Offline) → severity ('success'|'error'|'info'|'neutral')
5453
5673
  * - Mode (Light|Dark) → variant ('outlined'|'filled')
5454
5674
  *
5455
5675
  * Design Tokens Used:
5456
5676
  * - status.success.light, status.success.medium
5457
5677
  * - status.error.light, status.error.medium
5458
5678
  * - status.neutral.light, status.neutral.medium
5679
+ * - status.info.light, status.info.medium
5459
5680
  * - typography.tooltip, typography.bodySecondary
5460
5681
  * - grey[800]
5461
5682
  * - fontSize.default, fontSize.sm
@@ -5469,6 +5690,7 @@ const NeoStatusBanner = ({ severity = 'success', variant = 'outlined', icon, chi
5469
5690
  success: jsxRuntime.jsx(CircleCheck, { size: 24 }),
5470
5691
  error: jsxRuntime.jsx(CircleAlert, { size: 24 }),
5471
5692
  neutral: jsxRuntime.jsx(WifiOff, { size: 24 }),
5693
+ info: jsxRuntime.jsx(Info, { size: 24 }),
5472
5694
  };
5473
5695
  const defaultIcon = iconMap[severity];
5474
5696
  // Type assertion needed: severity and variant are custom props filtered by shouldForwardProp
@@ -6168,8 +6390,10 @@ exports.NeoDataGridSelect = NeoSelect;
6168
6390
  exports.NeoDatePicker = NeoDatePicker;
6169
6391
  exports.NeoDivider = NeoDivider;
6170
6392
  exports.NeoDot = NeoDot;
6393
+ exports.NeoFilterChip = NeoFilterChip;
6171
6394
  exports.NeoFooter = NeoFooter;
6172
6395
  exports.NeoIconButton = NeoIconButton;
6396
+ exports.NeoIconWrapper = NeoIconWrapper;
6173
6397
  exports.NeoInfiniteScrollGrid = NeoInfiniteScrollGrid;
6174
6398
  exports.NeoInputField = NeoInputField;
6175
6399
  exports.NeoListItem = NeoListItem;
@@ -6183,6 +6407,7 @@ exports.NeoModalContent = NeoModalContent;
6183
6407
  exports.NeoModalFooter = NeoModalFooter;
6184
6408
  exports.NeoModalHeader = NeoModalHeader;
6185
6409
  exports.NeoMultiBadgesCell = NeoMultiBadgesCell;
6410
+ exports.NeoNavigationItem = NeoNavigationItem;
6186
6411
  exports.NeoPageContent = NeoPageContent;
6187
6412
  exports.NeoPaginatedGrid = NeoPaginatedGrid;
6188
6413
  exports.NeoProgressbar = NeoProgressbar;