@moderneinc/neo-styled-components 2.4.0-next.df8e26 → 2.5.0-next.00efee

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
@@ -4,7 +4,7 @@ import Box from '@mui/material/Box';
4
4
  import { styled, alpha } from '@mui/material/styles';
5
5
  import Avatar from '@mui/material/Avatar';
6
6
  import Chip, { chipClasses } from '@mui/material/Chip';
7
- import SvgIcon from '@mui/material/SvgIcon';
7
+ import SvgIcon, { svgIconClasses } from '@mui/material/SvgIcon';
8
8
  import Alert, { alertClasses } from '@mui/material/Alert';
9
9
  import IconButton, { iconButtonClasses } from '@mui/material/IconButton';
10
10
  import { forwardRef, createElement, useState, useMemo, useRef, useEffect } from 'react';
@@ -147,9 +147,12 @@ 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
- padding: `${spacing.spacing_1_4}px ${spacing.spacing_1}px`,
152
+ paddingTop: spacing.spacing_1_4,
153
+ paddingBottom: spacing.spacing_1_4,
154
+ paddingLeft: spacing.spacing_1,
155
+ paddingRight: spacing.spacing_1,
153
156
  borderRadius: borderRadius.full,
154
157
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
155
158
  lineHeight: 1,
@@ -157,16 +160,19 @@ const StyledChip$1 = styled(Chip)(({ theme }) => ({
157
160
  gap: spacing.spacing_1_2,
158
161
  overflow: 'visible',
159
162
  [`& .${chipClasses.label}`]: {
160
- padding: 0,
163
+ paddingLeft: 0,
164
+ paddingRight: 0,
161
165
  overflow: 'visible',
162
166
  },
163
167
  [`& .${chipClasses.icon}`]: {
164
- margin: 0,
168
+ marginLeft: 0,
169
+ marginRight: 0,
165
170
  width: 12,
166
171
  height: 12,
167
172
  },
168
173
  [`& .${chipClasses.deleteIcon}`]: {
169
- margin: 0,
174
+ marginLeft: 0,
175
+ marginRight: 0,
170
176
  width: 12,
171
177
  height: 12,
172
178
  },
@@ -228,7 +234,7 @@ const StyledChip$1 = styled(Chip)(({ theme }) => ({
228
234
  * - Label → label prop
229
235
  */
230
236
  const NeoBadge = (props) => {
231
- return jsx(StyledChip$1, { ...props });
237
+ return jsx(StyledChip$2, { ...props });
232
238
  };
233
239
  NeoBadge.displayName = 'NeoBadge';
234
240
 
@@ -378,6 +384,7 @@ const ActivityDot = styled('div')(({ color }) => ({
378
384
  *
379
385
  * **Figma Props Mapping:**
380
386
  * - `Size` (Figma) → `size` (React): Height variant matching DataGrid sizes
387
+ * - `Type` (Figma) → `color` (React): Activity type (Commit Job → commitJob, Recipe Run → recipeRun, Visualization → visualization)
381
388
  *
382
389
  * **Design Tokens:**
383
390
  * - `semanticColors.activity.commitJob` - Blue dot for commit job events (#2F42FF)
@@ -493,7 +500,7 @@ const NeoActivityIndicatorCell = ({ event = 'commit-job', secondaryEvent, scene
493
500
  NeoActivityIndicatorCell.displayName = 'NeoActivityIndicatorCell';
494
501
 
495
502
  /**
496
- * @license lucide-react v0.563.0 - ISC
503
+ * @license lucide-react v0.575.0 - ISC
497
504
  *
498
505
  * This source code is licensed under the ISC license.
499
506
  * See the LICENSE file in the root directory of this source tree.
@@ -504,7 +511,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
504
511
  }).join(" ").trim();
505
512
 
506
513
  /**
507
- * @license lucide-react v0.563.0 - ISC
514
+ * @license lucide-react v0.575.0 - ISC
508
515
  *
509
516
  * This source code is licensed under the ISC license.
510
517
  * See the LICENSE file in the root directory of this source tree.
@@ -513,7 +520,7 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
513
520
  const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
514
521
 
515
522
  /**
516
- * @license lucide-react v0.563.0 - ISC
523
+ * @license lucide-react v0.575.0 - ISC
517
524
  *
518
525
  * This source code is licensed under the ISC license.
519
526
  * See the LICENSE file in the root directory of this source tree.
@@ -525,7 +532,7 @@ const toCamelCase = (string) => string.replace(
525
532
  );
526
533
 
527
534
  /**
528
- * @license lucide-react v0.563.0 - ISC
535
+ * @license lucide-react v0.575.0 - ISC
529
536
  *
530
537
  * This source code is licensed under the ISC license.
531
538
  * See the LICENSE file in the root directory of this source tree.
@@ -538,7 +545,7 @@ const toPascalCase = (string) => {
538
545
  };
539
546
 
540
547
  /**
541
- * @license lucide-react v0.563.0 - ISC
548
+ * @license lucide-react v0.575.0 - ISC
542
549
  *
543
550
  * This source code is licensed under the ISC license.
544
551
  * See the LICENSE file in the root directory of this source tree.
@@ -557,7 +564,7 @@ var defaultAttributes = {
557
564
  };
558
565
 
559
566
  /**
560
- * @license lucide-react v0.563.0 - ISC
567
+ * @license lucide-react v0.575.0 - ISC
561
568
  *
562
569
  * This source code is licensed under the ISC license.
563
570
  * See the LICENSE file in the root directory of this source tree.
@@ -573,7 +580,7 @@ const hasA11yProp = (props) => {
573
580
  };
574
581
 
575
582
  /**
576
- * @license lucide-react v0.563.0 - ISC
583
+ * @license lucide-react v0.575.0 - ISC
577
584
  *
578
585
  * This source code is licensed under the ISC license.
579
586
  * See the LICENSE file in the root directory of this source tree.
@@ -611,7 +618,7 @@ const Icon = forwardRef(
611
618
  );
612
619
 
613
620
  /**
614
- * @license lucide-react v0.563.0 - ISC
621
+ * @license lucide-react v0.575.0 - ISC
615
622
  *
616
623
  * This source code is licensed under the ISC license.
617
624
  * See the LICENSE file in the root directory of this source tree.
@@ -636,42 +643,42 @@ const createLucideIcon = (iconName, iconNode) => {
636
643
  };
637
644
 
638
645
  /**
639
- * @license lucide-react v0.563.0 - ISC
646
+ * @license lucide-react v0.575.0 - ISC
640
647
  *
641
648
  * This source code is licensed under the ISC license.
642
649
  * See the LICENSE file in the root directory of this source tree.
643
650
  */
644
651
 
645
652
 
646
- const __iconNode$h = [
653
+ const __iconNode$i = [
647
654
  ["path", { d: "M12 5v14", key: "s699le" }],
648
655
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
649
656
  ];
650
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$h);
657
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
651
658
 
652
659
  /**
653
- * @license lucide-react v0.563.0 - ISC
660
+ * @license lucide-react v0.575.0 - ISC
654
661
  *
655
662
  * This source code is licensed under the ISC license.
656
663
  * See the LICENSE file in the root directory of this source tree.
657
664
  */
658
665
 
659
666
 
660
- const __iconNode$g = [
667
+ const __iconNode$h = [
661
668
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
662
669
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
663
670
  ];
664
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$g);
671
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
665
672
 
666
673
  /**
667
- * @license lucide-react v0.563.0 - ISC
674
+ * @license lucide-react v0.575.0 - ISC
668
675
  *
669
676
  * This source code is licensed under the ISC license.
670
677
  * See the LICENSE file in the root directory of this source tree.
671
678
  */
672
679
 
673
680
 
674
- const __iconNode$f = [
681
+ const __iconNode$g = [
675
682
  ["path", { d: "M8 2v4", key: "1cmpym" }],
676
683
  ["path", { d: "M16 2v4", key: "4m81vk" }],
677
684
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
@@ -683,127 +690,142 @@ const __iconNode$f = [
683
690
  ["path", { d: "M12 18h.01", key: "mhygvu" }],
684
691
  ["path", { d: "M16 18h.01", key: "kzsmim" }]
685
692
  ];
686
- const CalendarDays = createLucideIcon("calendar-days", __iconNode$f);
693
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
687
694
 
688
695
  /**
689
- * @license lucide-react v0.563.0 - ISC
696
+ * @license lucide-react v0.575.0 - ISC
690
697
  *
691
698
  * This source code is licensed under the ISC license.
692
699
  * See the LICENSE file in the root directory of this source tree.
693
700
  */
694
701
 
695
702
 
696
- const __iconNode$e = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
697
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$e);
703
+ const __iconNode$f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
704
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
698
705
 
699
706
  /**
700
- * @license lucide-react v0.563.0 - ISC
707
+ * @license lucide-react v0.575.0 - ISC
701
708
  *
702
709
  * This source code is licensed under the ISC license.
703
710
  * See the LICENSE file in the root directory of this source tree.
704
711
  */
705
712
 
706
713
 
707
- const __iconNode$d = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
708
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$d);
714
+ const __iconNode$e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
715
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
709
716
 
710
717
  /**
711
- * @license lucide-react v0.563.0 - ISC
718
+ * @license lucide-react v0.575.0 - ISC
712
719
  *
713
720
  * This source code is licensed under the ISC license.
714
721
  * See the LICENSE file in the root directory of this source tree.
715
722
  */
716
723
 
717
724
 
718
- const __iconNode$c = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
719
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$c);
725
+ const __iconNode$d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
726
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
720
727
 
721
728
  /**
722
- * @license lucide-react v0.563.0 - ISC
729
+ * @license lucide-react v0.575.0 - ISC
723
730
  *
724
731
  * This source code is licensed under the ISC license.
725
732
  * See the LICENSE file in the root directory of this source tree.
726
733
  */
727
734
 
728
735
 
729
- const __iconNode$b = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
730
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$b);
736
+ const __iconNode$c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
737
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
731
738
 
732
739
  /**
733
- * @license lucide-react v0.563.0 - ISC
740
+ * @license lucide-react v0.575.0 - ISC
734
741
  *
735
742
  * This source code is licensed under the ISC license.
736
743
  * See the LICENSE file in the root directory of this source tree.
737
744
  */
738
745
 
739
746
 
740
- const __iconNode$a = [
747
+ const __iconNode$b = [
741
748
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
742
749
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
743
750
  ];
744
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$a);
751
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
745
752
 
746
753
  /**
747
- * @license lucide-react v0.563.0 - ISC
754
+ * @license lucide-react v0.575.0 - ISC
748
755
  *
749
756
  * This source code is licensed under the ISC license.
750
757
  * See the LICENSE file in the root directory of this source tree.
751
758
  */
752
759
 
753
760
 
754
- const __iconNode$9 = [
761
+ const __iconNode$a = [
755
762
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
756
763
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
757
764
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
758
765
  ];
759
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$9);
766
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
760
767
 
761
768
  /**
762
- * @license lucide-react v0.563.0 - ISC
769
+ * @license lucide-react v0.575.0 - ISC
763
770
  *
764
771
  * This source code is licensed under the ISC license.
765
772
  * See the LICENSE file in the root directory of this source tree.
766
773
  */
767
774
 
768
775
 
769
- const __iconNode$8 = [
776
+ const __iconNode$9 = [
770
777
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
771
778
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
772
779
  ];
773
- const CircleCheck = createLucideIcon("circle-check", __iconNode$8);
780
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
774
781
 
775
782
  /**
776
- * @license lucide-react v0.563.0 - ISC
783
+ * @license lucide-react v0.575.0 - ISC
777
784
  *
778
785
  * This source code is licensed under the ISC license.
779
786
  * See the LICENSE file in the root directory of this source tree.
780
787
  */
781
788
 
782
789
 
783
- const __iconNode$7 = [
790
+ const __iconNode$8 = [
784
791
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
785
792
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
786
793
  ["path", { d: "M12 17h.01", key: "p32p05" }]
787
794
  ];
788
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$7);
795
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8);
789
796
 
790
797
  /**
791
- * @license lucide-react v0.563.0 - ISC
798
+ * @license lucide-react v0.575.0 - ISC
792
799
  *
793
800
  * This source code is licensed under the ISC license.
794
801
  * See the LICENSE file in the root directory of this source tree.
795
802
  */
796
803
 
797
804
 
798
- const __iconNode$6 = [
805
+ const __iconNode$7 = [
799
806
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
800
807
  ["path", { d: "M9 3v18", key: "fh3hqa" }],
801
808
  ["path", { d: "M15 3v18", key: "14nvp0" }]
802
809
  ];
803
- const Columns3 = createLucideIcon("columns-3", __iconNode$6);
810
+ const Columns3 = createLucideIcon("columns-3", __iconNode$7);
804
811
 
805
812
  /**
806
- * @license lucide-react v0.563.0 - ISC
813
+ * @license lucide-react v0.575.0 - ISC
814
+ *
815
+ * This source code is licensed under the ISC license.
816
+ * See the LICENSE file in the root directory of this source tree.
817
+ */
818
+
819
+
820
+ const __iconNode$6 = [
821
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
822
+ ["path", { d: "M12 16v-4", key: "1dtifu" }],
823
+ ["path", { d: "M12 8h.01", key: "e9boi3" }]
824
+ ];
825
+ const Info = createLucideIcon("info", __iconNode$6);
826
+
827
+ /**
828
+ * @license lucide-react v0.575.0 - ISC
807
829
  *
808
830
  * This source code is licensed under the ISC license.
809
831
  * See the LICENSE file in the root directory of this source tree.
@@ -818,7 +840,7 @@ const __iconNode$5 = [
818
840
  const ListFilter = createLucideIcon("list-filter", __iconNode$5);
819
841
 
820
842
  /**
821
- * @license lucide-react v0.563.0 - ISC
843
+ * @license lucide-react v0.575.0 - ISC
822
844
  *
823
845
  * This source code is licensed under the ISC license.
824
846
  * See the LICENSE file in the root directory of this source tree.
@@ -832,7 +854,7 @@ const __iconNode$4 = [
832
854
  const Plus = createLucideIcon("plus", __iconNode$4);
833
855
 
834
856
  /**
835
- * @license lucide-react v0.563.0 - ISC
857
+ * @license lucide-react v0.575.0 - ISC
836
858
  *
837
859
  * This source code is licensed under the ISC license.
838
860
  * See the LICENSE file in the root directory of this source tree.
@@ -846,7 +868,7 @@ const __iconNode$3 = [
846
868
  const Search = createLucideIcon("search", __iconNode$3);
847
869
 
848
870
  /**
849
- * @license lucide-react v0.563.0 - ISC
871
+ * @license lucide-react v0.575.0 - ISC
850
872
  *
851
873
  * This source code is licensed under the ISC license.
852
874
  * See the LICENSE file in the root directory of this source tree.
@@ -863,7 +885,7 @@ const __iconNode$2 = [
863
885
  const Trash2 = createLucideIcon("trash-2", __iconNode$2);
864
886
 
865
887
  /**
866
- * @license lucide-react v0.563.0 - ISC
888
+ * @license lucide-react v0.575.0 - ISC
867
889
  *
868
890
  * This source code is licensed under the ISC license.
869
891
  * See the LICENSE file in the root directory of this source tree.
@@ -882,7 +904,7 @@ const __iconNode$1 = [
882
904
  const WifiOff = createLucideIcon("wifi-off", __iconNode$1);
883
905
 
884
906
  /**
885
- * @license lucide-react v0.563.0 - ISC
907
+ * @license lucide-react v0.575.0 - ISC
886
908
  *
887
909
  * This source code is licensed under the ISC license.
888
910
  * See the LICENSE file in the root directory of this source tree.
@@ -972,7 +994,7 @@ const LinkText = styled('span')(({ variant = 'light' }) => {
972
994
  return colors.grey['800'];
973
995
  };
974
996
  return {
975
- fontWeight: 600,
997
+ fontWeight: typography.fontWeight.semiBold,
976
998
  color: getLinkColor(),
977
999
  cursor: 'pointer',
978
1000
  '&:hover': {
@@ -1116,7 +1138,7 @@ const StyledButtonBase$1 = styled(ButtonBase, {
1116
1138
  height: sizeStyles.height,
1117
1139
  padding: sizeStyles.padding,
1118
1140
  fontSize: sizeStyles.fontSize,
1119
- fontWeight: 500,
1141
+ fontWeight: typography.fontWeight.medium,
1120
1142
  lineHeight: '1.25rem',
1121
1143
  borderRadius: borderRadius.button,
1122
1144
  textTransform: 'none',
@@ -1371,7 +1393,6 @@ const StyledButtonGroup = styled(MuiButtonGroup)(({ theme, size = 'medium' }) =>
1371
1393
  *
1372
1394
  * Figma Props Mapping:
1373
1395
  * - Size (Sm|Md) → size prop (small|medium)
1374
- * - Icon=False → Icon support not included in this implementation
1375
1396
  * - Active button state → Controlled externally via button props or classes
1376
1397
  *
1377
1398
  * Usage:
@@ -1407,7 +1428,7 @@ const IndeterminateIcon = ({ size = 'medium' }) => (jsxs(SvgIcon, { viewBox: "0
1407
1428
  const CheckboxContainer = styled('label')(({ disabled }) => ({
1408
1429
  display: 'inline-flex',
1409
1430
  alignItems: 'flex-start',
1410
- gap: 8,
1431
+ gap: spacing.spacing_1,
1411
1432
  cursor: disabled ? 'not-allowed' : 'pointer',
1412
1433
  userSelect: 'none',
1413
1434
  }));
@@ -1416,7 +1437,7 @@ const LabelContainer$4 = styled('div')(({ size = 'medium' }) => ({
1416
1437
  flexDirection: 'column',
1417
1438
  gap: size === 'medium' ? 2 : 0,
1418
1439
  }));
1419
- const Label$3 = styled('span')(({ theme, size = 'medium' }) => ({
1440
+ const Label$4 = styled('span')(({ theme, size = 'medium' }) => ({
1420
1441
  fontSize: theme.typography.pxToRem(size === 'xs'
1421
1442
  ? typography.fontSize.xs
1422
1443
  : size === 'small'
@@ -1436,6 +1457,8 @@ const HelperText$2 = styled('span')(({ theme, size = 'medium' }) => ({
1436
1457
  lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1437
1458
  color: semanticColors.typography.bodySecondary,
1438
1459
  }));
1460
+ // Figma-exact border radius for xs checkbox — no matching design token
1461
+ const FIGMA_XS_BORDER_RADIUS = 1;
1439
1462
  const StyledCheckbox = styled(Checkbox, {
1440
1463
  shouldForwardProp: prop => prop !== 'size',
1441
1464
  })(({ size = 'medium' }) => {
@@ -1443,7 +1466,7 @@ const StyledCheckbox = styled(Checkbox, {
1443
1466
  const sizeConfig = {
1444
1467
  xs: {
1445
1468
  size: 12,
1446
- borderRadius: 1, // From Figma: 1px for xs
1469
+ borderRadius: FIGMA_XS_BORDER_RADIUS,
1447
1470
  },
1448
1471
  small: {
1449
1472
  size: 16,
@@ -1564,7 +1587,7 @@ const NeoCheckbox = ({ size = 'medium', label, helperText, disabled, icon, check
1564
1587
  return (jsx(StyledCheckbox, { size: size, disabled: disabled, icon: defaultIcon, checkedIcon: defaultCheckedIcon, indeterminateIcon: defaultIndeterminateIcon, className: combinedClassName, ...props }));
1565
1588
  }
1566
1589
  // With label, wrap in container for proper layout
1567
- 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 })] })] }));
1568
1591
  };
1569
1592
  NeoCheckbox.displayName = 'NeoCheckbox';
1570
1593
 
@@ -1591,6 +1614,11 @@ const StyledButtonBase = styled(ButtonBase, {
1591
1614
  paddingMultiline: theme.spacing(3), // 24px all sides
1592
1615
  fontSize: theme.typography.pxToRem(typography.fontSize.sm), // 14px
1593
1616
  },
1617
+ inline: {
1618
+ height: 'auto',
1619
+ paddingSingleLine: `0 ${theme.spacing(0.5)}`, // 4px horizontal
1620
+ fontSize: theme.typography.pxToRem(typography.fontSize.xs), // 12px
1621
+ },
1594
1622
  };
1595
1623
  const sizeStyles = sizeConfig[size];
1596
1624
  // Base styles shared by all variants
@@ -1605,13 +1633,15 @@ const StyledButtonBase = styled(ButtonBase, {
1605
1633
  width: isMultiline ? '100%' : 'fit-content',
1606
1634
  maxWidth: isMultiline ? '100%' : 'none',
1607
1635
  overflowX: isMultiline ? 'auto' : 'visible',
1608
- padding: isMultiline ? sizeStyles.paddingMultiline : sizeStyles.paddingSingleLine,
1636
+ padding: isMultiline && 'paddingMultiline' in sizeStyles
1637
+ ? sizeStyles.paddingMultiline
1638
+ : sizeStyles.paddingSingleLine,
1609
1639
  paddingRight: isMultiline ? theme.spacing(7) : undefined, // Extra space for copy button in multiline only
1610
1640
  fontSize: sizeStyles.fontSize,
1611
1641
  fontFamily: typography.fontFamily.code,
1612
1642
  fontWeight: typography.fontWeight.regular,
1613
- lineHeight: isMultiline ? 1.5 : size === 'xs' ? 1.2 : 'normal',
1614
- borderRadius: 4,
1643
+ lineHeight: isMultiline ? 1.5 : size === 'xs' || size === 'inline' ? 1.2 : 'normal',
1644
+ borderRadius: borderRadius.xS,
1615
1645
  textAlign: 'left',
1616
1646
  textTransform: 'none',
1617
1647
  gap: isMultiline ? undefined : theme.spacing(1.25), // 10px gap only for single-line
@@ -1661,12 +1691,13 @@ const IconWrapper$2 = styled('span')(({ theme, isMultiline }) => ({
1661
1691
  *
1662
1692
  * Figma Props Mapping:
1663
1693
  * - Color (Light|Dark) → variant (outlined|filled)
1664
- * - size (Single line|multiline) → auto-detected from children
1694
+ * - size (Single line|multiline|inline) → size prop + auto-detected multiline
1665
1695
  * - Copy button → endIcon (ReactNode)
1666
1696
  * - Text content → children prop
1667
1697
  */
1668
1698
  const NeoCodeSnippet = ({ variant = 'outlined', size = 'small', endIcon, children, ...props }) => {
1669
- const isMultiline = String(children).includes('\n');
1699
+ // Inline snippets are never multiline — they sit within a line of text
1700
+ const isMultiline = size !== 'inline' && String(children).includes('\n');
1670
1701
  return (jsxs(StyledButtonBase, { variant: variant, size: size, isMultiline: isMultiline, ...props, children: [isMultiline ? children : jsx("span", { children: children }), endIcon && jsx(IconWrapper$2, { isMultiline: isMultiline, children: endIcon })] }));
1671
1702
  };
1672
1703
  NeoCodeSnippet.displayName = 'NeoCodeSnippet';
@@ -1714,7 +1745,7 @@ const StyledSearchField = styled(TextField)(({ theme }) => ({
1714
1745
  borderColor: semanticColors.buttons.primary.default,
1715
1746
  },
1716
1747
  },
1717
- '& .MuiInputAdornment-root': {
1748
+ [`& .${inputAdornmentClasses.root}`]: {
1718
1749
  color: semanticColors.icons.placeholder,
1719
1750
  '& svg': {
1720
1751
  width: 20,
@@ -1728,12 +1759,14 @@ const ColumnItemContainer = styled(Box)(({ theme }) => ({
1728
1759
  paddingLeft: theme.spacing(0.75),
1729
1760
  paddingRight: theme.spacing(0.75),
1730
1761
  }));
1762
+ // Figma-exact border radius for menu items — no matching design token
1763
+ const MENU_ITEM_BORDER_RADIUS = 6;
1731
1764
  const MenuItemContent$1 = styled('div')(({ theme }) => ({
1732
1765
  display: 'flex',
1733
1766
  alignItems: 'center',
1734
1767
  gap: theme.spacing(1),
1735
1768
  padding: theme.spacing(1),
1736
- borderRadius: 6,
1769
+ borderRadius: MENU_ITEM_BORDER_RADIUS,
1737
1770
  width: '100%',
1738
1771
  '&:hover': {
1739
1772
  backgroundColor: semanticColors.surfaces.listHover,
@@ -1762,7 +1795,7 @@ const FooterRow = styled(Box)(({ theme }) => ({
1762
1795
  }));
1763
1796
  const ResetButton = styled(Button)(({ theme }) => ({
1764
1797
  fontSize: theme.typography.pxToRem(16),
1765
- fontWeight: 400,
1798
+ fontWeight: typography.fontWeight.regular,
1766
1799
  color: semanticColors.buttons.primary.default,
1767
1800
  textTransform: 'none',
1768
1801
  padding: theme.spacing(1),
@@ -1874,10 +1907,10 @@ const LabelContainer$3 = styled('div')({
1874
1907
  flex: 1,
1875
1908
  display: 'flex',
1876
1909
  alignItems: 'center',
1877
- gap: 8,
1910
+ gap: spacing.spacing_1,
1878
1911
  minWidth: 0,
1879
1912
  });
1880
- const Label$2 = styled('span')({
1913
+ const Label$3 = styled('span')({
1881
1914
  color: semanticColors.icons.default,
1882
1915
  flexShrink: 0,
1883
1916
  });
@@ -1893,7 +1926,7 @@ const Shortcut = styled('span')(({ theme }) => ({
1893
1926
  marginLeft: 'auto',
1894
1927
  flexShrink: 0,
1895
1928
  border: `1px solid ${semanticColors.border.secondary}`,
1896
- borderRadius: 4,
1929
+ borderRadius: borderRadius.xS,
1897
1930
  padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
1898
1931
  backgroundColor: semanticColors.surfaces.white,
1899
1932
  }));
@@ -1903,9 +1936,11 @@ const Shortcut = styled('span')(({ theme }) => ({
1903
1936
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4159-8649
1904
1937
  *
1905
1938
  * Figma Props Mapping:
1939
+ * - Figma "Dropdown - Menu" component uses Type (Avatar|Button|Icon) and Open (True|False)
1940
+ * to control the menu trigger. NeoMenuItem is the individual item inside the menu.
1906
1941
  * - Text label → children prop (mapped via figma.children)
1907
- * - State=Selected → selected prop (mapped via figma.enum)
1908
- * - State=Disabled → disabled prop (mapped via figma.enum)
1942
+ * - selected → selected prop (React-controlled)
1943
+ * - disabled → disabled prop (React-controlled)
1909
1944
  * - Hover state → CSS :hover (not mapped)
1910
1945
  * - Icon slot → icon prop (not mappable - ReactNode)
1911
1946
  * - Secondary text → secondaryText prop (not mappable - ReactNode/string)
@@ -1927,7 +1962,7 @@ const Shortcut = styled('span')(({ theme }) => ({
1927
1962
  * ```
1928
1963
  */
1929
1964
  const NeoMenuItem = ({ icon, shortcut, secondaryText, children, ...props }) => {
1930
- 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 })] }) }));
1931
1966
  };
1932
1967
  NeoMenuItem.displayName = 'NeoMenuItem';
1933
1968
 
@@ -1996,7 +2031,7 @@ const NeoSelect = (props) => {
1996
2031
  backgroundColor: semanticColors.surfaces.white,
1997
2032
  borderRadius: `${borderRadius.s}px`,
1998
2033
  border: `1px solid ${semanticColors.border.primary}`,
1999
- boxShadow: '0px 4px 12px rgba(0, 0, 0, 0.1)',
2034
+ boxShadow: `${shadows.dropdown.x}px ${shadows.dropdown.y}px ${shadows.dropdown.blur}px ${shadows.dropdown.spread}px ${shadows.dropdown.shadow}`,
2000
2035
  marginTop: 1,
2001
2036
  ...props.MenuProps?.PaperProps?.sx,
2002
2037
  },
@@ -2160,14 +2195,14 @@ const StyledGridFilterPanel = styled(GridFilterPanel)({
2160
2195
  height: 32, // NeoButton small size
2161
2196
  padding: `0 ${spacing.spacing_1}px`, // NeoButton link variant padding
2162
2197
  fontSize: typography.fontSize.sm,
2163
- fontWeight: 500,
2198
+ fontWeight: typography.fontWeight.medium,
2164
2199
  lineHeight: 1.5,
2165
2200
  textTransform: 'none',
2166
2201
  minHeight: 'auto',
2167
2202
  backgroundColor: 'transparent',
2168
2203
  color: semanticColors.buttons.tertiary.default,
2169
2204
  border: 'none',
2170
- '& .MuiButton-startIcon': {
2205
+ [`& .${buttonClasses.startIcon}`]: {
2171
2206
  display: 'none', // Hide the trash icon
2172
2207
  },
2173
2208
  '&:hover': {
@@ -2276,7 +2311,7 @@ const getDataGridHeaderStyles = () => {
2276
2311
  // Style the checkbox in header to match Neo design (16x16 from Figma)
2277
2312
  [`& .${gridClasses.columnHeaderCheckbox}`]: {
2278
2313
  padding: 0,
2279
- '& .MuiCheckbox-root': {
2314
+ [`& .${checkboxClasses.root}`]: {
2280
2315
  padding: 0,
2281
2316
  width: 16,
2282
2317
  height: 16,
@@ -2381,7 +2416,7 @@ function NeoDataGrid({ autoHeight = false, toolbar, slots, sx, density = 'standa
2381
2416
  // Fix for MUI X 8.15.0+ scroll shadow issue - backgroundColor must be on main, not root
2382
2417
  // See: https://github.com/mui/mui-x/issues/20107
2383
2418
  // This must be set to prevent scroll shadow artifacts
2384
- '& .MuiDataGrid-main': {
2419
+ [`& .${gridClasses$1.main}`]: {
2385
2420
  backgroundColor: semanticColors.surfaces.white,
2386
2421
  },
2387
2422
  // White background for empty/loading overlays
@@ -2392,9 +2427,9 @@ function NeoDataGrid({ autoHeight = false, toolbar, slots, sx, density = 'standa
2392
2427
  border: `1px solid ${semanticColors.border.primary}`,
2393
2428
  // Style row selection checkboxes to match header (16px, proper spacing)
2394
2429
  [`& .${gridClasses$1.cellCheckbox}`]: {
2395
- '& .MuiCheckbox-root': {
2430
+ [`& .${checkboxClasses.root}`]: {
2396
2431
  padding: `${spacing.spacing_1}px`,
2397
- '& .MuiSvgIcon-root': {
2432
+ [`& .${svgIconClasses.root}`]: {
2398
2433
  width: 16,
2399
2434
  height: 16,
2400
2435
  },
@@ -2443,111 +2478,85 @@ function NeoDataGridColumnsButton() {
2443
2478
  }
2444
2479
  NeoDataGridColumnsButton.displayName = 'NeoDataGridColumnsButton';
2445
2480
 
2446
- const StyledChip = styled(Chip)(({ theme, size, variant, color }) => ({
2447
- padding: 0,
2448
- borderRadius: borderRadius.full,
2449
- fontSize: theme.typography.pxToRem(typography.fontSize.xs),
2450
- fontWeight: typography.fontWeight.medium,
2451
- // Size variants
2452
- ...(size === 'small' && {
2481
+ const sizeStyles = {
2482
+ small: {
2453
2483
  height: 16,
2454
2484
  paddingLeft: spacing.spacing_1_2, // 4px
2455
2485
  paddingRight: spacing.spacing_1_2, // 4px
2456
- }),
2457
- ...(size === 'medium' && {
2486
+ },
2487
+ medium: {
2458
2488
  height: 18,
2459
2489
  paddingLeft: spacing.spacing_3_4, // 6px
2460
2490
  paddingRight: spacing.spacing_3_4, // 6px
2461
- }),
2462
- ...(size === 'large' && {
2491
+ },
2492
+ large: {
2463
2493
  height: 20,
2464
2494
  paddingLeft: spacing.spacing_3_4, // 6px
2465
2495
  paddingRight: spacing.spacing_3_4, // 6px
2466
- }),
2467
- [`& .${chipClasses.label}`]: {
2468
- padding: 0,
2469
2496
  },
2470
- // Outlined variant (light type in Figma) - Neutral/Default
2471
- ...(variant === 'outlined' &&
2472
- color === 'default' && {
2497
+ };
2498
+ const outlinedColorStyles = {
2499
+ default: {
2473
2500
  backgroundColor: semanticColors.status.neutral.light,
2474
2501
  color: semanticColors.status.neutral.dark,
2475
- borderColor: colors.grey[200], // base/grey/200
2476
- }),
2477
- // Outlined variant - Error
2478
- ...(variant === 'outlined' &&
2479
- color === 'error' && {
2502
+ borderColor: colors.grey[200],
2503
+ },
2504
+ error: {
2480
2505
  backgroundColor: semanticColors.status.error.light,
2481
2506
  color: semanticColors.status.error.dark,
2482
- borderColor: colors.red[100], // base/red/100
2483
- }),
2484
- // Outlined variant - Warning
2485
- ...(variant === 'outlined' &&
2486
- color === 'warning' && {
2507
+ borderColor: colors.red[100],
2508
+ },
2509
+ warning: {
2487
2510
  backgroundColor: semanticColors.status.warning.light,
2488
2511
  color: semanticColors.status.warning.dark,
2489
- borderColor: colors.orange[100], // base/orange/100
2490
- }),
2491
- // Outlined variant - Success
2492
- ...(variant === 'outlined' &&
2493
- color === 'success' && {
2512
+ borderColor: colors.orange[100],
2513
+ },
2514
+ success: {
2494
2515
  backgroundColor: semanticColors.status.success.light,
2495
2516
  color: semanticColors.status.success.dark,
2496
- borderColor: 'rgba(94, 196, 111, 0.24)', // rgba from Figma
2497
- }),
2498
- // Outlined variant - Info
2499
- ...(variant === 'outlined' &&
2500
- color === 'info' && {
2517
+ borderColor: 'rgba(94, 196, 111, 0.24)',
2518
+ },
2519
+ info: {
2501
2520
  backgroundColor: semanticColors.status.info.light,
2502
2521
  color: semanticColors.status.info.dark,
2503
- borderColor: colors.digitalBlue[100], // base/digital-blue/100
2504
- }),
2505
- // Outlined variant - Violet
2506
- ...(variant === 'outlined' &&
2507
- color === 'violet' && {
2522
+ borderColor: colors.digitalBlue[100],
2523
+ },
2524
+ violet: {
2508
2525
  backgroundColor: `${colors.violet[100]}66`, // rgba(235,213,241,0.4)
2509
2526
  color: colors.violet[600],
2510
- borderColor: colors.violet[100], // base/violet/100
2511
- }),
2512
- // Filled variant (dark type in Figma) - Neutral/Default
2513
- ...(variant === 'filled' &&
2514
- color === 'default' && {
2515
- backgroundColor: semanticColors.status.neutral.medium,
2516
- color: theme.palette.common.white,
2517
- border: 'none',
2518
- }),
2519
- // Filled variant - Error
2520
- ...(variant === 'filled' &&
2521
- color === 'error' && {
2522
- backgroundColor: semanticColors.status.error.medium,
2523
- color: theme.palette.common.white,
2524
- border: 'none',
2525
- }),
2526
- // Filled variant - Warning
2527
- ...(variant === 'filled' &&
2528
- color === 'warning' && {
2529
- backgroundColor: semanticColors.status.warning.medium,
2530
- color: theme.palette.common.white,
2531
- border: 'none',
2532
- }),
2533
- // Filled variant - Success
2534
- ...(variant === 'filled' &&
2535
- color === 'success' && {
2536
- backgroundColor: semanticColors.status.success.medium,
2537
- color: theme.palette.common.white,
2538
- border: 'none',
2539
- }),
2540
- // Filled variant - Info
2541
- ...(variant === 'filled' &&
2542
- color === 'info' && {
2543
- backgroundColor: semanticColors.status.info.medium,
2544
- color: theme.palette.common.white,
2545
- border: 'none',
2546
- }),
2547
- // 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]),
2548
2556
  ...(variant === 'filled' &&
2549
- color === 'violet' && {
2550
- backgroundColor: colors.violet[500],
2557
+ color &&
2558
+ color in filledColorStyles && {
2559
+ backgroundColor: filledColorStyles[color],
2551
2560
  color: theme.palette.common.white,
2552
2561
  border: 'none',
2553
2562
  }),
@@ -2560,11 +2569,11 @@ const StyledChip = styled(Chip)(({ theme, size, variant, color }) => ({
2560
2569
  * Figma Props Mapping:
2561
2570
  * - m (sm|md|lg) → size (small|medium|large)
2562
2571
  * - type (light|dark) → variant (outlined|filled)
2563
- * - 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)
2564
2573
  * - Label text → label prop
2565
2574
  */
2566
2575
  const NeoTag = ({ size = 'small', variant = 'outlined', ...props }) => {
2567
- return jsx(StyledChip, { size: size, variant: variant, ...props });
2576
+ return jsx(StyledChip$1, { size: size, variant: variant, ...props });
2568
2577
  };
2569
2578
  NeoTag.displayName = 'NeoTag';
2570
2579
 
@@ -3331,7 +3340,7 @@ const shortcutChipStyles = {
3331
3340
  paddingY: `${spacing.spacing_1}px`,
3332
3341
  justifyContent: 'flex-start',
3333
3342
  width: '100%',
3334
- '& .MuiChip-label': {
3343
+ [`& .${chipClasses.label}`]: {
3335
3344
  padding: 0,
3336
3345
  },
3337
3346
  '&:hover': {
@@ -3525,6 +3534,102 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3525
3534
  };
3526
3535
  NeoDot.displayName = 'NeoDot';
3527
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
+
3528
3633
  const SpinnerWrapper = styled('div')({
3529
3634
  width: 24,
3530
3635
  height: 24,
@@ -3765,6 +3870,31 @@ const NeoFooter = ({ variant = 'pagination', showShadow = false, loading = false
3765
3870
  };
3766
3871
  NeoFooter.displayName = 'NeoFooter';
3767
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
+
3768
3898
  /**
3769
3899
  * NeoInfiniteScrollGrid - DataGrid with infinite scroll and load-more functionality
3770
3900
  *
@@ -3889,7 +4019,7 @@ const StyledInputLabel = styled(InputLabel, {
3889
4019
  position: 'static',
3890
4020
  transform: 'none',
3891
4021
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
3892
- fontWeight: 500,
4022
+ fontWeight: typography.fontWeight.medium,
3893
4023
  color: semanticColors.typography.input.label,
3894
4024
  display: 'flex',
3895
4025
  alignItems: 'center',
@@ -3969,7 +4099,7 @@ const StyledInputBase = styled(InputBase, {
3969
4099
  borderColor: semanticColors.status.error.medium,
3970
4100
  },
3971
4101
  // Adornment styling
3972
- '& .MuiInputAdornment-root': {
4102
+ [`& .${inputAdornmentClasses.root}`]: {
3973
4103
  color: destructive ? semanticColors.status.error.medium : semanticColors.icons.placeholder,
3974
4104
  },
3975
4105
  };
@@ -4274,7 +4404,7 @@ const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({
4274
4404
  display: 'flex',
4275
4405
  alignItems: 'center',
4276
4406
  gap: spacing.spacing_2,
4277
- borderRadius: theme.typography.pxToRem(12),
4407
+ borderRadius: borderRadius.m,
4278
4408
  paddingTop: spacing.spacing_1,
4279
4409
  paddingBottom: spacing.spacing_1,
4280
4410
  paddingLeft: spacing.spacing_3_4,
@@ -4316,6 +4446,22 @@ const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({
4316
4446
  color: semanticColors.typography.button.disabled,
4317
4447
  },
4318
4448
  },
4449
+ // Focus state
4450
+ [`&.${listItemButtonClasses.focusVisible}`]: {
4451
+ outline: `2px solid ${semanticColors.border.tabActive}`,
4452
+ outlineOffset: 2,
4453
+ border: `2px solid ${semanticColors.border.tabActive}`,
4454
+ backgroundColor: theme.palette.common.white,
4455
+ [`& .${listItemIconClasses.root}`]: {
4456
+ color: semanticColors.icons.default,
4457
+ },
4458
+ [`& .${listItemTextClasses.primary}`]: {
4459
+ color: colors.grey[800],
4460
+ },
4461
+ [`& .${listItemTextClasses.secondary}`]: {
4462
+ color: semanticColors.typography.bodySecondary,
4463
+ },
4464
+ },
4319
4465
  // Disabled state
4320
4466
  [`&.${listItemButtonClasses.disabled}`]: {
4321
4467
  backgroundColor: colors.grey[50],
@@ -4335,7 +4481,7 @@ const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({
4335
4481
  * NeoListItemButton - Selectable list item with icon and text
4336
4482
  *
4337
4483
  * A selectable list item component that displays an optional icon with primary
4338
- * and secondary text. Supports active (selected), deselected, and disabled states.
4484
+ * and secondary text. Supports active (selected), deselected, focus, and disabled states.
4339
4485
  *
4340
4486
  * Uses MUI's ListItemButton as base for proper accessibility and interaction.
4341
4487
  * Compose with ListItemIcon and ListItemText for proper structure.
@@ -4356,9 +4502,10 @@ const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({
4356
4502
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4925-3764
4357
4503
  *
4358
4504
  * Figma Props Mapping:
4359
- * - property1="Active" → selected={true}
4360
- * - property1="Deselected" → selected={false}
4361
- * - property1="Disabled" → disabled={true}
4505
+ * - state="active" → selected={true}
4506
+ * - state="deselected" → selected={false}
4507
+ * - state="focus" → focus-visible CSS state
4508
+ * - state="disabled" → disabled={true}
4362
4509
  * - showIcon → Conditional rendering of ListItemIcon child
4363
4510
  *
4364
4511
  * Design Tokens Used:
@@ -4382,36 +4529,36 @@ NeoListItemButton.displayName = 'NeoListItemButton';
4382
4529
  * Focus ring box-shadow using Neo design tokens
4383
4530
  * Combines focusWhite1 (inner white ring) and focusBlue2 (outer blue ring)
4384
4531
  */
4385
- 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}`;
4386
4533
  /**
4387
4534
  * Card box-shadow using Neo design tokens for hover and selected states
4388
4535
  */
4389
- 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}`;
4390
4537
  /**
4391
4538
  * Styled Card component with Neo design tokens
4392
4539
  */
4393
4540
  const StyledCard = styled(MuiCard, {
4394
4541
  shouldForwardProp: prop => prop !== 'selected' && prop !== 'disabled',
4395
4542
  })(({ theme, selected, disabled }) => ({
4396
- width: theme.typography.pxToRem(160),
4397
- height: theme.typography.pxToRem(160),
4543
+ width: 160,
4544
+ height: 160,
4398
4545
  padding: theme.spacing(1.5), // 12px
4399
4546
  display: 'flex',
4400
4547
  flexDirection: 'column',
4401
4548
  gap: theme.spacing(2), // 16px
4402
4549
  backgroundColor: semanticColors.surfaces.card,
4403
4550
  border: `1px solid ${selected ? semanticColors.border.tabActive : semanticColors.border.card}`,
4404
- borderRadius: theme.typography.pxToRem(4),
4405
- boxShadow: selected ? activeShadow : 'none',
4551
+ borderRadius: borderRadius.xS,
4552
+ boxShadow: selected ? activeShadow$1 : 'none',
4406
4553
  transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
4407
4554
  cursor: 'pointer',
4408
4555
  '&:hover': {
4409
4556
  borderColor: semanticColors.border.tabActive,
4410
- boxShadow: activeShadow,
4557
+ boxShadow: activeShadow$1,
4411
4558
  },
4412
4559
  '&:focus-visible': {
4413
4560
  borderColor: semanticColors.border.tabActive,
4414
- boxShadow: focusRingShadow,
4561
+ boxShadow: focusRingShadow$1,
4415
4562
  outline: 'none',
4416
4563
  },
4417
4564
  ...(disabled && {
@@ -4432,11 +4579,11 @@ const CardHeader = styled('div')({
4432
4579
  /**
4433
4580
  * Logo container
4434
4581
  */
4435
- const LogoContainer = styled('div')(({ theme }) => ({
4436
- width: theme.typography.pxToRem(spacing.spacing_6),
4437
- height: theme.typography.pxToRem(spacing.spacing_6),
4582
+ const LogoContainer = styled('div')({
4583
+ width: spacing.spacing_6,
4584
+ height: spacing.spacing_6,
4438
4585
  flexShrink: 0,
4439
- }));
4586
+ });
4440
4587
  /**
4441
4588
  * Recipe count badge
4442
4589
  */
@@ -4471,7 +4618,7 @@ const Title = styled('p')(({ theme }) => ({
4471
4618
  /**
4472
4619
  * Description text
4473
4620
  */
4474
- const Description = styled('p')(({ theme }) => ({
4621
+ const Description$1 = styled('p')(({ theme }) => ({
4475
4622
  margin: 0,
4476
4623
  fontSize: theme.typography.pxToRem(typography.fontSize.xs), // 12px
4477
4624
  fontWeight: typography.fontWeight.regular, // 400
@@ -4526,10 +4673,131 @@ const Description = styled('p')(({ theme }) => ({
4526
4673
  * - typography.fontWeight.regular (400) - Description
4527
4674
  */
4528
4675
  const NeoMarketplaceCard = ({ logo, recipeCount, title, description, selected = false, disabled = false, onClick, ...props }) => {
4529
- 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 })] })] }));
4530
4677
  };
4531
4678
  NeoMarketplaceCard.displayName = 'NeoMarketplaceCard';
4532
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
+
4533
4801
  const StyledMenu = styled(Menu)(({ theme }) => ({
4534
4802
  [`& .${paperClasses.root}`]: {
4535
4803
  backgroundColor: semanticColors.surfaces.white,
@@ -4773,6 +5041,87 @@ const NeoModalFooter = ({ leadingContent, children }) => {
4773
5041
  };
4774
5042
  NeoModalFooter.displayName = 'NeoModalFooter';
4775
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
+
4776
5125
  /**
4777
5126
  * Sticky header wrapper - sticks to top when scrolling
4778
5127
  */
@@ -5355,7 +5704,7 @@ NeoSkeleton.displayName = 'NeoSkeleton';
5355
5704
 
5356
5705
  /**
5357
5706
  * Styled Alert component with custom severity and variant styling
5358
- * Uses Custom Variants Pattern to add 'neutral' severity
5707
+ * Uses Custom Variants Pattern to add 'neutral' and 'info' severities
5359
5708
  */
5360
5709
  const StyledAlert$1 = styled(Alert, {
5361
5710
  shouldForwardProp: prop => prop !== 'severity' && prop !== 'variant',
@@ -5374,6 +5723,10 @@ const StyledAlert$1 = styled(Alert, {
5374
5723
  light: semanticColors.status.neutral.light,
5375
5724
  medium: semanticColors.status.neutral.medium,
5376
5725
  },
5726
+ info: {
5727
+ light: semanticColors.status.info.light,
5728
+ medium: semanticColors.status.info.medium,
5729
+ },
5377
5730
  };
5378
5731
  const severityColors = colorMap[severity];
5379
5732
  // Variant-specific styles based on Phase 1.1 analysis
@@ -5433,19 +5786,20 @@ const StyledAlert$1 = styled(Alert, {
5433
5786
  /**
5434
5787
  * NeoStatusBanner - Status banner component for displaying system status messages
5435
5788
  *
5436
- * Displays status information with different severity levels (success, error, neutral) and
5789
+ * Displays status information with different severity levels (success, error, info, neutral) and
5437
5790
  * visual modes (outlined for light backgrounds, filled for emphasis).
5438
5791
  *
5439
5792
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4921-3427
5440
5793
  *
5441
5794
  * Figma Props Mapping:
5442
- * - Status (Success|Error|Offline) → severity ('success'|'error'|'neutral')
5795
+ * - Status (Success|Error|Info|Offline) → severity ('success'|'error'|'info'|'neutral')
5443
5796
  * - Mode (Light|Dark) → variant ('outlined'|'filled')
5444
5797
  *
5445
5798
  * Design Tokens Used:
5446
5799
  * - status.success.light, status.success.medium
5447
5800
  * - status.error.light, status.error.medium
5448
5801
  * - status.neutral.light, status.neutral.medium
5802
+ * - status.info.light, status.info.medium
5449
5803
  * - typography.tooltip, typography.bodySecondary
5450
5804
  * - grey[800]
5451
5805
  * - fontSize.default, fontSize.sm
@@ -5459,6 +5813,7 @@ const NeoStatusBanner = ({ severity = 'success', variant = 'outlined', icon, chi
5459
5813
  success: jsx(CircleCheck, { size: 24 }),
5460
5814
  error: jsx(CircleAlert, { size: 24 }),
5461
5815
  neutral: jsx(WifiOff, { size: 24 }),
5816
+ info: jsx(Info, { size: 24 }),
5462
5817
  };
5463
5818
  const defaultIcon = iconMap[severity];
5464
5819
  // Type assertion needed: severity and variant are custom props filtered by shouldForwardProp
@@ -5493,14 +5848,14 @@ const StyledTab = styled(MuiTab)(({ theme }) => ({
5493
5848
  minHeight: spacing.spacing_5,
5494
5849
  padding: `${theme.spacing(1)} ${theme.spacing(2)}`,
5495
5850
  textTransform: 'none',
5496
- fontWeight: 400,
5851
+ fontWeight: typography.fontWeight.regular,
5497
5852
  fontSize: theme.typography.pxToRem(14),
5498
5853
  lineHeight: '1.5rem',
5499
5854
  color: semanticColors.typography.tab.inactive,
5500
5855
  transition: 'none', // Remove animation
5501
5856
  [`&.${tabClasses.selected}`]: {
5502
5857
  color: semanticColors.typography.tab.active,
5503
- fontWeight: 600,
5858
+ fontWeight: typography.fontWeight.semiBold,
5504
5859
  },
5505
5860
  [`&.${buttonBaseClasses.focusVisible}`]: {
5506
5861
  outline: `2px solid ${semanticColors.buttons.primary.focus}`,
@@ -5619,7 +5974,7 @@ const ToastTitle = styled('p')(({ theme, variant = 'default' }) => {
5619
5974
  return {
5620
5975
  margin: 0,
5621
5976
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
5622
- fontWeight: 600,
5977
+ fontWeight: typography.fontWeight.semiBold,
5623
5978
  lineHeight: 1.4,
5624
5979
  color: colorMap[variant],
5625
5980
  };
@@ -5637,7 +5992,7 @@ const ToastMessage = styled('p')(({ theme, variant = 'default' }) => {
5637
5992
  return {
5638
5993
  margin: 0,
5639
5994
  fontSize: theme.typography.pxToRem(typography.fontSize.sm),
5640
- fontWeight: 400,
5995
+ fontWeight: typography.fontWeight.regular,
5641
5996
  lineHeight: 1.4,
5642
5997
  color: colorMap[variant],
5643
5998
  };
@@ -5677,7 +6032,7 @@ const ToastButton = styled(Button, {
5677
6032
  padding: 0,
5678
6033
  minWidth: 'auto',
5679
6034
  fontSize: typography.fontSize.sm,
5680
- fontWeight: 500,
6035
+ fontWeight: typography.fontWeight.medium,
5681
6036
  lineHeight: 'normal',
5682
6037
  textTransform: 'none',
5683
6038
  color: getColor(),
@@ -5694,14 +6049,14 @@ const ProgressSection = styled(Stack)({
5694
6049
  const FileName = styled('p')(({ theme }) => ({
5695
6050
  margin: 0,
5696
6051
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
5697
- fontWeight: 500,
6052
+ fontWeight: typography.fontWeight.medium,
5698
6053
  lineHeight: 1.5,
5699
6054
  color: colors.grey['800'],
5700
6055
  }));
5701
6056
  const ProgressLabel = styled('p')(({ theme }) => ({
5702
6057
  margin: 0,
5703
6058
  fontSize: theme.typography.pxToRem(typography.fontSize.xs),
5704
- fontWeight: 500,
6059
+ fontWeight: typography.fontWeight.medium,
5705
6060
  lineHeight: 1.5,
5706
6061
  color: colors.grey['800'],
5707
6062
  }));
@@ -5773,13 +6128,13 @@ const LabelContainer = styled('div')({
5773
6128
  });
5774
6129
  const Label = styled('span')(({ theme, size = 'medium' }) => ({
5775
6130
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5776
- fontWeight: 500,
6131
+ fontWeight: typography.fontWeight.medium,
5777
6132
  lineHeight: size === 'small' ? 1.4 : 1.5,
5778
6133
  color: semanticColors.typography.input.default,
5779
6134
  }));
5780
6135
  const HelperText = styled('span')(({ theme, size = 'medium' }) => ({
5781
6136
  fontSize: theme.typography.pxToRem(size === 'small' ? typography.fontSize.sm : typography.fontSize.default),
5782
- fontWeight: 400,
6137
+ fontWeight: typography.fontWeight.regular,
5783
6138
  lineHeight: size === 'small' ? 1.4 : 1.5,
5784
6139
  color: semanticColors.typography.bodySecondary,
5785
6140
  }));
@@ -6062,6 +6417,8 @@ const NeoTooltip = ({ variant = 'light', title, description, children, arrow = f
6062
6417
  };
6063
6418
  NeoTooltip.displayName = 'NeoTooltip';
6064
6419
 
6420
+ // Figma-exact border radius for toggle buttons — no matching design token
6421
+ const TOGGLE_BUTTON_BORDER_RADIUS = 14;
6065
6422
  const StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme }) => ({
6066
6423
  backgroundColor: colors.grey[50],
6067
6424
  padding: theme.spacing(0.625, 0.875),
@@ -6069,14 +6426,14 @@ const StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme }) => ({
6069
6426
  gap: 0,
6070
6427
  [`& .${toggleButtonGroupClasses.grouped}`]: {
6071
6428
  border: 'none',
6072
- borderRadius: 14,
6429
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6073
6430
  margin: 0,
6074
6431
  '&:not(:first-of-type)': {
6075
- borderRadius: 14,
6432
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6076
6433
  marginLeft: 0,
6077
6434
  },
6078
6435
  '&:not(:last-of-type)': {
6079
- borderRadius: 14,
6436
+ borderRadius: TOGGLE_BUTTON_BORDER_RADIUS,
6080
6437
  },
6081
6438
  },
6082
6439
  }));
@@ -6129,5 +6486,5 @@ NeoTypologyControl.displayName = 'NeoTypologyControl';
6129
6486
 
6130
6487
  const version = '0.0.0-development';
6131
6488
 
6132
- 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 };
6133
6490
  //# sourceMappingURL=index.esm.js.map