@moderneinc/neo-styled-components 2.8.0 → 3.0.0-next.2d959a

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
@@ -8,14 +8,15 @@ var Avatar = require('@mui/material/Avatar');
8
8
  var Chip = require('@mui/material/Chip');
9
9
  var SvgIcon = require('@mui/material/SvgIcon');
10
10
  var Alert = require('@mui/material/Alert');
11
- var IconButton = require('@mui/material/IconButton');
11
+ var ButtonBase = require('@mui/material/ButtonBase');
12
12
  var React = require('react');
13
+ var IconButton = require('@mui/material/IconButton');
13
14
  var Breadcrumbs = require('@mui/material/Breadcrumbs');
14
15
  var Link = require('@mui/material/Link');
15
- var ButtonBase = require('@mui/material/ButtonBase');
16
16
  var CircularProgress = require('@mui/material/CircularProgress');
17
17
  var MuiToggleButton = require('@mui/material/ToggleButton');
18
18
  var MuiToggleButtonGroup = require('@mui/material/ToggleButtonGroup');
19
+ var MuiCard = require('@mui/material/Card');
19
20
  var Checkbox = require('@mui/material/Checkbox');
20
21
  var xDataGridPro = require('@mui/x-data-grid-pro');
21
22
  var Button = require('@mui/material/Button');
@@ -38,23 +39,22 @@ var PickersShortcuts = require('@mui/x-date-pickers/PickersShortcuts');
38
39
  var DateRangePicker = require('@mui/x-date-pickers-pro/DateRangePicker');
39
40
  var DateRangePickerDay = require('@mui/x-date-pickers-pro/DateRangePickerDay');
40
41
  var Badge = require('@mui/material/Badge');
42
+ var LinearProgress = require('@mui/material/LinearProgress');
43
+ var Paper = require('@mui/material/Paper');
44
+ var Stack = require('@mui/material/Stack');
41
45
  var List = require('@mui/material/List');
42
46
  var Menu = require('@mui/material/Menu');
43
- var Paper = require('@mui/material/Paper');
44
47
  var FormControl = require('@mui/material/FormControl');
45
48
  var FormHelperText = require('@mui/material/FormHelperText');
46
49
  var ListItemButton = require('@mui/material/ListItemButton');
47
50
  var ListItemIcon = require('@mui/material/ListItemIcon');
48
51
  var ListItemText = require('@mui/material/ListItemText');
49
52
  var Typography = require('@mui/material/Typography');
50
- var MuiCard = require('@mui/material/Card');
51
53
  var Dialog = require('@mui/material/Dialog');
52
54
  var DialogActions = require('@mui/material/DialogActions');
53
55
  var DialogContent = require('@mui/material/DialogContent');
54
56
  var Fab = require('@mui/material/Fab');
55
57
  var Fade = require('@mui/material/Fade');
56
- var Stack = require('@mui/material/Stack');
57
- var LinearProgress = require('@mui/material/LinearProgress');
58
58
  var Radio = require('@mui/material/Radio');
59
59
  var Skeleton = require('@mui/material/Skeleton');
60
60
  var MuiTab = require('@mui/material/Tab');
@@ -138,7 +138,7 @@ const AvatarContainer = styles.styled(Box)(({ size = 'medium' }) => ({
138
138
  alignItems: 'center',
139
139
  justifyContent: 'center',
140
140
  overflow: 'hidden',
141
- boxShadow: `${neoDesign.shadows.neutralSmall.x}px ${neoDesign.shadows.neutralSmall.y}px ${neoDesign.shadows.neutralSmall.blur}px ${neoDesign.shadows.neutralSmall.spread}px ${neoDesign.shadows.neutralSmall.shadow}`,
141
+ boxShadow: `${neoDesign.shadows.neutral.small.x}px ${neoDesign.shadows.neutral.small.y}px ${neoDesign.shadows.neutral.small.blur}px ${neoDesign.shadows.neutral.small.spread}px ${neoDesign.shadows.neutral.small.shadow}`,
142
142
  }),
143
143
  '&:focus-within': {
144
144
  ...focusRingStyles,
@@ -690,11 +690,11 @@ const createLucideIcon = (iconName, iconNode) => {
690
690
  */
691
691
 
692
692
 
693
- const __iconNode$i = [
693
+ const __iconNode$k = [
694
694
  ["path", { d: "M12 5v14", key: "s699le" }],
695
695
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
696
696
  ];
697
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
697
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$k);
698
698
 
699
699
  /**
700
700
  * @license lucide-react v0.577.0 - ISC
@@ -704,11 +704,32 @@ const ArrowDown = createLucideIcon("arrow-down", __iconNode$i);
704
704
  */
705
705
 
706
706
 
707
- const __iconNode$h = [
707
+ const __iconNode$j = [
708
708
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
709
709
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
710
710
  ];
711
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
711
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$j);
712
+
713
+ /**
714
+ * @license lucide-react v0.577.0 - ISC
715
+ *
716
+ * This source code is licensed under the ISC license.
717
+ * See the LICENSE file in the root directory of this source tree.
718
+ */
719
+
720
+
721
+ const __iconNode$i = [
722
+ [
723
+ "path",
724
+ {
725
+ d: "M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",
726
+ key: "3c2336"
727
+ }
728
+ ],
729
+ ["line", { x1: "12", x2: "12", y1: "16", y2: "12", key: "1y1yb1" }],
730
+ ["line", { x1: "12", x2: "12.01", y1: "8", y2: "8", key: "110wyk" }]
731
+ ];
732
+ const BadgeInfo = createLucideIcon("badge-info", __iconNode$i);
712
733
 
713
734
  /**
714
735
  * @license lucide-react v0.577.0 - ISC
@@ -718,7 +739,7 @@ const ArrowUp = createLucideIcon("arrow-up", __iconNode$h);
718
739
  */
719
740
 
720
741
 
721
- const __iconNode$g = [
742
+ const __iconNode$h = [
722
743
  ["path", { d: "M8 2v4", key: "1cmpym" }],
723
744
  ["path", { d: "M16 2v4", key: "4m81vk" }],
724
745
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
@@ -730,7 +751,7 @@ const __iconNode$g = [
730
751
  ["path", { d: "M12 18h.01", key: "mhygvu" }],
731
752
  ["path", { d: "M16 18h.01", key: "kzsmim" }]
732
753
  ];
733
- const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
754
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$h);
734
755
 
735
756
  /**
736
757
  * @license lucide-react v0.577.0 - ISC
@@ -740,8 +761,8 @@ const CalendarDays = createLucideIcon("calendar-days", __iconNode$g);
740
761
  */
741
762
 
742
763
 
743
- const __iconNode$f = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
744
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
764
+ const __iconNode$g = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
765
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$g);
745
766
 
746
767
  /**
747
768
  * @license lucide-react v0.577.0 - ISC
@@ -751,8 +772,8 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$f);
751
772
  */
752
773
 
753
774
 
754
- const __iconNode$e = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
755
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
775
+ const __iconNode$f = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
776
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$f);
756
777
 
757
778
  /**
758
779
  * @license lucide-react v0.577.0 - ISC
@@ -762,8 +783,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$e);
762
783
  */
763
784
 
764
785
 
765
- const __iconNode$d = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
766
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
786
+ const __iconNode$e = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
787
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$e);
767
788
 
768
789
  /**
769
790
  * @license lucide-react v0.577.0 - ISC
@@ -773,8 +794,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$d);
773
794
  */
774
795
 
775
796
 
776
- const __iconNode$c = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
777
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
797
+ const __iconNode$d = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
798
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$d);
778
799
 
779
800
  /**
780
801
  * @license lucide-react v0.577.0 - ISC
@@ -784,11 +805,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$c);
784
805
  */
785
806
 
786
807
 
787
- const __iconNode$b = [
808
+ const __iconNode$c = [
788
809
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
789
810
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
790
811
  ];
791
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
812
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$c);
792
813
 
793
814
  /**
794
815
  * @license lucide-react v0.577.0 - ISC
@@ -798,12 +819,12 @@ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$b);
798
819
  */
799
820
 
800
821
 
801
- const __iconNode$a = [
822
+ const __iconNode$b = [
802
823
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
803
824
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
804
825
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
805
826
  ];
806
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
827
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$b);
807
828
 
808
829
  /**
809
830
  * @license lucide-react v0.577.0 - ISC
@@ -813,11 +834,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$a);
813
834
  */
814
835
 
815
836
 
816
- const __iconNode$9 = [
817
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
818
- ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
837
+ const __iconNode$a = [
838
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
839
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
819
840
  ];
820
- const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
841
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$a);
821
842
 
822
843
  /**
823
844
  * @license lucide-react v0.577.0 - ISC
@@ -827,12 +848,12 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$9);
827
848
  */
828
849
 
829
850
 
830
- const __iconNode$8 = [
851
+ const __iconNode$9 = [
831
852
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
832
853
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
833
854
  ["path", { d: "M12 17h.01", key: "p32p05" }]
834
855
  ];
835
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8);
856
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$9);
836
857
 
837
858
  /**
838
859
  * @license lucide-react v0.577.0 - ISC
@@ -842,12 +863,12 @@ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$8
842
863
  */
843
864
 
844
865
 
