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