845
- const __iconNode$7 = [
866
+ const __iconNode$8 = [
846
867
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
847
868
  ["path", { d: "M9 3v18", key: "fh3hqa" }],
848
869
  ["path", { d: "M15 3v18", key: "14nvp0" }]
849
870
  ];
850
- const Columns3 = createLucideIcon("columns-3", __iconNode$7);
871
+ const Columns3 = createLucideIcon("columns-3", __iconNode$8);
851
872
 
852
873
  /**
853
874
  * @license lucide-react v0.577.0 - ISC
@@ -857,12 +878,12 @@ const Columns3 = createLucideIcon("columns-3", __iconNode$7);
857
878
  */
858
879
 
859
880
 
860
- const __iconNode$6 = [
861
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
862
- ["path", { d: "M12 16v-4", key: "1dtifu" }],
863
- ["path", { d: "M12 8h.01", key: "e9boi3" }]
881
+ const __iconNode$7 = [
882
+ ["path", { d: "M2 5h20", key: "1fs1ex" }],
883
+ ["path", { d: "M6 12h12", key: "8npq4p" }],
884
+ ["path", { d: "M9 19h6", key: "456am0" }]
864
885
  ];
865
- const Info = createLucideIcon("info", __iconNode$6);
886
+ const ListFilter = createLucideIcon("list-filter", __iconNode$7);
866
887
 
867
888
  /**
868
889
  * @license lucide-react v0.577.0 - ISC
@@ -872,12 +893,8 @@ const Info = createLucideIcon("info", __iconNode$6);
872
893
  */
873
894
 
874
895
 
875
- const __iconNode$5 = [
876
- ["path", { d: "M2 5h20", key: "1fs1ex" }],
877
- ["path", { d: "M6 12h12", key: "8npq4p" }],
878
- ["path", { d: "M9 19h6", key: "456am0" }]
879
- ];
880
- const ListFilter = createLucideIcon("list-filter", __iconNode$5);
896
+ const __iconNode$6 = [["path", { d: "M5 12h14", key: "1ays0h" }]];
897
+ const Minus = createLucideIcon("minus", __iconNode$6);
881
898
 
882
899
  /**
883
900
  * @license lucide-react v0.577.0 - ISC
@@ -887,11 +904,11 @@ const ListFilter = createLucideIcon("list-filter", __iconNode$5);
887
904
  */
888
905
 
889
906
 
890
- const __iconNode$4 = [
907
+ const __iconNode$5 = [
891
908
  ["path", { d: "M5 12h14", key: "1ays0h" }],
892
909
  ["path", { d: "M12 5v14", key: "s699le" }]
893
910
  ];
894
- const Plus = createLucideIcon("plus", __iconNode$4);
911
+ const Plus = createLucideIcon("plus", __iconNode$5);
895
912
 
896
913
  /**
897
914
  * @license lucide-react v0.577.0 - ISC
@@ -901,11 +918,11 @@ const Plus = createLucideIcon("plus", __iconNode$4);
901
918
  */
902
919
 
903
920
 
904
- const __iconNode$3 = [
921
+ const __iconNode$4 = [
905
922
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
906
923
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
907
924
  ];
908
- const Search = createLucideIcon("search", __iconNode$3);
925
+ const Search = createLucideIcon("search", __iconNode$4);
909
926
 
910
927
  /**
911
928
  * @license lucide-react v0.577.0 - ISC
@@ -915,14 +932,35 @@ const Search = createLucideIcon("search", __iconNode$3);
915
932
  */
916
933
 
917
934
 
918
- const __iconNode$2 = [
935
+ const __iconNode$3 = [
919
936
  ["path", { d: "M10 11v6", key: "nco0om" }],
920
937
  ["path", { d: "M14 11v6", key: "outv1u" }],
921
938
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
922
939
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
923
940
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
924
941
  ];
925
- const Trash2 = createLucideIcon("trash-2", __iconNode$2);
942
+ const Trash2 = createLucideIcon("trash-2", __iconNode$3);
943
+
944
+ /**
945
+ * @license lucide-react v0.577.0 - ISC
946
+ *
947
+ * This source code is licensed under the ISC license.
948
+ * See the LICENSE file in the root directory of this source tree.
949
+ */
950
+
951
+
952
+ const __iconNode$2 = [
953
+ [
954
+ "path",
955
+ {
956
+ d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
957
+ key: "wmoenq"
958
+ }
959
+ ],
960
+ ["path", { d: "M12 9v4", key: "juzpu7" }],
961
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
962
+ ];
963
+ const TriangleAlert = createLucideIcon("triangle-alert", __iconNode$2);
926
964
 
927
965
  /**
928
966
  * @license lucide-react v0.577.0 - ISC
@@ -957,33 +995,113 @@ const __iconNode = [
957
995
  ];
958
996
  const X = createLucideIcon("x", __iconNode);
959
997
 
998
+ const neutralSmallShadow = `${neoDesign.shadows.neutral.small.x}px ${neoDesign.shadows.neutral.small.y}px ${neoDesign.shadows.neutral.small.blur}px ${neoDesign.shadows.neutral.small.spread}px ${neoDesign.shadows.neutral.small.shadow}`;
999
+ const intentColors$1 = {
1000
+ success: neoDesign.semanticColors.status.success,
1001
+ error: neoDesign.semanticColors.status.error,
1002
+ warning: neoDesign.semanticColors.status.warning,
1003
+ offline: neoDesign.semanticColors.status.neutral,
1004
+ info: neoDesign.semanticColors.status.info,
1005
+ };
960
1006
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
961
1007
  const StyledAlert$2 = styles.styled(Alert, {
962
- shouldForwardProp: prop => prop !== 'messagePosition' && prop !== 'variant',
963
- })(({ variant = 'light', messagePosition = 'left' }) => {
964
- // Variant-specific styles
965
- const variantStyles = {
966
- dark: {
967
- backgroundColor: neoDesign.semanticColors.surfaces.snackbarBrand,
968
- color: neoDesign.semanticColors.surfaces.white,
969
- },
970
- light: {
971
- backgroundColor: neoDesign.semanticColors.status.info.light,
972
- color: neoDesign.colors.grey['800'],
973
- },
974
- success: {
975
- backgroundColor: neoDesign.semanticColors.status.success.light,
976
- color: neoDesign.colors.grey['800'],
1008
+ shouldForwardProp: prop => prop !== 'intent' && prop !== 'alertType',
1009
+ })(({ theme, intent = 'success', alertType = 'outlined' }) => {
1010
+ const palette = intentColors$1[intent];
1011
+ const isFilled = alertType === 'filled';
1012
+ const iconColor = isFilled ? neoDesign.semanticColors.typography.tooltip : palette.default;
1013
+ const messageColor = isFilled ? neoDesign.semanticColors.typography.tooltip : neoDesign.semanticColors.typography.body;
1014
+ return {
1015
+ height: neoDesign.spacing.spacing_8,
1016
+ width: '100%',
1017
+ borderRadius: neoDesign.borderRadius.xS,
1018
+ alignItems: 'center',
1019
+ fontFamily: neoDesign.typography.fontFamily.body,
1020
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.default),
1021
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
1022
+ lineHeight: 1.5,
1023
+ padding: theme.spacing(0, 2),
1024
+ backgroundColor: isFilled ? palette.dark : palette.light,
1025
+ border: isFilled ? 'none' : `1px solid ${palette.transparent}`,
1026
+ color: isFilled ? neoDesign.semanticColors.typography.tooltip : neoDesign.semanticColors.typography.body,
1027
+ boxShadow: isFilled ? neutralSmallShadow : undefined,
1028
+ [`& .${Alert.alertClasses.icon}`]: {
1029
+ color: iconColor,
1030
+ padding: 0,
1031
+ opacity: 1,
1032
+ marginRight: neoDesign.spacing.spacing_1_1_2,
977
1033
  },
978
- error: {
979
- backgroundColor: neoDesign.semanticColors.status.error.light,
980
- color: neoDesign.colors.grey['800'],
1034
+ [`& .${Alert.alertClasses.message}`]: {
1035
+ color: messageColor,
1036
+ padding: 0,
1037
+ flex: 1,
1038
+ display: 'flex',
1039
+ flexDirection: 'column',
1040
+ justifyContent: 'center',
1041
+ '& span:last-child': {
1042
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
1043
+ fontWeight: neoDesign.typography.fontWeight.medium,
1044
+ color: isFilled
1045
+ ? neoDesign.semanticColors.typography.tooltip
1046
+ : neoDesign.semanticColors.typography.bodySecondary,
1047
+ lineHeight: 1.4,
1048
+ },
981
1049
  },
982
- warning: {
983
- backgroundColor: neoDesign.semanticColors.status.warning.light,
984
- color: neoDesign.colors.grey['800'],
1050
+ [`& .${Alert.alertClasses.action}`]: {
1051
+ padding: 0,
1052
+ marginRight: 0,
1053
+ ...(isFilled && {
1054
+ color: neoDesign.semanticColors.typography.tooltip,
1055
+ [`& .${ButtonBase.buttonBaseClasses.root}`]: { color: 'inherit' },
1056
+ }),
985
1057
  },
986
1058
  };
1059
+ });
1060
+ const iconMap = {
1061
+ success: jsxRuntime.jsx(CircleCheckBig, { size: 24 }),
1062
+ error: jsxRuntime.jsx(CircleAlert, { size: 24 }),
1063
+ warning: jsxRuntime.jsx(TriangleAlert, { size: 24 }),
1064
+ offline: jsxRuntime.jsx(WifiOff, { size: 24 }),
1065
+ info: jsxRuntime.jsx(BadgeInfo, { size: 24 }),
1066
+ };
1067
+ /**
1068
+ * NeoAlert - Alert component for displaying contextual status messages
1069
+ *
1070
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4921-3427
1071
+ *
1072
+ * Figma Props Mapping:
1073
+ * - Intent (Success|Error|Warning|Offline|Info) → intent
1074
+ * - Type (Outlined|Filled) → type
1075
+ * - Show supporting text → description prop presence
1076
+ * - Show Button → action prop presence
1077
+ */
1078
+ const NeoAlert = ({ intent = 'success', type = 'outlined', title, description, icon, action, ...props }) => {
1079
+ const defaultIcon = iconMap[intent];
1080
+ return (jsxRuntime.jsxs(StyledAlert$2, { ...props, intent: intent, alertType: type, icon: icon ?? defaultIcon, action: action, children: [jsxRuntime.jsx("span", { children: title }), description && jsxRuntime.jsx("span", { children: description })] }));
1081
+ };
1082
+ NeoAlert.displayName = 'NeoAlert';
1083
+
1084
+ const intentColors = {
1085
+ info: neoDesign.semanticColors.status.info,
1086
+ success: neoDesign.semanticColors.status.success,
1087
+ error: neoDesign.semanticColors.status.error,
1088
+ warning: neoDesign.semanticColors.status.warning,
1089
+ neutral: neoDesign.semanticColors.status.neutral,
1090
+ };
1091
+ // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
1092
+ const StyledAlert$1 = styles.styled(Alert, {
1093
+ shouldForwardProp: prop => prop !== 'messagePosition' && prop !== 'intent' && prop !== 'bannerType',
1094
+ })(({ intent = 'info', bannerType = 'outlined', messagePosition = 'left' }) => {
1095
+ const palette = intentColors[intent];
1096
+ const typeStyles = bannerType === 'filled'
1097
+ ? {
1098
+ backgroundColor: palette.dark,
1099
+ color: neoDesign.semanticColors.surfaces.white,
1100
+ }
1101
+ : {
1102
+ backgroundColor: palette.light,
1103
+ color: neoDesign.colors.grey['800'],
1104
+ };
987
1105
  return {
988
1106
  width: '100%',
989
1107
  minHeight: 52,
@@ -995,11 +1113,11 @@ const StyledAlert$2 = styles.styled(Alert, {
995
1113
  alignItems: 'center',
996
1114
  justifyContent: messagePosition === 'center' ? 'center' : 'flex-start',
997
1115
  ...(messagePosition === 'center' && { position: 'relative' }),
998
- boxShadow: `${neoDesign.shadows.neutralSmall.x}px ${neoDesign.shadows.neutralSmall.y}px ${neoDesign.shadows.neutralSmall.blur}px ${neoDesign.shadows.neutralSmall.spread}px ${neoDesign.shadows.neutralSmall.shadow}`,
1116
+ boxShadow: `${neoDesign.shadows.neutral.small.x}px ${neoDesign.shadows.neutral.small.y}px ${neoDesign.shadows.neutral.small.blur}px ${neoDesign.shadows.neutral.small.spread}px ${neoDesign.shadows.neutral.small.shadow}`,
999
1117
  fontSize: neoDesign.typography.fontSize.default,
1000
- fontWeight: neoDesign.typography.fontWeight.regular,
1118
+ fontWeight: neoDesign.typography.fontWeight.medium,
1001
1119
  lineHeight: 1.5,
1002
- ...variantStyles[variant],
1120
+ ...typeStyles,
1003
1121
  [`& .${Alert.alertClasses.icon}`]: {
1004
1122
  padding: 0,
1005
1123
  opacity: 1,
@@ -1022,26 +1140,18 @@ const StyledAlert$2 = styles.styled(Alert, {
1022
1140
  },
1023
1141
  };
1024
1142
  });
1025
- const LinkText = styles.styled('span')(({ variant = 'light' }) => {
1026
- const getLinkColor = () => {
1027
- if (variant === 'dark') {
1028
- return neoDesign.semanticColors.typography.link.default; // #f9fafb (light gray/white)
1029
- }
1030
- if (variant === 'light') {
1031
- return neoDesign.semanticColors.typography.link.primary; // #2f42ff (blue)
1032
- }
1033
- // For success, error, warning - use dark body color #1f2937
1034
- return neoDesign.colors.grey['800'];
1035
- };
1036
- return {
1037
- fontWeight: neoDesign.typography.fontWeight.semiBold,
1038
- color: getLinkColor(),
1039
- cursor: 'pointer',
1040
- '&:hover': {
1041
- textDecoration: 'underline',
1042
- },
1043
- };
1044
- });
1143
+ const LinkText = styles.styled('span')(({ bannerType = 'outlined' }) => ({
1144
+ marginLeft: 'auto',
1145
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
1146
+ color: bannerType === 'filled'
1147
+ ? neoDesign.semanticColors.typography.link.white
1148
+ : neoDesign.semanticColors.typography.link.primary,
1149
+ cursor: 'pointer',
1150
+ whiteSpace: 'nowrap',
1151
+ '&:hover': {
1152
+ textDecoration: 'underline',
1153
+ },
1154
+ }));
1045
1155
  const StyledIconButton$1 = styles.styled(IconButton)(({ closeIconColor }) => ({
1046
1156
  padding: 0,
1047
1157
  color: closeIconColor,
@@ -1049,35 +1159,17 @@ const StyledIconButton$1 = styles.styled(IconButton)(({ closeIconColor }) => ({
1049
1159
  backgroundColor: 'transparent',
1050
1160
  },
1051
1161
  }));
1052
- /**
1053
- * NeoBanner - Inline banner/alert component based on MUI Alert
1054
- *
1055
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4170-2158
1056
- *
1057
- * Figma Props Mapping:
1058
- * - color (Dark|Light|Success|Error|Warning) → variant (dark|light|success|error|warning)
1059
- * - messagePosition (Left|Center) → messagePosition ("left"|"center")
1060
- * - closeIcon (boolean) → showClose (boolean)
1061
- * - link (boolean) → linkText (string)
1062
- * - {Message} → message (string)
1063
- */
1064
- const NeoBanner = ({ variant = 'light', message, messagePosition = 'left', linkText, showClose = true, icon, onClose, onLinkClick, ...props }) => {
1065
- const getCloseIconColor = () => {
1066
- if (variant === 'dark') {
1067
- return neoDesign.semanticColors.surfaces.white;
1068
- }
1069
- if (variant === 'success') {
1070
- return neoDesign.semanticColors.status.success.default;
1071
- }
1072
- if (variant === 'error') {
1073
- return neoDesign.semanticColors.status.error.default;
1074
- }
1075
- if (variant === 'warning') {
1076
- return neoDesign.semanticColors.status.warning.default;
1077
- }
1078
- return neoDesign.colors.grey['800'];
1162
+ const NeoBanner = ({ intent = 'info', type = 'outlined', message, messagePosition = 'left', linkText, showClose = false, icon, onClose, onLinkClick, ...props }) => {
1163
+ const [dismissed, setDismissed] = React.useState(false);
1164
+ const handleClose = () => {
1165
+ setDismissed(true);
1166
+ onClose?.();
1079
1167
  };
1080
- return (jsxRuntime.jsx(StyledAlert$2, { ...props, variant: variant, messagePosition: messagePosition, icon: messagePosition === 'left' ? icon || false : false, action: showClose ? (jsxRuntime.jsx(StyledIconButton$1, { size: "small", onClick: onClose, closeIconColor: getCloseIconColor(), children: jsxRuntime.jsx(X, { size: 24 }) })) : undefined, children: messagePosition === 'center' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [icon, jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { variant: variant, onClick: onLinkClick, children: linkText }))] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { variant: variant, onClick: onLinkClick, children: linkText }))] })) }));
1168
+ if (dismissed) {
1169
+ return null;
1170
+ }
1171
+ const closeIconColor = type === 'filled' ? neoDesign.semanticColors.surfaces.white : intentColors[intent].default;
1172
+ return (jsxRuntime.jsx(StyledAlert$1, { ...props, intent: intent, bannerType: type, messagePosition: messagePosition, icon: messagePosition === 'left' ? icon || false : false, action: showClose ? (jsxRuntime.jsx(StyledIconButton$1, { size: "small", onClick: handleClose, closeIconColor: closeIconColor, children: jsxRuntime.jsx(X, { size: 24 }) })) : undefined, children: messagePosition === 'center' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [icon, jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { children: message }), linkText && (jsxRuntime.jsx(LinkText, { bannerType: type, onClick: onLinkClick, children: linkText }))] })) }));
1081
1173
  };
1082
1174
  NeoBanner.displayName = 'NeoBanner';
1083
1175
 
@@ -1529,51 +1621,242 @@ const NeoButtonTabGroup = ({ size = 'medium', exclusive = true, ...props }) => {
1529
1621
  };
1530
1622
  NeoButtonTabGroup.displayName = 'NeoButtonTabGroup';
1531
1623
 
1532
- // Border radius per size (from Figma)
1533
- const borderRadiusConfig = {
1534
- xs: 2,
1535
- small: 3,
1536
- medium: 4,
1537
- };
1538
- // Unchecked: Rounded square outline (20x20 viewBox)
1539
- const UncheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsx(SvgIcon, { viewBox: "0 0 20 20", children: jsxRuntime.jsx("rect", { x: "1", y: "1", width: "18", height: "18", rx: borderRadiusConfig[size], fill: "none", stroke: "currentColor", strokeWidth: "1.5" }) }));
1540
- // Checked: Filled rounded square with white checkmark
1541
- // Path scaled from Untitled UI 24x24 (M20 6L9 17L4 12) to 20x20
1542
- const CheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M15 6L8.5 13L5 9.5", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" })] }));
1543
- // Indeterminate: Filled rounded square with white minus
1544
- // Path scaled from Untitled UI 24x24 (M5 12H19) to 20x20
1545
- const IndeterminateIcon = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M5 10H15", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", fill: "none" })] }));
1546
- const CheckboxContainer = styles.styled('label')(({ disabled }) => ({
1547
- display: 'inline-flex',
1624
+ // ─── Shared ──────────────────────────────────────────────────────────────────
1625
+ const activeShadow = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
1626
+ // ─── Small card styled components ────────────────────────────────────────────
1627
+ const SmallStyledCard = styles.styled(MuiCard, {
1628
+ shouldForwardProp: prop => prop !== 'selected' && prop !== 'disabled',
1629
+ })(({ theme, selected, disabled }) => ({
1630
+ width: 160,
1631
+ height: 160,
1632
+ padding: theme.spacing(1.5), // 12px
1633
+ display: 'flex',
1634
+ flexDirection: 'column',
1635
+ gap: theme.spacing(2), // 16px
1636
+ backgroundColor: neoDesign.semanticColors.surfaces.card,
1637
+ border: `1px solid ${selected ? neoDesign.semanticColors.buttons.primary.default : neoDesign.semanticColors.border.primary}`,
1638
+ borderRadius: neoDesign.borderRadius.xS,
1639
+ boxShadow: selected ? activeShadow : 'none',
1640
+ transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
1641
+ cursor: 'pointer',
1642
+ '&:hover': {
1643
+ borderColor: neoDesign.semanticColors.buttons.primary.default,
1644
+ boxShadow: activeShadow,
1645
+ },
1646
+ '&:focus-visible': {
1647
+ borderColor: neoDesign.semanticColors.buttons.primary.default,
1648
+ ...focusRingStyles,
1649
+ },
1650
+ ...(disabled && {
1651
+ opacity: 0.5,
1652
+ pointerEvents: 'none',
1653
+ cursor: 'not-allowed',
1654
+ }),
1655
+ }));
1656
+ const SmallCardHeader = styles.styled('div')({
1657
+ display: 'flex',
1548
1658
  alignItems: 'flex-start',
1549
- gap: neoDesign.spacing.spacing_1,
1550
- cursor: disabled ? 'not-allowed' : 'pointer',
1551
- userSelect: 'none',
1659
+ justifyContent: 'space-between',
1660
+ width: '100%',
1661
+ });
1662
+ const SmallLogoContainer = styles.styled('div')({
1663
+ width: neoDesign.spacing.spacing_6,
1664
+ height: neoDesign.spacing.spacing_6,
1665
+ flexShrink: 0,
1666
+ });
1667
+ const SmallRecipeCount = styles.styled('p')(({ theme }) => ({
1668
+ margin: 0,
1669
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xxs), // 10px
1670
+ fontWeight: neoDesign.typography.fontWeight.semiBold, // 600
1671
+ lineHeight: 1.2,
1672
+ color: neoDesign.colors.grey[800],
1673
+ whiteSpace: 'nowrap',
1552
1674
  }));
1553
- const LabelContainer$4 = styles.styled('div')(({ size = 'medium' }) => ({
1675
+ const SmallCardContent = styles.styled('div')(({ theme }) => ({
1554
1676
  display: 'flex',
1555
1677
  flexDirection: 'column',
1556
- gap: size === 'medium' ? 2 : 0,
1678
+ gap: theme.spacing(2), // 16px
1679
+ width: '100%',
1557
1680
  }));
1558
- const Label$4 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1559
- fontSize: theme.typography.pxToRem(size === 'xs'
1560
- ? neoDesign.typography.fontSize.xs
1561
- : size === 'small'
1562
- ? neoDesign.typography.fontSize.sm
1563
- : neoDesign.typography.fontSize.default),
1564
- fontWeight: neoDesign.typography.fontWeight.medium,
1565
- lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1566
- color: neoDesign.semanticColors.typography.input.default,
1681
+ const SmallTitle = styles.styled('p')(({ theme }) => ({
1682
+ margin: 0,
1683
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.h6), // 16px
1684
+ fontWeight: neoDesign.typography.fontWeight.semiBold, // 600
1685
+ lineHeight: 1.4,
1686
+ color: neoDesign.colors.grey[800],
1687
+ width: '100%',
1567
1688
  }));
1568
- const HelperText$2 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1569
- fontSize: theme.typography.pxToRem(size === 'xs'
1570
- ? neoDesign.typography.fontSize.xs
1571
- : size === 'small'
1572
- ? neoDesign.typography.fontSize.sm
1573
- : neoDesign.typography.fontSize.default),
1574
- fontWeight: neoDesign.typography.fontWeight.regular,
1575
- lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1576
- color: neoDesign.semanticColors.typography.bodySecondary,
1689
+ const SmallDescription = styles.styled('p')(({ theme }) => ({
1690
+ margin: 0,
1691
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
1692
+ fontWeight: neoDesign.typography.fontWeight.regular, // 400
1693
+ lineHeight: 1.5,
1694
+ color: neoDesign.colors.grey[800],
1695
+ width: '100%',
1696
+ display: '-webkit-box',
1697
+ WebkitLineClamp: 2,
1698
+ WebkitBoxOrient: 'vertical',
1699
+ overflow: 'hidden',
1700
+ textOverflow: 'ellipsis',
1701
+ }));
1702
+ const LargeStyledCard = styles.styled(MuiCard, {
1703
+ shouldForwardProp: prop => prop !== 'disabled' && prop !== 'cardTheme',
1704
+ })(({ disabled = false, cardTheme = 'light' }) => {
1705
+ const isLight = cardTheme === 'light';
1706
+ const activeBorderColor = isLight
1707
+ ? neoDesign.semanticColors.buttons.primary.default
1708
+ : neoDesign.colors.digitalGreen[300];
1709
+ const defaultBorderColor = isLight
1710
+ ? neoDesign.semanticColors.border.primary
1711
+ : `${neoDesign.semanticColors.border.primary}80`;
1712
+ return {
1713
+ width: 340,
1714
+ height: 162,
1715
+ display: 'flex',
1716
+ flexDirection: 'column',
1717
+ justifyContent: 'space-between',
1718
+ alignItems: 'flex-start',
1719
+ padding: neoDesign.spacing.spacing_2,
1720
+ borderRadius: neoDesign.borderRadius.xS,
1721
+ backgroundColor: isLight ? neoDesign.semanticColors.surfaces.card : neoDesign.colors.grey[800],
1722
+ border: `1px solid ${defaultBorderColor}`,
1723
+ boxShadow: 'none',
1724
+ overflow: 'hidden',
1725
+ cursor: 'pointer',
1726
+ transition: 'border-color 0.2s, box-shadow 0.2s',
1727
+ '&:hover': {
1728
+ borderColor: activeBorderColor,
1729
+ boxShadow: activeShadow,
1730
+ },
1731
+ '&:active': {
1732
+ borderColor: activeBorderColor,
1733
+ boxShadow: activeShadow,
1734
+ },
1735
+ '&:focus-visible': {
1736
+ borderColor: activeBorderColor,
1737
+ ...focusRingStyles,
1738
+ },
1739
+ ...(disabled && {
1740
+ opacity: 0.5,
1741
+ pointerEvents: 'none',
1742
+ cursor: 'not-allowed',
1743
+ }),
1744
+ };
1745
+ });
1746
+ const LargeTopSection = styles.styled('div')({
1747
+ display: 'flex',
1748
+ flexDirection: 'column',
1749
+ gap: neoDesign.spacing.spacing_2,
1750
+ alignItems: 'flex-start',
1751
+ width: '100%',
1752
+ flexShrink: 0,
1753
+ });
1754
+ const LargeHeaderRow = styles.styled('div')({
1755
+ display: 'flex',
1756
+ gap: neoDesign.spacing.spacing_1,
1757
+ alignItems: 'center',
1758
+ flexShrink: 0,
1759
+ });
1760
+ const LargeHeaderSlot = styles.styled('div')({
1761
+ display: 'flex',
1762
+ flexDirection: 'column',
1763
+ alignItems: 'center',
1764
+ justifyContent: 'center',
1765
+ width: 20,
1766
+ height: 20,
1767
+ flexShrink: 0,
1768
+ });
1769
+ const LargeHeaderTitle = styles.styled('span', {
1770
+ shouldForwardProp: prop => prop !== 'cardTheme',
1771
+ })(({ cardTheme = 'light' }) => ({
1772
+ fontFamily: `${neoDesign.typography.fontFamily.heading}, sans-serif`,
1773
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
1774
+ fontSize: neoDesign.typography.fontSize.h6,
1775
+ lineHeight: 1.4,
1776
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
1777
+ flexShrink: 0,
1778
+ }));
1779
+ const LargeDescription = styles.styled('p', {
1780
+ shouldForwardProp: prop => prop !== 'cardTheme',
1781
+ })(({ cardTheme = 'light' }) => ({
1782
+ fontFamily: `${neoDesign.typography.fontFamily.body}, sans-serif`,
1783
+ fontWeight: neoDesign.typography.fontWeight.regular,
1784
+ fontSize: neoDesign.typography.fontSize.xs,
1785
+ lineHeight: 1.5,
1786
+ color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
1787
+ margin: 0,
1788
+ minWidth: '100%',
1789
+ wordWrap: 'break-word',
1790
+ }));
1791
+ const LargeButtonsRow = styles.styled('div')({
1792
+ display: 'flex',
1793
+ gap: neoDesign.spacing.spacing_3,
1794
+ alignItems: 'flex-start',
1795
+ flexShrink: 0,
1796
+ });
1797
+ // ─── Internal implementations ────────────────────────────────────────────────
1798
+ const SmallCardImpl = ({ logo, recipeCount, title, description, selected = false, disabled = false, onClick, ...props }) => {
1799
+ return (jsxRuntime.jsxs(SmallStyledCard, { selected: selected, disabled: disabled, onClick: disabled ? undefined : onClick, tabIndex: disabled ? -1 : 0, role: "button", "aria-disabled": disabled, "aria-pressed": selected, ...props, children: [jsxRuntime.jsxs(SmallCardHeader, { children: [jsxRuntime.jsx(SmallLogoContainer, { children: logo }), jsxRuntime.jsx(SmallRecipeCount, { children: recipeCount })] }), jsxRuntime.jsxs(SmallCardContent, { children: [jsxRuntime.jsx(SmallTitle, { children: title }), jsxRuntime.jsx(SmallDescription, { children: description })] })] }));
1800
+ };
1801
+ const LargeCardImpl = ({ disabled = false, cardTheme = 'light', showIcon = true, showGel = true, showButtons = true, icon, gel, title, children, actions, onClick, ...props }) => {
1802
+ return (jsxRuntime.jsxs(LargeStyledCard, { disabled: disabled, cardTheme: cardTheme, onClick: disabled ? undefined : onClick, tabIndex: disabled ? -1 : 0, "aria-disabled": disabled || undefined, ...props, children: [jsxRuntime.jsxs(LargeTopSection, { children: [jsxRuntime.jsxs(LargeHeaderRow, { children: [showIcon && icon && jsxRuntime.jsx(LargeHeaderSlot, { children: icon }), showGel && gel && jsxRuntime.jsx(LargeHeaderSlot, { children: gel }), title && jsxRuntime.jsx(LargeHeaderTitle, { cardTheme: cardTheme, children: title })] }), children && jsxRuntime.jsx(LargeDescription, { cardTheme: cardTheme, children: children })] }), showButtons && actions && jsxRuntime.jsx(LargeButtonsRow, { children: actions })] }));
1803
+ };
1804
+ // ─── Exported component ──────────────────────────────────────────────────────
1805
+ const NeoCard = (props) => {
1806
+ if (props.size === 'small') {
1807
+ const { size: _, ...rest } = props;
1808
+ return jsxRuntime.jsx(SmallCardImpl, { ...rest });
1809
+ }
1810
+ const { size: _, ...rest } = props;
1811
+ return jsxRuntime.jsx(LargeCardImpl, { ...rest });
1812
+ };
1813
+ NeoCard.displayName = 'NeoCard';
1814
+
1815
+ // Border radius per size (from Figma)
1816
+ const borderRadiusConfig = {
1817
+ xs: 2,
1818
+ small: 3,
1819
+ medium: 4,
1820
+ };
1821
+ // Unchecked: Rounded square outline (20x20 viewBox)
1822
+ const UncheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsx(SvgIcon, { viewBox: "0 0 20 20", children: jsxRuntime.jsx("rect", { x: "1", y: "1", width: "18", height: "18", rx: borderRadiusConfig[size], fill: "none", stroke: "currentColor", strokeWidth: "1.5" }) }));
1823
+ // Checked: Filled rounded square with white checkmark
1824
+ // Path scaled from Untitled UI 24x24 (M20 6L9 17L4 12) to 20x20
1825
+ const CheckedIcon$1 = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M15 6L8.5 13L5 9.5", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" })] }));
1826
+ // Indeterminate: Filled rounded square with white minus
1827
+ // Path scaled from Untitled UI 24x24 (M5 12H19) to 20x20
1828
+ const IndeterminateIcon = ({ size = 'medium' }) => (jsxRuntime.jsxs(SvgIcon, { viewBox: "0 0 20 20", children: [jsxRuntime.jsx("rect", { width: "20", height: "20", rx: borderRadiusConfig[size], fill: "currentColor" }), jsxRuntime.jsx("path", { d: "M5 10H15", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", fill: "none" })] }));
1829
+ const CheckboxContainer = styles.styled('label')(({ disabled }) => ({
1830
+ display: 'inline-flex',
1831
+ alignItems: 'flex-start',
1832
+ gap: neoDesign.spacing.spacing_1,
1833
+ cursor: disabled ? 'not-allowed' : 'pointer',
1834
+ userSelect: 'none',
1835
+ }));
1836
+ const LabelContainer$4 = styles.styled('div')(({ size = 'medium' }) => ({
1837
+ display: 'flex',
1838
+ flexDirection: 'column',
1839
+ gap: size === 'medium' ? 2 : 0,
1840
+ }));
1841
+ const Label$4 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1842
+ fontSize: theme.typography.pxToRem(size === 'xs'
1843
+ ? neoDesign.typography.fontSize.xs
1844
+ : size === 'small'
1845
+ ? neoDesign.typography.fontSize.sm
1846
+ : neoDesign.typography.fontSize.default),
1847
+ fontWeight: neoDesign.typography.fontWeight.medium,
1848
+ lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1849
+ color: neoDesign.semanticColors.typography.input.default,
1850
+ }));
1851
+ const HelperText$2 = styles.styled('span')(({ theme, size = 'medium' }) => ({
1852
+ fontSize: theme.typography.pxToRem(size === 'xs'
1853
+ ? neoDesign.typography.fontSize.xs
1854
+ : size === 'small'
1855
+ ? neoDesign.typography.fontSize.sm
1856
+ : neoDesign.typography.fontSize.default),
1857
+ fontWeight: neoDesign.typography.fontWeight.regular,
1858
+ lineHeight: size === 'xs' ? 1.5 : size === 'small' ? 1.4 : 1.5,
1859
+ color: neoDesign.semanticColors.typography.bodySecondary,
1577
1860
  }));
1578
1861
  // Figma-exact border radius for xs checkbox — no matching design token
1579
1862
  const FIGMA_XS_BORDER_RADIUS = 1;
@@ -1602,6 +1885,7 @@ const StyledCheckbox = styles.styled(Checkbox, {
1602
1885
  padding: 0,
1603
1886
  marginTop: size === 'xs' ? 3 : 2,
1604
1887
  color: neoDesign.semanticColors.border.primary,
1888
+ borderRadius: config.borderRadius,
1605
1889
  flexShrink: 0,
1606
1890
  // Root element
1607
1891
  [`&.${Checkbox.checkboxClasses.root}`]: {
@@ -1652,7 +1936,7 @@ const StyledCheckbox = styles.styled(Checkbox, {
1652
1936
  /**
1653
1937
  * NeoCheckbox - Checkbox component based on MUI Checkbox
1654
1938
  *
1655
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4122-39311
1939
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=11487-81
1656
1940
  *
1657
1941
  * Figma Props Mapping:
1658
1942
  * - Checked (True|False) → checked prop
@@ -1808,9 +2092,9 @@ const IconWrapper$2 = styles.styled('span')(({ theme, isMultiline }) => ({
1808
2092
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4187-30353
1809
2093
  *
1810
2094
  * Figma Props Mapping:
1811
- * - Color (Light|Dark) → variant (outlined|filled)
1812
- * - size (Single line|multiline|inline) → size prop + auto-detected multiline
1813
- * - Copy button → endIcon (ReactNode)
2095
+ * - Theme (Dark|Light) → variant (filled|outlined)
2096
+ * - Content (Multi|Inline) → size prop + auto-detected multiline
2097
+ * - Show icon → endIcon (ReactNode, unmappable: boolean vs ReactNode)
1814
2098
  * - Text content → children prop
1815
2099
  */
1816
2100
  const NeoCodeSnippet = ({ variant = 'outlined', size = 'small', endIcon, children, ...props }) => {
@@ -2678,9 +2962,9 @@ const StyledChip$1 = styles.styled(Chip)(({ theme, size, variant, color }) => ({
2678
2962
  * - state (Neutral|Error|Warning|Success|Info|Violet|Beta) → color (default|error|warning|success|info|violet|beta)
2679
2963
  * - Label text → label prop
2680
2964
  */
2681
- const NeoTag = ({ size = 'small', variant = 'outlined', ...props }) => {
2965
+ function NeoTag({ size = 'small', variant = 'outlined', ...props }) {
2682
2966
  return jsxRuntime.jsx(StyledChip$1, { size: size, variant: variant, ...props });
2683
- };
2967
+ }
2684
2968
  NeoTag.displayName = 'NeoTag';
2685
2969
 
2686
2970
  /**
@@ -3640,6 +3924,84 @@ const NeoDot = ({ size = 'medium', variant = 'solid', color = 'neutral', ...prop
3640
3924
  };
3641
3925
  NeoDot.displayName = 'NeoDot';
3642
3926
 
3927
+ const StyledRoot$1 = styles.styled(Paper)({
3928
+ padding: neoDesign.spacing.spacing_2,
3929
+ borderRadius: neoDesign.borderRadius.s,
3930
+ backgroundColor: neoDesign.semanticColors.surfaces.snackbarDarkMode,
3931
+ color: neoDesign.colors.grey['800'],
3932
+ border: `1px solid ${neoDesign.semanticColors.border.primary}`,
3933
+ display: 'flex',
3934
+ flexDirection: 'column',
3935
+ gap: neoDesign.spacing.spacing_3,
3936
+ });
3937
+ const Title = styles.styled('p')(({ theme }) => ({
3938
+ margin: 0,
3939
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
3940
+ fontWeight: neoDesign.typography.fontWeight.semiBold,
3941
+ lineHeight: 1.4,
3942
+ color: neoDesign.colors.grey['700'],
3943
+ }));
3944
+ const FileName = styles.styled('p')(({ theme }) => ({
3945
+ margin: 0,
3946
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
3947
+ fontWeight: neoDesign.typography.fontWeight.medium,
3948
+ lineHeight: 1.5,
3949
+ color: neoDesign.colors.grey['800'],
3950
+ overflow: 'hidden',
3951
+ textOverflow: 'ellipsis',
3952
+ whiteSpace: 'nowrap',
3953
+ minWidth: 0,
3954
+ }));
3955
+ const ProgressLabel$1 = styles.styled('p')(({ theme }) => ({
3956
+ margin: 0,
3957
+ fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
3958
+ fontWeight: neoDesign.typography.fontWeight.medium,
3959
+ lineHeight: 1.5,
3960
+ color: neoDesign.colors.grey['800'],
3961
+ flexShrink: 0,
3962
+ }));
3963
+ const StyledLinearProgress$1 = styles.styled(LinearProgress)({
3964
+ width: '100%',
3965
+ height: neoDesign.spacing.spacing_1,
3966
+ borderRadius: neoDesign.borderRadius.s,
3967
+ backgroundColor: neoDesign.colors.grey['200'],
3968
+ [`& .${LinearProgress.linearProgressClasses.bar}`]: {
3969
+ backgroundColor: neoDesign.semanticColors.buttons.primary.default,
3970
+ borderRadius: `${neoDesign.borderRadius.xS}px 0 0 ${neoDesign.borderRadius.xS}px`,
3971
+ },
3972
+ });
3973
+ const ActionButton = styles.styled(IconButton)({
3974
+ padding: 0,
3975
+ width: neoDesign.spacing.spacing_2,
3976
+ height: neoDesign.spacing.spacing_2,
3977
+ color: neoDesign.colors.grey['500'],
3978
+ '&:hover': {
3979
+ backgroundColor: 'transparent',
3980
+ },
3981
+ });
3982
+ /**
3983
+ * NeoDownloadToast - Standalone download progress toast notification
3984
+ *
3985
+ * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=3377-26954
3986
+ */
3987
+ const NeoDownloadToast = ({ title, fileName, progress, showClose = true, showPause = true, onClose, onPause, actions, ...props }) => {
3988
+ const renderActions = () => {
3989
+ if (actions)
3990
+ return actions;
3991
+ const hasActions = showPause || showClose;
3992
+ if (!hasActions)
3993
+ return null;
3994
+ return (jsxRuntime.jsxs(Stack, { direction: "row", gap: `${neoDesign.spacing.spacing_2}px`, sx: { alignItems: 'center' }, children: [showPause && (jsxRuntime.jsx(ActionButton, { size: "small", onClick: onPause, "aria-label": "Pause download", children: jsxRuntime.jsx(Minus, { size: neoDesign.spacing.spacing_2 }) })), showClose && (jsxRuntime.jsx(ActionButton, { size: "small", onClick: onClose, "aria-label": "Close", children: jsxRuntime.jsx(X, { size: neoDesign.spacing.spacing_2 }) }))] }));
3995
+ };
3996
+ return (jsxRuntime.jsxs(StyledRoot$1, { elevation: 0, role: "status", ...props, children: [jsxRuntime.jsxs(Stack, { direction: "row", sx: {
3997
+ alignItems: 'flex-start',
3998
+ justifyContent: 'space-between',
3999
+ width: '100%',
4000
+ gap: `${neoDesign.spacing.spacing_4}px`,
4001
+ }, children: [title && jsxRuntime.jsx(Title, { children: title }), renderActions()] }), jsxRuntime.jsxs(Stack, { gap: `${neoDesign.spacing.spacing_1}px`, sx: { width: '100%' }, children: [jsxRuntime.jsxs(Stack, { direction: "row", gap: `${neoDesign.spacing.spacing_2}px`, sx: { alignItems: 'flex-end', justifyContent: 'space-between', width: '100%' }, children: [fileName && jsxRuntime.jsx(FileName, { children: fileName }), progress !== undefined && jsxRuntime.jsxs(ProgressLabel$1, { children: [progress, "%"] })] }), jsxRuntime.jsx(StyledLinearProgress$1, { variant: "determinate", value: progress ?? 0 })] })] }));
4002
+ };
4003
+ NeoDownloadToast.displayName = 'NeoDownloadToast';
4004
+
3643
4005
  const StyledMenu = styles.styled(Menu)(({ theme }) => ({
3644
4006
  [`& .${Paper.paperClasses.root}`]: {
3645
4007
  backgroundColor: neoDesign.semanticColors.surfaces.white,
@@ -3824,11 +4186,11 @@ const StyledFooter = styles.styled(Box, {
3824
4186
  '&::before': {
3825
4187
  content: showShadow ? '""' : 'none',
3826
4188
  position: 'absolute',
3827
- top: `-${neoDesign.shadows.neutralRegular.blur}px`, // -4px
4189
+ top: `-${neoDesign.shadows.neutral.regular.blur}px`, // -4px
3828
4190
  left: 0,
3829
4191
  right: 0,
3830
- height: `${neoDesign.shadows.neutralRegular.blur}px`, // 4px
3831
- background: `linear-gradient(to top, ${neoDesign.shadows.neutralRegular.shadow}, transparent)`, // rgba(31, 41, 55, 0.1)
4192
+ height: `${neoDesign.shadows.neutral.regular.blur}px`, // 4px
4193
+ background: `linear-gradient(to top, ${neoDesign.shadows.neutral.regular.shadow}, transparent)`, // rgba(31, 41, 55, 0.1)
3832
4194
  pointerEvents: 'none',
3833
4195
  },
3834
4196
  [theme.breakpoints.down('sm')]: {
@@ -4247,7 +4609,7 @@ const InfoIconWrapper = styles.styled('span')({
4247
4609
  });
4248
4610
  const StyledInputBase = styles.styled(InputBase, {
4249
4611
  shouldForwardProp: prop => prop !== 'size' && prop !== 'destructive',
4250
- })(({ theme, size = 'medium', destructive, startAdornment }) => {
4612
+ })(({ theme, size = 'medium', destructive, startAdornment, multiline }) => {
4251
4613
  const sizeConfig = {
4252
4614
  small: {
4253
4615
  height: neoDesign.spacing.spacing_5,
@@ -4264,7 +4626,7 @@ const StyledInputBase = styles.styled(InputBase, {
4264
4626
  };
4265
4627
  const sizeStyles = sizeConfig[size];
4266
4628
  return {
4267
- height: sizeStyles.height,
4629
+ height: multiline ? 'auto' : sizeStyles.height,
4268
4630
  fontSize: sizeStyles.fontSize,
4269
4631
  borderRadius: sizeStyles.borderRadius,
4270
4632
  backgroundColor: neoDesign.semanticColors.input.background,
@@ -4734,271 +5096,36 @@ const NeoListItemButton = ({ children, selected = false, disabled = false, ...pr
4734
5096
  NeoListItemButton.displayName = 'NeoListItemButton';
4735
5097
 
4736
5098
  /**
4737
- * Card box-shadow using Neo design tokens for hover and selected states
4738
- */
4739
- const activeShadow$1 = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
4740
- /**
4741
- * Styled Card component with Neo design tokens
4742
- */
4743
- const StyledCard = styles.styled(MuiCard, {
4744
- shouldForwardProp: prop => prop !== 'selected' && prop !== 'disabled',
4745
- })(({ theme, selected, disabled }) => ({
4746
- width: 160,
4747
- height: 160,
4748
- padding: theme.spacing(1.5), // 12px
4749
- display: 'flex',
4750
- flexDirection: 'column',
4751
- gap: theme.spacing(2), // 16px
4752
- backgroundColor: neoDesign.semanticColors.surfaces.card,
4753
- border: `1px solid ${selected ? neoDesign.semanticColors.buttons.primary.default : neoDesign.semanticColors.border.primary}`,
4754
- borderRadius: neoDesign.borderRadius.xS,
4755
- boxShadow: selected ? activeShadow$1 : 'none',
4756
- transition: theme.transitions.create(['border-color', 'background-color', 'box-shadow']),
4757
- cursor: 'pointer',
4758
- '&:hover': {
4759
- borderColor: neoDesign.semanticColors.buttons.primary.default,
4760
- boxShadow: activeShadow$1,
4761
- },
4762
- '&:focus-visible': {
4763
- borderColor: neoDesign.semanticColors.buttons.primary.default,
4764
- ...focusRingStyles,
4765
- },
4766
- ...(disabled && {
4767
- opacity: 0.5,
4768
- pointerEvents: 'none',
4769
- cursor: 'not-allowed',
4770
- }),
4771
- }));
4772
- /**
4773
- * Header section containing logo and recipe count
4774
- */
4775
- const CardHeader = styles.styled('div')({
4776
- display: 'flex',
4777
- alignItems: 'flex-start',
4778
- justifyContent: 'space-between',
4779
- width: '100%',
4780
- });
4781
- /**
4782
- * Logo container
4783
- */
4784
- const LogoContainer = styles.styled('div')({
4785
- width: neoDesign.spacing.spacing_6,
4786
- height: neoDesign.spacing.spacing_6,
4787
- flexShrink: 0,
4788
- });
4789
- /**
4790
- * Recipe count badge
4791
- */
4792
- const RecipeCount = styles.styled('p')(({ theme }) => ({
4793
- margin: 0,
4794
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xxs), // 10px
4795
- fontWeight: neoDesign.typography.fontWeight.semiBold, // 600
4796
- lineHeight: 1.2,
4797
- color: neoDesign.colors.grey[800],
4798
- whiteSpace: 'nowrap',
4799
- }));
4800
- /**
4801
- * Content section containing title and description
4802
- */
4803
- const CardContent = styles.styled('div')(({ theme }) => ({
4804
- display: 'flex',
4805
- flexDirection: 'column',
4806
- gap: theme.spacing(2), // 16px
4807
- width: '100%',
4808
- }));
4809
- /**
4810
- * Title text
4811
- */
4812
- const Title = styles.styled('p')(({ theme }) => ({
4813
- margin: 0,
4814
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.h6), // 16px
4815
- fontWeight: neoDesign.typography.fontWeight.semiBold, // 600
4816
- lineHeight: 1.4,
4817
- color: neoDesign.colors.grey[800],
4818
- width: '100%',
4819
- }));
4820
- /**
4821
- * Description text
4822
- */
4823
- const Description$1 = styles.styled('p')(({ theme }) => ({
4824
- margin: 0,
4825
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs), // 12px
4826
- fontWeight: neoDesign.typography.fontWeight.regular, // 400
4827
- lineHeight: 1.5,
4828
- color: neoDesign.colors.grey[800],
4829
- width: '100%',
4830
- display: '-webkit-box',
4831
- WebkitLineClamp: 2,
4832
- WebkitBoxOrient: 'vertical',
4833
- overflow: 'hidden',
4834
- textOverflow: 'ellipsis',
4835
- }));
4836
- /**
4837
- * NeoMarketplaceCard - Selectable card component for marketplace items
4838
- *
4839
- * A fixed-size card (160x160px) displaying a logo, recipe count, title, and description.
4840
- * Supports selected (active), disabled, and focused states.
5099
+ * @deprecated Use `NeoCard` with `size="small"` instead.
4841
5100
  *
4842
5101
  * @example
4843
5102
  * ```tsx
4844
- * <NeoMarketplaceCard
4845
- * logo={<JavaLogo />}
4846
- * recipeCount="1,260 recipes"
4847
- * title="Java"
4848
- * description="Basic building blocks for transforming Java..."
4849
- * selected={false}
4850
- * disabled={false}
4851
- * onClick={() => console.log('clicked')}
4852
- * />
4853
- * ```
5103
+ * // Before
5104
+ * <NeoMarketplaceCard logo={...} title="Java" ... />
4854
5105
  *
4855
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4286-1635&t=Bo58EpFmg6ILJtmv-11
4856
- *
4857
- * Figma Props Mapping:
4858
- * - State="Active" → selected={true}
4859
- * - State="Disabled" disabled={true}
4860
- * - State="Focused" CSS :focus-visible state (not a prop)
4861
- * - State="Hover" → CSS :hover state (not a prop)
4862
- * - State="Default" → Base state (no props)
4863
- *
4864
- * Design Tokens Used:
4865
- * - semanticColors.surfaces.card (#FFFFFF) - Default card background
4866
- * - semanticColors.status.info.light (#f2f3ff) - Active/focused card background
4867
- * - semanticColors.border.primary (#d1d5db) - Default border
4868
- * - semanticColors.buttons.primary.default (#2f42ff) - Active/focused border
4869
- * - shadows.focusWhite1 - Inner white focus ring (2px spread)
4870
- * - shadows.focusBlue2 - Outer blue focus ring (4px spread)
4871
- * - colors.grey[800] (#1F2937) - Text color
4872
- * - typography.fontSize.xxs (10px) - Recipe count
4873
- * - typography.fontSize.xs (12px) - Description
4874
- * - typography.fontSize.h6 (16px) - Title
4875
- * - typography.fontWeight.semiBold (600) - Title and recipe count
4876
- * - typography.fontWeight.regular (400) - Description
4877
- */
4878
- const NeoMarketplaceCard = ({ logo, recipeCount, title, description, selected = false, disabled = false, onClick, ...props }) => {
4879
- return (jsxRuntime.jsxs(StyledCard, { selected: selected, disabled: disabled, onClick: disabled ? undefined : onClick, tabIndex: disabled ? -1 : 0, role: "button", "aria-disabled": disabled, "aria-pressed": selected, ...props, children: [jsxRuntime.jsxs(CardHeader, { children: [jsxRuntime.jsx(LogoContainer, { children: logo }), jsxRuntime.jsx(RecipeCount, { children: recipeCount })] }), jsxRuntime.jsxs(CardContent, { children: [jsxRuntime.jsx(Title, { children: title }), jsxRuntime.jsx(Description$1, { children: description })] })] }));
5106
+ * // After
5107
+ * <NeoCard size="small" logo={...} title="Java" ... />
5108
+ * ```
5109
+ */
5110
+ const NeoMarketplaceCard = (props) => {
5111
+ return jsxRuntime.jsx(NeoCard, { size: "small", ...props });
4880
5112
  };
4881
5113
  NeoMarketplaceCard.displayName = 'NeoMarketplaceCard';
4882
5114
 
4883
- const activeShadow = `${neoDesign.shadows.card.x}px ${neoDesign.shadows.card.y}px ${neoDesign.shadows.card.blur}px ${neoDesign.shadows.card.spread}px ${neoDesign.shadows.card.shadow}`;
4884
- const StyledLargeCard = styles.styled(MuiCard, {
4885
- shouldForwardProp: prop => prop !== 'cardState' && prop !== 'cardTheme',
4886
- })(({ cardState = 'default', cardTheme = 'light' }) => {
4887
- const isLight = cardTheme === 'light';
4888
- const isActive = cardState === 'active';
4889
- const isDisabled = cardState === 'disabled';
4890
- const isFocused = cardState === 'focused';
4891
- const activeBorderColor = isLight
4892
- ? neoDesign.semanticColors.buttons.primary.default
4893
- : neoDesign.colors.digitalGreen[300];
4894
- const defaultBorderColor = isLight
4895
- ? neoDesign.semanticColors.border.primary
4896
- : `${neoDesign.semanticColors.border.primary}80`;
4897
- return {
4898
- width: 340,
4899
- height: 162,
4900
- display: 'flex',
4901
- flexDirection: 'column',
4902
- justifyContent: 'space-between',
4903
- alignItems: 'flex-start',
4904
- padding: neoDesign.spacing.spacing_2,
4905
- borderRadius: neoDesign.borderRadius.xS,
4906
- backgroundColor: isLight ? neoDesign.semanticColors.surfaces.card : neoDesign.colors.grey[800],
4907
- border: `1px solid ${isActive || isFocused ? activeBorderColor : defaultBorderColor}`,
4908
- boxShadow: isActive ? activeShadow : 'none',
4909
- overflow: 'hidden',
4910
- ...(isFocused && focusRingStyles),
4911
- '&:focus-visible': {
4912
- borderColor: isLight ? neoDesign.semanticColors.buttons.primary.default : neoDesign.colors.digitalGreen[300],
4913
- ...focusRingStyles,
4914
- },
4915
- ...(isDisabled && {
4916
- opacity: 0.5,
4917
- pointerEvents: 'none',
4918
- cursor: 'not-allowed',
4919
- }),
4920
- };
4921
- });
4922
- const TopSection = styles.styled('div')({
4923
- display: 'flex',
4924
- flexDirection: 'column',
4925
- gap: neoDesign.spacing.spacing_2,
4926
- alignItems: 'flex-start',
4927
- width: '100%',
4928
- flexShrink: 0,
4929
- });
4930
- const HeaderRow = styles.styled('div')({
4931
- display: 'flex',
4932
- gap: neoDesign.spacing.spacing_1,
4933
- alignItems: 'center',
4934
- flexShrink: 0,
4935
- });
4936
- const HeaderSlot = styles.styled('div')({
4937
- display: 'flex',
4938
- flexDirection: 'column',
4939
- alignItems: 'center',
4940
- justifyContent: 'center',
4941
- width: 20,
4942
- height: 20,
4943
- flexShrink: 0,
4944
- });
4945
- const HeaderTitle = styles.styled('span', {
4946
- shouldForwardProp: prop => prop !== 'cardTheme',
4947
- })(({ cardTheme = 'light' }) => ({
4948
- fontFamily: `${neoDesign.typography.fontFamily.heading}, sans-serif`,
4949
- fontWeight: neoDesign.typography.fontWeight.semiBold,
4950
- fontSize: neoDesign.typography.fontSize.h6,
4951
- lineHeight: 1.4,
4952
- color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4953
- flexShrink: 0,
4954
- }));
4955
- const Description = styles.styled('p', {
4956
- shouldForwardProp: prop => prop !== 'cardTheme',
4957
- })(({ cardTheme = 'light' }) => ({
4958
- fontFamily: `${neoDesign.typography.fontFamily.body}, sans-serif`,
4959
- fontWeight: neoDesign.typography.fontWeight.regular,
4960
- fontSize: neoDesign.typography.fontSize.xs,
4961
- lineHeight: 1.5,
4962
- color: cardTheme === 'light' ? neoDesign.colors.grey[800] : neoDesign.semanticColors.surfaces.white,
4963
- margin: 0,
4964
- minWidth: '100%',
4965
- wordWrap: 'break-word',
4966
- }));
4967
- const ButtonsRow = styles.styled('div')({
4968
- display: 'flex',
4969
- gap: neoDesign.spacing.spacing_3,
4970
- alignItems: 'flex-start',
4971
- flexShrink: 0,
4972
- });
4973
5115
  /**
4974
- * NeoMarketplaceLargeCard - A large marketplace card with state and theme variants
4975
- *
4976
- * A 340x162px card with optional icon, gel brand icon, title, description, and action buttons.
4977
- * Icon, gel, and title display inline in a header row.
4978
- * Supports 4 states (default, active, disabled, focused) and 2 themes (light, dark).
4979
- *
4980
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC?node-id=5925-11
5116
+ * @deprecated Use `NeoCard` with `size="large"` instead.
4981
5117
  *
4982
- * Figma Props Mapping:
4983
- * - State → state (Default/Active/Disabled/Focused)
4984
- * - Theme → cardTheme (Dark/Light)
4985
- * - Show Icon → showIcon
4986
- * - Show Gel → showGel
4987
- * - Show Buttons → showButtons
5118
+ * @example
5119
+ * ```tsx
5120
+ * // Before
5121
+ * <NeoMarketplaceLargeCard cardTheme="light" ... />
4988
5122
  *
4989
- * Design Tokens Used:
4990
- * - semanticColors.surfaces.card (#ffffff) - Light theme background
4991
- * - colors.grey[800] (#1f2937) - Dark theme background
4992
- * - semanticColors.border.primary (#d1d5db) - Default border (50% opacity on dark)
4993
- * - semanticColors.buttons.primary.default (#2f42ff) - Active/focused border (light theme)
4994
- * - colors.digitalGreen[300] (#88fe9b) - Active/focused border (dark theme)
4995
- * - borderRadius.xS (4px) - Corner radius
4996
- * - shadows.focusWhite1 + shadows.focusBlue2 - Focus ring
4997
- * - shadows.card - Active state shadow
4998
- */
4999
- const NeoMarketplaceLargeCard = ({ state = 'default', cardTheme = 'light', showIcon = true, showGel = true, showButtons = true, icon, gel, title, children, actions, onClick, ...props }) => {
5000
- const isDisabled = state === 'disabled';
5001
- return (jsxRuntime.jsxs(StyledLargeCard, { cardState: state, cardTheme: cardTheme, onClick: isDisabled ? undefined : onClick, tabIndex: isDisabled ? -1 : 0, "aria-disabled": isDisabled || undefined, ...props, children: [jsxRuntime.jsxs(TopSection, { children: [jsxRuntime.jsxs(HeaderRow, { children: [showIcon && icon && jsxRuntime.jsx(HeaderSlot, { children: icon }), showGel && gel && jsxRuntime.jsx(HeaderSlot, { children: gel }), title && jsxRuntime.jsx(HeaderTitle, { cardTheme: cardTheme, children: title })] }), children && jsxRuntime.jsx(Description, { cardTheme: cardTheme, children: children })] }), showButtons && actions && jsxRuntime.jsx(ButtonsRow, { children: actions })] }));
5123
+ * // After
5124
+ * <NeoCard size="large" cardTheme="light" ... />
5125
+ * ```
5126
+ */
5127
+ const NeoMarketplaceLargeCard = (props) => {
5128
+ return jsxRuntime.jsx(NeoCard, { size: "large", ...props });
5002
5129
  };
5003
5130
  NeoMarketplaceLargeCard.displayName = 'NeoMarketplaceLargeCard';
5004
5131
 
@@ -5225,15 +5352,14 @@ const StyledRoot = styles.styled(ButtonBase, {
5225
5352
  })(({ selected }) => ({
5226
5353
  display: 'flex',
5227
5354
  flexDirection: 'column',
5228
- gap: neoDesign.spacing.spacing_1_4, // 2px
5355
+ gap: neoDesign.spacing.spacing_1_2, // 4px
5229
5356
  alignItems: 'center',
5230
5357
  justifyContent: 'center',
5231
5358
  paddingTop: neoDesign.spacing.spacing_1, // 8px
5232
5359
  paddingBottom: neoDesign.spacing.spacing_1, // 8px
5233
5360
  paddingLeft: neoDesign.spacing.spacing_1_2, // 4px
5234
5361
  paddingRight: neoDesign.spacing.spacing_1_2, // 4px
5235
- borderRadius: neoDesign.borderRadius.xS, // 4px
5236
- width: 95,
5362
+ borderRadius: neoDesign.borderRadius.s, // 8px
5237
5363
  cursor: 'pointer',
5238
5364
  textDecoration: 'none',
5239
5365
  '&:hover .neo-nav-icon-padding': {
@@ -5279,7 +5405,7 @@ const IconPadding = styles.styled('span')({
5279
5405
  display: 'flex',
5280
5406
  alignItems: 'center',
5281
5407
  padding: neoDesign.spacing.spacing_1, // 8px
5282
- borderRadius: neoDesign.spacing.spacing_1, // 8px
5408
+ borderRadius: neoDesign.borderRadius.s, // 8px
5283
5409
  border: '1px solid transparent',
5284
5410
  transition: 'background-color 150ms, border-color 150ms',
5285
5411
  });
@@ -5313,9 +5439,9 @@ const TagPill = styles.styled('span')(({ theme }) => ({
5313
5439
  *
5314
5440
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=8455-6120
5315
5441
  */
5316
- const NeoNavigationItem = ({ icon, label, selected = false, tag, children, ...props }) => {
5442
+ function NeoNavigationItem({ icon, label, selected = false, tag, children, ...props }) {
5317
5443
  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] }));
5318
- };
5444
+ }
5319
5445
  NeoNavigationItem.displayName = 'NeoNavigationItem';
5320
5446
 
5321
5447
  /**
@@ -5539,7 +5665,7 @@ function NeoPaginatedGrid({ slots, pageSizeOptions, slotProps: userSlotProps, ..
5539
5665
  }
5540
5666
  NeoPaginatedGrid.displayName = 'NeoPaginatedGrid';
5541
5667
 
5542
- const StyledLinearProgress$1 = styles.styled(LinearProgress, {
5668
+ const StyledLinearProgress = styles.styled(LinearProgress, {
5543
5669
  shouldForwardProp: prop => prop !== 'labelPosition',
5544
5670
  })(() => ({
5545
5671
  height: 8,
@@ -5584,7 +5710,7 @@ const ProgressWrapper = styles.styled('div')(({ labelPosition }) => ({
5584
5710
  flexDirection: 'row',
5585
5711
  }),
5586
5712
  }));
5587
- const ProgressLabel$1 = styles.styled(Typography)(({ theme }) => ({
5713
+ const ProgressLabel = styles.styled(Typography)(({ theme }) => ({
5588
5714
  fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
5589
5715
  fontWeight: neoDesign.typography.fontWeight.medium,
5590
5716
  color: neoDesign.colors.grey[800],
@@ -5613,7 +5739,7 @@ const ProgressBarContainer = styles.styled('div')(({ labelPosition }) => ({
5613
5739
  const NeoProgressbar = ({ value = 0, labelPosition = 'none', variant = 'default', labelText, ...props }) => {
5614
5740
  const showLabel = labelPosition !== 'none';
5615
5741
  const displayLabel = labelText || (variant === 'cancelled' ? 'Canceled' : `${Math.round(value)}%`);
5616
- return (jsxRuntime.jsxs(ProgressWrapper, { labelPosition: labelPosition, children: [jsxRuntime.jsx(ProgressBarContainer, { labelPosition: labelPosition, children: jsxRuntime.jsx(StyledLinearProgress$1, { variant: "determinate", value: variant === 'cancelled' ? 100 : value, "data-variant": variant, labelPosition: labelPosition, ...props }) }), showLabel && jsxRuntime.jsx(ProgressLabel$1, { children: displayLabel })] }));
5742
+ return (jsxRuntime.jsxs(ProgressWrapper, { labelPosition: labelPosition, children: [jsxRuntime.jsx(ProgressBarContainer, { labelPosition: labelPosition, children: jsxRuntime.jsx(StyledLinearProgress, { variant: "determinate", value: variant === 'cancelled' ? 100 : value, "data-variant": variant, labelPosition: labelPosition, ...props }) }), showLabel && jsxRuntime.jsx(ProgressLabel, { children: displayLabel })] }));
5617
5743
  };
5618
5744
  NeoProgressbar.displayName = 'NeoProgressbar';
5619
5745
 
@@ -5715,17 +5841,19 @@ const NeoQuickFilter = ({ placeholder = 'Search...', onKeyDown, autoFocus = fals
5715
5841
  NeoQuickFilter.displayName = 'NeoQuickFilter';
5716
5842
 
5717
5843
  // Custom radio icons to match Figma design
5718
- const UncheckedIcon = ({ size }) => {
5844
+ const UncheckedIcon = ({ size, disabled }) => {
5719
5845
  const dimensions = size === 'small' ? 16 : 20;
5720
5846
  const radius = size === 'small' ? 8 : 10;
5721
- return (jsxRuntime.jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsxRuntime.jsx("title", { children: "Unchecked radio button" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, stroke: neoDesign.semanticColors.border.primary, strokeWidth: "1", fill: "transparent" })] }));
5847
+ return (jsxRuntime.jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsxRuntime.jsx("title", { children: "Unchecked radio button" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, stroke: neoDesign.semanticColors.border.primary, strokeWidth: "1", fill: disabled ? neoDesign.semanticColors.buttons.primary.disabled : 'transparent' })] }));
5722
5848
  };
5723
- const CheckedIcon = ({ size }) => {
5849
+ const CheckedIcon = ({ size, disabled }) => {
5724
5850
  const dimensions = size === 'small' ? 16 : 20;
5725
5851
  const radius = size === 'small' ? 8 : 10;
5726
5852
  const inset = size === 'small' ? 0.3125 : 0.3; // 31.25% or 30%
5727
5853
  const innerRadius = radius * (1 - 2 * inset);
5728
- return (jsxRuntime.jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsxRuntime.jsx("title", { children: "Checked radio button" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, fill: neoDesign.semanticColors.buttons.primary.default, stroke: neoDesign.semanticColors.buttons.primary.default, strokeWidth: "1" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: innerRadius, fill: neoDesign.semanticColors.surfaces.white })] }));
5854
+ return (jsxRuntime.jsxs("svg", { width: dimensions, height: dimensions, viewBox: `0 0 ${dimensions} ${dimensions}`, fill: "none", "aria-hidden": "true", children: [jsxRuntime.jsx("title", { children: "Checked radio button" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: radius - 0.5, fill: disabled
5855
+ ? neoDesign.semanticColors.buttons.primary.disabled
5856
+ : neoDesign.semanticColors.buttons.primary.default, stroke: disabled ? neoDesign.semanticColors.border.primary : neoDesign.semanticColors.buttons.primary.default, strokeWidth: "1" }), jsxRuntime.jsx("circle", { cx: dimensions / 2, cy: dimensions / 2, r: innerRadius, fill: disabled ? neoDesign.semanticColors.icons.disabled : neoDesign.semanticColors.surfaces.white })] }));
5729
5857
  };
5730
5858
  const RadioContainer = styles.styled('label')(({ disabled }) => ({
5731
5859
  display: 'inline-flex',
@@ -5770,6 +5898,10 @@ const StyledRadio = styles.styled(Radio, {
5770
5898
  height: dimensions,
5771
5899
  flexShrink: 0,
5772
5900
  borderRadius: radius,
5901
+ color: neoDesign.semanticColors.border.primary,
5902
+ [`&.${Radio.radioClasses.checked}`]: {
5903
+ color: neoDesign.semanticColors.buttons.primary.default,
5904
+ },
5773
5905
  '&:hover': {
5774
5906
  backgroundColor: 'transparent',
5775
5907
  },
@@ -5787,9 +5919,12 @@ const StyledRadio = styles.styled(Radio, {
5787
5919
  backgroundColor: 'transparent',
5788
5920
  },
5789
5921
  },
5790
- // Disabled state
5922
+ // Disabled state — icons handle their own disabled colors
5791
5923
  [`&.${Radio.radioClasses.disabled}`]: {
5792
- opacity: 0.5,
5924
+ color: neoDesign.semanticColors.border.primary,
5925
+ [`&.${Radio.radioClasses.checked}`]: {
5926
+ color: neoDesign.semanticColors.border.primary,
5927
+ },
5793
5928
  },
5794
5929
  };
5795
5930
  });
@@ -5797,7 +5932,6 @@ const StyledRadio = styles.styled(Radio, {
5797
5932
  * NeoRadio - Radio button component based on MUI Radio
5798
5933
  *
5799
5934
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4122-40039
5800
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4122-40150
5801
5935
  *
5802
5936
  * Figma Props Mapping:
5803
5937
  * - Checked (True|False) → checked prop
@@ -5837,9 +5971,9 @@ const StyledRadio = styles.styled(Radio, {
5837
5971
  * </RadioGroup>
5838
5972
  */
5839
5973
  const NeoRadio = ({ size = 'medium', label, helperText, disabled, ...props }) => {
5840
- // Custom icons based on size
5841
- const uncheckedIcon = jsxRuntime.jsx(UncheckedIcon, { size: size });
5842
- const checkedIcon = jsxRuntime.jsx(CheckedIcon, { size: size });
5974
+ // Custom icons based on size and disabled state
5975
+ const uncheckedIcon = jsxRuntime.jsx(UncheckedIcon, { size: size, disabled: disabled });
5976
+ const checkedIcon = jsxRuntime.jsx(CheckedIcon, { size: size, disabled: disabled });
5843
5977
  // If no label, return just the radio button
5844
5978
  if (!label && !helperText) {
5845
5979
  return (jsxRuntime.jsx(StyledRadio, { size: size, disabled: disabled, icon: uncheckedIcon, checkedIcon: checkedIcon, ...props }));
@@ -5963,127 +6097,6 @@ const NeoSkeleton = ({ colorTheme = 'light', position = 'start', ...props }) =>
5963
6097
  };
5964
6098
  NeoSkeleton.displayName = 'NeoSkeleton';
5965
6099
 
5966
- /**
5967
- * Styled Alert component with custom severity and variant styling
5968
- * Uses Custom Variants Pattern to add 'neutral' and 'info' severities
5969
- */
5970
- const StyledAlert$1 = styles.styled(Alert, {
5971
- shouldForwardProp: prop => prop !== 'severity' && prop !== 'variant',
5972
- })(({ theme, severity = 'success', variant = 'outlined' }) => {
5973
- // Color mapping for different severities
5974
- const colorMap = {
5975
- success: {
5976
- light: neoDesign.semanticColors.status.success.light,
5977
- medium: neoDesign.semanticColors.status.success.default,
5978
- },
5979
- error: {
5980
- light: neoDesign.semanticColors.status.error.light,
5981
- medium: neoDesign.semanticColors.status.error.default,
5982
- },
5983
- neutral: {
5984
- light: neoDesign.semanticColors.status.neutral.light,
5985
- medium: neoDesign.semanticColors.status.neutral.default,
5986
- },
5987
- info: {
5988
- light: neoDesign.semanticColors.status.info.light,
5989
- medium: neoDesign.semanticColors.status.info.default,
5990
- },
5991
- };
5992
- const severityColors = colorMap[severity];
5993
- // Variant-specific styles based on Phase 1.1 analysis
5994
- const variantStyles = (() => {
5995
- if (variant === 'filled') {
5996
- // Dark mode: solid background with white text
5997
- return {
5998
- backgroundColor: severityColors.medium,
5999
- border: 'none',
6000
- color: neoDesign.semanticColors.typography.tooltip,
6001
- padding: theme.spacing(0.75, 3),
6002
- boxShadow: `0px 1px 3px ${neoDesign.semanticColors.surfaces.shadowNeutral}1a`, // 1a = 10% opacity
6003
- [`& .${Alert.alertClasses.icon}`]: {
6004
- color: neoDesign.semanticColors.typography.tooltip,
6005
- },
6006
- [`& .${Alert.alertClasses.message}`]: {
6007
- color: neoDesign.semanticColors.typography.tooltip,
6008
- },
6009
- };
6010
- }
6011
- // Light mode: light background with border
6012
- return {
6013
- backgroundColor: severityColors.light,
6014
- border: `1px solid ${severityColors.medium}`,
6015
- color: neoDesign.colors.grey[800],
6016
- padding: theme.spacing(0.125, 2),
6017
- [`& .${Alert.alertClasses.icon}`]: {
6018
- color: severityColors.medium,
6019
- },
6020
- [`& .${Alert.alertClasses.message}`]: {
6021
- color: neoDesign.colors.grey[800],
6022
- },
6023
- };
6024
- })();
6025
- return {
6026
- height: neoDesign.spacing.spacing_8,
6027
- width: '100%',
6028
- borderRadius: neoDesign.borderRadius.xS,
6029
- alignItems: 'center',
6030
- fontFamily: neoDesign.typography.fontFamily.body,
6031
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.default),
6032
- fontWeight: neoDesign.typography.fontWeight.medium,
6033
- lineHeight: 1.5,
6034
- ...variantStyles,
6035
- // Supporting text styling
6036
- [`& .${Alert.alertClasses.message} > *:not(:first-child)`]: {
6037
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.sm),
6038
- fontWeight: neoDesign.typography.fontWeight.regular,
6039
- color: variant === 'filled'
6040
- ? neoDesign.semanticColors.typography.tooltip
6041
- : neoDesign.semanticColors.typography.bodySecondary,
6042
- lineHeight: 1.4,
6043
- marginTop: theme.spacing(0.25),
6044
- },
6045
- };
6046
- });
6047
- /**
6048
- * NeoStatusBanner - Status banner component for displaying system status messages
6049
- *
6050
- * Displays status information with different severity levels (success, error, info, neutral) and
6051
- * visual modes (outlined for light backgrounds, filled for emphasis).
6052
- *
6053
- * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4921-3427
6054
- *
6055
- * Figma Props Mapping:
6056
- * - Status (Success|Error|Info|Offline) → severity ('success'|'error'|'info'|'neutral')
6057
- * - Mode (Light|Dark) → variant ('outlined'|'filled')
6058
- *
6059
- * Design Tokens Used:
6060
- * - status.success.light, status.success.default
6061
- * - status.error.light, status.error.default
6062
- * - status.neutral.light, status.neutral.default
6063
- * - status.info.light, status.info.default
6064
- * - typography.tooltip, typography.bodySecondary
6065
- * - grey[800]
6066
- * - fontSize.default, fontSize.sm
6067
- * - fontWeight.medium, fontWeight.regular
6068
- * - fontFamily.body
6069
- * - surfaces.shadowNeutral
6070
- */
6071
- const NeoStatusBanner = ({ severity = 'success', variant = 'outlined', icon, children, ...props }) => {
6072
- // Icon mapping for different severities
6073
- const iconMap = {
6074
- success: jsxRuntime.jsx(CircleCheck, { size: 24 }),
6075
- error: jsxRuntime.jsx(CircleAlert, { size: 24 }),
6076
- neutral: jsxRuntime.jsx(WifiOff, { size: 24 }),
6077
- info: jsxRuntime.jsx(Info, { size: 24 }),
6078
- };
6079
- const defaultIcon = iconMap[severity];
6080
- // Type assertion needed: severity and variant are custom props filtered by shouldForwardProp
6081
- // biome-ignore lint/suspicious/noExplicitAny: Custom props pattern requires any cast
6082
- const StyledAlertAny = StyledAlert$1;
6083
- return (jsxRuntime.jsx(StyledAlertAny, { ...props, severity: severity, variant: variant, icon: icon ?? defaultIcon, children: children }));
6084
- };
6085
- NeoStatusBanner.displayName = 'NeoStatusBanner';
6086
-
6087
6100
  /**
6088
6101
  * NeoTabs - Tabs container component based on MUI Tabs
6089
6102
  *
@@ -6118,7 +6131,20 @@ const StyledTab = styles.styled(MuiTab)(({ theme }) => ({
6118
6131
  color: neoDesign.semanticColors.typography.tab.active,
6119
6132
  fontWeight: neoDesign.typography.fontWeight.semiBold,
6120
6133
  },
6134
+ '&:hover': {
6135
+ backgroundColor: neoDesign.semanticColors.buttons.secondary.hoverBackground,
6136
+ [`&.${MuiTab.tabClasses.selected}::after`]: {
6137
+ content: '""',
6138
+ position: 'absolute',
6139
+ bottom: 0,
6140
+ left: 0,
6141
+ right: 0,
6142
+ height: 2,
6143
+ backgroundColor: neoDesign.semanticColors.buttons.primary.hover,
6144
+ },
6145
+ },
6121
6146
  [`&.${ButtonBase.buttonBaseClasses.focusVisible}`]: {
6147
+ color: neoDesign.semanticColors.typography.tab.active,
6122
6148
  outline: `2px solid ${neoDesign.semanticColors.border.focus}`,
6123
6149
  outlineOffset: -2,
6124
6150
  },
@@ -6126,6 +6152,21 @@ const StyledTab = styles.styled(MuiTab)(({ theme }) => ({
6126
6152
  color: neoDesign.semanticColors.typography.button.disabled,
6127
6153
  cursor: 'not-allowed',
6128
6154
  pointerEvents: 'auto',
6155
+ '&:hover': {
6156
+ backgroundColor: 'transparent',
6157
+ },
6158
+ [`&.${MuiTab.tabClasses.selected}`]: {
6159
+ color: neoDesign.semanticColors.typography.button.disabled,
6160
+ '&::after': {
6161
+ content: '""',
6162
+ position: 'absolute',
6163
+ bottom: 0,
6164
+ left: 0,
6165
+ right: 0,
6166
+ height: 2,
6167
+ backgroundColor: neoDesign.semanticColors.buttons.tertiary.disabled,
6168
+ },
6169
+ },
6129
6170
  },
6130
6171
  }));
6131
6172
  const TabLabelContainer = styles.styled('span')(({ theme }) => ({
@@ -6140,10 +6181,7 @@ const TabLabelContainer = styles.styled('span')(({ theme }) => ({
6140
6181
  *
6141
6182
  * Figma Props Mapping:
6142
6183
  * - Current=True/False → Controlled by parent NeoTabs value
6143
- * - State=Defaultdefault styling
6144
- * - State=Hover → CSS :hover
6145
- * - State=Focus → CSS :focus-visible
6146
- * - Tag count → count prop (renders NeoTag)
6184
+ * - Show tag count prop (renders NeoTag)
6147
6185
  * - Text label → label prop
6148
6186
  */
6149
6187
  const NeoTab = ({ label, count, ...props }) => {
@@ -6154,7 +6192,7 @@ NeoTab.displayName = 'NeoTab';
6154
6192
 
6155
6193
  // biome-ignore lint/suspicious/noExplicitAny: Type cast required to override MUI Alert variant type without global augmentation
6156
6194
  const StyledAlert = styles.styled(Alert, {
6157
- shouldForwardProp: prop => prop !== 'variant' && prop !== 'showProgress',
6195
+ shouldForwardProp: prop => prop !== 'variant',
6158
6196
  })(({ theme, variant = 'default' }) => {
6159
6197
  // Base styles
6160
6198
  const baseStyles = {
@@ -6211,11 +6249,6 @@ const StyledAlert = styles.styled(Alert, {
6211
6249
  color: neoDesign.semanticColors.status.info.dark,
6212
6250
  border: `1px solid ${neoDesign.semanticColors.status.info.default}`,
6213
6251
  },
6214
- download: {
6215
- backgroundColor: neoDesign.semanticColors.surfaces.snackbarDarkMode,
6216
- color: neoDesign.colors.grey['800'],
6217
- border: `1px solid ${neoDesign.semanticColors.border.primary}`,
6218
- },
6219
6252
  };
6220
6253
  return {
6221
6254
  ...baseStyles,
@@ -6230,7 +6263,6 @@ const ToastTitle = styles.styled('p')(({ theme, variant = 'default' }) => {
6230
6263
  error: neoDesign.semanticColors.status.error.dark,
6231
6264
  success: neoDesign.semanticColors.status.success.dark,
6232
6265
  info: neoDesign.semanticColors.status.info.dark,
6233
- download: neoDesign.colors.grey['700'],
6234
6266
  };
6235
6267
  return {
6236
6268
  margin: 0,
@@ -6248,7 +6280,6 @@ const ToastMessage = styles.styled('p')(({ theme, variant = 'default' }) => {
6248
6280
  error: neoDesign.semanticColors.status.error.dark,
6249
6281
  success: neoDesign.semanticColors.status.success.dark,
6250
6282
  info: neoDesign.semanticColors.status.info.dark,
6251
- download: neoDesign.colors.grey['800'],
6252
6283
  };
6253
6284
  return {
6254
6285
  margin: 0,
@@ -6286,7 +6317,7 @@ const ToastButton = styles.styled(Button, {
6286
6317
  if (toastVariant === 'info') {
6287
6318
  return neoDesign.semanticColors.status.info.dark;
6288
6319
  }
6289
- // default and download variants use icon placeholder color
6320
+ // default variant uses icon placeholder color
6290
6321
  return neoDesign.semanticColors.icons.placeholder;
6291
6322
  };
6292
6323
  return {
@@ -6303,68 +6334,20 @@ const ToastButton = styles.styled(Button, {
6303
6334
  },
6304
6335
  };
6305
6336
  });
6306
- const ProgressSection = styles.styled(Stack)({
6307
- gap: neoDesign.spacing.spacing_1,
6308
- width: '100%',
6309
- });
6310
- const FileName = styles.styled('p')(({ theme }) => ({
6311
- margin: 0,
6312
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
6313
- fontWeight: neoDesign.typography.fontWeight.medium,
6314
- lineHeight: 1.5,
6315
- color: neoDesign.colors.grey['800'],
6316
- }));
6317
- const ProgressLabel = styles.styled('p')(({ theme }) => ({
6318
- margin: 0,
6319
- fontSize: theme.typography.pxToRem(neoDesign.typography.fontSize.xs),
6320
- fontWeight: neoDesign.typography.fontWeight.medium,
6321
- lineHeight: 1.5,
6322
- color: neoDesign.colors.grey['800'],
6323
- }));
6324
- const StyledLinearProgress = styles.styled(LinearProgress)({
6325
- width: '100%',
6326
- height: neoDesign.spacing.spacing_2,
6327
- borderRadius: neoDesign.borderRadius.s,
6328
- backgroundColor: neoDesign.colors.grey['200'],
6329
- [`& .${LinearProgress.linearProgressClasses.bar}`]: {
6330
- backgroundColor: neoDesign.semanticColors.buttons.primary.default,
6331
- borderRadius: `${neoDesign.borderRadius.xS}px 0 0 ${neoDesign.borderRadius.xS}px`,
6332
- },
6333
- });
6334
- const DownloadActions = styles.styled(Stack)({
6335
- gap: `${neoDesign.spacing.spacing_4}px`,
6336
- alignItems: 'center',
6337
- });
6338
- const DownloadIconButton = styles.styled(IconButton)({
6339
- padding: 0,
6340
- width: 16,
6341
- height: 16,
6342
- color: neoDesign.colors.grey['800'],
6343
- '&:hover': {
6344
- backgroundColor: 'transparent',
6345
- },
6346
- });
6347
6337
  /**
6348
6338
  * NeoToast - Notification/Toast component based on MUI Alert
6349
6339
  *
6350
6340
  * @figma https://www.figma.com/design/fQTkGSFbYyE7LiHuQJsENC/Neo---Moderne-Design-system---2025?node-id=4122-37223
6351
6341
  *
6352
6342
  * Figma Props Mapping:
6353
- * - type (Light mode|Dark mode|Brand color|Error|Success|Info|Download) → variant (default|dark|brand|error|success|info|download)
6343
+ * - type (Light mode|Dark mode|Brand color|Error|Success|Info) → variant (default|dark|brand|error|success|info)
6354
6344
  * - header → title (string)
6355
6345
  * - supportingText → message (string)
6356
6346
  * - xCloseButton → showClose (boolean)
6357
6347
  * - actions → actions (ReactNode)
6358
- * - Progress bar → progress (number 0-100)
6359
- */
6360
- const NeoToast = ({ variant = 'default', title, message, showClose = true, actions, progress, fileName, onClose, ...props }) => {
6361
- const isDownloadVariant = variant === 'download';
6362
- return (jsxRuntime.jsx(StyledAlert, { ...props, variant: variant, showProgress: isDownloadVariant, action: showClose && !isDownloadVariant ? (jsxRuntime.jsx(IconButton, { size: "small", onClick: onClose, sx: { color: neoDesign.semanticColors.icons.placeholder }, children: jsxRuntime.jsx(X, { size: 16 }) })) : undefined, children: isDownloadVariant ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(Stack, { direction: "row", sx: {
6363
- alignItems: 'flex-start',
6364
- justifyContent: 'space-between',
6365
- width: '100%',
6366
- gap: `${neoDesign.spacing.spacing_4}px`,
6367
- }, children: [title && jsxRuntime.jsx(ToastTitle, { variant: variant, children: title }), showClose && (jsxRuntime.jsxs(DownloadActions, { direction: "row", children: [jsxRuntime.jsx(DownloadIconButton, { size: "small", children: jsxRuntime.jsx(Stack, { sx: { width: 16, height: 16 } }) }), jsxRuntime.jsx(DownloadIconButton, { size: "small", onClick: onClose, children: jsxRuntime.jsx(X, { size: 16 }) })] }))] }), jsxRuntime.jsxs(ProgressSection, { children: [jsxRuntime.jsxs(Stack, { direction: "row", sx: { alignItems: 'flex-end', justifyContent: 'space-between', width: '100%' }, children: [fileName && jsxRuntime.jsx(FileName, { children: fileName }), progress !== undefined && jsxRuntime.jsxs(ProgressLabel, { children: [progress, "%"] })] }), jsxRuntime.jsx(StyledLinearProgress, { variant: "determinate", value: progress ?? 0 })] })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(Stack, { sx: { gap: `${neoDesign.spacing.spacing_1}px`, width: '100%' }, children: [title && jsxRuntime.jsx(ToastTitle, { variant: variant, children: title }), message && jsxRuntime.jsx(ToastMessage, { variant: variant, children: message })] }), actions && jsxRuntime.jsx(ToastActions, { direction: "row", children: actions })] })) }));
6348
+ */
6349
+ const NeoToast = ({ variant = 'default', title, message, showClose = true, actions, onClose, ...props }) => {
6350
+ return (jsxRuntime.jsxs(StyledAlert, { ...props, variant: variant, action: showClose ? (jsxRuntime.jsx(IconButton, { size: "small", onClick: onClose, sx: { color: neoDesign.semanticColors.icons.placeholder }, children: jsxRuntime.jsx(X, { size: 16 }) })) : undefined, children: [jsxRuntime.jsxs(Stack, { sx: { gap: `${neoDesign.spacing.spacing_1}px`, width: '100%' }, children: [title && jsxRuntime.jsx(ToastTitle, { variant: variant, children: title }), message && jsxRuntime.jsx(ToastMessage, { variant: variant, children: message })] }), actions && jsxRuntime.jsx(ToastActions, { direction: "row", children: actions })] }));
6368
6351
  };
6369
6352
  /**
6370
6353
  * Helper component for creating toast action buttons with proper styling
@@ -6471,7 +6454,7 @@ const StyledSwitch = styles.styled(Switch, {
6471
6454
  [`& .${Switch.switchClasses.thumb}`]: {
6472
6455
  width: config.thumbSize,
6473
6456
  height: config.thumbSize,
6474
- boxShadow: `${neoDesign.shadows.neutralSmall.x}px ${neoDesign.shadows.neutralSmall.y}px ${neoDesign.shadows.neutralSmall.blur}px ${neoDesign.shadows.neutralSmall.spread}px ${neoDesign.shadows.neutralSmall.shadow}`,
6457
+ boxShadow: `${neoDesign.shadows.neutral.small.x}px ${neoDesign.shadows.neutral.small.y}px ${neoDesign.shadows.neutral.small.blur}px ${neoDesign.shadows.neutral.small.spread}px ${neoDesign.shadows.neutral.small.shadow}`,
6475
6458
  transition: theme.transitions.create(['width'], {
6476
6459
  duration: theme.transitions.duration.shortest,
6477
6460
  }),
@@ -6640,7 +6623,7 @@ const StyledTooltip = styles.styled(Tooltip, {
6640
6623
  justifyContent: 'center',
6641
6624
  }),
6642
6625
  // Apply shadow
6643
- boxShadow: `${neoDesign.shadows.neutralMedium.x}px ${neoDesign.shadows.neutralMedium.y}px ${neoDesign.shadows.neutralMedium.blur}px ${neoDesign.shadows.neutralMedium.spread}px ${neoDesign.shadows.neutralMedium.shadow}`,
6626
+ boxShadow: `${neoDesign.shadows.neutral.medium.x}px ${neoDesign.shadows.neutral.medium.y}px ${neoDesign.shadows.neutral.medium.blur}px ${neoDesign.shadows.neutral.medium.spread}px ${neoDesign.shadows.neutral.medium.shadow}`,
6644
6627
  },
6645
6628
  // Style the arrow
6646
6629
  [`& .${Tooltip.tooltipClasses.arrow}`]: {
@@ -6884,6 +6867,7 @@ const version = '0.0.0-development';
6884
6867
  exports.CIRCLE_RADIUS = CIRCLE_RADIUS;
6885
6868
  exports.NeoActivityHeader = NeoActivityHeader;
6886
6869
  exports.NeoActivityIndicatorCell = NeoActivityIndicatorCell;
6870
+ exports.NeoAlert = NeoAlert;
6887
6871
  exports.NeoAvatar = NeoAvatar;
6888
6872
  exports.NeoBadge = NeoBadge;
6889
6873
  exports.NeoBanner = NeoBanner;
@@ -6892,6 +6876,7 @@ exports.NeoBreadcrumbs = NeoBreadcrumbs;
6892
6876
  exports.NeoButton = NeoButton;
6893
6877
  exports.NeoButtonTab = NeoButtonTab;
6894
6878
  exports.NeoButtonTabGroup = NeoButtonTabGroup;
6879
+ exports.NeoCard = NeoCard;
6895
6880
  exports.NeoCheckbox = NeoCheckbox;
6896
6881
  exports.NeoCodeSnippet = NeoCodeSnippet;
6897
6882
  exports.NeoDataGrid = NeoDataGrid;
@@ -6908,6 +6893,7 @@ exports.NeoDataGridSelect = NeoDropdown;
6908
6893
  exports.NeoDatePicker = NeoDatePicker;
6909
6894
  exports.NeoDivider = NeoDivider;
6910
6895
  exports.NeoDot = NeoDot;
6896
+ exports.NeoDownloadToast = NeoDownloadToast;
6911
6897
  exports.NeoDropdown = NeoDropdown;
6912
6898
  exports.NeoDropdownMenu = NeoDropdownMenu;
6913
6899
  exports.NeoDropdownMenuItem = NeoDropdownMenuItem;
@@ -6943,7 +6929,6 @@ exports.NeoSelect = NeoDropdown;
6943
6929
  exports.NeoSelectOption = NeoDropdownMenuItem;
6944
6930
  exports.NeoSkeleton = NeoSkeleton;
6945
6931
  exports.NeoStatusBadgeCell = NeoStatusBadgeCell;
6946
- exports.NeoStatusBanner = NeoStatusBanner;
6947
6932
  exports.NeoTab = NeoTab;
6948
6933
  exports.NeoTabs = NeoTabs;
6949
6934
  exports.NeoTag = NeoTag;